Aracılığıyla paylaş


Microsoft Agent Framework Çok Aşamalı Konuşmalar ve İş Parçacıklarının Yönetimi

Microsoft Agent Framework, yapay zeka aracılarıyla çok aşamalı konuşmaları yönetmek için yerleşik destek sağlar. Bu, birden çok etkileşimde bağlamı korumayı içerir. Aracı oluşturmak için kullanılan farklı aracı türleri ve temel alınan hizmetler farklı iş parçacığı türlerini destekleyebileceğinden, Agent Framework bu farklılıkları soyutlayarak geliştiriciler için tutarlı bir arabirim sağlar.

Örneğin, foundry aracısını üzerine kurulu bir ChatClientAgent kullanırken, konuşma geçmişi hizmette kalıcı olarak saklanır. Öte yandan, gpt-4.1 ile sohbet tamamlamaya dayalı bir ChatClientAgent kullanırken konuşma geçmişi bellek içindedir ve aracı tarafından yönetilir.

AgentThread türü, bir aracının konuşma geçmişini ve diğer durumlarını temsil eden soyut bir temsildir. AIAgent örnekler durum bilgisi yoktur ve aynı aracı örneği birden çok AgentThread örnekle kullanılabilir. Bu nedenle tüm durum bilgisi AgentThread içinde korunur. hem AgentThread sohbet geçmişini hem de aracının birden çok etkileşimde koruması gereken diğer durumları temsil edebilir. Konuşma geçmişi, AgentThread nesnesinin kendisinde veya uzaktan depolanabilir; bu durumda AgentThread, yalnızca uzak konuşma geçmişine bir başvuru içerir. Durum, uzaktan depolanan anılara veya bu anılara yönelik referansları da içerebilir.

Tavsiye

Aracı Çerçevesi'nde Sohbet Geçmişi ve Bellek hakkında daha fazla bilgi edinmek için bkz. Aracı Sohbet Geçmişi ve Belleği.

AgentThread Oluşturma

AgentThread örnekler iki şekilde oluşturulabilir:

  1. Temsilciye GetNewThread çağrısı yapılmasıyla.
  2. Ajanı çalıştırarak ve AgentThread sağlamadan. Bu durumda aracı, yalnızca çalıştırma süresi boyunca kullanılacak bir throwaway AgentThread oluşturur.

Bazı temel hizmetler, depolanmış konuşmalar/iş parçacıkları/yanıtları kalıcı olarak oluşturabilir; bu, hizmetin gereksinimleri doğrultusunda, örneğin Döküm Aracıları veya OpenAI Yanıtları gibi durumlarda söz konusudur. Bunların temizlenmesi veya silinmesi kullanıcının sorumluluğundadır.

// Create a new thread.
AgentThread thread = agent.GetNewThread();
// Run the agent with the thread.
var response = await agent.RunAsync("Hello, how are you?", thread);

// Run an agent with a temporary thread.
response = await agent.RunAsync("Hello, how are you?");

AgentThread Depolama

AgentThread örnekleri seri hale getirilebilir ve daha sonra kullanılmak üzere depolanabilir. Bu, farklı oturumlarda veya hizmet çağrılarında konuşma bağlamının korunmasını sağlar.

Konuşma geçmişinin bir hizmette depolandığı durumlarda, seri hale getirilen AgentThread hizmetteki konuşma geçmişine işaret eden bir kimlik içerir. Konuşma geçmişinin bellek içinde yönetildiği durumlarda, serileştirilmiş AgentThread iletilerin kendisini içerir.

// Create a new thread.
AgentThread thread = agent.GetNewThread();
// Run the agent with the thread.
var response = await agent.RunAsync("Hello, how are you?", thread);

// Serialize the thread for storage.
JsonElement serializedThread = await thread.SerializeAsync();
// Deserialize the thread state after loading from storage.
AgentThread resumedThread = await agent.DeserializeThreadAsync(serializedThread);

// Run the agent with the resumed thread.
var response = await agent.RunAsync("Hello, how are you?", resumedThread);

