الذاكرة

امنح وكلاءك ذاكرة تتجاوز محادثة واحدة. تحتفظ حالة الجلسة بهذه المحادثة؛ أما الذاكرة فهي مخزن طويل الأمد يقرأ منه الوكيل في بداية الدور ويكتب إليه ما يتعلمه — بحيث تعرف الجلسة التالية المستخدم مسبقًا.

يأخذك هذا القسم في جولة بدءًا من الصفر: نوعا الذاكرة اللذان يقدمهما ADK-Rust، والأنواع الأساسية، والواجهات الخلفية، ورسم المعرفة البي-زمني، وكيفية توصيل كل ذلك بوكيل.

هل أنت جديد على ADK-Rust؟ اقرأ المقدمة و الجلسات والحالة أولًا — فالذاكرة هي النظير المستمر للجلسة المؤقتة.

نوعا الذاكرة

يوفّر ADK-Rust نموذجي ذاكرة متكاملين خلف سمة MemoryService نفسها، بحيث يمكن للوكيل استخدام أيٍّ منهما عبر واجهة واحدة:

مخزن دلاليرسم بياني للمعرفة
الشكلمجموعة قابلة للبحث من إدخالات نصيةكيانات وملاحظات وعلاقات محددة الأنواع
الاسترجاعبحث عن التشابه / الكلمات المفتاحية ضمن الإدخالاتبطاقة ملف شخصي + بحث في العقدة بتسجيل رموز الوصول
الأفضل لـ«ما الذي ناقشناه حول X؟»«ما الصحيح بشأن هذا المستخدم الآن؟»
الواجهات الخلفيةInMemory، SQLite، Postgres، Redis، MongoDB، Neo4jGraphMemoryService (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-memorySqliteMemoryService — مخزن دلالي قائم على الملفات
graph-memoryGraphMemoryService — رسم بياني للمعرفة ثنائي الزمن (SQLite)
database-memoryPostgresMemoryService مع pgvector
redis-memoryRedisMemoryService
mongodb-memoryMongoMemoryService
neo4j-memoryNeo4jMemoryService

بدء سريع خلال 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 وتدع الوكيل يسترجع الذاكرة وينظّمها بنفسه.

إلى أين تذهب بعد ذلك

  1. المفاهيمMemoryEntry، سمة MemoryService، البحث، تحديد نطاق المشروع، ومحو البيانات وفقًا للائحة GDPR.
  2. الواجهات الخلفية — مخازن البيانات الستة، ورايات الميزات، وكيفية الاختيار.
  3. الرسم البياني للمعرفةGraphMemoryService ولماذا تُعدّ الثنائية الزمن مهمة.
  4. الأدوات والوكلاء — توصيل الذاكرة بالوكلاء؛ remember/relate وأدوات الذاكرة.
الذاكرة - وثائق ADK-Rust | ADK-Rust