Agent quên sạch — lỗi không nằm ở model

Agent thông minh đến mấy mà không nhớ context cũ thì cũng như gọi món mới mỗi lần. Đây là cách gắn long-term memory đàng hoàng.

Sao agent trả lời hay mà vẫn bị chê?

Tuần trước mình ngồi review hệ thống agent cho một team ở TP.HCM — chatbot nội bộ hỗ trợ vận hành logistics, chạy GPT-4o, prompt chuẩn chỉnh, retrieval ngon lành. Sếp vào demo, hỏi một câu, agent trả lời xuất sắc. Hôm sau sếp hỏi tiếp về đúng lô hàng đó — agent hỏi lại từ đầu như chưa gặp bao giờ. Sếp quay sang team: "Chatbot gì mà ngu thế?"

Không phải model dở. Không phải prompt tệ. Kiến trúc thiếu một thứ mà nhiều team bỏ qua: long-term memory.

Anthropic cũng chia sẻ quan sát tương tự sau khi làm việc với hàng chục team xây agent: những hệ thống thành công nhất dùng các pattern đơn giản, composable — và memory là một pattern nền tảng mà ít ai ưu tiên đúng mức.

Khoan — "nhớ" ở đây khác "chat history" hoàn toàn

Nhiều bạn nghĩ agent đã có memory vì nó giữ được context trong cùng một cuộc hội thoại. Nhưng đó chỉ là context window — nói thẳng ra thì nó giống bạn đọc lại toàn bộ transcript cũ mỗi lần trả lời. Token tăng, bill dày, và đến lúc window đầy thì quên sạch.

Long-term memory khác hẳn. Nó là khả năng trích xuất những gì quan trọng từ hội thoại, lưu dạng semantic, và gọi lại đúng lúc cần — xuyên session, xuyên ngày, thậm chí xuyên các agent trong cùng hệ thống.

Ví dụ cụ thể: giả sử team bạn 5 người, xây agent hỗ trợ CS cho sàn thương mại điện tử. Khách hàng hôm thứ Hai hỏi về chính sách đổi trả laptop, agent giải thích rõ ràng. Thứ Tư, cùng khách hỏi tiếp "vậy mình gửi hàng về đâu?" — nhưng agent không nhớ gì về cuộc hội thoại trước. Khách phải kể lại từ đầu. Nhân lên hàng trăm khách mỗi ngày, bạn thấy vấn đề.

Ba cách gắn memory — chọn đúng "set menu" cho giai đoạn của bạn

Hiện tại có ba hướng tiếp cận chính, mỗi hướng phù hợp với một kiểu team khác nhau:

Tự nấu với vector store. Bạn lấy embedding từ hội thoại, lưu vào ChromaDB hoặc Qdrant, rồi semantic search khi cần. Như mình từng chia sẻ trong các bài về RAG — pattern này quen thuộc. Ưu điểm: kiểm soát toàn bộ. Nhược điểm: bạn phải tự viết extraction logic (trích gì từ hội thoại?), xử lý update/delete memory cũ, và multi-user isolation.

Dùng thư viện chuyên biệt như Mem0. Đây là thư viện open-source wrap lại toàn bộ flow trên: trích xuất structured memories, lưu semantic, hỗ trợ CRUD, phân tách theo user. Giống như bạn gọi set menu đã phối sẵn — khai vị là extraction, phần chính là storage cộng retrieval, tráng miệng là inject context vào response — thay vì tự chế từng món rồi hy vọng chúng hợp nhau.

Managed service (Amazon Bedrock AgentCore và tương tự). Nếu team đã ở trên cloud và cần enterprise-grade monitoring. Một case study từ mạng lưới bệnh viện lớn ở Brazil cho thấy: khi chạy 12 agent đồng thời xử lý billing và claims, khả năng trace memory và govern hành vi agent trở thành yêu cầu bắt buộc — không phải nice-to-have.

Đang prototype? Mem0 hoặc tự build nhẹ. Production với compliance? Xem managed service. Đừng over-engineer lúc chưa cần.

Thử ngay: gắn long-term memory trong một buổi chiều

Bạn cần khoảng 2-3 tiếng với Mem0 + OpenAI + ChromaDB.

Bước 1 — Cài đặt

pip install mem0ai openai chromadb

Bước 2 — Khởi tạo memory

from mem0 import Memory

m = Memory()  # Default: ChromaDB local + OpenAI embeddings

Bước 3 — Lưu memory từ hội thoại

conversation = [
    {"role": "user", "content": "Team mình 4 backend Python, đang xây chatbot CS bằng GPT-4o"},
    {"role": "assistant", "content": "Bạn dùng framework nào?"},
    {"role": "user", "content": "Tự build, không dùng LangChain"}
]

m.add(conversation, user_id="dev_hung")

Mem0 tự trích xuất: user xây chatbot, GPT-4o, team 4 người Python, tự build.

Bước 4 — Query memory trước khi trả lời

relevant = m.search("tech stack and team info", user_id="dev_hung")
# Inject memories vào system prompt trước khi gọi LLM

Bước 5 — Lưu tiếp sau mỗi lượt chat

Gọi m.add() sau mỗi cuộc hội thoại. Memory tích lũy dần, agent ngày càng hiểu user hơn.

Xong. Agent giờ nhớ được ai đang hỏi, dùng gì, context cũ ra sao — xuyên suốt các session.

Ba cái bẫy mà team nào cũng dễ dính

Bẫy 1: Lưu hết, không lọc. Mình biết một team ở Đà Nẵng lưu toàn bộ raw conversation vào memory. Sau hai tuần, mỗi query trả về một đống noise — agent bắt đầu "nhớ" cả câu chào hỏi vô nghĩa rồi nhồi vào response. Memory mà thiếu extraction logic tốt thì giống ghi chép mọi thứ sếp nói trong meeting, kể cả lúc sếp order trà đá.

Bẫy 2: Chỉ Create, không Update. User đổi stack từ LangChain sang tự build — memory vẫn giữ record cũ. Agent tự tin gợi ý LangChain patterns cho người đã bỏ nó. Bạn cần CRUD đầy đủ, không chỉ C và R.

Bẫy 3: Quên multi-user isolation. Agent nhớ nhầm context của user A khi trả lời user B. Với dữ liệu nội bộ công ty, đây không phải bug buồn cười — đây là incident.

Khi nào KHÔNG cần memory?

Không phải agent nào cũng cần nhớ. Agent one-shot (tra giá, check status đơn hàng) thêm memory layer là tốn resource vô ích. Bản chất thật sự: memory có giá trị khi agent phục vụ cùng một user qua nhiều session — CS dài hạn, coaching, internal ops, hoặc multi-agent system cần chia sẻ context.

Các framework mới như SmolAgents và Google ADK đều đang tích hợp memory như first-class citizen. Xu hướng rõ: agent stateless sẽ dần trở thành ngoại lệ, không phải mặc định. Như mình đề cập trong bài "Agent không biết đọc", retrieval tệ thì memory tốt cũng không cứu — nhưng không có memory thì retrieval hay mấy cũng chỉ giỏi trong đúng một lượt chat.

Agent thông minh mà quên nhanh thì cũng chỉ là người lạ lịch sự — mỗi lần gặp lại phải giới thiệu từ đầu.

---

Bụi Wire — nghiện đọc release notes lúc 2 giờ sáng

Nguồn tham khảo