الذاكرة

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

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