Bagikan melalui


Langkah 4: Memori & Persistensi

Tambahkan konteks ke agen Anda sehingga dapat mengingat preferensi pengguna, interaksi sebelumnya, atau pengetahuan eksternal.

Secara bawaan, agen akan menyimpan riwayat obrolan dalam InMemoryChatHistoryProvider atau di layanan AI yang digunakan, tergantung pada kebutuhan layanan tersebut.

Agen berikut menggunakan OpenAI Chat Completion, yang tidak mendukung atau memerlukan penyimpanan riwayat obrolan dalam layanan sehingga secara otomatis membuat dan menggunakan InMemoryChatHistoryProvider.

using System;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;

var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
    ?? throw new InvalidOperationException("Set AZURE_OPENAI_ENDPOINT");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";

AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new AzureCliCredential())
    .GetChatClient(deploymentName)
    .AsAIAgent(instructions: "You are a friendly assistant. Keep your answers brief.", name: "MemoryAgent");

Untuk menggunakan ChatHistoryProvider kustom, Anda dapat meneruskannya ke opsi agen:

using System;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;

var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
    ?? throw new InvalidOperationException("Set AZURE_OPENAI_ENDPOINT");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";

AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new AzureCliCredential())
    .GetChatClient(deploymentName)
    .AsAIAgent(new ChatClientAgentOptions()
    {
        ChatOptions = new() { Instructions = "You are a helpful assistant." },
        ChatHistoryProvider = new CustomChatHistoryProvider()
    });

Gunakan sesi untuk berbagi konteks di seluruh proses:

AgentSession session = await agent.CreateSessionAsync();

Console.WriteLine(await agent.RunAsync("Hello! What's the square root of 9?", session));
Console.WriteLine(await agent.RunAsync("My name is Alice", session));
Console.WriteLine(await agent.RunAsync("What is my name?", session));

Petunjuk / Saran

Lihat di sini untuk aplikasi sampel lengkap yang dapat dijalankan.

Tentukan penyedia konteks yang menyimpan info pengguna dalam status sesi dan menyuntikkan instruksi personalisasi:

class UserMemoryProvider(BaseContextProvider):
    """A context provider that remembers user info in session state."""

    DEFAULT_SOURCE_ID = "user_memory"

    def __init__(self):
        super().__init__(self.DEFAULT_SOURCE_ID)

    async def before_run(
        self,
        *,
        agent: Any,
        session: AgentSession | None,
        context: SessionContext,
        state: dict[str, Any],
    ) -> None:
        """Inject personalization instructions based on stored user info."""
        user_name = state.get("user_name")
        if user_name:
            context.extend_instructions(
                self.source_id,
                f"The user's name is {user_name}. Always address them by name.",
            )
        else:
            context.extend_instructions(
                self.source_id,
                "You don't know the user's name yet. Ask for it politely.",
            )

    async def after_run(
        self,
        *,
        agent: Any,
        session: AgentSession | None,
        context: SessionContext,
        state: dict[str, Any],
    ) -> None:
        """Extract and store user info in session state after each call."""
        for msg in context.input_messages:
            text = msg.text if hasattr(msg, "text") else ""
            if isinstance(text, str) and "my name is" in text.lower():
                state["user_name"] = text.lower().split("my name is")[-1].strip().split()[0].capitalize()

Buat agen dengan penyedia konteks:

credential = AzureCliCredential()
client = AzureOpenAIResponsesClient(
    project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
    deployment_name=os.environ["AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME"],
    credential=credential,
)

agent = client.as_agent(
    name="MemoryAgent",
    instructions="You are a friendly assistant.",
    context_providers=[UserMemoryProvider()],
)

Jalankan — agen sekarang memiliki akses ke konteks:

session = agent.create_session()

# The provider doesn't know the user yet — it will ask for a name
result = await agent.run("Hello! What's the square root of 9?", session=session)
print(f"Agent: {result}\n")

# Now provide the name — the provider stores it in session state
result = await agent.run("My name is Alice", session=session)
print(f"Agent: {result}\n")

# Subsequent calls are personalized — name persists via session state
result = await agent.run("What is 2 + 2?", session=session)
print(f"Agent: {result}\n")

# Inspect session state to see what the provider stored
provider_state = session.state.get("user_memory", {})
print(f"[Session State] Stored user name: {provider_state.get('user_name')}")

Petunjuk / Saran

Lihat sampel lengkap untuk file lengkap yang dapat dijalankan.

Nota

Di Python, persistensi/memori ditangani oleh penyedia Konteks dan Riwayat. A BaseHistoryProvider juga merupakan BaseContextProvider, dan InMemoryHistoryProvider merupakan implementasi lokal dalam memori bawaan. RawAgent dapat menambahkan InMemoryHistoryProvider() secara otomatis dalam kasus tertentu (misalnya, saat menggunakan sesi tanpa penyedia konteks yang dikonfigurasi dan tidak ada indikator penyimpanan sisi layanan), tetapi ini tidak dijamin dalam semua skenario. Jika Anda selalu menginginkan persistensi lokal, tambahkan InMemoryHistoryProvider secara eksplisit. Pastikan juga hanya satu penyedia riwayat yang memiliki load_messages=True, sehingga Anda tidak memutar ulang beberapa toko ke dalam pemanggilan yang sama.

Anda juga dapat menambahkan penyimpanan audit dengan menambahkan penyedia riwayat lain di akhir daftar context_providers dengan store_context_messages=True:

from agent_framework import InMemoryHistoryProvider
from agent_framework.mem0 import Mem0ContextProvider

memory_store = InMemoryHistoryProvider(load_messages=True) # add a history provider for persistence across sessions
agent_memory = Mem0ContextProvider("user-memory", api_key=..., agent_id="my-agent")  # add Mem0 provider for agent memory
audit_store = InMemoryHistoryProvider(
    "audit",
    load_messages=False,
    store_context_messages=True,  # include context added by other providers
)

agent = client.as_agent(
    name="MemoryAgent",
    instructions="You are a friendly assistant.",
    context_providers=[memory_store, agent_memory, audit_store],  # audit store last
)

Langkah selanjutnya

Masuk lebih dalam: