La sortie structurée enrichit le gameplay avec les PNJ. La sortie structurée permet au LLM qui sous-tend votre PNJ de renvoyer des structures définies par l'utilisateur et instanciées par le LLM afin de piloter la logique de gameplay.
Votre personnage LLM peut ainsi interagir plus en profondeur, par exemple en répondant à des questions à choix multiples ou en déterminant si un objet vaut son prix.
La réponse et la sortie structurée doivent toutes deux être en anglais.
Overview
Cette section personnalise persona_npc_behavior avec une seule sortie structurée pour votre Persona. La structure interactions_response :
Enregistre le nombre d'interactions entre ce PNJ et le joueur.
Indique ce que la Persona ressent actuellement au sujet de cette interaction avec le joueur.
Contient une matrice qui retrace l'évolution des sentiments de la Persona au fil de toutes ses interactions avec le joueur.
Pour utiliser la sortie structurée, vous devez :
Créer une structure définissant la sortie structurée.
Fournir des instructions expliquant comment la Persona doit remplir la structure de sortie structurée.
Définir un événement déclenché à la réception d'une sortie structurée et s'y abonner.
Vous pouvez configurer simultanément plusieurs sorties structurées pour une même Persona et définir un abonnement différent pour chaque type.
Types pris en charge
La sortie structurée prend en charge les types Verse suivants dans les champs des structures :
intfloatboolenummessage
Afficher les messages
Les valeurs de type message sont masquées lorsqu'elles sont affichées dans le journal ou en jeu, mais vous pouvez les afficher avec des appareils conçus à cet effet, notamment :
billboard_devicehud_message_devicepopup_dialog_device
Conditions préalables
Ajouter une sortie structurée au script de comportement du PNJ
Le code ci-dessous utilise la sortie structurée pour étendre les capacités de plusieurs LLM. Le type prompt_binding_definition et la fonction RegisterAction() introduisent de nouveaux types de réponses en fonction des invites des joueurs.
La liaison d'invite est une structure transmise à l'IA pour enregistrer une action définie dans la fonction RegisterAction(). Ensemble, ces éléments indiquent au LLM quand effectuer une action donnée ou pourquoi l'utiliser en fonction de l'invite d'un joueur.
Le script Verse ci-dessous contient une version étendue de persona_npc_behavior dans la section persona_npc_behavior.verse. Ce code reprend et développe celui de la documentation Ajouter un PNJ à une conversation en y ajoutant une sortie structurée.
Pour modifier le code de votre persona_npc_behavior existant, procédez comme suit :
Vérifiez que votre projet Verse est ouvert dans VS Code :
Dans la barre de menus, sélectionnez Verse > Ouvrir le projet dans VS Code…
Une fois VS Code ouvert, recherchez votre fichier
persona_npc_behavior.versedans l'Explorateur VS Code.
Copiez le contenu du fichier
persona_npc_behavior.verseci-dessous et collez-le dans le fichier Verse de votre projet.Compilez votre code Verse depuis la barre d'outils de l'UEFN ou dans VS Code.
Pour une démonstration pas-à-pas du script Verse, consultez Explication des modifications apportées au script. Cette section reprend exactement là où s'arrête l'explication du script dans Ajouter une Persona à un personnage 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 }
Explication des modifications apportées au script
Une structure nommée
interactions_responsecontient les variables que les fonctions transmettent au LLM. Le LLM utilise les variables pour évaluer l'invite et déterminer sa réponse.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:messageDeux
@ai_descriptionsdifférentes indiquent au LLM le rôle des variables et pourquoi il doit les utiliser pour créer une réponse.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:messageLa fonction
OnInteractionsResponsepilote la logique de gameplay à l'aide de la sortie structurée. Fonction de rappel déclenchée chaque fois que la session d'IA produit une sortie structurée correspondant à la structureinteractions_response. Il s'agit du gestionnaire enregistré parRegisterActiondansAddStructuredOutput(). Son paramètre Response contient les données renseignées par le modèle.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 fonction
AddStructuredOutputenregistre l'action de sortie structurée du PNJ auprès de sa session d'IA. Le modèle peut ainsi transmettre les données d'interaction au gameplay. Ce code accomplit deux opérations. La fonction commence par créer uneprompt_binding_definition, un petit descripteur qui attribue à l'action unNameet uneDescription. Ces deux valeurs passent par la fonction auxiliaireMakeMessage, qui convertit les littéraux de chaîne en valeurs de type message. Le texte de description indique au modèle quand utiliser cette action : ici, chaque fois que le joueur s'est adressé au PNJ.Elle appelle ensuite
Session.RegisterActionet lui transmet la liaison, true, le type de structureinteractions_responseet le gestionnaireOnInteractionsResponse. La session comprend ainsi que, lorsqu'elle émet une sortie structurée au formatinteractions_response, elle doit transmettre ces données àOnInteractionsResponse. La fonctionRegisterActionrenvoie un cancelable, encapsulé dansoption{}et stocké dansInteractionsResponseSubscription. L'abonnement peut ainsi être supprimé dans la méthodeOnEnd.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.")OnBeginajoute la sortie structurée à la session et définit le joueur comme cible de la conversation. Dans une partie où des joueurs peuvent arriver en cours de jeu, veillez à les ajouter lors dePlayerAddedEventou lorsqu'un joueur s'approche d'un PNJ en passant par un déclencheur.VerseOnBegin<override>()<suspends>:void= AddStructuredOutput() AddPlayersAsConversationTarget()Dans
OnEnd,InteractionsResponseSubscriptionest nettoyé et supprimé pour tous les joueurs. Il s'agit d'une bonne pratique.VerseOnEnd<override>():void= if (Subscription := InteractionsResponseSubscription?): Subscription.Cancel() for (Player : GetEntity[].GetPlayspaceForEntity[].GetPlayers()): RemovePlayerAsConversationTarget(Player)
Tester la sortie structurée
Le PNJ est désormais configuré avec une sortie structurée. Chaque fois que la Persona parle, un signal est émis pour interactions_response.
Testez le comportement de votre personnage LLM afin d'obtenir en jeu des réponses et réactions plus intéressantes à vos invites.