Trần Quốc Việt
← All posts

2026-04-15

Gen AI

BeGuru 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.

View
Lang

Tóm lược

  • beguru-ai hiện stateless phía server cho freetext/chat: client gửi toàn bộ messages; ContextCompressor chỉ rút gọn trong phiên — không có lớp nhớ xuyên session ổn định.
  • user_id đã có trong FreetextChatRequest (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, inject user_memory_context vào compose_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òng agent.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 Memorymem0 (plan)
EffortCao — refactor agent / run loopThấp — route + service wrapper
Tìm kiếmSQLite text, dễ inject “tất cả”Qdrant vector — chỉ memories liên quan
Infradata/agno.db đã cóThêm Qdrant + dependency mem0ai
RiskRegression 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: search theo tin nhắn user cuối + user_id → chuỗi inject (ví dụ section “User context từ session trước”).
  • Sau: add cặp user/assistant (background task) sau khi stream xong.

How — file & cấu hình chính (beguru-ai)

Hạng mụcGhi chú
InfraThêm service Qdrant trong docker-compose (port 6333, volume persist).
Codesrc/components/memory/mem0_service.py — wrapper AsyncMemory, build_mem0_config, search_user_memories, store_turn.
SettingsMEM0_ENABLED, MEM0_QDRANT_URL, MEM0_LLM_MODEL, … (mặc định tắt feature).
Promptcompose_pm_system_prompt(..., user_memory_context=...) trong composer / runtime.
Routefreetext.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.
Ví dụ khối config Python — tham khảo plan

Vector store provider: qdrant, url từ settings; LLM/embedder trỏ OpenRouter. Tên collection (vd. beguru_ai_memories) và model rẻ cho extraction nằm trong settings — không cố định trong blog.

Đ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=false mặ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


Bài liên quan / Related posts