A saída estruturada adiciona uma nova dimensão à sua jogabilidade com PNJs. Saída estruturada é um mecanismo pelo qual o LLM que sustenta seu PNJ retorna structs instanciadas por LLM e definidas pelo usuário para orientar a lógica da jogabilidade.
Isso significa que seu personagem de LLM pode ter interações mais profundas, como retornar respostas a perguntas de múltipla escolha, decidir se o preço de um item vale o custo e muito mais.
Tanto a resposta quanto a saída estruturada devem estar em inglês.
overview
Esta seção personaliza seu persona_npc_behavior com uma única saída estruturada para sua persona. A struct interactions_response:
Registra o número de vezes que este PNJ interagiu com a pessoa.
O sentimento atual que a persona tem sobre essa interação com a pessoa.
Uma matriz que registra o histórico dos sentimentos da persona sobre todas as interações com a pessoa.
A saída estruturada exige que você:
Crie uma struct definindo a saída estruturada.
Forneça instruções sobre como a persona deve preencher a struct de saída estruturada.
Defina e inscreva-se em um evento sinalizado ao receber a saída estruturada.
Você pode configurar várias saídas estruturadas em uma única persona ao mesmo tempo e especificar assinaturas diferentes para cada tipo de saída estruturada da sua persona.
Tipos aceitos
A saída estruturada suporta os seguintes tipos Verse como campos dentro de structs:
intfloatboolenummessage
Como exibir mensagens
Os tipos de mensagem são censurados quando impressos no log ou no jogo, mas você pode exibir os tipos de mensagem usando dispositivos projetados para exibi-los, como:
billboard_devicehud_message_devicepopup_dialog_device
Pré-requisitos
Adicione uma saída estruturada ao código de comportamento do PNJ
O código abaixo usa a saída estruturada para ampliar as capacidades de vários LLMs usando um tipo prompt_binding_definition e a função RegisterAction() para introduzir novos tipos de resposta com base nos prompts da pessoa.
Prompt Binding (Vinculação de Prompt) é uma struct dada à IA para registrar uma ação definida na função RegisterAction(). Juntas, elas informam ao LLM quando realizar uma determinada ação ou por que uma determinada ação deve ser usada com base no prompt da pessoa.
Abaixo está um código Verse contendo um persona_npc_behavior expandido na seção persona_npc_behavior.verse. Isso aprofunda o código na documentação Como adicionar um PNJ a uma conversa, incluindo a saída estruturada.
Para alterar o código no seu persona_npc_behavior existente, siga estas etapas:
Certifique-se de que você tenha seu projeto Verse aberto no VS Code:
Na barra de menus, selecione Verse > Abrir projeto no VS Code…
Assim que o VS Code abrir, localize seu arquivo
persona_npc_behavior.verseno VS Code Explorer.
Copie e cole o conteúdo de
persona_npc_behavior.verseabaixo no arquivo Verse no seu projeto.Compile seu código Verse na barra de ferramentas do UEFN ou no VS Code.
Para obter um passo a passo do código Verse, siga as etapas em Explicação das alterações do código. Esta seção continua imediatamente após onde a explicação do código em Adicionar persona ao personagem PNJ parou.
persona_npc_behavior.verse
using { /Fortnite.com/AI }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Playspaces }
using { /UnrealEngine.com/Conversations }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Chat }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
Como explicar as alterações do código
Uma struct chamada
interactions_responsearmazena variáveis que as funções passam para o LLM. O LLM usa as variáveis para avaliar o prompt e como responder.Verseinteractions_response := struct: @ai_description("Use the Number field to output the number of times you have spoken to this player.") Number:int @ai_description("Use the Feeling field to output how you are feeling about your current interaction with the player.") Feeling:messageDuas
@ai_descriptionsdiferentes informam ao LLM quais são as variáveis e o motivo pelo qual o LLM deve usá-las ao criar uma resposta.Verse@ai_description("Use the Number field to output the number of times you have spoken to this player.") Number:int @ai_description("Use the Feeling field to output how you are feeling about your current interaction with the player.") Feeling:messageOnInteractionsResponseé a função que orienta a lógica de jogabilidade usando saída Estruturada. O retorno de chamada que é acionado sempre que a sessão de IA produz uma saída estruturada que corresponde à structinteractions_response. É o manipulador registrado porRegisterActionemAddStructuredOutput(), e seu parâmetro de resposta carrega os dados preenchidos pelo modelo.VerseOnInteractionsResponse(Response:interactions_response):void = Logger.Print("Structured response received") Logger.Print("Number of Interactions: {Response.Number}") Logger.Print("Feeling: {Localize(Response.Feeling)}") # Drive gameplay logic hereA função
AddStructuredOutputregistra a ação de saída estruturada do PNJ com sua sessão de IA. Isso permite que o modelo reporte dados de interação de volta à jogabilidade. Este código faz duas coisas. Primeiro, cria umaprompt_binding_definition, um pequeno descritor que dá à ação umNomee umaDescrição(ambos agrupados por meio do auxiliarMakeMessagepara transformar os literais de string em valores de mensagem). O texto de descrição é o que informa ao modelo quando usar esta ação: aqui, sempre que a pessoa tiver falado com o PNJ.Em seguida, ele chama
Session.RegisterAction, passando a vinculação, verdadeiro, o tipo de structinteractions_responsee o manipuladorOnInteractionsResponse. Isso informa à sessão que, quando ela emite uma saída estruturada formatada comointeractions_response, ela deve encaminhar esses dados paraOnInteractionsResponse.RegisterActionretorna um cancelável, que é agrupado emoption{}e armazenado emInteractionsResponseSubscriptionpara que a assinatura possa ser desativada no métodoOnEnd.VerseAddStructuredOutput():void = if: NPCEntity := GetEntity[] PersonaComponent := NPCEntity.GetComponent[persona_component] Session := PersonaComponent.GetAISession() then: # Create a prompt_binding so that we can use it on RegisterAction InteractionBinding:prompt_binding_definition = prompt_binding_definition: Name := MakeMessage("InteractionBinding") Description := MakeMessage("Signals whenever the player has spoken to you.")OnBeginadiciona a saída estruturada à sessão e define a pessoa como alvo da conversa. Em um jogo onde as pessoas podem entrar mais tarde, você quer garantir que serão adicionadas noPlayerAddedEventou quando uma pessoa se aproxima de um PNJ via um gatilho.VerseOnBegin<override>()<suspends>:void= AddStructuredOutput() AddPlayersAsConversationTarget()Em
OnEnd, aInteractionsResponseSubscriptioné limpa e removida de todas as pessoas. Essa é uma boa prática.VerseOnEnd<override>():void= if (Subscription := InteractionsResponseSubscription?): Subscription.Cancel() for (Player : GetEntity[].GetPlayspaceForEntity[].GetPlayers()): RemovePlayerAsConversationTarget(Player)
Teste a saída estruturada
O PNJ está agora configurado com saída estruturada. Toda vez que a persona fala, a interactions_response é sinalizada.
Teste o comportamento do seu personagem de LLM para obter respostas e reações mais envolventes aos seus prompts no jogo.