Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Fügen Sie Ihrem Agent Kontext hinzu, damit es sich an Benutzereinstellungen, vergangene Interaktionen oder externes Wissen erinnern kann.
Standardmäßig speichern Agenten den Chatverlauf in einem InMemoryChatHistoryProvider oder im zugrunde liegenden KI-Dienst, je nachdem, was der zugrunde liegende Dienst erfordert.
Der folgende Agent verwendet die OpenAI-Chat-Vervollständigung, die weder die Speicherung des Chatverlaufs unterstützt noch benötigt. Daher wird automatisch ein InMemoryChatHistoryProvider erstellt und verwendet.
using System;
using Azure.AI.Projects;
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 AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
.AsAIAgent(
model: deploymentName,
instructions: "You are a friendly assistant. Keep your answers brief.",
name: "MemoryAgent");
Warnung
DefaultAzureCredential ist praktisch für die Entwicklung, erfordert aber sorgfältige Überlegungen in der Produktion. Berücksichtigen Sie in der Produktion die Verwendung bestimmter Anmeldeinformationen (z. B. ManagedIdentityCredential), um Latenzprobleme, unbeabsichtigte Abfragen von Anmeldeinformationen und potenzielle Sicherheitsrisiken durch Ausweichmechanismen zu vermeiden.
Um ein benutzerdefiniertes ChatHistoryProvider zu verwenden, können Sie eines an die Agent-Optionen übergeben.
using System;
using Azure.AI.Projects;
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 AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
.AsAIAgent(model: deploymentName, options: new ChatClientAgentOptions()
{
ChatOptions = new() { Instructions = "You are a helpful assistant." },
ChatHistoryProvider = new CustomChatHistoryProvider()
});
Verwenden Sie eine Sitzung, um den Kontext über mehrere Läufe hinweg zu teilen.
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));
Tip
Eine voll ausgeführte Beispielanwendung finden Sie hier .
Das vollständige Beispiel definiert einen Kontextanbieter, fügt ihn einem Agent hinzu und verwendet eine Sitzung, um den Personalisierungszustand beizubehalten:
import asyncio
from typing import Any
from agent_framework import Agent, AgentSession, ContextProvider, SessionContext
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
class UserMemoryProvider(ContextProvider):
def __init__(self) -> None:
super().__init__("user_memory")
async def before_run(
self,
*,
agent: Any,
session: AgentSession | None,
context: SessionContext,
state: dict[str, Any],
) -> None:
user_name = state.get("user_name")
instructions = (
f"The user's name is {user_name}. Address them by name." if user_name else "Ask for the user's name."
)
context.extend_instructions(self.source_id, instructions)
async def after_run(
self,
*,
agent: Any,
session: AgentSession | None,
context: SessionContext,
state: dict[str, Any],
) -> None:
for message in context.input_messages:
text = message.text
if not isinstance(text, str):
continue
_, marker, name = text.lower().partition("my name is")
if marker and name.strip():
state["user_name"] = name.split()[0].capitalize()
async def main() -> None:
agent = Agent(
client=FoundryChatClient(
project_endpoint="https://your-account.services.ai.azure.com/api/projects/your-project",
model="gpt-6-luna",
credential=AzureCliCredential(),
),
instructions="You are a friendly assistant.",
context_providers=[UserMemoryProvider()],
)
session = agent.create_session()
print(await agent.run("Hello! What's the square root of 9?", session=session))
print(await agent.run("My name is Alice", session=session))
print(await agent.run("What is 2 + 2?", session=session))
if __name__ == "__main__":
asyncio.run(main())
Tip
Sehen Sie sich das vollständige Beispiel für die vollständige ausgeführte Datei an.
Note
In Python werden Persistenz und Speicher von den Implementierungen ContextProvider und HistoryProvider verwaltet.
InMemoryHistoryProvider ist der integrierte lokale Speicherverlaufsanbieter.
RawAgent kann InMemoryHistoryProvider() in bestimmten Fällen automatisch hinzufügen (z. B. wenn eine Sitzung ohne konfigurierte Kontextanbieter oder ohne dienstseitige Speicherindikatoren verwendet wird), jedoch ist dies nicht in allen Szenarien garantiert.
Wenn Sie immer lokale Persistenz wünschen, fügen Sie eine explizite InMemoryHistoryProvider Hinzulage hinzu. Stellen Sie außerdem sicher, dass nur ein Verlaufsanbieter über load_messages=True verfügt, damit Sie nicht mehrere Speicher in demselben Aufruf zurückspielen.
Erstellen Sie einen Projektclient und einen Speicher, indem Sie dem Artikel Verwaltetes semantisches Gedächtnis von Microsoft Foundry folgen. Kombinieren Sie dann den lokalen Transkriptverlauf, verwalteten Arbeitsspeicher und einen Audit-Speicher:
from agent_framework import InMemoryHistoryProvider
from agent_framework.foundry import FoundryMemoryProvider
history = InMemoryHistoryProvider(load_messages=True)
memory = FoundryMemoryProvider(
project_client=project_client,
memory_store_name="user-memory",
scope="user-123",
)
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=[history, memory, audit_store], # audit store last
)
Standardmäßig verwenden Agents abhängig vom Anbieter und der Sitzung entweder den lokalen Speicherverlauf oder den vom Dienst verwalteten Verlauf.
Der folgende Foundry-Agent verwendet eine projektgestützte Modellbereitstellung. Fügen Sie einen Kontextanbieter hinzu, wenn Sie anwendungsspezifischen Speicher- oder Personalisierungsstatus über den Unterhaltungsverlauf hinaus wünschen.
a := foundryprovider.NewAgent(
endpoint,
token,
foundryprovider.ModelDeployment(model),
foundryprovider.AgentConfig{
Instructions: "You are a friendly assistant. Keep your answers brief.",
Config: agent.Config{
Name: "MemoryAgent",
},
},
)
Definieren Sie einen Kontextanbieter, der Benutzerinformationen im Sitzungszustand speichert, und fügt Personalisierungsanweisungen ein:
import (
"context"
"fmt"
"strings"
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/message"
)
const userMemorySourceID = "user_memory"
type providerState struct {
UserName string `json:"user_name,omitempty"`
}
func newUserMemoryProvider() agent.ContextProvider {
return agent.NewContextProvider(agent.ContextProviderConfig{
SourceID: userMemorySourceID,
Provide: provideUserMemory,
Store: storeUserMemory,
})
}
func provideUserMemory(ctx context.Context, invoking agent.InvokingContext) ([]*message.Message, []agent.Option, error) {
session, _ := agent.GetOption(invoking.Options, agent.WithSession)
var state providerState
_, _ = session.Get(userMemorySourceID, &state)
instructions := "You don't know the user's name yet. Ask for it politely."
if state.UserName != "" {
instructions = fmt.Sprintf("The user's name is %s. Always address them by name.", state.UserName)
}
return nil, []agent.Option{agent.WithInstructions(instructions)}, nil
}
func storeUserMemory(ctx context.Context, invoked agent.InvokedContext) error {
session, _ := agent.GetOption(invoked.Options, agent.WithSession)
var state providerState
_, _ = session.Get(userMemorySourceID, &state)
for _, msg := range invoked.RequestMessages {
text := strings.TrimSpace(msg.Contents.Text())
lower := strings.ToLower(text)
if idx := strings.Index(lower, "my name is"); idx >= 0 {
parts := strings.Fields(text[idx+len("my name is"):])
if len(parts) == 0 {
continue
}
state.UserName = strings.Trim(parts[0], ".,!?")
session.Set(userMemorySourceID, state)
break
}
}
return nil
}
Erstellen Sie einen Agent mit dem Kontextanbieter:
a := foundryprovider.NewAgent(
endpoint,
token,
foundryprovider.ModelDeployment(model),
foundryprovider.AgentConfig{
Instructions: "You are a friendly assistant.",
Config: agent.Config{
Name: "MemoryAgent",
ContextProviders: []agent.ContextProvider{newUserMemoryProvider()},
},
},
)
Führen Sie es aus – der Agent hat jetzt Zugriff auf den Kontext:
ctx := context.Background()
session, err := a.CreateSession(ctx)
if err != nil {
panic(err)
}
// The provider doesn't know the user yet.
resp, err := a.RunText(ctx, "Hello, what is the square root of 9?", agent.WithSession(session)).Collect()
fmt.Println(resp, err)
// Teach the provider the user's name.
resp, err = a.RunText(ctx, "My name is Alice", agent.WithSession(session)).Collect()
fmt.Println(resp, err)
// Subsequent calls are personalized using session state.
resp, err = a.RunText(ctx, "What is 2 + 2?", agent.WithSession(session)).Collect()
fmt.Println(resp, err)
Tip
Sehen Sie sich das vollständige Beispiel für die vollständige ausgeführte Datei an.
Nächste Schritte
Gehen Sie tiefer:
- Beständiger Speicher – Speichern von Unterhaltungen in Datenbanken
- Chatverlauf – Verwalten des Chatverlaufs und des Speichers