الذاكرة
امنح وكلاءك ذاكرة تتجاوز محادثة واحدة. تحتفظ حالة الجلسة بهذه المحادثة؛ أما الذاكرة فهي مخزن طويل الأمد يقرأ منه الوكيل في بداية الدور ويكتب إليه ما يتعلمه — بحيث تعرف الجلسة التالية المستخدم مسبقًا.
يأخذك هذا القسم في جولة بدءًا من الصفر: نوعا الذاكرة اللذان يقدمهما ADK-Rust، والأنواع الأساسية، والواجهات الخلفية، ورسم المعرفة البي-زمني، وكيفية توصيل كل ذلك بوكيل.
هل أنت جديد على ADK-Rust؟ اقرأ المقدمة و الجلسات والحالة أولًا — فالذاكرة هي النظير المستمر للجلسة المؤقتة.
نوعا الذاكرة
يوفّر ADK-Rust نموذجي ذاكرة متكاملين خلف سمة MemoryService نفسها،
بحيث يمكن للوكيل استخدام أيٍّ منهما عبر واجهة واحدة:
| مخزن دلالي | رسم بياني للمعرفة | |
|---|---|---|
| الشكل | مجموعة قابلة للبحث من إدخالات نصية | كيانات وملاحظات وعلاقات محددة الأنواع |
| الاسترجاع | بحث عن التشابه / الكلمات المفتاحية ضمن الإدخالات | بطاقة ملف شخصي + بحث في العقدة بتسجيل رموز الوصول |
| الأفضل لـ | «ما الذي ناقشناه حول X؟» | «ما الصحيح بشأن هذا المستخدم الآن؟» |
| الواجهات الخلفية | InMemory، SQLite، Postgres، Redis، MongoDB، Neo4j | GraphMemoryService (SQLite، ثنائي الزمن) |
| الصفحة | المفاهيم · الواجهات الخلفية | رسم المعرفة |
لا يتعين عليك الاختيار على مستوى شامل — اختر لكل وكيل بناءً على ما إذا كنت تحتاج إلى استرجاع بأسلوب السجلّ أو نموذج نظيف وقابل للاستعلام للمستخدم.
النموذج الذهني
Agent turn
│ search_memory(query) ← recall relevant context at turn start
▼
adk_core::Memory ← the interface the agent sees
│ (MemoryServiceAdapter bridges to…)
▼
MemoryService ← add_session / search / delete_user …
├─ InMemoryMemoryService (dev)
├─ Sqlite/Postgres/Redis/… (semantic store)
└─ GraphMemoryService (bi-temporal knowledge graph)
- إن
MemoryServiceهو الواجهة الخلفية للتخزين: إذ يخزّن الإدخالات (أو عُقد الرسم البياني) ويجيب عنsearch. - يغلّفه
MemoryServiceAdapterباعتبارهadk_core::Memory، ضمن نطاق(app_name, user_id, project_id?)، وهو ما يستدعيهsearch_memoryالخاص بالوكيل فعليًا. - يحتفظ المشغّل بـ
Memoryويعرضه على الوكيل؛ وتتيح أدوات الذاكرة للوكيل البحث في الذاكرة وتنظيمها عمدًا.
التثبيت
# Semantic store — pick the backend you need
adk-memory = { version = "2.1.0", features = ["sqlite-memory"] }
# Bi-temporal knowledge graph
adk-memory = { version = "2.1.0", features = ["graph-memory"] }
| الميزة | يضيف |
|---|---|
| (الافتراضي) | InMemoryMemoryService — بدون إعداد، للتطوير |
sqlite-memory | SqliteMemoryService — مخزن دلالي قائم على الملفات |
graph-memory | GraphMemoryService — رسم بياني للمعرفة ثنائي الزمن (SQLite) |
database-memory | PostgresMemoryService مع pgvector |
redis-memory | RedisMemoryService |
mongodb-memory | MongoMemoryService |
neo4j-memory | Neo4jMemoryService |
بدء سريع خلال 60 ثانية
خزّن ذكريْن وابحث عنهما مجددًا:
use adk_memory::{InMemoryMemoryService, MemoryService, MemoryEntry, SearchRequest};
use adk_core::Content;
use chrono::Utc;
# async fn run() -> anyhow::Result<()> {
let memory = InMemoryMemoryService::new();
memory.add_session("support", "alice", "s1", vec![
MemoryEntry { content: Content::new("user").with_text("I prefer email over phone"),
author: "user".into(), timestamp: Utc::now() },
]).await?;
let hits = memory.search(SearchRequest {
app_name: "support".into(), user_id: "alice".into(),
query: "how should we contact this customer?".into(),
..Default::default()
}).await?;
for entry in hits.entries { println!("{:?}", entry.content); }
# Ok(()) }
في وكيل حقيقي، لن تستدعي search يدويًا — بل تُرفق الخدمة بـ
Runner وتدع الوكيل يسترجع الذاكرة وينظّمها بنفسه.
إلى أين تذهب بعد ذلك
- المفاهيم —
MemoryEntry، سمةMemoryService، البحث، تحديد نطاق المشروع، ومحو البيانات وفقًا للائحة GDPR. - الواجهات الخلفية — مخازن البيانات الستة، ورايات الميزات، وكيفية الاختيار.
- الرسم البياني للمعرفة —
GraphMemoryServiceولماذا تُعدّ الثنائية الزمن مهمة. - الأدوات والوكلاء — توصيل الذاكرة بالوكلاء؛
remember/relateوأدوات الذاكرة.