الذاكرة في الوكلاء

تخزين الذاكرة هو نصف القصة؛ النقطة هي أن الوكيل يستخدمها — يستدعي السياق ذي الصلة قبل أن يجيب، ويكتب الحقائق الدائمة مرة أخرى كلما تعلم. هناك آليتان متعاونتان:

  1. ربط خدمة بحيث يمكن للوكيل الاستدعاء.
  2. إعطاء الوكيل أدوات بحيث يمكنه البحث والتنظيم عن قصد.

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 الصوتية/متعددة الوسائط عبر IntegratedRealtimeRunnerremember/relate يتم ربطها تلقائيًا بجلسة في الوقت الفعلي، و MemoryService يحقن السياق عند الاتصال ويخزن الأدوار. انظر Realtime → Memory.

نموذج كامل

مثال realtime_voice (Mindfulness with Mia) هو المرجع الشامل: GraphMemoryService المدعوم بالملفات هو ذاكرة ميا طويلة المدى؛ بطاقة ملفها الشخصي تُحقن عند بدء الجلسة؛ وهي تنظم الحقائق في منتصف المحادثة عبر remember/relate؛ ولوحة حية تقرأ وتكتب نفس الرسم البياني. اقرأه لترى كل جزء في هذه الصفحة يعمل معًا.

← العودة إلى Memory overview