Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 5 — Checkpoint và Persistence: lưu, khôi phục và chạy đa phiên

Đã đọc 0/8 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

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

CheckpointerDùng khiĐặc điểm
MemorySaverDev, test, prototypeNhanh, mất khi tắt process
SQLite saverApp nhỏ, một máyBền, lưu file cục bộ
Postgres saverProduction, nhiều instanceBền, chia sẻ được, chịu tải
Nguyên tắc: 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_id duy nhất cho mỗi phiên/người dùng (ví dụ ghép user id với session id).
  • Truyền config chứa thread_id ở mọi lần invoke của phiên đó.
  • Khi cần audit hoặc debug, dùng get_state và get_state_history.

Checklist persistence

  • [ ] Production không dùng MemorySaver.
  • [ ] Mỗi người dùng/phiên có thread_id riê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_id cho 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ớ".
  • Để MemorySaver lên production: một lần restart là mất sạch mọi state đang chạy dở.
  • Sinh thread_id ngẫ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ỳ.
Có checkpoint, agent đã có bộ nhớ bền. Bài 6 tận dụng chính cơ chế này để chèn con người vào vòng lặp — human-in-the-loop.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi