TROISINH
Phát triển AgentMemory & Context nâng cao

RAG cho Agent: Khi memory không đủ, tìm kiếm thêm — Hierarchical retrieval thay vì flat search

Tại sao RAG truyền thống thất bại với agent memory? Giải pháp phân cấp theme-episode-message và agentic loop giúp agent nhớ ngữ cảnh ngầm thay vì chỉ tìm từ...

Agent cần nhớ nhiều thứ: preference user, trạng thái dự án, lịch sử hội thoại dài. Nhưng bộ nhớ làm việc (working memory) của LLM có giới hạn. RAG truyền thống như việc xé sách thành mảnh giấy rồi tìm lại — nó thất bại với "sinh nhật hôm nay" khi user đã nói "thích màu xanh" tuần trước. Bài này nói về cách thiết kế RAG thực sự cho agent: không phải tìm kiếm đơn thuần, mà là tái hiện ngữ cảnh có cấu trúc.

Vấn đề

Vấn đề "Birthday Paradox" trong agent memory: Khi user nói "hôm nay sinh nhật tôi", RAG truyền thống dùng cosine similarity chỉ trả về các đoạn có từ "sinh nhật". Nó bỏ qua thông tin "thích màu xanh" hay "thích Star Wars" đã nói trước đó vì semantic distance cao — vector của "birthday", "color", "Star Wars" nằm xa nhau trong không gian embedding.

Hệ quả là agent tổ chức party sai concept: đặt bánh chocolate khi user thích matcha, hoặc trang trí màu đỏ khi user đã nói thích xanh từ tháng trước.

Thêm nữa, flat vector search nhét context pollution vào context window: top-k retrieval trả về nhiều đoạn trùng lặp (redundant) và irrelevant data, làm suy giảm reasoning models. RAG cũng không tự động extract facts từ conversation — nó cần layer extraction riêng, và không handle được updates/forgetting (nếu user đổi preference từ "chay" sang "ăn cá", RAG vẫn retrieve cả hai).

Ý tưởng cốt lõi

Giải pháp là Hierarchical Agentic RAG — không phải tìm kiếm đơn thuần mà là tái hiện có chọn lọc qua nhiều tầng, giống như cách não người hoạt động: không phải search mà là reconstruct.

Từ "Shredded Book" đến Hierarchical Memory

Hãy tưởng tượng bạn viết book report về cuốn sách dày 500 trang. Cách RAG truyền thống: (1) Xé sách thành từng mảnh giấy nhỏ 2-3 câu, (2) Cho học sinh tìm 10 mảnh "relevant" nhất dựa trên tiêu đề đề bài, (3) Viết report từ 10 mảnh đó. Kết quả? Thảm họa. Học sinh không có narrative arc, không hiểu character development, thiếu context để kết nối các mảnh rời rạc.

Đây chính là vấn đề cốt lõi: RAG được sinh ra để truy cập knowledge base (Wikipedia, manuals) — nơi mỗi đoạn văn tự chứa đựng thông tin đầy đủ. Nhưng agent memoryexperience stream — một dòng chảy thời gian nơi ý nghĩa nằm trong mối quan hệ giữa các sự kiện, không phải trong từng sự kiện riêng lẻ.

Theme-Episode-Message Hierarchy

Thay vì flat search qua 10,000 messages trong MEMORY.md, ta tổ chức memory thành ba tầng decoupling:

  • Themes (high-level): user preferences, work context, family situation — như các folder lớn trong não
  • Episodes: specific conversations or events under themes — các buổi trò chuyện cụ thể
  • Messages: raw content — từng tin nhắn gốc

Agent duyệt top-down retrieval: chọn themes đa dạng trước (để tránh redundant cùng chủ đề), chỉ expand xuống episodes/messages khi giảm uncertainty của reader. Điều này dùng sparse representation để tránh duplicate, giữ lại prerequisite cho reasoning.

Ví dụ trong MEMORY.md của OpenClaw/GoClaw:

## Theme: User Preferences
- **Episode: Food Choices**
  - [2024-01-15] Message: "Tôi ăn chay"
  - [2024-03-20] Message: "Bắt đầu ăn cá" (UPDATE: ghi đè preference)

## Theme: Entertainment  
- **Episode: Birthday Planning Context**
  - [2024-02-10] Message: "Thích màu xanh dương"
  - [2024-02-10] Message: "Fan Star Wars"

Khi user nói "hôm nay sinh nhật", agent không search "sinh nhật" mà traverse: Theme Preferences → Episode Food/Entertainment → thấy màu xanh và Star Wars là relevant dù semantic distance xa.

Agentic RAG Loop: Plan-Retrieve-Observe-Refine

Không phải single-shot retrieval mà là vòng lặp multi-hop:

  1. Plan: Xác định cần biết những gì để trả lời (ngân sách, sở thích, occasion)
  2. Retrieve: Tìm theme phù hợp nhất (diversity-first selection)
  3. Observe: Đã đủ thông tin chưa? Còn missing prerequisite không?
  4. Refine: Nếu thiếu, retrieve thêm từ episodes khác hoặc hỏi user
  5. Repeat cho đến khi đủ context

