Salida estructurada aporta una dimensión más profunda a la jugabilidad con PNJ. La salida estructurada es un mecanismo a través del cual el LLM que respalda a tu PNJ devuelve structs instanciados por LLM y definidos por el usuario para impulsar la lógica de juego.
Esto significa que tu personaje con LLM puede tener interacciones más profundas, como devolver respuestas a preguntas de opción múltiple y decidir si el precio de un objeto merece la pena, entre otras cosas.
Tanto la respuesta como la salida estructurada deben estar en inglés.
Overview
Esta sección personaliza tu persona_npc_behavior con una única salida estructurada para tu personaje. La interactions_response estructura:
Registra el número de veces que este PNJ ha interactuado con el jugador.
El sentimiento actual que tiene la identidad sobre esta interacción con el jugador.
Una matriz que registra el historial de los sentimientos de la identidad sobre todas las interacciones con el jugador.
La salida estructurada requiere que:
Crees un struct que defina la salida estructurada.
Proporciones instrucciones sobre cómo debe rellenar la identidad el struct de salida estructurada.
Definas y suscribas a un evento que se señale al recibir una salida estructurada.
Puedes configurar varias salidas estructuradas en una sola identidad al mismo tiempo y especificar diferentes suscripciones para cada tipo de salida estructurada de la identidad.
Tipos compatibles
La salida estructurada admite los siguientes tipos de Verse como campos dentro de structs:
intfloatboolenummessage
Visualización de mensajes
Los tipos de mensaje se censuran cuando se imprimen en el registro o en el juego, pero puedes mostrar los tipos de mensaje utilizando dispositivos diseñados para mostrarlos, como:
billboard_devicehud_message_devicepopup_dialog_device
Requisitos previos
Cómo añadir una salida estructurada a la secuencia de comandos de comportamiento de PNJ
El código a continuación utiliza la salida estructurada para ampliar las capacidades de varios LLM mediante el uso de un tipo prompt_binding_definition y la función RegisterAction() para introducir nuevos tipos de respuesta basados en las instrucciones del jugador.
Vinculación de instrucción es un struct que se proporciona a la IA para registrar una acción definida en la función RegisterAction(). Juntos, estos le indican al LLM cuándo realizar una determinada acción o por qué se debería utilizar una determinada acción en función de la instrucción de un jugador.
A continuación, se muestra una secuencia de comandos de Verse que contiene un persona_npc_behavior ampliado en la sección persona_npc_behavior.verse. Esto amplía el código de la documentación Cómo añadir un PNJ a una conversación, incluyendo la salida estructurada.
Para modificar el código en tu persona_npc_behavior existente, sigue estos pasos:
Asegúrate de tener el proyecto de Verse abierto en VS Code:
En la barra del menú, selecciona Verse > Proyecto abierto en VS Code...
Una vez que se abra VS Code, busca tu archivo
persona_npc_behavior.verseen el explorador de VS Code.
Copia y pega el contenido de
persona_npc_behavior.versea continuación en el archivo de Verse de tu proyecto.Compila el código de Verse en la barra de herramientas de UEFN o en VS Code.
Si quieres una guía paso a paso de la secuencia de comandos de Verse, sigue los pasos en Explicación de cambios en la secuencia de comandos. Esta sección continúa inmediatamente después de donde terminó la explicación de la secuencia de comandos en Cómo añadir una identidad al personaje PNJ.
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 }
Explicación de cambios en la secuencia de comandos
Un struct llamado
interactions_responsecontiene variables que las funciones pasan al LLM. El LLM utiliza las variables para evaluar la instrucción y cómo 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:messageDos
@ai_descriptionsdiferentes le dicen al LLM cuáles son las variables y la razón por la que debería usarlas al crear una respuesta.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:messageOnInteractionsResponsees la función que impulsa la lógica de juego utilizando salida estructurada. La devolución de llamada que se activa cada vez que la sesión de IA produce una salida estructurada que coincide con el structinteractions_response. Es el controlador registrado porRegisterActionenAddStructuredOutput(), y su parámetro de respuesta contiene los datos que el modelo ha rellenado.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 hereLa función
AddStructuredOutputregistra la acción de salida estructurada del PNJ con su sesión de IA. Esto proporciona una forma para que el modelo informe de los datos de interacción al juego. Este código hace dos cosas. Primero construye unaprompt_binding_definition, un pequeño descriptor que da a la acción unNamey unaDescription(ambos envueltos a través del asistenteMakeMessagepara convertir los literales de cadena en valores de mensaje). El texto de la descripción es lo que indica al modelo cuándo utilizar esta acción: aquí, cada vez que el jugador haya hablado con el PNJ.Luego llama a
Session.RegisterAction, pasando la vinculación, true, el tipo de estructurainteractions_responsey el controladorOnInteractionsResponse. Esto indica a la sesión que cuando emita una salida estructurada con forma deinteractions_response, debe dirigir esos datos aOnInteractionsResponse.RegisterActiondevuelve un cancelable, que se envuelve enoption{}y se almacena enInteractionsResponseSubscriptionpara que la suscripción pueda eliminarse en el 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.")OnBeginañade la salida estructurada a la sesión y establece al jugador como objetivo de la conversación. En un juego en el que los jugadores pueden unirse tarde, querrás asegurarte de añadirlos en elPlayerAddedEvento cuando un jugador se acerque a un PNJ, a través de un activador.VerseOnBegin<override>()<suspends>:void= AddStructuredOutput() AddPlayersAsConversationTarget()En
OnEnd, se limpia laInteractionsResponseSubscriptiony se elimina de todos los jugadores. Esto es recomendable.VerseOnEnd<override>():void= if (Subscription := InteractionsResponseSubscription?): Subscription.Cancel() for (Player : GetEntity[].GetPlayspaceForEntity[].GetPlayers()): RemovePlayerAsConversationTarget(Player)
Probar salidas estructuradas
El PNJ está ahora configurado con salida estructurada. Cada vez que la identidad habla, se señaliza la interactions_response.
Prueba el comportamiento del personaje con LLM para obtener respuestas y reacciones más atractivas a tus instrucciones en el juego.