Zapier gần như không có bộ nhớ: mỗi lần chạy là một tờ giấy trắng. Agent thật cần nhớ — trong phiên và giữa các phiên — để không hỏi lại khách những điều đã biết và để cải thiện theo thời gian.
Hai loại memory, hai mục đích
- Short-term (working memory): lịch sử hội thoại và observation của phiên hiện tại. Nằm trong context window, mất khi phiên kết thúc.
- Long-term: kiến thức lưu bền — hồ sơ khách, quyết định trước, tài liệu nội bộ. Lưu ở DB hoặc vector store và nạp lại khi liên quan.
Vấn đề context window và cách nén
Context có giới hạn. Với phiên dài, đừng nhồi hết lịch sử. Ba kỹ thuật:
- Summarization: định kỳ tóm tắt các lượt cũ thành một đoạn ngắn.
- Selective recall: chỉ nạp phần liên quan tới câu hiện tại.
- Structured state: lưu trạng thái quan trọng thành JSON gọn thay vì cả đoạn chat.
# Nén khi lịch sử quá dài
if token_count(messages) > 6000:
summary = summarize(messages[1:-4]) # tóm phần giữa
messages = [messages[0],
{"role":"system","content": f"Tóm tắt trước đó: {summary}"},
*messages[-4:]] # giữ system + tóm tắt + 4 lượt cuối
Long-term memory với retrieval (RAG tối giản)
Để agent "biết" tài liệu nội bộ, ta lưu chúng dưới dạng vector và truy hồi đoạn liên quan trước khi trả lời.
def answer_with_memory(question):
hits = vector_store.search(question, top_k=3) # lấy 3 đoạn liên quan
context = "\n".join(h["text"] for h in hits)
prompt = f"Dùng tài liệu sau để trả lời:\n{context}\n\nCâu hỏi: {question}"
return llm(prompt)
Đây là bước nhảy lớn so với Zapier: agent trả lời dựa trên kiến thức của bạn, không chỉ dữ liệu trong sự kiện trigger.
Structured state cho quy trình nhiều bước
Với tác vụ dài (onboarding khách, xử lý hồ sơ), giữ một object trạng thái rõ ràng để agent luôn biết đang ở đâu.
{
"customer": "Lan",
"stage": "chờ_giấy_tờ",
"collected": ["cccd", "địa_chỉ"],
"missing": ["mã_số_thuế"]
}
Mỗi vòng lặp agent cập nhật stage, collected, missing — dễ audit và khôi phục nếu phiên gián đoạn.
Các bước thêm memory vào agent
- Xác định cần nhớ gì trong phiên, cần lưu gì lâu dài.
- Với ngắn hạn: đặt ngưỡng token và bật summarization.
- Với dài hạn: chọn nơi lưu (DB cho dữ liệu có cấu trúc, vector store cho văn bản).
- Trước mỗi lượt, truy hồi phần liên quan và chèn vào context.
- Sau mỗi lượt quan trọng, ghi lại trạng thái/kết luận để dùng sau.
Khung tư duy: nhớ đúng thứ cần nhớ
- Thông tin dùng lại nhiều phiên → long-term.
- Thông tin chỉ đúng trong phiên → short-term.
- Thông tin nhạy cảm (thẻ, mật khẩu) → không lưu vào memory/LLM.
Sai lầm thường gặp
- Nhồi toàn bộ lịch sử vào context: tốn token, giảm chất lượng, dễ vượt giới hạn.
- Lưu dữ liệu nhạy cảm vào vector store/LLM: rủi ro rò rỉ và tuân thủ.
- Không tóm tắt: phiên dài trở nên chậm và đắt.
- RAG lấy quá nhiều đoạn: nhiễu thông tin khiến agent trả lời lệch. Giữ top_k nhỏ, đoạn liên quan.
- Không có structured state: quy trình dài dễ "quên" mình đang ở bước nào.
Tổng kết
Memory biến agent từ "trả lời một lần" thành "đồng hành theo thời gian". Ngắn hạn cần nén, dài hạn cần truy hồi đúng, trạng thái cần có cấu trúc. Bài 7 ta thêm vòng lặp ra quyết định phức tạp và cơ chế an toàn để agent tự chủ mà vẫn kiểm soát được.