Freigeben über


Speicheranbieter für Chatverlauf

Dies ChatHistoryMemoryProvider ist ein KI-Kontextanbieter, der den gesamten Chatverlauf in einem Vektorspeicher speichert und verwandte Nachrichten abruft, um die aktuelle Unterhaltung zu erweitern. Auf diese Weise können Agents relevante Kontexte aus früheren Interaktionen mithilfe der semantischen Ähnlichkeitssuche zurückrufen.

So funktioniert es

Der Anbieter arbeitet in zwei Phasen:

  1. Speicher: Nach jedem Agentaufruf werden neue Anforderungs- und Antwortnachrichten im Vektorspeicher mit Einbettungen gespeichert, die aus ihrem Inhalt generiert werden.

  2. Abruf: Vor jedem Aufruf (oder bei Bedarf über Funktionsaufrufe) durchsucht der Anbieter den Vektorspeicher nach Nachrichten semantisch ähnlich der aktuellen Benutzereingabe und fügt sie als Kontext ein.

Gespeicherte Nachrichten werden mit konfigurierbaren Bezeichnern (Anwendung, Agent, Benutzer, Sitzung) festgelegt, sodass präzise Kontrolle über den gespeicherten und durchsuchbaren Verlauf ermöglicht wird.

Voraussetzungen

Tipp

Weitere Informationen zur VectorData-Abstraktion und verfügbaren Implementierungen finden Sie in der Integrationsdokumentation zu Vector Stores.

Verwendung

Im folgenden Beispiel wird die Erstellung eines Agenten unter Verwendung eines ChatHistoryMemoryProvider Vektorspeichers im Arbeitsspeicher veranschaulicht.

Beachten Sie die Verwendung der einzigen Benutzer-ID für den Suchbereich. Auf diese Weise kann der Agent Informationen aus früheren Unterhaltungen mit demselben Benutzer zurückrufen, um neue Antworten zu informieren.

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;

var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") 
    ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
var embeddingDeploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME") 
    ?? "text-embedding-3-large";

// Create a vector store with an embedding generator.
// For production, replace InMemoryVectorStore with a persistent store.
VectorStore vectorStore = new InMemoryVectorStore(new InMemoryVectorStoreOptions()
{
    EmbeddingGenerator = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
        .GetEmbeddingClient(embeddingDeploymentName)
        .AsIEmbeddingGenerator()
});

// Create the agent with ChatHistoryMemoryProvider
AIAgent agent = new AzureOpenAIClient(
    new Uri(endpoint),
    new DefaultAzureCredential())
    .GetChatClient(deploymentName)
    .AsAIAgent(new ChatClientAgentOptions
    {
        ChatOptions = new() { Instructions = "You are a helpful assistant." },
        Name = "MemoryAgent",
        AIContextProviders = [new ChatHistoryMemoryProvider(
            vectorStore,
            collectionName: "chathistory",
            vectorDimensions: 3072,
            session => new ChatHistoryMemoryProvider.State(
                // Configure where messages are stored
                storageScope: new() { UserId = "user-123", SessionId = Guid.NewGuid().ToString() },
                // Configure where to search (can be broader than storage scope)
                searchScope: new() { UserId = "user-123" }))]
    });

// Start a session and interact with the agent
AgentSession session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("I prefer window seats on flights.", session));

// Start a new session - the agent can recall the user's preference
AgentSession session2 = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("Book me a flight to Seattle.", session2));

Tipp

Verwenden Sie unterschiedliche storageScope Konfigurationen searchScope , um die Speicherisolation zu steuern. Speichern Sie z. B. pro Sitzung, suchen Sie aber in allen Sitzungen nach einem Benutzer.

Konfigurationsoptionen

Die ChatHistoryMemoryProviderOptions Klasse stellt die Konfiguration für das Anbieterverhalten bereit.

Suchverhalten

Auswahl Typ Vorgabe Beschreibung
SearchTime SearchBehavior BeforeAIInvoke Steuert, wann die Speichersuche ausgeführt wird.

Die SearchBehavior Enum hat zwei mögliche Werte:

  • BeforeAIInvoke: Sucht automatisch vor jedem KI-Aufruf nach relevanten Erinnerungen und fügt sie als Kontextnachrichten ein. Dies ist das Standardverhalten.
  • OnDemandFunctionCalling: Macht ein Funktionstool verfügbar, das das KI-Modell aufrufen kann, um Erinnerungen bei Bedarf zu durchsuchen. Verwenden Sie dies, wenn Das Modell entscheiden soll, wann Erinnerungen zurückrufen sollen.

Suchergebnisoptionen

Auswahl Typ Vorgabe Beschreibung
MaxResults int? 3 Maximale Anzahl von Chatverlaufsergebnissen, die pro Suche abgerufen werden sollen.
ContextPrompt string? "## Memories\nConsider the following memories..." Der Eingabeaufforderungstext, der vor dem Einfügen den Suchergebnissen vorangestellt ist.

On-Demand-Funktionstooloptionen

Diese Optionen gelten nur, wenn SearchTime auf OnDemandFunctionCalling gesetzt ist.

