Agent thật cần nhớ: nhớ hội thoại giữa các lượt, khôi phục sau khi tiến trình chết, và cho nhiều người dùng chạy song song mà không lẫn dữ liệu. LangGraph giải quyết tất cả bằng checkpointer — cơ chế tự lưu state sau mỗi bước.
Checkpointer làm gì
Khi bạn compile graph kèm checkpointer, sau mỗi node LangGraph tự lưu một snapshot của state. Snapshot được gắn với một thread_id — định danh phiên làm việc. Nhờ đó bạn có thể:
- Gọi agent nhiều lượt, mỗi lượt nối tiếp state cũ (bộ nhớ hội thoại tự nhiên).
- Khôi phục đúng chỗ đã dừng nếu chương trình crash giữa chừng.
- Chạy nhiều người dùng độc lập bằng các thread_id khác nhau, hoàn toàn tách biệt.
Ví dụ: bật bộ nhớ với thread_id
from langgraph.checkpoint.memory import MemorySaver
checkpointer = MemorySaver()
app = builder.compile(checkpointer=checkpointer)
config = {"configurable": {"thread_id": "user-123"}}
app.invoke({"messages": [("user", "Tôi tên Khang")]}, config)
# lượt sau, cùng thread_id -> agent vẫn nhớ tên
out = app.invoke({"messages": [("user", "Tên tôi là gì?")]}, config)
Điểm mấu chốt: cùng thread_id = cùng cuộc hội thoại. Đổi thread_id là bắt đầu một phiên mới, sạch trơn. Đây chính là cách bạn tách biệt người dùng với nhau — mỗi người một thread_id.
Chọn checkpointer phù hợp
| Checkpointer | Dùng khi | Đặc điểm |
|---|---|---|
MemorySaver | Dev, test, prototype | Nhanh, mất khi tắt process |
| SQLite saver | App nhỏ, một máy | Bền, lưu file cục bộ |
| Postgres saver | Production, nhiều instance | Bền, chia sẻ được, chịu tải |
MemorySaver để học và thử nghiệm; production luôn dùng checkpointer bền (SQLite hoặc Postgres) để không mất dữ liệu khi restart hay scale nhiều instance.Xem lại và tua lịch sử state
Checkpointer còn cho phép "time travel": xem state ở từng bước và chạy lại từ một điểm trong quá khứ.
# state hiện tại của thread
snap = app.get_state(config)
print(snap.values, snap.next) # dữ liệu và node sắp chạy
# duyệt toàn bộ lịch sử checkpoint
for s in app.get_state_history(config):
print(s.config, s.values)
Khả năng này vô giá khi debug: bạn thấy chính xác state trước thời điểm agent ra quyết định sai, thay vì phải đoán mò.
Các bước tích hợp persistence
- Chọn checkpointer theo môi trường (Memory cho dev, Postgres cho prod).
- Compile graph với
checkpointer=.... - Sinh
thread_idduy nhất cho mỗi phiên/người dùng (ví dụ ghép user id với session id). - Truyền
configchứathread_idở mọi lần invoke của phiên đó. - Khi cần audit hoặc debug, dùng
get_statevàget_state_history.
Checklist persistence
- [ ] Production không dùng
MemorySaver. - [ ] Mỗi người dùng/phiên có
thread_idriêng, không trùng. - [ ]
thread_idđược truyền nhất quán qua tất cả các lượt. - [ ] Có phương án backup cho store bền (Postgres/SQLite).
- [ ] Đã thử khôi phục sau khi "giả lập" crash.
Sai lầm thường gặp
- Dùng chung một
thread_idcho nhiều người dùng: hội thoại của họ trộn vào nhau — lỗi bảo mật và trải nghiệm nghiêm trọng. - Quên truyền
configở lượt sau: agent không tìm thấy state cũ, coi như phiên mới và "mất trí nhớ". - Để
MemorySaverlên production: một lần restart là mất sạch mọi state đang chạy dở. - Sinh
thread_idngẫu nhiên mỗi request cho cùng một cuộc trò chuyện: mỗi lượt bỗng thành một phiên riêng, agent không nhớ gì. - Không dọn dữ liệu cũ: store phình vô hạn theo thời gian; cần chính sách xóa hoặc lưu trữ định kỳ.