Ustrukturyzowane wyniki nadają rozgrywce z NPC głębszy wymiar. Ustrukturyzowane wyniki to mechanizm, dzięki któremu LLM wspierający postać niezależną zwraca zdefiniowane przez użytkownika i instancjonowane przez LLM struktury, które sterują logiką rozgrywki.
Oznacza to, że postać LLM może wchodzić w bardziej złożone interakcje, takie jak udzielanie odpowiedzi na pytania wielokrotnego wyboru, ocena, czy cena danego przedmiotu jest adekwatna do jego wartości, i wiele innych.
Zarówno odpowiedź, jak i ustrukturyzowane wyniki muszą być w języku angielskim.
Omówienie
Ta sekcja dostosowuje zachowanie persona_npc_behavior dla twojej persony za pomocą pojedynczych ustrukturyzowanych wyników. Struktura interactions_response:
Zapisuje liczbę interakcji tej postaci niezależnej z graczem.
Obecne odczucia persony związane z daną interakcją z graczem.
Tablica zawierająca historię odczuć persony związanych ze wszystkimi interakcjami z graczem.
Ustrukturyzowane wyniki wymagają:
Utworzenia struktury definiującej ustrukturyzowane wyniki.
Podania instrukcji dotyczącej tego, w jaki persona powinna wypełnić strukturę ustrukturyzowanych wyników.
Zdefiniowania i zasubskrybowania zdarzenia sygnalizowanego po otrzymaniu ustrukturyzowanych wyników.
W ramach jednej persony można jednocześnie skonfigurować wiele ustrukturyzowanych wyników i określić różne subskrypcje dla każdego typu ustrukturyzowanych wyników dla tej persony.
Obsługiwane typy
Ustrukturyzowane wyniki obsługują następujące typy Verse jako pola w strukturach:
liczba całkowita (int)wartość zmiennopozycyjna (float)wartość logiczna (boolean)wyliczenie (enum)komunikat (message)
Wyświetlanie komunikatów
Typy komunikatów są utajniane po zapisaniu do dziennika lub w grze, ale można je wyświetlać za pomocą urządzeń przeznaczonych do ich wyświetlania, takich jak:
billboard_devicehud_message_devicepopup_dialog_device
Instalacja wstępna
Dodawanie ustrukturyzowanych wyników do skryptu zachowania postaci niezależnej
Poniższy kod wykorzystuje ustrukturyzowane wyniki do rozszerzenia możliwości wielu LLM poprzez użycie typu prompt_binding_definition i funkcji RegisterAction() w celu wprowadzenia nowych typów odpowiedzi opartych na promptach graczy.
Powiązanie promptu jest strukturą przekazywaną do AI w celu zarejestrowania akcji zdefiniowanej w funkcji RegisterAction(). Razem informują one model LLM, kiedy ma wykonać określoną akcję lub dlaczego należy ją zastosować w oparciu o prompt gracza.
Poniżej znajduje się skrypt Verse zawierający rozszerzony persona_npc_behavior w sekcji persona_npc_behavior.verse. Stanowi to rozszerzenie kodu zawartego w dokumentacji Dodawanie postaci niezależnej do rozmowy, z uwzględnieniem ustrukturyzowanych wyników.
Aby zmienić kod w istniejącym pliku persona_npc_behavior, wykonaj następujące kroki:
Upewnij się, że masz otwarty projekt Verse w VS Code:
Na pasku menu wybierz kolejno Verse > Otwórz projekt w VS Code…
Po otwarciu VS Code znajdź swój plik
persona_npc_behavior.versew Eksploratorze VS Code.
Skopiuj i wklej poniższą zawartość pliku
persona_npc_behavior.versedo pliku Verse w projekcie.Skompiluj kod Verse na pasku narzędzi UEFN lub w VS Code.
Szczegółowy opis krok po kroku skryptu Verse znajduje się w sekcji Objaśnienie zmian w skrypcie. Ta sekcja stanowi bezpośrednią kontynuację objaśnienia skryptu zawartego w sekcji Dodawanie persony do postaci niezależnej.
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 }
Objaśnienie zmian w skrypcie
Struktura o nazwie
interactions_responseprzechowuje zmienne, które są przekazywane przez funkcje do modelu LLM. Model LLM wykorzystuje te zmienne do oceny promptu i ustalenia, jak na niego odpowiedzieć.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:messageDwie różne
@ai_descriptionsinformują LLM, czym są zmienne i z jakiego powodu LLM powinien ich używać podczas tworzenia odpowiedzi.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:messageOnInteractionsResponsejest funkcją, która steruje logiką rozgrywki za pomocą ustrukturyzowanych wyników. Wywołanie zwrotne, które jest uruchamiane za każdym razem, gdy sesja AI generuje ustrukturyzowane wyniki odpowiadające strukturzeinteractions_response. Jest to procedura obsługi zarejestrowana przezRegisterActionwAddStructuredOutput(), a jej parametr odpowiedzi zawiera dane wypełnione przez model.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 hereFunkcja
AddStructuredOutputrejestruje akcję postaci NPC z ustrukturyzowanym wynikiem w ramach jego sesji AI. Dzięki temu model może przekazywać dane dotyczące interakcji z powrotem do rozgrywki. Kod ten wykonuje dwie czynności. Po pierwsze tworzyprompt_binding_definition, mały deskryptor nadający akcjiNameiDescription(oba elementy są przetwarzane przez funkcję pomocnicząMakeMessagew celu przekształcenia literałów ciągu tekstowego w wartości komunikatów). Tekst opisu informuje model, kiedy ma użyć tej akcji: w tym przypadku zawsze wtedy, gdy gracz porozmawiał z NPC.Następnie wywołuje
Session.RegisterAction, przekazując powiązanie, wartość true, typ strukturyinteractions_responseoraz procedurę obsługiOnInteractionsResponse. Informuje to sesję, że gdy emituje ustrukturyzowane wyniki w kształcieinteractions_response, powinna przekierować te dane doOnInteractionsResponse.RegisterActionzwraca obiekt, który można anulować, który jest zawarty woption{}i przechowywany wInteractionsResponseSubscription, aby subskrypcję można było zakończyć w metodzieOnEnd.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.")OnBegindodaje ustrukturyzowane wyniki do sesji i ustawia gracza jako cel rozmowy. W grze, w której gracze mogą dołączyć później, trzeba upewnić się, że zostaną dodani w ramach zdarzeniaPlayerAddedEventlub za pomocą aktywatora, gdy gracz podejdzie do postaci niezależnej.VerseOnBegin<override>()<suspends>:void= AddStructuredOutput() AddPlayersAsConversationTarget()W
OnEndInteractionsResponseSubscriptionjest czyszczona, a wszyscy gracie zostają usunięci. Jest to dobra praktyka.VerseOnEnd<override>():void= if (Subscription := InteractionsResponseSubscription?): Subscription.Cancel() for (Player : GetEntity[].GetPlayspaceForEntity[].GetPlayers()): RemovePlayerAsConversationTarget(Player)
Test ustrukturyzowanych wyników
Postać niezależna jest teraz skonfigurowana z ustrukturyzowanymi wynikami. Za każdym razem, gdy persona mówi, sygnalizowana jest odpowiedź interactions_response.
Przetestuj zachowanie postaci LLM, aby uzyskać bardziej angażujące odpowiedzi i reakcje na prompty w grze.