第 18 章:LangGraph 入门:可控的 Agent 工作流
本章目标
这一章介绍 LangGraph。它适合当你不想让 Agent 完全自由发挥,而是希望流程可控、可观察、可恢复。
为什么需要 LangGraph
简单 Agent 可以用 createAgent。但业务复杂后,你可能希望明确规定:
分析问题 -> 检索知识库 -> 判断是否足够 -> 调用工具 -> 生成答案 -> 质量检查
这时图工作流比自由 Agent 更清晰。
LangChain 官方文档也说明,LangChain Agent 底层构建在 LangGraph 之上。LangGraph 更适合高级编排场景。
图的基本概念
可以把 LangGraph 理解成:
- State:流程中的共享状态
- Node:每一步处理逻辑
- Edge:步骤之间的连接
- Conditional Edge:根据条件走不同分支
知识库问答工作流
我们可以设计:
start
-> rewrite_question
-> retrieve
-> decide
-> generate_answer
-> fallback
-> end
如果检索结果足够好,就生成答案;否则进入兜底回复。
状态设计
interface RagState {
messages: Array<{ role: string; content: string }>;
rewrittenQuestion?: string;
retrievedDocs?: Array<{
content: string;
source: string;
score: number;
}>;
answer?: string;
}
节点示例
async function rewriteQuestion(state: RagState): Promise<Partial<RagState>> {
const lastMessage = state.messages[state.messages.length - 1];
return {
rewrittenQuestion: lastMessage.content
};
}
async function retrieveDocs(state: RagState): Promise<Partial<RagState>> {
const docs = await retrieveRelevantChunks(state.rewrittenQuestion ?? "");
return {
retrievedDocs: docs.map((item) => ({
content: item.record.content,
source: item.record.metadata.source,
score: item.score
}))
};
}
这只是伪代码,正式实现时需要按 LangGraph 当前 API 组织。
什么时候不用 LangGraph
不要为了炫技一开始就上图工作流。
以下情况先不用:
- 只是一个简单 Chat
- 只有一个模型调用
- 没有工具调用
- 没有复杂分支
以下情况适合用:
- 多步骤 RAG
- 多工具 Agent
- 需要人工确认
- 需要持久化状态
- 需要失败恢复
- 需要观测每个节点
实战任务
完成设计稿即可:
- 画出 RAG 工作流图
- 定义 state 类型
- 写出 4 个节点伪代码
- 说明哪些分支需要条件判断
常见坑
不要把 LangGraph 当成必须项。它解决复杂流程编排,不是每个 AI 应用都需要。
不要让图节点做太多事。一个节点只负责一个明确步骤。
不要忽略状态结构。State 设计混乱,图会很快失控。
本章小结
LangGraph 让 Agent 流程更可控。下一章会用 LangSmith 观察一次 AI 调用到底发生了什么。