Yapılandırılmış çıktı, NPC’ler ile oynanışına daha derin bir boyut katar. Yapılandırılmış çıktı, NPC’ni destekleyen LLM’nin oynanış mantığını yönlendirmek için kullanıcı tanımlı, LLM tarafından örneklendirilen yapılar döndürmesini sağlayan bir mekanizmadır.
Böylece LLM karakterin çoktan seçmeli sorulara yanıt verme ve bir eşyanın fiyatının maliyetine değip değmediğine karar verme gibi daha derin etkileşimler kurabilecektir.
Hem yanıt hem de yapılandırılmış çıktı İngilizce olmalıdır.
Genel Bakış
Bu bölümde persona_npc_behavior’ın, personan için tek bir yapılandırılmış çıktı ile özelleştirilir. interactions_response yapısı:
Bu NPC’nin oyuncuyla etkileşime girme sayısını kaydeder.
Personanın, oyuncuyla bu etkileşim hakkındaki mevcut hissi.
Personanın, oyuncuyla tüm etkileşimleri hakkındaki hislerinin geçmişini kaydeden dizi.
Yapılandırılmış çıktı şunları yapmanı gerektirir:
Yapılandırılmış çıktıyı tanımlayan bir yapı oluşturmak.
Personanın yapılandırılmış çıktı yapısını nasıl doldurması gerektiğine dair talimatlar sağlamak.
Yapılandırılmış çıktı alındığında sinyali verilen bir olay tanımlamak ve bu olaya bağlanmak.
Tek bir persona üzerinde aynı anda birden fazla yapılandırılmış çıktı yapılandırabilir ve personana ilişkin her bir yapılandırılmış çıktı türü için farklı abonelikler belirleyebilirsin.
Desteklenen Türler
Yapılandırılmış çıktı, aşağıdaki Verse türlerini yapıların içinde alanlar olarak destekler:
tamsayıkayan sayıbooleenummesaj
Mesajları Görüntüleme
Mesaj türleri günlüğe yazdırıldığında veya oyun içinde yazdırıldığında gizlenir ancak mesaj türlerini, bunları görüntülemek için tasarlanmış olan aşağıdaki gibi cihazları kullanarak görüntüleyebilirsin:
billboard_devicehud_message_devicepopup_dialog_device
Ön Gereksinimler
NPC Davranış Koduna Yapılandırılmış Çıktı Ekle
Aşağıdaki kodda, oyuncu istemlerine göre yeni yanıt türleri sunmak için bir prompt_binding_definition türü ve RegisterAction() fonksiyonu kullanılarak birden fazla LLM’nin işlevlerini genişletmek için yapılandırılmış çıktı kullanılmaktadır.
İstem Bağlama, yapay zekâya, RegisterAction() fonksiyonunda tanımlanan bir eylemi kaydetmek için verilen bir yapıdır. Bunlar birlikte, bir oyuncunun istemine göre LLM’ye ne zaman belirli bir eylemi yapacağını veya belirli bir eylemin neden kullanılması gerektiğini söyler.
Aşağıda, persona_npc_behavior.verse bölümünde genişletilmiş bir persona_npc_behavior içeren bir Verse kodu yer almaktadır. Bu, Bir Konuşmaya NPC Ekle dokümantasyonundaki kodu yapılandırılmış çıktıyı da içerecek şekilde geliştirir.
Mevcut persona_npc_behavior’ındaki kodu değiştirmek için şu adımları izle:
Verse projenin VS Code’da açık olduğundan emin ol:
Menü çubuğunda Verse > Projeyi VS Code’da Aç…’ı seç.
VS Code açıldığında, VS Code Gezgini’nde
persona_npc_behavior.versedosyanı bul.
Aşağıdaki
persona_npc_behavior.verse’ün içeriğini kopyalayıp projendeki Verse dosyana yapıştır.Verse kodunu UEFN Araç Çubuğu’nda veya VS Code’da derle.
Verse kodunun adım adım anlatımı için Kod Değişikliklerinin Açıklaması altındaki adımları izle. Bu bölüm tam olarak NPC Karakterine Persona Ekle kısmındaki kod açıklamasının kaldığı yerden devam eder.
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 }
Kod Değişikliklerinin Açıklaması
interactions_responseadlı bir yapı, fonksiyonların LLM’ye ilettiği değişkenleri tutar. LLM, istemi ve nasıl yanıt vereceğini değerlendirmek için değişkenleri kullanır.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:messageİki farklı
@ai_descriptions, LLM’ye değişkenlerin ne olduğunu ve LLM bir yanıt oluştururken onun bunları neden kullanması gerektiğini söyler.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, yapılandırılmış çıktı kullanarak oynanış mantığını yönlendiren fonksiyondur. Yapay zekâ oturumu,interactions_responseyapısına uyan bir yapılandırılmış çıktı ürettiğinde tetiklenen geri çağırma. Bu,AddStructuredOutput()’taRegisterActiontarafından kaydedilen işleyicidir ve bunun yanıt parametresi modelin doldurduğu verileri taşır.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 hereAddStructuredOutputfonksiyonu, NPC’nin yapılandırılmış çıktı eylemini onun yapay zekâ oturumuna kaydeder. Böylece, modelin etkileşim verilerini oyuna geri bildirmesi sağlanmış olur. Bu kod iki şey yapar. Öncelikle, eyleme birAdve birAçıklama(her ikisi de dize değişmezlerini mesaj değerlerine dönüştürmek içinMakeMessageyardımcısı aracılığıyla sarmalanmıştır) veren küçük bir tanımlayıcı olan birprompt_binding_definitionoluşturur. Açıklama metni, modele bu eylemi ne zaman kullanacağını söyler; burada, eylemin kullanılacağı zaman oyuncunun NPC ile her konuştuğu andır.Ardından
Session.RegisterActionfonksiyonunu çağırarak bağlamayı, true değerini,interactions_responseyapı türünü veOnInteractionsResponseişleyicisini iletir. Bu işlem oturuma, onuninteractions_responsegibi şekillendirilmiş bir yapılandırılmış çıktı yayınlaması durumunda, o verileriOnInteractionsResponse’a yönlendirmesi gerektiğini söyler.RegisterAction,option{}içine sarılmış veInteractionsResponseSubscription’da depolanan, iptal edilebilir bir değer döndürür, böylece abonelikOnEndmetodunda sonlandırılabilir.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.")OnBegin, yapılandırılmış çıktıyı oturuma ekler ve oyuncuyu konuşma hedefi olarak ayarlar. Oyuncuların geç katılabileceği bir oyunda, onlarıPlayerAddedEvent’te veya bir oyuncu bir tetikleyici aracılığıyla bir NPC'ye yaklaştığında eklediğinden emin olman uygun olacaktır.VerseOnBegin<override>()<suspends>:void= AddStructuredOutput() AddPlayersAsConversationTarget()OnEnd’deInteractionsResponseSubscriptiontemizlenir ve tüm oyunculardan kaldırılır. Bu, iyi bir uygulamadır.VerseOnEnd<override>():void= if (Subscription := InteractionsResponseSubscription?): Subscription.Cancel() for (Player : GetEntity[].GetPlayspaceForEntity[].GetPlayers()): RemovePlayerAsConversationTarget(Player)
Yapılandırılmış Çıktıyı Test Et
NPC artık yapılandırılmış çıktı ile yapılandırılmıştır. Persona her konuştuğunda, interactions_response’a sinyal verilir.
Oyun içindeki istemlerine daha ilgi çekici yanıtlar ve tepkiler almak için LLM karakterinin davranışını test et.