2.6. Checkpointing & Persistence: Lưu Trữ Trạng Thái Agent
Agenda
Thời gian đọc ước tính: ~22 phút
Learning outcome:
- Giải thích được sự khác biệt giữa Checkpointer (short-term) và Store (long-term) — và khi nào dùng từng loại.
- Cấu hình được
MemorySaver,SqliteSavervào graph và sử dụngthread_idđúng cách. - Đọc được
StateSnapshotvà traverse lịch sử checkpoint bằnggetStateHistory. - Thực hiện được
updateStateđể chỉnh sửa graph state mà không chạy lại toàn bộ graph. - Phân biệt được 3 durability modes (
exit,async,sync) và chọn đúng cho từng use case.
Glossary & Vocabulary
1. Technical Terms (Thuật ngữ kỹ thuật):
| Term | Vietnamese Meaning & Quick Explain |
|---|---|
| Checkpointer | Công cụ lưu checkpoint — lưu snapshot của graph state tại mỗi super-step boundary. Short-term, thread-scoped. |
| Store | Kho lưu trữ — lưu dữ liệu application-defined ngoài graph state. Long-term, cross-thread. |
| Checkpoint | Điểm lưu — snapshot của graph state tại một thời điểm cụ thể, đại diện bởi StateSnapshot object. |
| Thread | Luồng — ID duy nhất gán cho mỗi chuỗi checkpoint. Giống như "session" của agent. |
| Super-step | Siêu bước — một "tick" của graph nơi tất cả node được schedule thực thi xong trước khi checkpoint được tạo. |
StateSnapshot | Bản chụp trạng thái — object chứa values, next, config, metadata, createdAt, tasks. |
thread_id | ID luồng — khóa chính để checkpointer lưu và nạp lại state của một conversation. |
checkpoint_id | ID checkpoint — định danh checkpoint cụ thể trong một thread, dùng cho time travel. |
getState | Lấy trạng thái — lấy checkpoint mới nhất của một thread. |
getStateHistory | Lấy lịch sử trạng thái — lấy tất cả checkpoints của một thread, theo thứ tự thời gian ngược. |
updateState | Cập nhật trạng thái — tạo checkpoint mới với values đã chỉnh sửa, không sửa checkpoint gốc. |
| Pending Writes | Ghi đang chờ — kết quả của các node thành công trong một super-step bị lỗi, được lưu để tránh re-run khi resume. |
| Durability Mode | Chế độ độ bền — cấu hình khi nào LangGraph persist checkpoint: exit, async, hoặc sync. |
| Reducer | Hàm rút gọn — hàm xác định cách merge value mới vào state channel (thay vì ghi đè). |
2. Vocabulary Support (Từ vựng học thuật/B1+):
| Word | Meaning in Context |
|---|---|
| Durable (adj) | Bền vững — dữ liệu tồn tại qua process crash, restart. |
| Serializable (adj) | Có thể tuần tự hóa — có thể chuyển đổi thành bytes để lưu vào file/DB. |
| Traverse (v) | Đi qua, duyệt — đi qua một chuỗi checkpoints từ mới đến cũ. |
| Idempotent (adj) | Bất biến lũy thừa — gọi nhiều lần cho kết quả giống gọi một lần. |
| Namespace (n) | Không gian tên — prefix xác định checkpoint thuộc graph nào (parent hay subgraph). |
| Accumulated (adj) | Tích lũy — channel dùng reducer tích lũy values thay vì ghi đè. |
1. Vấn đề & Giải pháp
Vấn đề (Problem Statement):
Agent trong thực tế gặp những bài toán mà một lần chạy không giải quyết được:
- Conversational memory: User hỏi "Thủ đô Việt Nam là gì?" rồi sau đó "Dân số ở đó bao nhiêu?" — agent cần nhớ câu trước.
- Long-running workflows: Pipeline phân tích dài 30 phút, server crash ở phút 25 — phải chạy lại từ đầu nếu không có checkpoint.
- Human-in-the-loop: Agent tạm dừng chờ human review, nhưng process có thể restart — cần lưu state để resume.
- Debugging: Muốn replay lại đúng tại bước nào đó để tìm lỗi, hoặc fork execution từ giữa chừng.
Giải pháp (Solution):
LangGraph cung cấp 2 persistence systems bổ sung nhau:
- Checkpointers — lưu graph state snapshot tại mỗi super-step. Thread-scoped, short-term.
- Stores — lưu dữ liệu key-value ngoài graph state. Cross-thread, long-term.
2. Checkpointing Là Gì?
Định nghĩa kỹ thuật:
Checkpointing là cơ chế LangGraph tự động lưu một snapshot của toàn bộ graph state tại mỗi super-step boundary, tổ chức thành các threads với unique
thread_id, cho phép resume, replay, và inspect execution tại bất kỳ điểm nào.
Definition Anatomy — Giải phẫu định nghĩa:
- snapshot (bản chụp): Không phải diff — là bản ghi đầy đủ toàn bộ state tại một thời điểm.
- super-step boundary (ranh giới siêu bước): Checkpoint tạo ra sau khi tất cả node trong một super-step hoàn tất, không phải sau mỗi lệnh.
- threads (luồng): Mỗi conversation/session độc lập là một thread với ID riêng — giống session trong web.
Checkpointer là điều kiện tiên quyết cho:

