الذاكرة في الوكلاء
تخزين الذاكرة هو نصف القصة؛ النقطة هي أن الوكيل يستخدمها — يستدعي السياق ذي الصلة قبل أن يجيب، ويكتب الحقائق الدائمة مرة أخرى كلما تعلم. هناك آليتان متعاونتان:
- ربط خدمة بحيث يمكن للوكيل الاستدعاء.
- إعطاء الوكيل أدوات بحيث يمكنه البحث والتنظيم عن قصد.
1. ربط الذاكرة بالوكيل
يتم ربط MemoryService بواجهة adk_core::Memory التي يستخدمها الوكيل عبر MemoryServiceAdapter، والمحددة النطاق لـ (app, user, project?). قم بربطها بـ Runner وتدفق search_memory الخاص بالوكيل إلى الواجهة الخلفية الخاصة بك:
use adk_memory::{InMemoryMemoryService, MemoryServiceAdapter};
use std::sync::Arc;
let service = Arc::new(InMemoryMemoryService::new());
let memory: Arc<dyn adk_core::Memory> =
Arc::new(MemoryServiceAdapter::new(service.clone(), "support", "alice"));
let runner = Runner::builder()
.agent(agent)
.session_service(sessions)
.memory_service(memory) // ← the agent can now recall
.build()?;
مع هذا الإعداد، يمكن للوكيل استدعاء search_memory(query) خلال دور — ولكن متى يفعل ذلك يعتمد على كيفية توصيلك للاستدعاء. هذا هو الغرض من الأدوات.
2. أدوات الذاكرة (المخزن الدلالي)
يقدم adk-tool (ميزة memory-tools) أداتين تحولان الاستدعاء إلى سلوك وكيل:
| الأداة | كيف تعمل |
|---|---|
LoadMemoryTool | يستدعيها الـ Agent كأي أداة أخرى، عندما يقرر أنه بحاجة إلى الاستدعاء. |
PreloadMemoryTool | تعمل كـ BeforeModelCallback، وتقوم بحقن الذاكرة ذات الصلة تلقائيًا في بداية كل دورة. |
use adk_tool::memory::{LoadMemoryTool, PreloadMemoryTool};
let load = LoadMemoryTool::builder()
.memory_service(service.clone())
.max_results(5)
.min_relevance_score(0.3)
.build()?;
let preload = PreloadMemoryTool::builder()
.memory_service(service.clone())
.max_results(3)
.build()?;
let agent = LlmAgentBuilder::new("assistant")
.model(model)
.tool(Arc::new(load)) // on-demand recall
.before_model_callback(preload.into_before_model_callback()) // automatic recall
.build()?;
استخدم preload لـ "تذكر الأساسيات دائمًا،" و load لـ "ابحث عنها عند الحاجة." انظر المرجع الكامل: أدوات الذاكرة.
أدوات الرسم البياني المعرفي
عندما تكون الواجهة الخلفية هي GraphMemoryService، يمنح adk-tool (ميزة graph-memory-tools) الوكيل أداتين لـ تنظيم الرسم البياني نفسه — بحيث يتذكر عمدًا بدلاً من تفريغ النصوص:
| الأداة | ما يفعله النموذج بها | تُعيّن إلى |
|---|---|---|
remember (RememberTool) | حفظ حقائق دائمة حول كيان ("يفضل البريد الإلكتروني") | create_entities / add_observations |
relate (RelateTool) | تسجيل علاقة مُحددة النوع ("أليس → works_at → أكـمي") | create_relations |
توجّه أوصافها النموذج نحو حقائق مستقرة وقابلة لإعادة الاستخدام (الأسماء، التفضيلات، الأهداف، العلاقات) وبعيدًا عن الأحاديث الجانبية. سجّلها بشكل فردي أو كمجموعة أدوات:
use adk_tool::memory::{RememberTool, RelateTool, GraphMemoryToolset};
use std::sync::Arc;
let kg = Arc::new(GraphMemoryService::new("sqlite://mem.db").await?);
kg.migrate().await?;
// individually…
let agent = LlmAgentBuilder::new("coach")
.model(model)
.tool(Arc::new(RememberTool::new(kg.clone())))
.tool(Arc::new(RelateTool::new(kg.clone())))
.build()?;
// …or as one toolset
let toolset = GraphMemoryToolset::new(kg.clone());
اقرن هذا بـ profile_card الخاص بالرسم البياني المحقونة عند بدء الجلسة، وستحصل على Agent يقوم بـ قراءة من هو المستخدم مقدمًا وكتابة ما يتعلمه مرة أخرى — الحلقة التي تجعل الذاكرة تبدو حقيقية.
في الجلسات في الوقت الفعلي
نفس التوصيلات تعمل لـ Agents الصوتية/متعددة الوسائط عبر IntegratedRealtimeRunner — remember/relate يتم ربطها تلقائيًا بجلسة في الوقت الفعلي، و MemoryService يحقن السياق عند الاتصال ويخزن الأدوار. انظر Realtime → Memory.
نموذج كامل
مثال realtime_voice (Mindfulness with Mia) هو المرجع الشامل: GraphMemoryService المدعوم بالملفات هو ذاكرة ميا طويلة المدى؛ بطاقة ملفها الشخصي تُحقن عند بدء الجلسة؛ وهي تنظم الحقائق في منتصف المحادثة عبر remember/relate؛ ولوحة حية تقرأ وتكتب نفس الرسم البياني. اقرأه لترى كل جزء في هذه الصفحة يعمل معًا.
← العودة إلى Memory overview