Microsoft Agent Framework, yapay zeka aracılarıyla çok aşamalı konuşmaları yönetmek için yerleşik destek sağlar. Bu, birden çok etkileşimde bağlamı korumayı içerir. Aracı oluşturmak için kullanılan farklı aracı türleri ve temel alınan hizmetler farklı iş parçacığı türlerini destekleyebileceğinden, Agent Framework bu farklılıkları soyutlayarak geliştiriciler için tutarlı bir arabirim sağlar.

Örneğin, Foundry aracısı tabanlı bir ChatAgent kullanılırken konuşma geçmişi hizmette kalıcı olarak saklanır. gpt-4 ile sohbet tamamlamasına dayalı bir ChatAgent kullanılırken, konuşma geçmişi bellek içi tutulur ve yazılım aracı tarafından yönetilir.

Altyapı iş parçacığı modelleri arasındaki farklar AgentThread tipi aracılığıyla soyutlanır.

Agent/AgentThread ilişkisi

AIAgent örnekler durum bilgisi yoktur ve aynı aracı örneği birden çok AgentThread örnekle kullanılabilir.

Ancak tüm aracılar tüm AgentThread türleri desteklemez. Örneğin, ChatClientAgent kullanıyorsanız yanıt hizmetiyle, bu aracının oluşturduğu AgentThread örnekleri, Foundry Aracısı hizmetini kullanan bir ChatClientAgent ile çalışmaz. Bunun nedeni, bu hizmetlerin her ikisinin de konuşma geçmişini hizmette kaydetmeyi desteklemesi ve iki AgentThread örneğin, her hizmet tarafından depolanan konuşmaya başvuru içerdiği halde, yanıtlar hizmetindeki kimliğin Döküm Aracı hizmetiyle kullanılamayacağı ve bunun tersinin de geçerli olmasıdır.

Bu nedenle, temel alınan iş parçacığı modelinin ve etkilerinin farkında değilseniz, farklı bir temsilci örneğiyle bir temsilci tarafından oluşturulmuş bir AgentThread örneği kullanmak güvenli değildir.

Hizmete/protokole göre konuşma geçmişi desteği

Hizmet Konuşma Geçmişi Desteği
Döküm Aracıları Hizmet depolanmış kalıcı konuşma geçmişi
OpenAI Yanıtları Hizmet tarafından depolanan yanıt zincirleri VEYA bellek içi konuşma geçmişi
OpenAI ChatCompletion (Sohbet Tamamlama) Bellek içi konuşma geçmişi
OpenAI Yardımcıları Hizmetin depoladığı kalıcı sohbet geçmişi
A2A Kalıcı konuşma geçmişinin hizmet tarafından saklanması

AgentThread Oluşturma

AgentThread örnekler iki şekilde oluşturulabilir:

  1. Temsilciye get_new_thread() çağrısı yapılmasıyla.
  2. Ajanı çalıştırarak ve AgentThread sağlamadan. Bu durumda ajan, yalnızca çalışma süresi boyunca kullanılacak temel iş parçacığıyla bir geçici AgentThread oluşturur.

Bazı temel hizmetlerde depolanan konuşmalar/iş parçacıkları/yanıtlar, hizmetin bunu gerektirdiği durumlarda kalıcı olarak oluşturulabilir, örneğin Azure AI Aracıları veya OpenAI Yanıtları. Bunların temizlenmesi veya silinmesi kullanıcının sorumluluğundadır.

# Create a new thread.
thread = agent.get_new_thread()
# Run the agent with the thread.
response = await agent.run("Hello, how are you?", thread=thread)

# Run an agent with a temporary thread.
response = await agent.run("Hello, how are you?")

AgentThread Depolama

AgentThread örnekleri seri hale getirilebilir ve daha sonra kullanılmak üzere depolanabilir. Bu, farklı oturumlarda veya hizmet çağrılarında konuşma bağlamının korunmasını sağlar.