Auswahl Typ Vorgabe Beschreibung
FunctionToolName string? "Search" Der Name des Suchfunktionstools, das für das Modell verfügbar gemacht wird.
FunctionToolDescription string? "Allows searching for related previous chat history..." Die Beschreibung des Suchfunktionstools.

Nachrichtenfilterung

Auswahl Typ Vorgabe Beschreibung
SearchInputMessageFilter Func<IEnumerable<ChatMessage>, IEnumerable<ChatMessage>>? Nur externe Nachrichten Filter, der beim Erstellen von Suchabfragen auf Anforderungsmeldungen angewendet wird.
StorageInputRequestMessageFilter Func<IEnumerable<ChatMessage>, IEnumerable<ChatMessage>>? Nur externe Nachrichten Filter, der auf Anforderungsnachrichten angewendet wird, bevor sie gespeichert werden.
StorageInputResponseMessageFilter Func<IEnumerable<ChatMessage>, IEnumerable<ChatMessage>>? Kein Filter Filter, der vor dem Speicher auf Antwortnachrichten angewendet wird.

Protokollierung und Telemetrie

Auswahl Typ Vorgabe Beschreibung
EnableSensitiveTelemetryData bool false Wenn true, vertrauliche Daten (Benutzer-IDs, Nachrichteninhalt) in Protokollen unverändert angezeigt werden.
Redactor Redactor? Redaktor, der Text durch "<redacted>" ersetzt. Benutzerdefinierter Redakteur für vertrauliche Werte bei der Protokollierung. Wird ignoriert, wenn EnableSensitiveTelemetryDatatrue ist.

Zustandsverwaltung

Auswahl Typ Vorgabe Beschreibung
StateKey string? Anbietertypname Schlüssel, der zum Speichern des Provider-Status in der AgentSession.StateBag verwendet wird. Überschreiben, wenn mehrere ChatHistoryMemoryProvider Instanzen in derselben Sitzung verwendet werden.

Bereichskonfiguration

Die ChatHistoryMemoryProviderScope Klasse steuert, wie Nachrichten im Vektorspeicher organisiert und gefiltert werden.

Eigentum Typ Beschreibung
ApplicationId string? Nachrichten auf eine bestimmte Anwendung beschränken. Wenn sie nicht festgelegt ist, werden alle Anwendungen umfasst.
AgentId string? Nachrichten auf einen bestimmten Agenten ausrichten. Wenn nicht festgelegt, erstreckt es sich über alle Agenten.
UserId string? Nachrichten auf einen bestimmten Benutzer eingrenzen. Wenn nicht festgelegt, erstreckt es sich über alle Benutzer.
SessionId string? Nachrichten auf eine bestimmte Sitzung einschränken.

Speicher- und Suchbereich

Die ChatHistoryMemoryProvider.State Klasse akzeptiert zwei Bereiche:

  • storageScope: Definiert, wie neue Nachrichten beim Speichern markiert werden. Alle Bereichseigenschaften werden als Metadaten geschrieben.
  • searchScope: Definiert die Filterkriterien bei der Suche. Legen Sie einen umfassenderen Bereich als den Speicherbereich fest, um über mehrere Sitzungen oder Agenten hinweg zu suchen.

Beispiel: Speichern sie pro Sitzung, suchen Sie in allen Sitzungen nach einem Benutzer:

new ChatHistoryMemoryProvider.State(
    storageScope: new() { UserId = "user-123", SessionId = "session-456" },
    searchScope: new() { UserId = "user-123" })

Sicherheitsaspekte

Warnung

Überprüfen Sie diese Sicherheitsüberlegungen, bevor Sie das ChatHistoryMemoryProvider in Produktion nehmen.

  • Indirekte Eingabeaufforderungseinfügung: Aus dem Vektorspeicher abgerufene Nachrichten werden in den LLM-Kontext eingefügt. Wenn der Vektorspeicher kompromittiert wird, kann der Adversarialinhalt das LLM-Verhalten beeinflussen. Daten aus dem Speicher werden as-is ohne Validierung akzeptiert.

  • PII und vertrauliche Daten: Unterhaltungsnachrichten (einschließlich Benutzereingaben und LLM-Antworten) werden als Vektoren gespeichert. Diese Nachrichten können PII oder vertrauliche Informationen enthalten. Stellen Sie sicher, dass Ihr Vektorspeicher über geeignete Zugriffssteuerungen und verschlüsselung im Ruhezustand verfügt.

  • On-Demand-Suchtool: Bei Verwendung OnDemandFunctionCallingsteuert das KI-Modell, wann und wonach gesucht werden soll. Die Suchabfrage wird KI-generiert und sollte von der Vektor-Datenbank-Implementierung als nicht vertrauenswürdige Eingabe behandelt werden.

  • Ablaufverfolgungsprotokollierung: Wenn LogLevel.Trace aktiviert ist, werden vollständige Suchabfragen und Ergebnisse möglicherweise protokolliert. Diese Daten können PII enthalten. Verwenden Sie die Redactor Option, oder deaktivieren Sie vertrauliche Telemetrie in der Produktion.

Dieser Anbieter ist für Python noch nicht verfügbar. Beispiele für die Verwendung finden Sie auf der Registerkarte "C#".

Nächste Schritte