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 memory là experience 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:
- Plan: Xác định cần biết những gì để trả lời (ngân sách, sở thích, occasion)
- Retrieve: Tìm theme phù hợp nhất (diversity-first selection)
- Observe: Đã đủ thông tin chưa? Còn missing prerequisite không?
- Refine: Nếu thiếu, retrieve thêm từ episodes khác hoặc hỏi user
- 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:
| Approach | Implicit Context | Update/Forget | Token Cost | Production Ready |
|---|---|---|---|---|
| Flat RAG (traditional) | Kém (2.8%) | Khó (cần re-index) | Cao (nhiều chunks) | Dễ |
| Hierarchical Agentic RAG | Tốt (80%+) | Có thể qua theme eviction | Trung bình | Phức tạp |
| Full History (no RAG) | Hoàn hảo (nếu fit) | Không cần | Rấ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
Quản lý lịch sử hội thoại: Pruning, summarization, sliding window
Chiến lược nén lịch sử hội thoại cho AI Agent: sliding window, recursive summarization và pruning để tránh hiện tượng lost-in-the-middle và kiểm soát chi phí...
Tại sao cần nhiều agent? — Khi single agent bất lực trước task phức tạp
Single agent thất bại 90% trên task đa bước do context degradation và specification drift. Tìm hiểu 14 failure modes và cách multi-agent architecture cô lập...