2026-04-15
Gen AIBeGuru AI — Technical Docs: Mem0, cross-session memory & lộ trình tích hợp
Plan tích hợp mem0 vào beguru-ai: Qdrant + AsyncMemory, search/add quanh POST /api/freetext/chat, so sánh Agno Memory vs mem0; ContextCompressor giữ nguyên trong phiên.
Tóm lược
beguru-aihiện stateless phía server cho freetext/chat: client gửi toàn bộmessages;ContextCompressorchỉ rút gọn trong phiên — không có lớp nhớ xuyên session ổn định.user_idđã có trongFreetextChatRequest(dùng cho Langfuse quota) — có thể tận dụng cho mem0, không cần thiết kế field mới cho mục đích này.- Kế hoạch triển khai chi tiết: Qdrant làm vector store, wrapper
AsyncMemory, injectuser_memory_contextvàocompose_pm_system_prompt(), search trước / add sau stream trên route freetext — bài này phản ánh plan repo, không phải trạng thái đã merge.
Why — tình trạng & vấn đề
- Mỗi request phụ thuộc client gửi lại history; server không “nhớ” giữa các phiên chat khác nhau.
- Agno có built-in memory (
update_memory_on_run), nhưng trong codebase hiện tại chưa được wire đúng chuỗi gọi: DB SQLite có thể được init nhưng không gắn vào agent / luồng gọi LLM thực tế đang bypass vòngagent.run()— memory Agno không kích hoạt như thiết kế mặc định.
ContextCompressor vs Agno Memory vs mem0
- ContextCompressor: giảm token trong session — giữ nguyên theo plan.
- Agno Memory (nếu wire đúng): SQLite, thường inject theo cơ chế Agno — effort refactor lớn (agents,
chat_with_history). - mem0: vector store độc lập (Qdrant trong plan), tích hợp ở mức route (
freetext.py), additive, semantic search theo query.
So sánh nhanh Agno Memory vs mem0
| Agno Memory | mem0 (plan) | |
|---|---|---|
| Effort | Cao — refactor agent / run loop | Thấp — route + service wrapper |
| Tìm kiếm | SQLite text, dễ inject “tất cả” | Qdrant vector — chỉ memories liên quan |
| Infra | data/agno.db đã có | Thêm Qdrant + dependency mem0ai |
| Risk | Regression lõi agent | Ít đụng code agent cũ |
Khuyến nghị trong plan: ưu tiên mem0 cho cross-session semantic memory trên beguru-ai.
What — Mem0 trong kiến trúc này
mem0ai/mem0 (Apache-2.0): lưu fact, merge/dedup, search(query, user_id); cấu hình LLM/embedder qua OpenRouter (OpenAI-compatible). Vector store trong plan: Qdrant (docker-compose), không dùng SQLite thuần cho mem0 trên beguru-ai.
Tài liệu: docs.mem0.ai.
How — luồng POST /api/freetext/chat (theo plan)
- Trước:
searchtheo tin nhắn user cuối +user_id→ chuỗi inject (ví dụ section “User context từ session trước”). - Sau:
addcặp user/assistant (background task) sau khi stream xong.
How — file & cấu hình chính (beguru-ai)
| Hạng mục | Ghi chú |
|---|---|
| Infra | Thêm service Qdrant trong docker-compose (port 6333, volume persist). |
| Code | src/components/memory/mem0_service.py — wrapper AsyncMemory, build_mem0_config, search_user_memories, store_turn. |
| Settings | MEM0_ENABLED, MEM0_QDRANT_URL, MEM0_LLM_MODEL, … (mặc định tắt feature). |
| Prompt | compose_pm_system_prompt(..., user_memory_context=...) trong composer / runtime. |
| Route | freetext.py: gọi search trước compose_pm_system_prompt; sau stream asyncio.create_task(store_turn(...)) khi bật mem0 và có user_id. |
Điểm kỹ thuật (từ plan)
AsyncMemory: dùng async để không block SSE.- Một instance mem0 gắn app (
lifespan/app.state), không tạo mới mỗi request. - Feature flag:
MEM0_ENABLED=falsemặc định — bật dần. - Model extraction: ưu tiên model rẻ cho bước extract của mem0 (khác model PM chính nếu cần).
- Qdrant: mount volume để không mất index khi restart container.
Phạm vi khác (domain-assistant)
Tích hợp mem0 vào beguru-domain-assistant (Guru chat, user_memory JSON, extraction một shot) có thể làm theo lộ trình riêng; plan repo hiện tại mà bài này bám theo tập trung beguru-ai + Qdrant + freetext.
Tham chiếu
- Mem0: github.com/mem0ai/mem0
- Memory runtime beguru-ai: Memory & context
- Tổng quan: Tổng quan kiến trúc