3. Checkpointers — Thiết Lập và Sử Dụng
3.1. MemorySaver — Phát triển và Testing
MemorySaver lưu state trong RAM — đủ nhanh cho development, mất dữ liệu khi process restart:
// filename: agent/checkpointer-memory.ts
import {
StateGraph,
StateSchema,
START,
END,
MemorySaver,
MessagesValue,
} from "@langchain/langgraph";
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
import * as z from "zod";
const model = new ChatGoogleGenerativeAI({ model: "gemini-2.5-flash" });
const State = new StateSchema({
messages: MessagesValue,
});
const callModel = async (state: typeof State.State) => {
const response = await model.invoke(state.messages);
return { messages: [response] };
};
const graph = new StateGraph(State)
.addNode("agent", callModel)
.addEdge(START, "agent")
.addEdge("agent", END)
// Compile với checkpointer để bật persistence
.compile({ checkpointer: new MemorySaver() });
// thread_id là BẮT BUỘC khi dùng checkpointer
const config = { configurable: { thread_id: "conversation-abc" } };
// Lần 1: hỏi câu đầu tiên
const turn1 = await graph.invoke(
{ messages: [{ role: "user", content: "Thủ đô Việt Nam là gì?" }] },
config
);
// Lần 2: cùng thread_id → agent nhớ lịch sử
// Agent biết "thủ đô" trong câu 2 là Hà Nội vì đã hỏi ở câu 1
const turn2 = await graph.invoke(
{ messages: [{ role: "user", content: "Dân số ở đó bao nhiêu?" }] },
config
);
3.2. SqliteSaver — Local Development với Persistence
SqliteSaver lưu vào SQLite file — state tồn tại qua process restart:
// filename: agent/checkpointer-sqlite.ts
// npm install @langchain/langgraph-checkpoint-sqlite
import { SqliteSaver } from "@langchain/langgraph-checkpoint-sqlite";
import {
StateGraph,
StateSchema,
START,
END,
MessagesValue,
} from "@langchain/langgraph";
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
import * as z from "zod";
const model = new ChatGoogleGenerativeAI({ model: "gemini-2.5-flash" });
// File-based storage — tồn tại qua restart
const checkpointer = SqliteSaver.fromConnString("./agent_state.db");
const State = new StateSchema({ messages: MessagesValue });
const graph = new StateGraph(State)
.addNode("agent", async (state) => ({
messages: [await model.invoke(state.messages)],
}))
.addEdge(START, "agent")
.addEdge("agent", END)
.compile({ checkpointer });
// State được lưu vào agent_state.db — restart process vẫn nhớ
const config = { configurable: { thread_id: "persistent-thread-1" } };
3.3. Checkpointer Libraries
| Library | Class | Phù hợp |
|---|---|---|
@langchain/langgraph (built-in) | MemorySaver | Development, testing |
@langchain/langgraph-checkpoint-sqlite | SqliteSaver | Local workflows, prototyping |
@langchain/langgraph-checkpoint-postgres | PostgresSaver | Production, scalable |
@langchain/langgraph-checkpoint-mongodb | MongoDBSaver | Production + vector store |
@langchain/langgraph-checkpoint-redis | RedisSaver | Production, high throughput |