Konuşma geçmişinin bir hizmette depolandığı durumlarda, seri hale getirilen AgentThread hizmetteki konuşma geçmişine işaret eden bir kimlik içerir. Konuşma geçmişinin bellek içinde yönetildiği durumlarda, serileştirilmiş AgentThread iletilerin kendisini içerir.

# Create a new thread.
thread = agent.get_new_thread()
# Run the agent with the thread.
response = await agent.run("Hello, how are you?", thread=thread)

# Serialize the thread for storage.
serialized_thread = await thread.serialize()
# Deserialize the thread state after loading from storage.
resumed_thread = await agent.deserialize_thread(serialized_thread)

# Run the agent with the resumed thread.
response = await agent.run("Hello, how are you?", thread=resumed_thread)

Özel İleti Depoları

Bellek içi iş parçacıkları için, iletilerin nasıl depolandığını ve alınabileceğini denetlemek için özel bir ileti deposu uygulaması sağlayabilirsiniz:

from agent_framework import AgentThread, ChatMessageStore, ChatAgent
from agent_framework.azure import AzureAIAgentClient
from azure.identity.aio import AzureCliCredential

class CustomStore(ChatMessageStore):
    # Implement custom storage logic here
    pass

# You can also provide a custom message store factory when creating the agent
def custom_message_store_factory():
    return CustomStore()  # or your custom implementation

async with AzureCliCredential() as credential:
    agent = ChatAgent(
        chat_client=AzureAIAgentClient(async_credential=credential),
        instructions="You are a helpful assistant",
        chat_message_store_factory=custom_message_store_factory
    )
    # Or let the agent create one automatically
    thread = agent.get_new_thread()
    # thread.message_store is not a instance of CustomStore

Agent/AgentThread ilişkisi

Agents durumsuzdur ve aynı aracı örneği birden fazla AgentThread örneğiyle kullanılabilir.

Ancak tüm aracılar tüm AgentThread türleri desteklemez. Örneğin, OpenAI Cevaplar hizmeti ve bu aracı kullanan ChatAgent, store=True, AgentThread örnekleri, Azure AI Aracısı hizmetini kullanan bir ChatAgent ile çalışmaz. Bunun nedeni, bu hizmetlerin hem konuşma geçmişinin hizmete kaydedilmesini desteklemesi hem de iki AgentThread örneğin, her hizmetin depolanan konuşmasına yönelik referanslar içermesidir. Ancak, OpenAI Yanıtlar hizmetinden alınan kimlik Foundry Agent hizmetiyle kullanılamaz ve bu durumun tersi de geçerlidir.

Bu nedenle, temel alınan iş parçacığı modelinin ve etkilerinin farkında değilseniz, farklı bir temsilci örneğiyle bir temsilci tarafından oluşturulmuş bir AgentThread örneği kullanmak güvenli değildir.

Pratik Çok Dönüşlü Örnek

Birden çok etkileşimde bağlamı korumayı gösteren tam bir örnek aşağıda verilmiştir:

from agent_framework import ChatAgent
from agent_framework.azure import AzureAIAgentClient
from azure.identity.aio import AzureCliCredential

async def multi_turn_example():
    async with (
        AzureCliCredential() as credential,
        ChatAgent(
            chat_client=AzureAIAgentClient(async_credential=credential),
            instructions="You are a helpful assistant"
        ) as agent
    ):
        # Create a thread for persistent conversation
        thread = agent.get_new_thread()

        # First interaction
        response1 = await agent.run("My name is Alice", thread=thread)
        print(f"Agent: {response1.text}")

        # Second interaction - agent remembers the name
        response2 = await agent.run("What's my name?", thread=thread)
        print(f"Agent: {response2.text}")  # Should mention "Alice"

        # Serialize thread for storage
        serialized = await thread.serialize()

        # Later, deserialize and continue conversation
        new_thread = await agent.deserialize_thread(serialized)
        response3 = await agent.run("What did we talk about?", thread=new_thread)
        print(f"Agent: {response3.text}")  # Should remember previous context

Sonraki Adımlar