Bagikan melalui


Microsoft Agent Framework Percakapan Multi-Giliran

Microsoft Agent Framework menyediakan dukungan bawaan untuk mengelola percakapan multi-giliran dengan agen AI. Ini termasuk mempertahankan konteks di beberapa interaksi. Berbagai jenis agen dan layanan dasar yang digunakan untuk membangun agen mungkin mendukung jenis penyimpanan riwayat obrolan yang berbeda, dan Agent Framework mengabstraksi perbedaan ini, menyediakan antarmuka yang konsisten untuk pengembang.

Misalnya, saat menggunakan ChatClientAgent yang didasarkan pada layanan foundry, riwayat obrolan disimpan dalam layanan tersebut. Saat menggunakan ChatClientAgent berdasarkan penyelesaian obrolan dengan "gpt-4.1", riwayat obrolan berada dalam memori dan dikelola oleh agen.

Jenisnya AgentSession adalah abstraksi yang mewakili riwayat obrolan dan status agen lainnya. AIAgent instans tidak memiliki status, instans agen yang sama dapat digunakan dengan beberapa AgentSession instans. Semua status oleh karena itu dipertahankan dalam AgentSession. Sebuah AgentSession dapat mewakili riwayat obrolan serta status lain yang perlu dijaga oleh agen selama beberapa interaksi. Riwayat obrolan dapat disimpan dalam objek AgentSession itu sendiri, atau secara jarak jauh, dengan AgentSession hanya berisi referensi ke riwayat obrolan jarak jauh. Status AgentSession juga dapat mencakup ingatan atau referensi ke ingatan yang disimpan secara jarak jauh.

Tip

Untuk mempelajari selengkapnya tentang Riwayat Obrolan dan Memori di Kerangka Kerja Agen, lihat Riwayat Obrolan agen dan Memori.

Pembuatan AgentSession

AgentSession instance dapat dibuat dengan dua cara:

  1. Dengan memanggil GetNewSessionAsync pada agen tersebut.
  2. Dengan menjalankan agen dan tidak menyediakan AgentSession. Dalam hal ini, agen akan membuat "throwaway" AgentSession yang hanya akan digunakan selama proses berjalan.

Beberapa percakapan/utas/respons yang disimpan di layanan yang mendasarinya mungkin secara terus menerus dibuat di layanan tersebut, jika layanan membutuhkannya, misalnya Agen Foundry atau Respons OpenAI. Setiap pembersihan atau penghapusan ini adalah tanggung jawab pengguna.

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

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

Penyimpanan AgentSession

AgentSession instans dapat diserialisasikan, dan disimpan untuk digunakan nanti. Hal ini memungkinkan pelestarian konteks percakapan di berbagai sesi atau panggilan layanan.

Untuk kasus di mana riwayat percakapan disimpan dalam layanan, yang diserialisasikan AgentSession akan berisi id yang menunjuk ke riwayat percakapan dalam layanan. Untuk kasus di mana riwayat percakapan dikelola dalam memori, serial AgentSession akan berisi pesan itu sendiri.

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

// Serialize the session for storage.
JsonElement serializedSession = session.Serialize();
// Deserialize the session state after loading from storage.
AgentSession resumedSession = await agent.DeserializeSessionAsync(serializedSession);

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

Microsoft Agent Framework menyediakan dukungan bawaan untuk mengelola percakapan multi-giliran dengan agen AI. Ini termasuk mempertahankan konteks di beberapa interaksi. Berbagai jenis agen dan layanan mendasar yang digunakan untuk membangun agen mungkin mendukung jenis riwayat obrolan yang berbeda, dan Agent Framework mengabstraksi perbedaan ini, menyediakan antarmuka yang konsisten untuk pengembang.

Misalnya, saat menggunakan ChatAgent berdasarkan agen Foundry, riwayat percakapan disimpan di layanan. Saat menggunakan ChatAgent yang didasarkan pada penyelesaian obrolan dengan gpt-4, riwayat percakapan disimpan dalam memori dan dikelola oleh agen.

Perbedaan antara model riwayat obrolan yang mendasar diabstraksi melalui jenis AgentSession.

