Поделиться через


Многоэтапные беседы и потоки в Microsoft Agent Framework

Microsoft Agent Framework обеспечивает встроенную поддержку управления многоэтапными беседами с агентами ИИ. Это включает в себя поддержание контекста в нескольких взаимодействиях. Различные типы агентов и базовые службы, используемые для создания агентов, могут поддерживать различные типы потоков, а платформа агента абстрагирует эти различия, предоставляя согласованный интерфейс для разработчиков.

Например, при использовании ChatClientAgent на основе агента фабрики, история бесед сохраняется в службе. Хотя при использовании ChatClientAgent на основе завершения чата с gpt-4.1 журнал бесед находится в памяти и управляется агентом.

Различия между базовыми моделями потоков абстрагируются через тип AgentThread.

Создание AgentThread

AgentThread Экземпляры можно создать двумя способами:

  1. Вызывая GetNewThread агент.
  2. Запустив агент и не предоставляя AgentThread. В этом случае агент создаст исключение AgentThread с базовым потоком, который будет использоваться только в течение выполнения.

Некоторые базовые потоки выполнения могут постоянно создаваться в базовой службе, где это необходимо, например, для агентов Foundry или ответов OpenAI. Любая очистка или удаление этих потоков является ответственностью пользователя.

// 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

AgentThread экземпляры можно сериализовать и сохранить для последующего использования. Это позволяет сохранять контекст беседы в разных сеансах или вызовах служб.

В случаях, когда журнал бесед хранится в службе, сериализованный AgentThread будет содержать идентификатор потока в службе. В случаях, когда журнал бесед управляется в памяти, сериализованный AgentThread будет содержать сами сообщения.

// 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 обеспечивает встроенную поддержку управления многоэтапными беседами с агентами ИИ. Это включает в себя поддержание контекста в нескольких взаимодействиях. Различные типы агентов и базовые службы, используемые для создания агентов, могут поддерживать различные типы потоков, а платформа агента абстрагирует эти различия, предоставляя согласованный интерфейс для разработчиков.

Например, при использовании ChatAgent агента Foundry журнал бесед сохраняется в службе. Хотя при использовании ChatAgent на основе завершения чата с gpt-4 журнал бесед находится в памяти и управляется агентом.

Различия между базовыми моделями потоков абстрагируются через тип AgentThread.

Отношение Agent/AgentThread

AIAgent экземпляры являются без сохранения состояния, и один и тот же экземпляр агента можно использовать с несколькими AgentThread экземплярами.

Но не все агенты поддерживают все типы потоков. Например, если вы используете ChatClientAgent службу обработки ответов, экземпляры, созданные этим агентом, AgentThread не будут работать с ChatClientAgent службой Foundry Agent. Это связано с тем, что обе службы способны сохранять историю бесед, и AgentThread содержит только ссылку на этот управляемый поток.

Поэтому считается небезопасным для использования экземпляра AgentThread , созданного одним агентом с другим экземпляром агента, если вы не знаете о базовой модели потоков и ее последствиях.

Поддержка потоков для службы / протокола

Услуга Поддержка потоков
Агенты Foundry Управляемые потоки службы
Ответы OpenAI Управляемые службой постоянные потоки или потоки в памяти
OpenAI ChatCompletion Потоки в оперативной памяти
Помощники OpenAI Потоки, управляемые службой
A2A Потоки, управляемые службой

Создание AgentThread

AgentThread Экземпляры можно создать двумя способами:

  1. Вызывая get_new_thread() агент.
  2. Запустив агент и не предоставляя AgentThread. В этом случае агент создаст исключение AgentThread с базовым потоком, который будет использоваться только в течение выполнения.

Некоторые базовые потоки могут постоянно создаваться в базовой службе, где служба требует этого, например агенты ИИ Azure или ответы OpenAI. Любая очистка или удаление этих потоков является ответственностью пользователя.

# 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

AgentThread экземпляры можно сериализовать и сохранить для последующего использования. Это позволяет сохранять контекст беседы в разных сеансах или вызовах служб.

В случаях, когда журнал бесед хранится в службе, сериализованный AgentThread будет содержать идентификатор потока в службе. В случаях, когда журнал бесед управляется в памяти, сериализованный AgentThread будет содержать сами сообщения.

# 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)

Пользовательские хранилища сообщений

Для потоков в памяти можно предоставить реализацию пользовательского хранилища сообщений для управления хранением и извлечением сообщений:

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

Agents являются без состояния, и один и тот же экземпляр агента можно использовать с несколькими экземплярами AgentThread.

Но не все агенты поддерживают все типы потоков. Например, если вы используете ChatAgent службу "Ответы OpenAI" и store=TrueAgentThread экземпляры, используемые этим агентом, не будут работать с ChatAgent службой агента ИИ Azure, так как thread_ids несовместимы.

Поэтому считается небезопасным для использования экземпляра AgentThread , созданного одним агентом с другим экземпляром агента, если вы не знаете о базовой модели потоков и ее последствиях.

Практический пример с несколькими поворотами

Ниже приведен полный пример, показывающий, как поддерживать контекст в нескольких взаимодействиях:

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

Дальнейшие шаги