Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Microsoft Agent Framework обеспечивает встроенную поддержку управления многоэтапными беседами с агентами ИИ. Это включает в себя поддержание контекста в нескольких взаимодействиях. Различные типы агентов и базовые службы, используемые для создания агентов, могут поддерживать различные типы потоков, а платформа агента абстрагирует эти различия, предоставляя согласованный интерфейс для разработчиков.
Например, при использовании ChatClientAgent на основе агента фабрики, история бесед сохраняется в службе. Хотя при использовании ChatClientAgent на основе завершения чата с gpt-4.1 журнал бесед находится в памяти и управляется агентом.
Различия между базовыми моделями потоков абстрагируются через тип AgentThread.
Создание AgentThread
AgentThread Экземпляры можно создать двумя способами:
- Вызывая
GetNewThreadагент. - Запустив агент и не предоставляя
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 Экземпляры можно создать двумя способами:
- Вызывая
get_new_thread()агент. - Запустив агент и не предоставляя
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