Hubungan Agent/AgentSession

AIAgent instans tidak memiliki status, instans agen yang sama dapat digunakan dengan beberapa AgentSession instans.

Tidak semua agen mendukung semua AgentSession jenis sekalipun. Misalnya jika Anda menggunakan ChatClientAgent dengan layanan tanggapan, instans AgentSession yang dibuat oleh agen ini tidak kompatibel dengan ChatClientAgent yang menggunakan layanan Agen Foundry. Ini karena kedua layanan ini mendukung penyimpanan riwayat percakapan di dalam layanan, dan walaupun kedua instans AgentSession tersebut akan memiliki referensi ke setiap percakapan tersimpan dari masing-masing layanan, ID dari layanan respons tidak dapat digunakan dengan layanan Agen Foundry, dan sebaliknya.

Oleh karena itu dianggap tidak aman untuk menggunakan AgentSession instans yang dibuat oleh satu agen dengan instans agen yang berbeda, kecuali Anda mengetahui model riwayat obrolan yang mendasar dan implikasinya.

Dukungan riwayat obrolan menurut layanan / protokol

Pelayanan Dukungan Riwayat Obrolan
Agen Peleburan Riwayat obrolan persisten yang disimpan layanan
Respons OpenAI Rantai respons tersimpan layanan ATAU riwayat obrolan dalam memori
OpenAI ChatCompletion Riwayat obrolan dalam-ingatan
Asisten OpenAI Riwayat obrolan persisten yang disimpan layanan
A2A Riwayat obrolan persisten yang disimpan layanan

Pembuatan AgentThread

AgentThread instance dapat dibuat dengan dua cara:

  1. Dengan memanggil get_new_thread() pada agen tersebut.
  2. Dengan menjalankan agen dan tidak menyediakan AgentThread. Dalam hal ini agen akan membuat throwaway AgentThread dengan utas yang mendasarinya yang hanya akan digunakan selama eksekusi.

Beberapa percakapan/utas/respons mungkin disimpan secara permanen oleh layanan yang mendasari, jika layanan tersebut membutuhkannya, misalnya pada Agen Azure AI atau Respons OpenAI. Setiap pembersihan atau penghapusan ini adalah tanggung jawab pengguna.

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

AgentThread instans dapat diserialisasikan, dan disimpan untuk digunakan nanti. Hal ini memungkinkan pelestarian konteks percakapan di berbagai sesi atau panggilan layanan.

Untuk kasus di mana riwayat percakapan disimpan dalam layanan, yang diserialisasikan AgentThread akan berisi id yang menunjuk ke riwayat percakapan dalam layanan. Untuk kasus di mana riwayat percakapan dikelola dalam memori, serial AgentThread akan berisi pesan itu sendiri.

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

Toko Pesan Kustom

Untuk utas dalam memori, Anda dapat menyediakan implementasi penyimpanan pesan kustom untuk mengontrol bagaimana pesan disimpan dan diambil:

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

Hubungan Agent/AgentThread

Agents bersifat stateless dan instance agen yang sama dapat digunakan dengan beberapa instance AgentThread.

Tidak semua agen mendukung semua AgentThread jenis sekalipun. Misalnya jika Anda menggunakan ChatAgent dengan layanan Respons OpenAI dan store=True, AgentThread instans yang digunakan agen ini, tidak akan berfungsi dengan ChatAgent yang menggunakan layanan Agen Azure AI. Ini karena kedua layanan ini mendukung penyimpanan riwayat percakapan dalam layanan, dan meskipun kedua instans AgentThread akan memiliki referensi ke setiap percakapan yang disimpan oleh layanan, ID dari layanan Respons OpenAI tidak dapat digunakan dengan layanan Agen Foundry, dan begitu pula sebaliknya.

Oleh karena itu, dianggap tidak aman untuk menggunakan instans AgentThread yang dibuat oleh satu agen dengan instans agen yang berbeda, kecuali Anda memahami model threading yang mendasarinya dan implikasinya.

Contoh Praktis Multi-Giliran

Berikut adalah contoh lengkap yang menunjukkan cara mempertahankan konteks di beberapa interaksi:

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

Langkah selanjutnya