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.
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:
Speicher: Nach jedem Agentaufruf werden neue Anforderungs- und Antwortnachrichten im Vektorspeicher mit Einbettungen gespeichert, die aus ihrem Inhalt generiert werden.
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
- Eine Vektorspeicherimplementierung aus 📦Microsoft. Extensions.VectorData.Abstractions (z. B. 📦
InMemoryVectorStore, 📦Azure KI-Suche oder other supported stores) - Ein einbettungsmodell, das in Ihrem Vektorspeicher konfiguriert ist
- Azure OpenAI- oder OpenAI-Bereitstellung für das Chatmodell
- .NET 8.0 oder höher
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.Traceaktiviert ist, werden vollständige Suchabfragen und Ergebnisse möglicherweise protokolliert. Diese Daten können PII enthalten. Verwenden Sie dieRedactorOption, 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#".