Agent mất trí nhớ — playbook dựng memory layer

Agent mất trí nhớ — playbook dựng memory layer

Playbook dựng memory layer cho agent production — từ chọn backend, thiết lập isolation, đến tránh bẫy nhớ sai thứ.

Vấn đề thật mà nhiều team đang chịu

Bao nhiêu lần bạn phải giải thích lại context cho agent — dù cuộc hội thoại đó mới diễn ra hôm qua? Với team 4-5 dev ở Việt Nam đang chạy agent hỗ trợ khách hàng hoặc agent nội bộ, chuyện này xảy ra hàng ngày: user quay lại, agent không nhớ gì, user bực, dev đi patch thủ công.

Bài toán không phải "agent cần thông minh hơn" mà là agent cần một nhật ký hải trình — nơi ghi lại mọi thứ đã xảy ra, và biết lục đúng trang khi cần.

Playbook này giúp bạn dựng một memory layer (lớp bộ nhớ dài hạn cho agent) đảm bảo dữ liệu tách biệt giữa users, giữa sessions, và giữa các agent persona khác nhau. Mục tiêu: agent nhớ đúng người, đúng việc, không lẫn lộn.

Checklist: 5 câu phải trả lời trước khi code

Trước khi viết dòng code đầu tiên, bạn cần rõ:

  1. Agent phục vụ bao nhiêu user đồng thời? — Nếu chỉ 1 user (tool nội bộ), multi-tenancy (phân tách dữ liệu theo từng người dùng) chưa cần. Nếu 50+ user, bắt buộc.
  2. Memory cần sống bao lâu? — Trong session (vài phút) hay cross-session (vài tuần, vài tháng)?
  3. Có nhiều agent persona không? — Agent persona là vai trò riêng biệt của agent: bán hàng và hỗ trợ kỹ thuật KHÔNG nên chia sẻ cùng memory pool.
  4. Latency budget bao nhiêu? — Memory lookup thêm khoảng 100-300ms mỗi turn. Chấp nhận được không?
  5. Managed service hay self-host? — Giống quyết định thuê tàu hay đóng tàu: team nhỏ nên thuê trước, tự đóng sau khi đã hiểu luồng nước.

Nếu bạn trả lời được cả 5, đi tiếp. Nếu chưa — dừng lại, vì dựng memory layer mà không rõ scope thì sẽ phải refactor từ đầu.

Từng bước: dựng memory layer trong một buổi chiều

Bước 1 — Chọn memory backend

Hai lựa chọn đáng xem hiện tại:

Cả hai đều hỗ trợ multi-user isolation và cross-session persistence (duy trì ngữ cảnh xuyên phiên). Nếu team đang dùng OpenAI SDK, Memori tích hợp nhanh hơn vì wrap trực tiếp client. Nếu muốn backend-agnostic, Supermemory linh hoạt hơn.

Open-source alternative: Mem0 — self-host được, nhưng bạn tự lo phần scaling và isolation logic.

Bước 2 — Wrap client với memory

Với Memori, flow ngắn gọn:

from memori import Memori
from openai import OpenAI

client = OpenAI()
Memori.register(client)  # Mọi chat completion giờ đi qua memory layer

Dịch sang tiếng người: bạn không cần sửa prompt hay logic agent. Memory layer tự chặn request, bổ sung context từ lịch sử user, rồi mới gửi tới model. Đây gọi là memory intercept — chặn và làm giàu ngữ cảnh tự động trước khi request tới LLM.

Bước 3 — Thiết lập user identity và session scope

Đây là bước nhiều team bỏ qua rồi trả giá sau. Mỗi conversation cần gắn rõ:

Ví dụ cụ thể: Giả sử team bạn 5 người đang build agent CSKH cho một app fintech. User A hỏi về lãi suất tháng trước, user B hỏi về gói premium. Nếu không có session isolation (cách ly ngữ cảnh giữa các phiên) rõ ràng, agent có thể trả lời user B bằng thông tin của user A. Đó không phải bug — đó là data leak.

Bước 4 — Test memory isolation trước khi deploy

Chạy test đơn giản:

  1. Gửi 3 fact về user A (tên, preference, lịch sử giao dịch)
  2. Switch sang user B, hỏi lại fact của A → agent phải không biết
  3. Quay lại user A, hỏi recall → agent phải nhớ đủ

Nếu bước 2 fail, isolation chưa đúng. Fix trước khi đi tiếp — đừng mang lỗi này lên production.

Bước 5 — Monitor memory growth

Memory không phải "set and forget". Sau vài nghìn sessions, memory store sẽ phình. Bạn cần:

Bẫy mà team nào cũng dính ít nhất một lần

Bẫy 1: Nhớ quá nhiều, nhớ sai thứ.

Một team ở Sài Gòn từng kể: agent CSKH nhớ hết mọi câu user nói — kể cả lúc user đùa "tao ghét app này". Tuần sau, agent mở đầu bằng "Mình biết bạn không thích app lắm..." Agent nhớ tốt, nhưng nhớ thứ không nên nhớ.

→ Giải pháp: memory filter — chỉ lưu structured fact (tên, preference, action), không lưu raw utterance.

Bẫy 2: Gộp memory của nhiều persona.

Agent bán hàng biết user thích giảm giá. Agent hỗ trợ kỹ thuật không cần biết điều đó. Share memory pool → agent hỗ trợ bắt đầu upsell giữa lúc user đang frustrated vì bug. Kết quả: user rời app.

→ Giải pháp: scope memory theo agent_id, không chỉ user_id.

Bẫy 3: Không có chiến lược xóa.

Memory layer không phải két sắt — nó giống khoang hàng trên tàu. Chất đầy mà không dọn, tàu nặng dần rồi chậm lại. Lên kế hoạch retention ngay từ đầu: fact nào giữ vĩnh viễn (tên, vai trò), fact nào expire sau 30 ngày (preference mùa vụ).

Hành động tiếp theo

Nếu agent chạy được nhưng chưa nhớ gì:

  1. Chọn Memori hoặc Supermemory, dựng POC trong 2-3 giờ
  2. Test isolation với 2 user giả lập
  3. Đo latency thêm vào mỗi turn
  4. Chấp nhận được → triển khai cho 10% traffic thật, monitor 1 tuần

Nếu đã có memory nhưng hay lẫn:

  1. Audit scope: user_id, session_id, agent_id đã tách chưa?
  2. Thêm memory filter: chỉ giữ structured fact
  3. Set TTL cho entries cũ

Đừng xây hải đăng khi chưa biết tàu đi hướng nào — nhưng một khi đã ra khơi, nhật ký hải trình là thứ giữ bạn không lạc.

---

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

Nguồn tham khảo