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.
Wichtig
Speicher (Vorschau) im Foundry Agent Service und die Memory Store-API (Vorschau) werden Ihnen im Rahmen Ihres Azure-Abonnements lizenziert und unterliegen den für „Previews“ geltenden Bestimmungen in den Microsoft-Produktbestimmungen, dem Nachtrag zum Datenschutz für Microsoft-Produkte und -Services und den Ergänzenden Nutzungsbedingungen für Microsoft Azure Previews.
Die neueste Vorschau bietet neue Funktionen und Verbesserungen, darunter:
- Speicherelementvorgänge zum Erstellen, Lesen, Aktualisieren, Auflisten und Löschen einzelner Speichereinträge.
- Standardmäßige Aufbewahrungseinstellungen auf Speicherebene, einschließlich der Standard-TTL (Time-to-Live) für neu erstellte Speicher.
- Direktes Merken-oder-Vergessen-Verhalten synchronisierter Speicherbefehle.
Der Speicher im Foundry Agent Service ist eine verwaltete, langfristige Speicherlösung. Sie ermöglicht die Agentkontinuität über Sitzungen, Geräte und Workflows hinweg. Durch das Erstellen und Verwalten von Speicherspeichern können Sie Agents erstellen, die Benutzereinstellungen beibehalten, den Unterhaltungsverlauf verwalten und personalisierte Erfahrungen bereitstellen.
Speicherspeicher fungieren als beständiger Speicher, der definiert, welche Informationstypen für jeden Agent relevant sind. Sie steuern den Zugriff mithilfe des scope-Parameters, der Speicher zwischen Benutzern segmentiert, um sichere und isolierte Nutzungserfahrungen zu gewährleisten.
In diesem Artikel wird erläutert, wie Speicher erstellt, verwaltet und verwendet werden. Konzeptionelle Informationen finden Sie unter "Memory in Foundry Agent Service".
Verwendungsunterstützung
| Fähigkeit | Python SDK | C# SDK | JavaScript SDK | Java SDK | REST-API |
|---|---|---|---|---|---|
| Speicherbereiche erstellen, aktualisieren, auflisten und löschen | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Speicher an einen Prompt-Agenten anhängen | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Aktualisieren und Durchsuchen von Erinnerungen | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Erstellen, Lesen, Aktualisieren, Auflisten und Löschen von Speicherelementen | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Voraussetzungen
- Ein Azure-Abonnement. Erstellen Sie eine kostenlos.
- Ein Microsoft Foundry-Projekt mit konfigurierter Authorisierung und Berechtigungen.
- Eine Chatmodell-Bereitstellung, z. B.
gpt-5.2, in Ihrem Projekt. - Das Einbetten von Modellbereitstellungen, z. B.
text-embedding-3-small, in das Projekt. - Eine konfigurierte lokale Umgebung mit erforderlichen Paketen und Umgebungsvariablen.
Autorisierung und Berechtigungen
Wir empfehlen die rollenbasierte Zugriffssteuerung für Produktionsbereitstellungen. Wenn Rollen nicht machbar sind, überspringen Sie diesen Abschnitt, und verwenden Sie stattdessen die schlüsselbasierte Authentifizierung.
So konfigurieren Sie den rollenbasierten Zugriff:
Melden Sie sich beim portal Azure an.
In Ihrem Projekt:
- Wählen Sie im linken Bereich Ressourcenverwaltung> und Identität aus.
- Verwenden Sie den Umschalter, um eine vom System zugewiesene verwaltete Identität zu aktivieren.
Auf der Ressource, die mit Ihrem Projekt verbunden ist:
Wählen Sie im linken Bereich access control (IAM) aus.
Wählen Sie Add>Rollenzuweisung hinzufügen aus.
Weisen Sie der verwalteten Identität Ihres Projekts die Rolle Foundry-Benutzer zu.
Wichtig
Die Foundry-RBAC-Rollen wurden kürzlich umbenannt. Foundry User, Foundry Owner, Foundry Account Owner und Foundry Project Manager wurden zuvor Azure KI-Benutzer, Azure KI-Besitzer, Azure KI-Kontobesitzer und Azure AI Project Manager benannt. Möglicherweise werden die vorherigen Namen an einigen Stellen weiterhin angezeigt, während der Umbenennungsrollout ausgeführt wird. Die Rollen-IDs und Kernberechtigungen bleiben durch die Umbenennung unverändert.
Einrichten Ihrer Umgebung
Installieren Sie die erforderlichen Pakete:
pip install "azure-ai-projects>=2.0.0" azure-identity
Installieren Sie die erforderlichen Pakete:
dotnet add package Azure.AI.Projects
dotnet add package Azure.AI.Projects.Agents
dotnet add package Azure.AI.Extensions.OpenAI
dotnet add package Azure.Identity
Installieren Sie die erforderlichen Pakete:
npm install @azure/ai-projects@2 @azure/identity
Installieren Sie die erforderlichen Pakete:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
</dependency>
Legen Sie Umgebungsvariablen für den Projektendpunkt und die Modellbereitstellungsnamen fest:
export FOUNDRY_PROJECT_ENDPOINT="https://{your-ai-services-account}.services.ai.azure.com/api/projects/{project-name}"
export MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME="<chat-model-deployment-name>"
export MEMORY_STORE_EMBEDDING_MODEL_DEPLOYMENT_NAME="<embedding-model-deployment-name>"
Festlegen von Umgebungsvariablen für Ihren Projektendpunkt, Modellbereitstellungen, API-Version und Zugriffstoken:
FOUNDRY_PROJECT_ENDPOINT="https://{your-ai-services-account}.services.ai.azure.com/api/projects/{project-name}"
MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME="<chat-model-deployment-name>" # For example, gpt-5.2
MEMORY_STORE_EMBEDDING_MODEL_DEPLOYMENT_NAME="<embedding-model-deployment-name>" # For example, text-embedding-3-small
API_VERSION="2025-11-15-preview"
# Get a short-lived access token using Azure CLI
ACCESS_TOKEN="$(az account get-access-token --resource https://ai.azure.com/ --query accessToken -o tsv)"
Umfang verstehen
Der scope Parameter steuert, wie der Arbeitsspeicher partitioniert wird. Jeder Reservierungsumfang im Speicher behält eine isolierte Sammlung von Speicherelementen bei. Wenn Sie beispielsweise einen Kundensupportmitarbeiter mit Arbeitsspeicher erstellen, sollte jeder Kunde über einen eigenen individuellen Speicher verfügen.
Als Entwickler wählen Sie den Schlüssel aus, der zum Speichern und Abrufen von Speicherelementen verwendet wird. Der richtige Ansatz hängt davon ab, wie Sie auf den Arbeitsspeicher zugreifen.
Über das Speichersuchwerkzeug
Wenn Sie das Speichersuchtool an einen Agenten anfügen, setzen Sie scope auf {{$userId}}, um die Speicherisolation pro Benutzer zu ermöglichen, ohne Bezeichner hart zu codieren. Das System löst die Identität des Endbenutzers bei jedem Antwortaufruf aus einer von zwei Quellen automatisch auf:
x-memory-user-idAnforderungsheader: Wenn vorhanden, wird der Headerwert als Benutzer-ID verwendet. Verwenden Sie dies in Proxy- oder Back-End-Szenarien, in denen Ihr Dienst die API im Auftrag eines Endbenutzers aufruft.Microsoft Entra-Authentifizierungstoken: Wenn der Header nicht festgelegt ist, greift das System auf die Mandanten-ID (TID) des Aufrufers und die Objekt-ID (OID) zurück. Dies ist die Standardeinstellung in Front-End-Szenarien, in denen Benutzer sich direkt mit Microsoft Entra authentifizieren.
Wenn Sie keine Benutzerisolation benötigen, verwenden Sie stattdessen einen statischen scope Wert.
Über APIs mit niedriger Speicherebene
Wenn Sie Speicher-APIs direkt aufrufen, geben Sie in jeder Anforderung explizit an scope . Sie können einen statischen Wert übergeben, z. B. einen universal eindeutigen Bezeichner (UUID) oder einen anderen stabilen Bezeichner aus Ihrem System. Die automatische Identitätsextraktion wird für diese Vorgänge nicht unterstützt.
Erstellen eines Speichers
Erstellen Sie einen dedizierten Speicher für jeden Agent, um klare Grenzen für den Speicherzugriff und die Optimierung festzulegen. Wenn Sie einen Speicher erstellen, geben Sie das Chatmodell und die Bereitstellungen des Einbettungsmodells zum Verarbeiten Ihrer Speicherinhalte an.
Verwenden Sie Speicheroptionen, um das Extraktionsverhalten und aufbewahrungsstandardwerte zu steuern. In der neuesten Vorschau können Sie den prozeduralen Speicher aktivieren und einen Standard-TTL (Sekunden) für neu erstellte Speichereinträge festlegen.
import os
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MemoryStoreDefaultDefinition, MemoryStoreDefaultOptions
from azure.identity import DefaultAzureCredential
project_client = AIProjectClient(
endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
credential=DefaultAzureCredential(),
)
memory_store_name = "my_memory_store"
# Specify memory store options
options = MemoryStoreDefaultOptions(
chat_summary_enabled=True,
user_profile_enabled=True,
procedural_memory_enabled=True,
default_ttl_seconds=30 * 24 * 60 * 60,
user_profile_details="Avoid irrelevant or sensitive data, such as age, financials, precise location, and credentials"
)
# Create memory store
chat_model = os.environ["MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME"]
embedding_model = os.environ["MEMORY_STORE_EMBEDDING_MODEL_DEPLOYMENT_NAME"]
definition = MemoryStoreDefaultDefinition(
chat_model=chat_model,
embedding_model=embedding_model,
options=options
)
memory_store = project_client.beta.memory_stores.create(
name=memory_store_name,
definition=definition,
description="Memory store with procedural memory and 30-day default TTL",
)
print(f"Created memory store: {memory_store.name}")
using System;
using Azure.AI.Projects;
using Azure.AI.Projects.Memory;
using Azure.Identity;
#pragma warning disable AAIP001
var projectEndpoint = Environment.GetEnvironmentVariable(
"FOUNDRY_PROJECT_ENDPOINT");
var chatModel = Environment.GetEnvironmentVariable(
"MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME");
var embeddingModel = Environment.GetEnvironmentVariable(
"MEMORY_STORE_EMBEDDING_MODEL_DEPLOYMENT_NAME");
AIProjectClient projectClient = new(
new Uri(projectEndpoint),
new DefaultAzureCredential());
var memoryStoreName = "my_memory_store";
// Specify memory store options
MemoryStoreDefaultDefinition memoryStoreDefinition = new(
chatModel: chatModel,
embeddingModel: embeddingModel
);
memoryStoreDefinition.Options = new(
isUserProfileEnabled: true,
isChatSummaryEnabled: true);
memoryStoreDefinition.Options.UserProfileDetails =
"Avoid irrelevant or sensitive data, such as age, "
+ "financials, precise location, and credentials";
// Create memory store
MemoryStore memoryStore = projectClient.MemoryStores.CreateMemoryStore(
name: memoryStoreName,
definition: memoryStoreDefinition,
description: "Memory store for customer support agent"
);
Console.WriteLine($"Created memory store: {memoryStore.Name}");
import { DefaultAzureCredential } from "@azure/identity";
import type {
MemoryStoreDefaultDefinition,
MemoryStoreDefaultOptions,
} from "@azure/ai-projects";
import { AIProjectClient } from "@azure/ai-projects";
const projectEndpoint =
process.env["FOUNDRY_PROJECT_ENDPOINT"] ||
"<project endpoint>";
const chatModelDeployment =
process.env["MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME"] ||
"<chat model deployment name>";
const embeddingModelDeployment =
process.env["MEMORY_STORE_EMBEDDING_MODEL_DEPLOYMENT_NAME"] ||
"<embedding model deployment name>";
const memoryStoreName = "my_memory_store";
const project = new AIProjectClient(
projectEndpoint,
new DefaultAzureCredential(),
);
const memoryOptions: MemoryStoreDefaultOptions = {
user_profile_enabled: true,
chat_summary_enabled: true,
procedural_memory_enabled: true,
default_ttl_seconds: 30 * 24 * 60 * 60,
user_profile_details:
"Avoid irrelevant or sensitive data, such as age, " +
"financials, precise location, and credentials",
};
const definition: MemoryStoreDefaultDefinition = {
kind: "default",
chat_model: chatModelDeployment,
embedding_model: embeddingModelDeployment,
options: memoryOptions,
};
const memoryStore = await project.beta.memoryStores.create(
memoryStoreName,
definition,
{
description: "Memory store with procedural memory and 30-day default TTL",
},
);
console.log(
`Created memory store: ${memoryStore.name} (${memoryStore.id})`,
);
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.MemoryStoresClient;
import com.azure.ai.agents.models.MemoryStoreDefaultDefinition;
import com.azure.ai.agents.models.MemoryStoreDefaultOptions;
import com.azure.ai.agents.models.MemoryStoreDetails;
import com.azure.identity.DefaultAzureCredentialBuilder;
String projectEndpoint = System.getenv("FOUNDRY_PROJECT_ENDPOINT");
String chatModel = System.getenv("MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME");
String embeddingModel =
System.getenv("MEMORY_STORE_EMBEDDING_MODEL_DEPLOYMENT_NAME");
MemoryStoresClient memoryStoresClient = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint)
.buildMemoryStoresClient();
String memoryStoreName = "my_memory_store";
MemoryStoreDefaultDefinition definition =
new MemoryStoreDefaultDefinition(chatModel, embeddingModel)
.setOptions(new MemoryStoreDefaultOptions(true, true));
MemoryStoreDetails memoryStore = memoryStoresClient.createMemoryStore(
memoryStoreName,
definition,
"Memory store for customer support agent",
null);
System.out.println("Created memory store: " + memoryStore.getName());
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "my_memory_store",
"description": "Memory store with procedural memory and 30-day default TTL",
"definition": {
"kind": "default",
"chat_model": "'"${MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME}"'",
"embedding_model": "'"${MEMORY_STORE_EMBEDDING_MODEL_DEPLOYMENT_NAME}"'",
"options": {
"chat_summary_enabled": true,
"user_profile_enabled": true,
"procedural_memory_enabled": true,
"default_ttl_seconds": 2592000,
"user_profile_details": "Avoid irrelevant or sensitive data, such as age, financials, precise location, and credentials"
}
}
}'
Tipp
Die verbleibenden Python, C#, TypeScript und Java Codeausschnitte basieren auf dem Client und variablen, die im Speicher erstellen definiert sind. Wenn Sie diese Codeausschnitte unabhängig ausführen, schließen Sie den Import- und Clientinitialisierungscode aus diesem Abschnitt ein.
Die C#-Codeausschnitte in diesem Artikel verwenden synchrone Methoden. Informationen zur asynchronen Verwendung finden Sie im Memory-Suchtool und den Memory-Speicher Beispielen.
Anpassen des Arbeitsspeichers
Passen Sie an, welche Informationen der Agent speichert, um speichereffizient, relevant und datenschutzbeachtet zu bleiben. Verwenden Sie den user_profile_details Parameter, um die Datentypen anzugeben, die für die Funktion des Agents kritisch sind.
Legen Sie user_profile_details z. B. fest, dass für ein Reisebüro "Präferenz der Fluggesellschaft und Ernährungseinschränkungen" priorisiert wird. Dieser fokussierte Ansatz hilft dem Speichersystem zu wissen, welche Details extrahiert, zusammengefasst und auf den langfristigen Speicher festgelegt werden sollen.
Sie können diesen Parameter auch verwenden, um bestimmte Datentypen auszuschließen, Speicher schlanker zu halten und die Datenschutzanforderungen einzuhalten. Legen Sie user_profile_details folgendermaßen fest: "Vermeiden Sie irrelevante oder vertrauliche Daten, wie Alter, Finanzdaten, genaue Position und Anmeldeinformationen."
Konfigurieren von TTL- und Aufbewahrungsrichtlinien
TTL gilt für alle Erinnerungen, ob aus direkten Speicherbefehlen, Extraktions- und Konsolidierungsvorgängen oder CRUD-Vorgängen auf Elementebene. Wenn ein Speicher aktualisiert und konsolidiert wird, setzt der Dienst seine letzte Aktualisierungszeit zurück.
TTL gilt nur für Speicher, die nach der Einführung der TTL-Unterstützung erstellt wurden. Es wirkt sich nicht auf vorhandene Speicher aus.
Ein default_ttl_seconds-Wert von 0 bedeutet, dass kein Ablaufdatum festgelegt ist. Wählen Sie einen Aufbewahrungszeitraum aus, der Ihren Compliance- und Benutzerdatenlebenszyklusanforderungen entspricht.
Aktualisieren eines Speichers
Aktualisieren Sie Speicherverwaltungseigenschaften, wie zum Beispiel description oder metadata, um Speicher besser zu verwalten.
# Update memory store properties
updated_store = project_client.beta.memory_stores.update(
name=memory_store_name,
description="Updated description"
)
print(f"Updated: {updated_store.description}")
// Update memory store properties
MemoryStore updatedStore = projectClient.MemoryStores.UpdateMemoryStore(
name: memoryStoreName,
description: "Updated description"
);
Console.WriteLine($"Updated: {updatedStore.Description}");
const updatedStore = await project.beta.memoryStores.update(
memoryStoreName,
{
description: "Updated description",
},
);
console.log(`Updated: ${updatedStore.description}`);
import com.azure.ai.agents.models.MemoryStoreDetails;
MemoryStoreDetails updatedStore = memoryStoresClient.updateMemoryStore(
memoryStoreName,
"Updated description",
null);
System.out.println("Updated: " + updatedStore.getDescription());
MEMORY_STORE_NAME="my_memory_store"
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/${MEMORY_STORE_NAME}?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated description"
}'
Liste von Speicherplätzen
Rufen Sie eine Liste von Speicherspeichern in Ihrem Projekt ab, um Ihre Speicherinfrastruktur zu verwalten und zu überwachen.
# List all memory stores
stores_list = list(project_client.beta.memory_stores.list())
print(f"Found {len(stores_list)} memory stores")
for store in stores_list:
print(f"- {store.name} ({store.description})")
// List all memory stores
foreach (MemoryStore store in projectClient.MemoryStores.GetMemoryStores())
{
Console.WriteLine(
$"Memory store: {store.Name} ({store.Description})");
}
const storeList = project.beta.memoryStores.list();
console.log("Listing all memory stores...");
for await (const store of storeList) {
console.log(` - Memory Store: ${store.name} (${store.id})`);
}
import com.azure.ai.agents.models.MemoryStoreDetails;
System.out.println("Listing all memory stores...");
for (MemoryStoreDetails store : memoryStoresClient.listMemoryStores()) {
System.out.println(
" - Memory Store: " + store.getName() + " (" + store.getId() + ")");
}
curl -X GET "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
Verwenden von Erinnerungen über ein Agent-Tool
Nachdem Sie einen Speicher erstellt haben, können Sie das Speichersuchtool an einen Eingabeaufforderungs-Agent anfügen. Dieses Tool ermöglicht es dem Agent, während Unterhaltungen aus Ihrem Speicher zu lesen und in Ihren Speicher zu schreiben. Konfigurieren Sie das Tool mit dem entsprechenden scope und update_delay, um zu steuern, wie und wann Speicher aktualisiert werden.
Tipp
Um Erinnerungen auf einen einzelnen Endbenutzer zu beschränken, setzen Sie scope auf "{{$userId}}" in der Tooldefinition und übergeben Sie x-memory-user-id: <user-id> als Kopfzeile bei jedem Antwortaufruf. Das System löst den Bereich auf die Identität dieses Benutzenden auf. Ohne den Header fällt der Bereich auf die Microsoft Entra Identität des Aufrufers (TID und OID) zurück. Weitere Informationen finden Sie unter "Grundlegendes zum Bereich".
from azure.ai.projects.models import MemorySearchPreviewTool, PromptAgentDefinition
# Set scope to associate the memories with
scope = "user_123"
openai_client = project_client.get_openai_client()
# Create memory search tool
tool = MemorySearchPreviewTool(
memory_store_name=memory_store_name,
scope=scope,
update_delay=1, # Wait 1 second of inactivity before updating memories
# In a real application, set this to a higher value like 300 (5 minutes, default)
)
# Create a prompt agent with memory search tool
agent = project_client.agents.create_version(
agent_name="MyAgent",
definition=PromptAgentDefinition(
model=os.environ["MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME"],
instructions="You are a helpful assistant that answers general questions",
tools=[tool],
)
)
print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})")
using Azure.AI.Projects.Agents;
using Azure.AI.Extensions.OpenAI;
using OpenAI.Responses;
#pragma warning disable OPENAI001
// Set scope to associate the memories with
string scope = "user_123";
// Create a prompt agent with memory search tool
DeclarativeAgentDefinition agentDefinition = new(model: chatModel)
{
Instructions = "You are a helpful assistant that answers "
+ "general questions",
};
agentDefinition.Tools.Add(new MemorySearchPreviewTool(
memoryStoreName: memoryStore.Name,
scope: scope)
{
UpdateDelayInSecs = 1, // Wait 1 second of inactivity before updating memories
// In a real application, set this to a higher value
// like 300 (5 minutes, default)
});
ProjectsAgentVersion agent =
projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "MyAgent",
options: new(agentDefinition));
Console.WriteLine(
$"Agent created (id: {agent.Id}, name: {agent.Name}, "
+ $"version: {agent.Version})");
// Set scope to associate the memories with
const scope = "user_123";
const agent = await project.agents.createVersion(
"memory-search-agent",
{
kind: "prompt",
model: chatModelDeployment,
instructions:
"You are a helpful assistant that retrieves relevant " +
"information from the user's memory store to answer their questions.",
tools: [
{
type: "memory_search_preview",
memory_store_name: memoryStoreName,
scope: scope,
update_delay: 1,
},
],
},
);
console.log(
`Created agent with memory search tool, agent ID: ${agent.id}, ` +
`name: ${agent.name}, version: ${agent.version}`,
);
import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.models.AgentVersionDetails;
import com.azure.ai.agents.models.MemorySearchPreviewTool;
import com.azure.ai.agents.models.PromptAgentDefinition;
import com.azure.identity.DefaultAzureCredentialBuilder;
String scope = "user_123";
AgentsClient agentsClient = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint)
.buildAgentsClient();
MemorySearchPreviewTool memoryTool = new MemorySearchPreviewTool(
memoryStoreName,
scope).setUpdateDelaySeconds(1);
PromptAgentDefinition agentDefinition = new PromptAgentDefinition(chatModel)
.setInstructions("You are a helpful assistant that answers general questions")
.setTools(java.util.Collections.singletonList(memoryTool));
AgentVersionDetails agent =
agentsClient.createAgentVersion("MyAgent", agentDefinition);
System.out.println(
"Agent created (id: " + agent.getId() + ", name: " + agent.getName()
+ ", version: " + agent.getVersion() + ")");
# The agents API uses api-version=v1, which differs from the memory store API version
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/agents?api-version=v1" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "MyAgent",
"definition": {
"kind": "prompt",
"model": "gpt-5.2",
"instructions": "You are a helpful assistant that answers general questions",
"tools": [
{
"type": "memory_search_preview",
"memory_store_name": "my_memory_store",
"scope": "user_123",
"update_delay": 1
}
]
}
}'
Unterhaltung erstellen
Sie können jetzt Unterhaltungen erstellen und Agentantworten anfordern. Zu Beginn jeder Unterhaltung werden statische Erinnerungen eingefügt, sodass der Agent sofortigen, beständigen Kontext hat. Kontextabhängige Speicherungen werden pro Runde basierend auf den neuesten Nachrichten abgerufen, um die neuesten Informationen für jede Antwort zu haben.
Nach jeder Agentantwort ruft der Dienst intern update_memories auf. Die tatsächlichen Schreibvorgänge im Langzeitspeicher werden jedoch durch die Einstellung update_delay entprellt. Das Update wird geplant und wird erst nach dem konfigurierten Zeitraum der Inaktivität abgeschlossen.
Note
Im aktualisierten Vorschauschema verwendet die Ausgabe des Tools für die Speichersuche eine memories-Sammlung anstelle des veralteten Felds results. Wenn Sie rohe Ausgabedaten verarbeiten, aktualisieren Sie Ihre Parser entsprechend.
import time
# Create a conversation with the agent with memory tool enabled
conversation = openai_client.conversations.create()
print(f"Created conversation (id: {conversation.id})")
# Create an agent response to initial user message
response = openai_client.responses.create(
input="I prefer dark roast coffee",
conversation=conversation.id,
extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
# To scope memories to an end user, uncomment:
# extra_headers={"x-memory-user-id": "<user-id>"},
)
print(f"Response output: {response.output_text}")
# After an inactivity in the conversation, memories will be extracted from the conversation and stored
print("Waiting for memories to be stored...")
time.sleep(65)
# Create a new conversation
new_conversation = openai_client.conversations.create()
print(f"Created new conversation (id: {new_conversation.id})")
# Create an agent response with stored memories
new_response = openai_client.responses.create(
input="Please order my usual coffee",
conversation=new_conversation.id,
extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)
print(f"Response output: {new_response.output_text}")
using System.Threading;
#pragma warning disable OPENAI001
// Get a response client scoped to the agent
ProjectResponsesClient responseClient =
projectClient.ProjectOpenAIClient
.GetProjectResponsesClientForAgent(agent.Name);
// Create an agent response to initial user message
ResponseItem request = ResponseItem.CreateUserMessageItem(
"I prefer dark roast coffee");
ResponseResult response = responseClient.CreateResponse([request]);
// To scope memories to an end user, uncomment:
// var options = new CreateResponseOptions();
// options.InputItems.Add(request);
// var requestOptions = new RequestOptions();
// requestOptions.AddHeader("x-memory-user-id", "<user-id>");
// ClientResult result = responseClient.CreateResponse(
// BinaryContent.Create(options), requestOptions);
// ResponseResult response = ModelReaderWriter.Read<ResponseResult>(
// result.GetRawResponse().Content);
Console.WriteLine($"Response output: {response.GetOutputText()}");
// After inactivity, memories are extracted and stored
Console.WriteLine("Waiting for memories to be stored...");
Thread.Sleep(65_000);
// Create a new response to demonstrate cross-session recall
ResponseItem newRequest = ResponseItem.CreateUserMessageItem(
"Please order my usual coffee");
ResponseResult newResponse = responseClient.CreateResponse(
[newRequest]);
Console.WriteLine(
$"Response output: {newResponse.GetOutputText()}");
import { setTimeout } from "timers/promises";
const openaiClient = project.getOpenAIClient();
// Create a conversation with the agent with memory tool enabled
const conversation = await openaiClient.conversations.create();
console.log(`Created conversation (id: ${conversation.id})`);
// Create an agent response to initial user message
const response = await openaiClient.responses.create(
{
conversation: conversation.id,
input: "I prefer dark roast coffee",
},
{
body: {
agent: { name: agent.name, type: "agent_reference" },
},
// To scope memories to an end user, uncomment:
// headers: { "x-memory-user-id": "<user-id>" },
},
);
console.log(`Response output: ${response.output_text}`);
// After inactivity, memories are extracted and stored
console.log("Waiting for memories to be stored...");
await setTimeout(65_000);
// Create a new conversation to demonstrate cross-session recall
const newConversation = await openaiClient.conversations.create();
console.log(`Created new conversation (id: ${newConversation.id})`);
// Create an agent response with stored memories
const newResponse = await openaiClient.responses.create(
{
conversation: newConversation.id,
input: "Please order my usual coffee",
},
{
body: {
agent: { name: agent.name, type: "agent_reference" },
},
},
);
console.log(`Response output: ${newResponse.output_text}`);
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
ResponsesClient responsesClient = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint)
.buildResponsesClient();
AgentReference agentReference = new AgentReference(agent.getName())
.setVersion(agent.getVersion());
Response response = responsesClient.createAzureResponse(
new AzureCreateResponseOptions().setAgentReference(agentReference),
ResponseCreateParams.builder()
.input("I prefer dark roast coffee"));
System.out.println("Response output: " + response.output());
System.out.println("Waiting for memories to be stored...");
Thread.sleep(65_000);
Response newResponse = responsesClient.createAzureResponse(
new AzureCreateResponseOptions().setAgentReference(agentReference),
ResponseCreateParams.builder()
.input("Please order my usual coffee"));
System.out.println("Response output: " + newResponse.output());
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/openai/v1/conversations" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{}'
# Copy the "id" field from the previous response
# To scope memories to an end user, add -H "x-memory-user-id: <user-id>" to the following request
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/openai/v1/responses" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"input": "I prefer dark roast coffee",
"conversation": "{conversation-id}",
"agent_reference": {
"type": "agent_reference",
"name": "MyAgent"
}
}'
Direktverhalten zum Erinnern oder Vergessen anwenden
Wenn ein Benutzer den Agent explizit auffordern, Informationen zu speichern oder zu vergessen, wendet das Speichersuchtool im tools Array den Vorgang sofort an und gibt das Ergebnis als Speicherbefehlselemente in der Antwortausgabe zurück. Es ist keine zusätzliche Toolkonfiguration erforderlich.
Note
Direkte Speicherbefehle überschreiben keine Arbeitsspeicher-TTL. Wenn für einen Memory Store eine TTL konfiguriert ist, können Speichereinträge trotzdem ablaufen, auch wenn sie durch einen remember-Befehl hinzugefügt wurden.
openai_client = project_client.get_openai_client()
# Configure the memory search tool
tools = [
{
"type": "memory_search_preview",
"memory_store_name": memory_store_name,
"scope": scope,
}
]
# Ask the agent to remember information
remember_response = openai_client.responses.create(
model=os.environ["MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME"],
tools=tools,
input="Remember that my preferred seat is aisle.",
)
for item in remember_response.output:
if getattr(item, "type", None) == "memory_command_call":
print(item.type) # memory_command_call
print(item.arguments) # {"action": "remember", "content": "..."}
print(item.status) # completed
# Ask the agent to forget information
forget_response = openai_client.responses.create(
model=os.environ["MEMORY_STORE_CHAT_MODEL_DEPLOYMENT_NAME"],
tools=tools,
input="Forget my preferred seat.",
)
for item in forget_response.output:
if getattr(item, "type", None) == "memory_command_call":
print(item.type)
print(item.arguments) # {"action": "forget", "content": "..."}
print(item.status)
// This code snippet is currently unavailable.
const openaiClient = project.getOpenAIClient();
// Configure the memory search tool
const tools = [
{
type: "memory_search_preview",
memory_store_name: memoryStoreName,
scope: scope,
},
];
// Ask the agent to remember information
const rememberResponse = await openaiClient.responses.create({
model: chatModelDeployment,
input: "Remember that my preferred seat is aisle.",
tools: tools as any,
});
for (const item of rememberResponse.output) {
const outputItem = item as Record<string, unknown>;
if (outputItem["type"] === "memory_command_call") {
console.log(outputItem["type"]); // memory_command_call
console.log(outputItem["arguments"]);
// {"action": "remember", "content": "..."}
console.log(outputItem["status"]); // completed
}
}
// Ask the agent to forget information
const forgetResponse = await openaiClient.responses.create({
model: chatModelDeployment,
input: "Forget my preferred seat.",
tools: tools as any,
});
for (const item of forgetResponse.output) {
const outputItem = item as Record<string, unknown>;
if (outputItem["type"] === "memory_command_call") {
console.log(outputItem["type"]);
console.log(outputItem["arguments"]);
// {"action": "forget", "content": "..."}
console.log(outputItem["status"]);
}
}
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
Response rememberResponse = responsesClient.createAzureResponse(
new AzureCreateResponseOptions().setAgentReference(agentReference),
ResponseCreateParams.builder()
.input("Remember that my preferred seat is aisle."));
System.out.println(rememberResponse.output());
Response forgetResponse = responsesClient.createAzureResponse(
new AzureCreateResponseOptions().setAgentReference(agentReference),
ResponseCreateParams.builder()
.input("Forget my preferred seat."));
System.out.println(forgetResponse.output());
# Reuse the {conversation-id} from the previous section
# To scope memories to an end user, set x-memory-user-id in each request
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/openai/v1/responses" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-H "x-memory-user-id: <user-id>" \
-d '{
"input": "Remember that my preferred seat is aisle.",
"conversation": "{conversation-id}",
"agent_reference": {
"type": "agent_reference",
"name": "MyAgent"
}
}'
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/openai/v1/responses" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-H "x-memory-user-id: <user-id>" \
-d '{
"input": "Forget my preferred seat.",
"conversation": "{conversation-id}",
"agent_reference": {
"type": "agent_reference",
"name": "MyAgent"
}
}'
Verwenden von Erinnerungen über APIs
Sie können direkt mit einem Speicherspeicher interagieren, indem Sie die Speicher-APIs verwenden. Fügen Sie zunächst Erinnerungen aus Unterhaltungsinhalten zum Speicher hinzu, und suchen Sie dann nach relevanten Erinnerungen, um Kontext für Agentinteraktionen bereitzustellen.
Hinzufügen von Erinnerungen zu einem Speicher
Fügen Sie Erinnerungen hinzu, indem Sie dem Speicher Unterhaltungsinhalte bereitstellen. Das System führt Vorverarbeitung und Nachverarbeitung der Daten durch, einschließlich Speicherextraktion und Konsolidierung, um den Speicher des Agenten zu optimieren. Dieser langandauernde Vorgang kann etwa eine Minute dauern.
Entscheiden Sie, wie der Speicher durch Angabe des scope Parameters benutzerübergreifend segmentiert wird. Sie können den Speicher auf einen bestimmten Endbenutzer, ein Team oder einen anderen Bezeichner beschränken.
Sie können einen Speicher mit Inhalten aus mehreren Gesprächsrunden aktualisieren oder nach jeder Gesprächsrunde aktualisieren und die Aktualisierungen mithilfe der vorhergehenden Aktualisierungsvorgangs-ID verketten.
# Set scope to associate the memories with
scope = "user_123"
user_message = {
"role": "user",
"content": "I prefer dark roast coffee and usually drink it in the morning",
"type": "message"
}
update_poller = project_client.beta.memory_stores.begin_update_memories(
name=memory_store_name,
scope=scope,
items=[user_message], # Pass conversation items that you want to add to memory
update_delay=0, # Trigger update immediately without waiting for inactivity
)
# Wait for the update operation to complete, but can also fire and forget
update_result = update_poller.result()
print(f"Updated with {len(update_result.memory_operations)} memory operations")
for operation in update_result.memory_operations:
print(
f" - Operation: {operation.kind}, Memory ID: {operation.memory_item.memory_id}, Content: {operation.memory_item.content}"
)
# Extend the previous update with another update and more messages
new_message = {
"role":"user",
"content":"I also like cappuccinos in the afternoon",
"type":"message"}
new_update_poller = project_client.beta.memory_stores.begin_update_memories(
name=memory_store_name,
scope=scope,
items=[new_message],
previous_update_id=update_poller.update_id, # Extend from previous update ID
update_delay=0, # Trigger update immediately without waiting for inactivity
)
new_update_result = new_update_poller.result()
for operation in new_update_result.memory_operations:
print(
f" - Operation: {operation.kind}, Memory ID: {operation.memory_item.memory_id}, Content: {operation.memory_item.content}"
)
#pragma warning disable OPENAI001
// Set scope to associate the memories with
string scope = "user_123";
MemoryUpdateOptions memoryOptions = new(scope)
{
UpdateDelay = 0, // Trigger update immediately without waiting for inactivity
};
memoryOptions.Items.Add(ResponseItem.CreateUserMessageItem(
"I prefer dark roast coffee and usually drink it "
+ "in the morning"));
// Wait for the update operation to complete
MemoryUpdateResult updateResult =
projectClient.MemoryStores.WaitForMemoriesUpdate(
memoryStoreName: memoryStore.Name,
options: memoryOptions,
pollingInterval: 500);
if (updateResult.Status == MemoryStoreUpdateStatus.Failed)
{
throw new InvalidOperationException(
updateResult.ErrorDetails);
}
Console.WriteLine(
$"Updated with {updateResult.Details.MemoryOperations.Count} "
+ "memory operations");
foreach (var operation in updateResult.Details.MemoryOperations)
{
Console.WriteLine(
$" - Operation: {operation.Kind}, "
+ $"Memory ID: {operation.MemoryItem.MemoryId}, "
+ $"Content: {operation.MemoryItem.Content}");
}
// Extend the previous update with another message
MemoryUpdateOptions newMemoryOptions = new(scope)
{
PreviousUpdateId = updateResult.UpdateId,
UpdateDelay = 0, // Trigger update immediately without waiting for inactivity
};
newMemoryOptions.Items.Add(ResponseItem.CreateUserMessageItem(
"I also like cappuccinos in the afternoon"));
MemoryUpdateResult newUpdateResult =
projectClient.MemoryStores.WaitForMemoriesUpdate(
memoryStoreName: memoryStore.Name,
options: newMemoryOptions,
pollingInterval: 500);
if (newUpdateResult.Status == MemoryStoreUpdateStatus.Failed)
{
throw new InvalidOperationException(
newUpdateResult.ErrorDetails);
}
foreach (var operation in newUpdateResult.Details.MemoryOperations)
{
Console.WriteLine(
$" - Operation: {operation.Kind}, "
+ $"Memory ID: {operation.MemoryItem.MemoryId}, "
+ $"Content: {operation.MemoryItem.Content}");
}
const scope = "user_123";
const userMessage: Record<string, unknown> = {
type: "message",
role: "user",
content: [
{
type: "input_text",
text: "I prefer dark roast coffee and usually drink it in the morning",
},
],
};
console.log("\nSubmitting memory update request...");
const updatePoller = project.beta.memoryStores.updateMemories(
memoryStoreName,
scope,
{
items: [userMessage],
updateDelayInSecs: 0,
},
);
const updateResult = await updatePoller.pollUntilDone();
console.log(
`Updated with ${updateResult.memory_operations.length} ` +
`memory operation(s)`,
);
for (const operation of updateResult.memory_operations) {
console.log(
` - Operation: ${operation.kind}, ` +
`Memory ID: ${operation.memory_item.memory_id}, ` +
`Content: ${operation.memory_item.content}`,
);
}
// Extend the previous update with another message
const newMessage = {
role: "user",
content: "I also like cappuccinos in the afternoon",
type: "message",
};
const newUpdatePoller = project.beta.memoryStores.updateMemories(
memoryStoreName,
scope,
{
items: [newMessage],
updateDelayInSecs: 0,
},
);
const newUpdateResult = await newUpdatePoller.pollUntilDone();
console.log(
`Updated with ${newUpdateResult.memory_operations.length} ` +
`memory operation(s)`,
);
for (const operation of newUpdateResult.memory_operations) {
console.log(
` - Operation: ${operation.kind}, ` +
`Memory ID: ${operation.memory_item.memory_id}, ` +
`Content: ${operation.memory_item.content}`,
);
}
import com.azure.ai.agents.models.MemoryStoreUpdateCompletedResult;
import com.azure.ai.agents.models.MemoryStoreUpdateResponse;
import com.azure.core.util.polling.SyncPoller;
import com.openai.models.responses.EasyInputMessage;
import com.openai.models.responses.ResponseInputItem;
import java.util.Arrays;
ResponseInputItem userMessage = ResponseInputItem.ofEasyInputMessage(
EasyInputMessage.builder()
.role(EasyInputMessage.Role.USER)
.content("I prefer dark roast coffee and usually drink it in the morning")
.build());
SyncPoller<MemoryStoreUpdateResponse, MemoryStoreUpdateCompletedResult> updatePoller =
memoryStoresClient.beginUpdateMemories(
memoryStoreName,
scope,
Arrays.asList(userMessage),
null,
0);
updatePoller.waitForCompletion();
MemoryStoreUpdateCompletedResult updateResult = updatePoller.getFinalResult();
System.out.println(
"Updated with " + updateResult.getMemoryOperations().size()
+ " memory operation(s)");
for (var operation : updateResult.getMemoryOperations()) {
System.out.println(
" - Operation: " + operation.getKind() + ", Memory ID: "
+ operation.getMemoryItem().getMemoryId() + ", Content: "
+ operation.getMemoryItem().getContent());
}
ResponseInputItem newMessage = ResponseInputItem.ofEasyInputMessage(
EasyInputMessage.builder()
.role(EasyInputMessage.Role.USER)
.content("I also like cappuccinos in the afternoon")
.build());
// Pass null for previousUpdateId to start a fresh independent update.
// To chain from the previous update, pass the update ID from the
// intermediate poller response instead.
SyncPoller<MemoryStoreUpdateResponse, MemoryStoreUpdateCompletedResult> newUpdatePoller =
memoryStoresClient.beginUpdateMemories(
memoryStoreName,
scope,
Arrays.asList(newMessage),
null,
0);
newUpdatePoller.waitForCompletion();
MemoryStoreUpdateCompletedResult newUpdateResult = newUpdatePoller.getFinalResult();
for (var newOperation : newUpdateResult.getMemoryOperations()) {
System.out.println(
" - Operation: " + newOperation.getKind() + ", Memory ID: "
+ newOperation.getMemoryItem().getMemoryId() + ", Content: "
+ newOperation.getMemoryItem().getContent());
}
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store:update_memories?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"scope": "user_123",
"items": [
{
"type": "message",
"role": "user",
"content": [
{
"type": "input_text",
"text": "I prefer dark roast coffee and usually drink it in the morning"
}
]
}
],
"update_delay": 0
}'
# Get add memory status by polling the update_id
# Use the "update_id" from previous response
UPDATE_ID=<your_update_id>
curl -X GET "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store/updates/${UPDATE_ID}?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
Suchen nach Erinnerungen in einem Speicher
Durchsuchen Sie Erinnerungen, um den relevanten Kontext für Agentinteraktionen abzurufen. Geben Sie den Namen und den Bereich des Speicherspeichers an, um die Suche einzugrenzen.
from azure.ai.projects.models import MemorySearchOptions
# Search memories by a query
query_message = {"role": "user", "content": "What are my coffee preferences?", "type": "message"}
search_response = project_client.beta.memory_stores.search_memories(
name=memory_store_name,
scope=scope,
items=[query_message],
options=MemorySearchOptions(max_memories=5)
)
print(f"Found {len(search_response.memories)} memories")
for memory in search_response.memories:
print(f" - Memory ID: {memory.memory_item.memory_id}, Content: {memory.memory_item.content}")
#pragma warning disable OPENAI001
// Search memories by a query
MemorySearchOptions searchOptions = new(scope)
{
Items =
{
ResponseItem.CreateUserMessageItem(
"What are my coffee preferences?")
},
ResultOptions = new() { MaxMemories = 5 },
};
MemoryStoreSearchResponse searchResponse =
projectClient.MemoryStores.SearchMemories(
memoryStoreName: memoryStore.Name,
options: searchOptions);
Console.WriteLine(
$"Found {searchResponse.Memories.Count} memories");
foreach (MemorySearchItem item in searchResponse.Memories)
{
Console.WriteLine(
$" - Content: {item.MemoryItem.Content}");
}
const queryMessage: Record<string, unknown> = {
type: "message",
role: "user",
content: [
{ type: "input_text", text: "What are my coffee preferences?" },
],
};
console.log("\nSearching memories for stored preferences...");
const searchResponse =
await project.beta.memoryStores.searchMemories(
memoryStoreName,
scope,
{
items: [queryMessage],
options: { max_memories: 5 },
},
);
console.log(`Found ${searchResponse.memories.length} memory item(s)`);
for (const memory of searchResponse.memories) {
console.log(
` - Memory ID: ${memory.memory_item.memory_id}, ` +
`Content: ${memory.memory_item.content}`,
);
}
import com.azure.ai.agents.models.MemorySearchItem;
import com.azure.ai.agents.models.MemorySearchOptions;
import com.azure.ai.agents.models.MemoryStoreSearchResponse;
import com.openai.models.responses.EasyInputMessage;
import com.openai.models.responses.ResponseInputItem;
import java.util.Arrays;
ResponseInputItem queryMessage = ResponseInputItem.ofEasyInputMessage(
EasyInputMessage.builder()
.role(EasyInputMessage.Role.USER)
.content("What are my coffee preferences?")
.build());
MemorySearchOptions searchOptions = new MemorySearchOptions()
.setMaxMemories(5);
MemoryStoreSearchResponse searchResponse = memoryStoresClient.searchMemories(
memoryStoreName,
scope,
Arrays.asList(queryMessage),
null,
searchOptions);
System.out.println("Found " + searchResponse.getMemories().size() + " memories");
for (MemorySearchItem item : searchResponse.getMemories()) {
System.out.println(
" - Memory ID: " + item.getMemoryItem().getMemoryId() + ", Content: "
+ item.getMemoryItem().getContent());
}
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store:search_memories?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"scope": "user_123",
"items": [
{
"type": "message",
"role": "user",
"content": [
{
"type": "input_text",
"text": "What are my coffee preferences?"
}
]
}
],
"options": {
"max_memories": 5
}
}'
Abrufen statischer oder kontextbezogener Erinnerungen
Benutzerprofilerinnerungen können häufig nicht basierend auf der semantischen Ähnlichkeit mit der Nachricht eines Benutzers abgerufen werden. Es wird empfohlen, statische Erinnerungen am Anfang jeder Unterhaltung einzufügen und kontextbezogene Erinnerungen zu verwenden, um jede Agentantwort zu generieren.
Um statische Erinnerungen abzurufen, rufen Sie
search_memoriesmit einemscopeaber ohneitemsoderprevious_search_id. Dadurch werden Benutzerprofilerinnerungen zurückgegeben, die dem Bereich zugeordnet sind.Um kontextbezogene Erinnerungen abzurufen, rufen Sie
search_memoriesauf und stellen Sieitemsauf die neuesten Nachrichten ein. Dadurch können sowohl Benutzerprofil- als auch Chatzusammenfassungserinnerungen zurückgegeben werden, die für die angegebenen Elemente am relevantesten sind.
Weitere Informationen zu Benutzerprofil- und Chatzusammenfassungserinnerungen finden Sie unter "Speichertypen".
Verwalten von Speicherelementen
Verwenden Sie Vorgänge auf Elementebene, um einzelne Speichereinträge direkt zu erstellen, zu prüfen, zu aktualisieren und zu löschen. Informationen zum Löschen auf Bereichsebene oder zum Löschen auf Speicherebene finden Sie unter "Löschen von Erinnerungen".
Erstellen eines Speicherelements
# Create a memory item directly
created = project_client.beta.memory_stores.create_memory(
name=memory_store_name,
scope="defaultUser",
content="User prefers concise changelogs with impact-first summaries.",
kind="user_profile",
)
print(f"Memory ID: {created.memory_id}")
print(f"Content: {created.content}")
print(f"Kind: {created.kind}")
// This code snippet is currently unavailable.
// Create a memory item directly
const created = await project.beta.memoryStores.createMemory(
memoryStoreName,
"defaultUser",
"User prefers concise changelogs with impact-first summaries.",
"user_profile",
);
console.log(`Memory ID: ${created.memory_id}`);
console.log(`Content: ${created.content}`);
console.log(`Kind: ${created.kind}`);
import com.azure.ai.agents.models.MemoryItem;
import com.azure.ai.agents.models.MemoryItemKind;
MemoryItem created = memoryStoresClient.createMemory(
memoryStoreName,
"defaultUser",
"User prefers concise changelogs with impact-first summaries.",
MemoryItemKind.USER_PROFILE);
System.out.println("Memory ID: " + created.getMemoryId());
System.out.println("Content: " + created.getContent());
System.out.println("Kind: " + created.getKind());
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store/items?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"scope": "defaultUser",
"content": "User prefers concise changelogs with impact-first summaries.",
"kind": "user_profile"
}'
Speichereintrag abrufen
# Retrieve a memory item by ID
item = project_client.beta.memory_stores.get_memory(
name=memory_store_name,
memory_id="<memory-item-id>",
)
print(f"Memory ID: {item.memory_id}")
print(f"Content: {item.content}")
print(f"Kind: {item.kind}")
// This code snippet is currently unavailable.
// Retrieve a memory item by ID
const item = await project.beta.memoryStores.getMemory(
memoryStoreName,
"<memory-item-id>",
);
console.log(`Memory ID: ${item.memory_id}`);
console.log(`Content: ${item.content}`);
console.log(`Kind: ${item.kind}`);
import com.azure.ai.agents.models.MemoryItem;
MemoryItem memItem = memoryStoresClient.getMemory(
memoryStoreName,
"<memory-item-id>");
System.out.println("Memory ID: " + memItem.getMemoryId());
System.out.println("Content: " + memItem.getContent());
System.out.println("Kind: " + memItem.getKind());
curl -X GET "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store/items/<memory-item-id>?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
Auflisten von Speicherelementen
# List all memory items in the store
memories = project_client.beta.memory_stores.list_memories(
name=memory_store_name,
scope="defaultUser",
)
count = 0
for item in memories:
count += 1
print(f"- {item.memory_id} [{item.kind}]: {item.content}")
print(f"Total memories: {count}")
// This code snippet is currently unavailable.
// List all memory items in the store
const memoriesList = project.beta.memoryStores.listMemories(
memoryStoreName,
"defaultUser",
);
let count = 0;
for await (const item of memoriesList) {
count += 1;
console.log(`- ${item.memory_id} [${item.kind}]: ${item.content}`);
}
console.log(`Total memories: ${count}`);
import com.azure.ai.agents.models.ListMemoriesOptions;
import com.azure.ai.agents.models.MemoryItem;
ListMemoriesOptions options = new ListMemoriesOptions(
memoryStoreName,
"defaultUser");
int count = 0;
for (MemoryItem memoryEntry : memoryStoresClient.listMemories(options)) {
count++;
System.out.println(
"- " + memoryEntry.getMemoryId() + " [" + memoryEntry.getKind() + "]: "
+ memoryEntry.getContent());
}
System.out.println("Total memories: " + count);
curl -X GET "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store/items:list?scope=user_123&api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
Aktualisieren eines Speicherelements
# Update a memory item by ID
updated = project_client.beta.memory_stores.update_memory(
name=memory_store_name,
memory_id="<memory-item-id>",
content="User prefers detailed technical explanations with examples.",
)
print(f"Updated: {updated.content}")
// This code snippet is currently unavailable.
// Update a memory item by ID
const updated = await project.beta.memoryStores.updateMemory(
memoryStoreName,
"<memory-item-id>",
"User prefers detailed technical explanations with examples.",
);
console.log(`Updated: ${updated.content}`);
import com.azure.ai.agents.models.MemoryItem;
MemoryItem updated = memoryStoresClient.updateMemory(
memoryStoreName,
"<memory-item-id>",
"User prefers detailed technical explanations with examples.");
System.out.println("Updated: " + updated.getContent());
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store/items/<memory-item-id>?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"content": "User prefers detailed technical explanations with examples."}'
Löschen eines Speicherelements
# Delete a memory item by ID
project_client.beta.memory_stores.delete_memory(
name=memory_store_name,
memory_id="<memory-item-id>",
)
print("Memory item deleted successfully")
// This code snippet is currently unavailable.
// Delete a memory item by ID
await project.beta.memoryStores.deleteMemory(
memoryStoreName,
"<memory-item-id>",
);
console.log("Memory item deleted successfully");
memoryStoresClient.deleteMemory(memoryStoreName, "<memory-item-id>");
System.out.println("Memory item deleted successfully");
curl -X DELETE "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store/items/<memory-item-id>?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
Löschen von Erinnerungen
Warnung
Bevor Sie einen Speicher löschen, sollten Sie die Auswirkungen auf abhängige Agents berücksichtigen. Agents mit angehängten Speichern können möglicherweise den Zugriff auf den historischen Kontext verlieren.
Erinnerungen werden innerhalb eines Speichers nach Bereich organisiert. Sie können Speicher für einen bestimmten Bereich löschen, um benutzerspezifische Daten zu entfernen, oder Sie können den gesamten Speicher löschen, um alle Erinnerungen in allen Bereichen zu entfernen.
Löschen von Erinnerungen nach Bereich
Entfernen Sie alle Erinnerungen, die einem bestimmten Benutzer- oder Gruppenbereich zugeordnet sind, während sie die Speicherstruktur beibehalten. Verwenden Sie diesen Vorgang, um Benutzerdatenlöschanforderungen zu verarbeiten oder Speicher für bestimmte Benutzer zurückzusetzen.
# Delete memories for a specific scope
project_client.beta.memory_stores.delete_scope(
name=memory_store_name,
scope="user_123"
)
print(f"Deleted memories for scope: user_123")
// Delete memories for a specific scope
MemoryStoreDeleteScopeResponse deleteScopeResponse =
projectClient.MemoryStores.DeleteScope(
name: memoryStore.Name,
scope: "user_123");
Console.WriteLine(
$"Deleted scope: {deleteScopeResponse.Name}, "
+ $"success: {deleteScopeResponse.IsDeleted}");
console.log("\nDeleting memories for scope...");
await project.beta.memoryStores.deleteScope(memoryStoreName, scope);
memoryStoresClient.deleteScope(memoryStoreName, "user_123");
System.out.println("Deleted memories for scope: user_123");
curl -X POST "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store:delete_scope?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"scope": "user_123"
}'
Löschen eines Speichers
Entfernen Sie den gesamten Speicher und alle zugehörigen Erinnerungen in allen Bereichen. Dieser Vorgang ist unumkehrbar.
# Delete the entire memory store
delete_response = project_client.beta.memory_stores.delete(memory_store_name)
print(f"Deleted memory store: {delete_response.deleted}")
// Delete the entire memory store
DeleteMemoryStoreResponse deleteResponse =
projectClient.MemoryStores.DeleteMemoryStore(
name: memoryStore.Name);
Console.WriteLine(
$"Deleted memory store: {deleteResponse.Name}, "
+ $"success: {deleteResponse.IsDeleted}");
console.log("Deleting memory store...");
await project.beta.memoryStores.delete(memoryStoreName);
memoryStoresClient.deleteMemoryStore(memoryStoreName);
System.out.println("Deleted memory store: " + memoryStoreName);
curl -X DELETE "${FOUNDRY_PROJECT_ENDPOINT}/memory_stores/my_memory_store?api-version=${API_VERSION}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
Bewährte Methoden
Implementieren von Zugriffssteuerungen pro Benutzer: Vermeiden Sie es, Agenten Zugriff auf Erinnerungen zu gewähren, die für alle Benutzer freigegeben wurden. Verwenden Sie die
scopeEigenschaft, um den Speicher nach Benutzer zu partitionieren. Wenn Siescopebenutzerübergreifend freigeben, verwenden Sieuser_profile_details, um das Speichersystem anzuweisen, persönliche Informationen nicht zu speichern.Zuordnen des Bereichs zum Endbenutzer: Wenn Sie das Speichersuchtool verwenden, setzen Sie
scopeauf{{$userId}}in der Tooldefinition. Das System ermittelt die Benutzeridentität aus demx-memory-user-idAnforderungsheader, wenn vorhanden. Andernfalls fällt sie auf das Microsoft Entra Token des Aufrufers zurück ({tid}_{oid}).Minimieren und Schützen vertraulicher Daten: Speichern Sie nur das, was für Ihren Anwendungsfall erforderlich ist. Wenn Sie vertrauliche Daten speichern müssen, z. B. personenbezogene Daten, Gesundheitsdaten oder vertrauliche Geschäftseingaben, sollten Sie andere Inhalte redigieren oder entfernen, die verwendet werden könnten, um eine Person zurückzuverfolgen.
Unterstützung von Datenschutz und Compliance: Geben Sie den Benutzern Transparenz, indem Sie ihnen die Möglichkeit bieten, auf ihre Daten zuzugreifen und diese zu löschen. Zeichnen Sie alle Löschungen in einem manipulationssicheren Überwachungspfad auf. Stellen Sie sicher, dass das System den lokalen Compliance-Anforderungen und behördlichen Standards entspricht.
Segmentieren von Daten und Isolieren des Arbeitsspeichers: Im Bereich von Multi-Agent-Systemen segmentieren Sie den Arbeitsspeicher logisch und operativ. Ermöglichen Sie Kunden, ihren eigenen Speicherbedarf zu definieren, zu isolieren, zu prüfen und zu löschen.
Überwachen der Speicherauslastung: Verfolgen Sie die Tokennutzung und Speichervorgänge, um Kosten zu verstehen und die Leistung zu optimieren.
Verfügbarmachen von Benutzerspeichersteuerelementen: Stellen Sie Bearbeitungs- und Löschaktionen auf Elementebene bereit, um Workflows für Vertrauensstellungen und Datenrechte zu unterstützen.
Festlegen expliziter Aufbewahrungsstandardwerte: Verwenden Sie TTL-Einstellungen, die den Richtlinienanforderungen entsprechen. Verhalten der Dokumentaufbewahrung in der UX Ihres Produkts.
Problembehandlung
| Angelegenheit | Ursache | Auflösung |
|---|---|---|
| Anforderungen schlagen mit einem Authentifizierungs- oder Autorisierungsfehler fehl. | Ihre Identität oder die vom Projekt verwaltete Identität verfügt nicht über die erforderlichen Rollen. | Überprüfen Sie die Rollen in Autorisierung und Berechtigungen. Generieren Sie für REST-Aufrufe ein neues Zugriffstoken, und versuchen Sie es erneut. |
| Erinnerungen erscheinen nicht nach einem Gespräch. | Speicheraktualisierungen werden entprellt oder noch verarbeitet. | Erhöhen Sie die Wartezeit, oder rufen Sie die Update-API mit update_delay auf 0, um die Verarbeitung sofort auszulösen. |
| Die Speichersuche gibt keine Ergebnisse zurück. | Der scope Wert stimmt nicht mit dem Bereich überein, der verwendet wird, wenn Erinnerungen gespeichert wurden. |
Verwenden Sie denselben Bereich für Aktualisierung und Suche. Wenn Sie den Reservierungsumfang den Benutzern zuordnen, verwenden Sie einen stabilen Benutzerbezeichner. |
| Die Agentantwort verwendet keinen gespeicherten Speicher. | Der Agent ist nicht mit dem Speichersuchtool konfiguriert, oder der Speicherspeichername ist falsch. | Vergewissern Sie sich, dass die Agentdefinition das memory_search_preview Tool enthält und auf den richtigen Speicherspeichernamen verweist. |
| Die prozedurale Speicher- oder Standardeinstellung TTL wurde nach einem Update nicht wirksam. | In der neuesten Vorschauversion können Sie Standardoptionen nur beim Erstellen des Memory Store festlegen. | Erstellen Sie den Memory Store mit den gewünschten Standardwerten neu, oder prüfen Sie, ob Ihre API-Version Aktualisierungen von Optionen nach der Erstellung unterstützt. |
| Eine explizite Erinnerungs- oder Vergessen-Anforderung hat keine Speicherbefehlselemente in der Antwort zurückgegeben. | Die Speicherfunktion ist nicht korrekt konfiguriert, oder die Eingabe wurde nicht als Befehl zum Merken oder Vergessen erkannt. | Überprüfen Sie die Konfiguration des Memory-Tools und testen Sie mit einer direkten Formulierung wie „merken oder vergessen“. |
Verwandte Inhalte
- Azure AI-Erweiterungen für OpenAI: Beispiel für die Speichersuche
- Azure AI Projects-Client-Bibliothek für .NET: Speicherverwaltung-Beispiel
- REST-API-Referenz für Speicher
- Speicher in Foundry Agent Service
- Kontingente und Grenzwerte für den Foundry Agent-Dienst
- Einen Agenten mit Microsoft Foundry erstellen
- Azure AI Agents-Clientbibliothek für Java: Speicherbeispiele
- Azure KI-Agents-Clientbibliothek für Java: Beispiel für den Speichersuch-Agent
- REST-API-Referenz für Speicher
- Speicher in Foundry Agent Service
- Kontingente und Grenzwerte für den Foundry Agent-Dienst
- Einen Agenten mit Microsoft Foundry erstellen