خلفيات الذاكرة
تطبق جميع الواجهات الخلفية نفس MemoryService trait، لذلك تختار واحدة عن طريق تمكين علامة ميزة وبنائها — لا يتغير رمز الـ Agent الخاص بك. يوجد ستة.
لمحة سريعة
| الواجهة الخلفية | الميزة | الاستمرارية | البحث | يُستخدم عندما |
|---|---|---|---|---|
InMemoryMemoryService | (افتراضي) | للعملية فقط | كلمة مفتاحية | التطوير، الاختبارات، العروض التوضيحية |
SqliteMemoryService | sqlite-memory | ملف | كلمة مفتاحية | تطبيقات العقدة الواحدة، الاستمرارية المحلية |
PostgresMemoryService | database-memory | Postgres + pgvector | تشابه المتجهات | البحث الدلالي للإنتاج |
RedisMemoryService | redis-memory | Redis (اختياري TTL) | كلمة مفتاحية | ذاكرة تخزين مؤقت سريعة، شبه مؤقتة، مشتركة |
MongoMemoryService | mongodb-memory | MongoDB | كلمة مفتاحية / متجه | البنية التحتية لـ Mongo الموجودة |
Neo4jMemoryService | neo4j-memory | Neo4j | الرسم البياني | البنية التحتية لـ Neo4j الموجودة |
(ثنائي الزمن GraphMemoryService هو السابع، ويتم تغطيته في صفحته الخاصة —
الرسم البياني المعرفي.)
InMemory — ابدأ هنا
إعداد صفري. كل شيء يعيش في العملية ويختفي عند الخروج.
use adk_memory::InMemoryMemoryService;
let memory = InMemoryMemoryService::new();
مثالي للتطوير ومجموعة الاختبار؛ استبدله بخلفية دائمة بتغيير سطر واحد لأن السمة متطابقة.
SQLite — ملف
دائم، ملف واحد، بدون خادم. رائع لتطبيقات سطح المكتب والخدمات أحادية العقدة.
use adk_memory::SqliteMemoryService;
let memory = SqliteMemoryService::new("sqlite://memory.db").await?;
// or build from an existing pool: SqliteMemoryService::from_pool(pool)
Postgres + pgvector — بحث دلالي للإنتاج
الخلفية للبحث الحقيقي عن التشابه. يخزن التضمينات في pgvector ويتيح لك اختيار استراتيجية الفهرسة.
use adk_memory::{PostgresMemoryService, VectorIndexType};
let memory = PostgresMemoryService::builder(pool, embedding_provider)
.vector_index(VectorIndexType::Hnsw { m: 32, ef_construction: 128 }) // or IvfFlat / None
.build()
.await?;
يقوم VectorIndexType::None بالبحث الدقيق (القوة الغاشمة) — وهو جيد للمجموعات الصغيرة؛
يتوسع Hnsw (الافتراضي) و IvfFlat إلى المجموعات الكبيرة. يتطلب البحث المتجه مزود تضمين.
Redis, MongoDB, Neo4j
استخدم هذه عندما تكون البنية التحتية لديك قيد التشغيل بالفعل:
use adk_memory::{RedisMemoryService, RedisMemoryConfig};
use std::time::Duration;
let memory = RedisMemoryService::new(RedisMemoryConfig {
url: "redis://localhost:6379".into(),
ttl: Some(Duration::from_secs(60 * 60 * 24 * 30)), // optional expiry
}).await?;
يتبع MongoMemoryService::new(...) و Neo4jMemoryService::new(...) نفس
الشكل. كلها تحترم عزل (app, user, project) من
المفاهيم.
التضمينات
الخلفيات التي تقوم بتشابه المتجهات (Postgres، Mongo اختياريًا) تحتاج إلى تحويل النص إلى متجهات. قدم EmbeddingProvider:
#[async_trait]
pub trait EmbeddingProvider: Send + Sync {
async fn embed(&self, texts: &[String]) -> Result<Vec<Vec<f32>>>;
}
الخلفيات القائمة على الكلمات المفتاحية (InMemory, SQLite, Redis) لا تحتاج إلى واحدة. طابق نموذج التضمين الذي تقوم ب فهرسته مع النموذج الذي تستعلم به.
الترحيلات
تقوم الخدمات المدعومة بـ SQL بتشغيل ترحيلات ذات إصدارات ومتطابقة لإنشاء وتحديث مخططها،
لذا فإن نشر إصدار جديد لا يتطلب DDL يدويًا. استدعِ migrate() للخدمة (أو دع الإنشاء يتعامل معها) عند بدء التشغيل.
الاختيار
- البناء / الاختبار → InMemory.
- عقدة واحدة، وتريدها أن تستمر → SQLite.
- استدعاء دلالي حقيقي على نطاق واسع → Postgres + pgvector.
- أنت تدير بالفعل Redis / Mongo / Neo4j → تلك الخلفية.
- تريد نموذجًا قابلًا للاستعلام للمستخدم، وليس نسخة نصية →
GraphMemoryService.
التالي: الرسم البياني المعرفي →