Ví dụ thực chiến: User hỏi "tôi nên mua quà gì cho chồng".

  • Plan: cần biết sở thích, ngân sách, occasion
  • Retrieve: tìm theme "preferences" → thấy "thích Star Wars", theme "finance" → thấy "ngân sách 500k", nhưng thiếu "occasion"
  • Observe: chưa biết là sinh nhật hay anniversary
  • Refine: retrieve thêm "recent calendar" hoặc hỏi lại user
  • Tổng hợp: đề xuất mô hình Star Wars giá 450k

Tại sao nó hoạt động

Contextual reconstruction vs Semantic retrieval. Human memory không tìm kiếm (search), mà tái hiện (reconstruct) qua associative chains: Birthday → Party → Theme → Star Wars → Last year. RAG truyền thống là correlation-based, bị giới hạn bởi khoảng cách vector.

Hierarchy giải quyết pattern separation (lưu trải nghiệm tương tự vào non-overlapping representations) và pattern completion (reconstruct từ partial cues). Khi agent cần nhớ "user thích gì", nó không tìm "party" mà traverse graph: user preferences → entertainment choices → color preferences.

Top-down retrieval giải quyết birthday paradox bằng cách kết hợp recency + importance + similarity thay vì chỉ similarity. Ngay cả khi "màu xanh" xa semantically với "sinh nhật", nhưng vì nó là preference quan trọng (high importance score) và trong theme "user preferences" được đánh dấu cao, nó vẫn được retrieve.

Trade-off: Tốn nhiều compute hơn cho việc tổ chức hierarchy (cần extraction layer để phân loại themes), nhưng giảm token waste khi đưa vào context window (chỉ load 3-5 episodes thay vì 20 chunks trùng lặp).

Ý nghĩa thực tế

Benchmarks thực chiến:

  • Observational memory (Mastra): 84.23% vs RAG 80.05% trên GPT-4o, giảm cost 10x
  • MemAware benchmark: RAG-based memory chỉ đạt 2.8% recall trên implicit context queries vs 0.8% baseline — nghĩa là thêm RAG còn làm tệ hơn không dùng gì!
  • xMemory (paper 2026): cải thiện token efficiency và answer quality trên LoCoMo và PerLTQA bằng hierarchical decoupling

So sánh chiến lược:

ApproachImplicit ContextUpdate/ForgetToken CostProduction Ready
Flat RAG (traditional)Kém (2.8%)Khó (cần re-index)Cao (nhiều chunks)Dễ
Hierarchical Agentic RAGTốt (80%+)Có thể qua theme evictionTrung bìnhPhức tạp
Full History (no RAG)Hoàn hảo (nếu fit)Không cầnRất cao (không fit >32k)Không scalable

Ai đang dùng:

  • Letta: Memory-first agent platform, phân biệt rõ archival memory vs recall memory với hierarchical search
  • Mem0: Memory layer cho AI agents, xử lý extraction/update/retrieval có state
  • Mastra: Observational memory architecture với semantic + episodic memory
  • xMemory: Research prototype cho hierarchical agent memory từ paper 2026

Hạn chế cần biết:

  • Không auto-extract: RAG không tự động extract facts từ conversation — cần layer extraction riêng (như Mem0) để tạo themes/episodes
  • Không handle forgetting: Nếu user đổi preference, cần mechanism để ghi đè hoặc expire old themes
  • Token cost: Nếu dùng large corpus RAG cho mỗi turn, cost sẽ cao hơn nhiều so với selective memory

Đào sâu hơn

Tài liệu chính thức:

  • Paper: "Beyond RAG for Agent Memory: Retrieval by Decoupling and Aggregation" (2026) — xMemory architecture chi tiết
  • Letta Blog: "RAG is single-step & reactive, memory requires multi-hop association" — phân biệt RAG vs memory

Bài liên quan TroiSinh:

Cùng cụm: Memory & Context

Kiến trúc Memory: Short-term, working, long-term — Hiểu các tầng memory cơ bản trước khi RAG

Cùng cụm: MEMORY.md Patterns

MEMORY.md Patterns: Ghi nhớ có chọn lọc qua sessions — Cách implement selective memory trong file config

Cùng cụm: Context Files

Context Files: Per-user, per-workspace, per-project — Cách tổ chức context cho multi-tenant

Cùng cụm: Conversation History

Quản lý lịch sử hội thoại: Pruning, summarization, sliding window — Kỹ thuật nén lịch sử trước khi đưa vào RAG

Đọc tiếp: Multi-Agent & Teams

Agent Teams: Shared task board, delegation, handoff — Làm sao teams chia sẻ memory qua shared context và tránh cross-contamination

Đọc tiếp: Security & Multi-tenant

Multi-tenant Architecture: Row-Level Security — Cách isolate RAG index per user trong production để tránh leak dữ liệu qua tenants

Mở rộng:

  • Mem0: https://docs.mem0.ai — Memory layer cho developers, có self-improvement mechanism
  • Letta (formerly MemGPT): https://letta.com — Open source memory-first agent platform với hierarchical retrieval built-in
  • Mastra: https://mastra.ai — Framework với observational memory architecture

On this page