Delen via


Gesprekken met meerdere rondes en threading in Microsoft Agent Framework.

Het Microsoft Agent Framework biedt ingebouwde ondersteuning voor het beheren van meerlaagse gesprekken met AI-agents. Dit omvat het onderhouden van context voor meerdere interacties. Verschillende agenttypen en onderliggende services die worden gebruikt om agents te bouwen, kunnen verschillende threadingtypen ondersteunen en het agentframework abstraheert deze verschillen weg, waardoor ontwikkelaars een consistente interface bieden.

Wanneer u bijvoorbeeld een ChatClientAgent gebruikt die gebaseerd is op een foundry-agent, wordt de gespreksgeschiedenis in de service opgeslagen. Wanneer u een ChatClientAgent gebruikt op basis van chatvoltooiing met gpt-4.1, is de gespreksgeschiedenis in het geheugen en wordt beheerd door de agent.

Het AgentThread type is de abstractie die een gespreksthread met een agent vertegenwoordigt. AIAgent exemplaren zijn staatloos en hetzelfde agentexemplaren kunnen worden gebruikt met meerdere AgentThread exemplaren. Alle status blijft dus in de AgentThread. Een AgentThread kan zowel de chatgeschiedenis vertegenwoordigen als een andere status die de agent moet behouden voor meerdere interacties. De chatgeschiedenis kan worden opgeslagen in de thread zelf of op afstand, met alleen AgentThread een verwijzing naar de externe chatgeschiedenis. De AgentThread status kan ook herinneringen of verwijzingen naar op afstand opgeslagen herinneringen bevatten.

Aanbeveling

Zie De chatgeschiedenis en het geheugen van de agent voor meer informatie over chatgeschiedenis en geheugen in het Agent Framework.

AgentThread maken

AgentThread exemplaren kunnen op twee manieren worden gemaakt:

  1. Door `GetNewThread` op de agent aan te roepen.
  2. Door de agent uit te voeren zonder AgentThread te verstrekken. In dit geval maakt de agent een throwaway AgentThread met een onderliggende thread die alleen wordt gebruikt voor de duur van de uitvoering.

Sommige onderliggende threads kunnen persistent gecreëerd worden in een onderliggende service, waar de service dit vereist. Bijvoorbeeld: Foundry Agents of OpenAI-reacties. Het opschonen of verwijderen van deze threads is de verantwoordelijkheid van de gebruiker.

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

AgentThread instanties kunnen worden geserialiseerd en opgeslagen voor later gebruik. Dit maakt het behoud van gesprekscontext mogelijk voor verschillende sessies of serviceoproepen.

Voor gevallen waarin de gespreksgeschiedenis wordt opgeslagen in een service, bevat de geserialiseerde AgentThread id van de thread in de service. Voor gevallen waarin de gespreksgeschiedenis in het geheugen wordt beheerd, bevat de geserialiseerde AgentThread berichten zelf.

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

Het Microsoft Agent Framework biedt ingebouwde ondersteuning voor het beheren van meerlaagse gesprekken met AI-agents. Dit omvat het onderhouden van context voor meerdere interacties. Verschillende agenttypen en onderliggende services die worden gebruikt voor het bouwen van agents, kunnen verschillende threadingtypen ondersteunen en het Agent Framework abstraheert deze verschillen weg, wat een consistente interface biedt voor ontwikkelaars.

Wanneer u bijvoorbeeld een ChatAgent op een Foundry-agent gebaseerde gebruikt, wordt de gespreksgeschiedenis in de service bewaard. Wanneer je een ChatAgent gebruikt op basis van chatvoltooiing met gpt-4, bevindt de gespreksgeschiedenis zich in het geheugen en wordt beheerd door de agent.

De verschillen tussen de onderliggende threading-modellen worden geabstraheerd via het type AgentThread.

Agent/AgentThread-relatie

AIAgent exemplaren zijn staatloos en hetzelfde agentexemplaren kunnen worden gebruikt met meerdere AgentThread exemplaren.

Niet alle agents ondersteunen echter alle threadtypen. Als u bijvoorbeeld een ChatClientAgent samen met de service voor antwoorden gebruikt, zullen AgentThread-exemplaren die door deze agent zijn gemaakt, niet werken met een ChatClientAgent die gebruikmaakt van de Foundry Agent-service. Dit komt doordat deze services zowel het opslaan van de gespreksgeschiedenis in de service ondersteunen, en de AgentThread heeft slechts een verwijzing naar deze door de service beheerde thread.

Het wordt daarom als onveilig beschouwd om een AgentThread exemplaar te gebruiken dat is gemaakt door één agent met een ander agentexemplaar, tenzij u op de hoogte bent van het onderliggende threadingmodel en de gevolgen ervan.

Threading-ondersteuning per service/protocol

Dienst Ondersteuning voor threading
Gieterij-agenten Door de dienst beheerde blijvende threads
OpenAI-antwoorden Door de service beheerde permanente threads OF threads in het geheugen
OpenAI ChatCompletion Threads in het geheugen
OpenAI-assistenten Door de service beheerde threads
A2A Door de service beheerde threads

AgentThread maken

AgentThread exemplaren kunnen op twee manieren worden gemaakt:

  1. Door `get_new_thread()` op de agent aan te roepen.
  2. Door de agent uit te voeren zonder AgentThread te verstrekken. In dit geval maakt de agent een throwaway AgentThread met een onderliggende thread die alleen wordt gebruikt voor de duur van de uitvoering.

Sommige onderliggende threads kunnen permanent worden gemaakt in een onderliggende service, waarbij de service dit vereist, bijvoorbeeld Azure AI-agents of OpenAI-antwoorden. Het opschonen of verwijderen van deze threads is de verantwoordelijkheid van de gebruiker.

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

AgentThread instanties kunnen worden geserialiseerd en opgeslagen voor later gebruik. Dit maakt het behoud van gesprekscontext mogelijk voor verschillende sessies of serviceoproepen.

Voor gevallen waarin de gespreksgeschiedenis wordt opgeslagen in een service, bevat de geserialiseerde AgentThread id van de thread in de service. Voor gevallen waarin de gespreksgeschiedenis in het geheugen wordt beheerd, bevat de geserialiseerde AgentThread berichten zelf.

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

Aangepaste berichtenarchieven

Voor threads in het geheugen kunt u een aangepaste implementatie van het berichtenarchief opgeven om te bepalen hoe berichten worden opgeslagen en opgehaald:

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

Agents zijn staatloos en hetzelfde agentexemplaar kan worden gebruikt met meerdere AgentThread exemplaren.

Niet alle agents ondersteunen echter alle threadtypen. Als u bijvoorbeeld een ChatAgent met de OpenAI Responses-service gebruikt en store=True, AgentThread instanties die door deze agent worden gebruikt, zullen niet werken met een ChatAgent die de Azure AI Agent-service gebruikt, omdat de thread_ids niet compatibel zijn.

Het wordt daarom als onveilig beschouwd om een AgentThread exemplaar te gebruiken dat is gemaakt door één agent met een ander agentexemplaar, tenzij u op de hoogte bent van het onderliggende threadingmodel en de gevolgen ervan.

Praktisch voorbeeld van meerdere rondes

Hier volgt een volledig voorbeeld waarin wordt getoond hoe u context kunt onderhouden voor meerdere interacties:

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

Volgende stappen