إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
أضف سياقا إلى وكيلك حتى يتمكن من تذكر تفضيلات المستخدم أو التفاعلات السابقة أو المعرفة الخارجية.
بشكل افتراضي، سيقوم الوكلاء بتخزين محفوظات الدردشة InMemoryChatHistoryProvider في أو في خدمة الذكاء الاصطناعي الأساسية، اعتمادا على ما تتطلبه الخدمة الأساسية.
يستخدم العامل التالي OpenAI Chat Completion، والذي لا يدعم ولا يتطلب تخزين محفوظات الدردشة في الخدمة لذلك يقوم تلقائيا بإنشاء واستخدام InMemoryChatHistoryProvider.
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");
تحذير
DefaultAzureCredential مناسب للتنمية ولكنه يتطلب دراسة متأنية في الإنتاج. في الإنتاج، ضع في اعتبارك استخدام بيانات اعتماد محددة (على سبيل المثال، ManagedIdentityCredential) لتجنب مشكلات زمن الانتقال، وبحث بيانات الاعتماد غير المقصودة، والمخاطر الأمنية المحتملة من الآليات الاحتياطية.
لاستخدام مخصص ChatHistoryProvider ، يمكنك تمرير واحد إلى خيارات العامل:
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()
});
استخدم جلسة عمل لمشاركة السياق عبر عمليات التشغيل:
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
انظر هنا للحصول على نموذج تطبيق كامل قابل للتشغيل.
حدد موفر سياق يخزن معلومات المستخدم في حالة جلسة العمل ويضخ إرشادات التخصيص:
class UserMemoryProvider(ContextProvider):
"""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()
إنشاء عامل مع موفر السياق:
client = FoundryChatClient(
project_endpoint="https://your-project.services.ai.azure.com",
model="gpt-4o",
credential=AzureCliCredential(),
)
agent = Agent(
client=client,
name="MemoryAgent",
instructions="You are a friendly assistant.",
context_providers=[UserMemoryProvider()],
)
قم بتشغيله — يمكن للعامل الآن الوصول إلى السياق:
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')}")
Tip
راجع النموذج الكامل للملف الكامل القابل للتشغيل.
Note
في Python، تتم معالجة الثبات/الذاكرة بواسطة ContextProvider عمليات التنفيذ.HistoryProvider
InMemoryHistoryProvider هو موفر المحفوظات المحلية المضمنة في الذاكرة.
RawAgent قد يضيف InMemoryHistoryProvider() تلقائيا في حالات معينة (على سبيل المثال، عند استخدام جلسة عمل مع عدم وجود موفري سياق مكونين ولا مؤشرات تخزين من جانب الخدمة)، ولكن هذا غير مضمون في جميع السيناريوهات.
إذا كنت تريد دائما الاستمرارية المحلية، أضف InMemoryHistoryProvider بشكل صريح. تأكد أيضا من أن موفر محفوظات واحدا فقط لديه load_messages=True، لذلك لا تقوم بإعادة تشغيل متاجر متعددة في نفس استدعاء .
يمكنك أيضا إضافة مخزن تدقيق عن طريق إلحاق موفر محفوظات آخر في نهاية قائمة context_providers ب store_context_messages=True:
from agent_framework import InMemoryHistoryProvider
from agent_framework.mem0 import Mem0ContextProvider
memory_store = InMemoryHistoryProvider(load_messages=True) # add local history for a reused or serialized session
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
)
بشكل افتراضي، يستخدم الوكلاء إما المحفوظات المحلية في الذاكرة أو المحفوظات المدارة بواسطة الخدمة اعتمادا على الموفر وجلسة العمل.
يستخدم عامل Foundry التالي نشر نموذج مدعوم من المشروع. أضف موفر سياق عندما تريد ذاكرة خاصة بالتطبيق أو حالة تخصيص خارج محفوظات المحادثات.
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",
},
},
)
حدد موفر سياق يخزن معلومات المستخدم في حالة جلسة العمل ويضخ إرشادات التخصيص:
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
}
إنشاء عامل مع موفر السياق:
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()},
},
},
)
قم بتشغيله — يمكن للعامل الآن الوصول إلى السياق:
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
راجع النموذج الكامل للملف الكامل القابل للتشغيل.
الخطوات التالية
انتقل إلى أبعد من ذلك:
- التخزين الدائم — تخزين المحادثات في قواعد البيانات
- محفوظات الدردشة — إدارة محفوظات الدردشة والذاكرة