📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第17章 Graph 工作流:像搭积木一样编排 AI
17.1 Graph 核心概念
17.1.1 为什么需要 Graph
ReAct Agent 的局限:
- 执行路径不可控(LLM 自主决定,可能跑偏)
- 复杂流程难以表达(多分支、并行、循环)
- 调试困难(黑盒执行)
Graph 工作流的优势:
- 显式定义执行路径(节点 + 边)
- 支持条件分支、并行执行、循环
- 可视化、可调试、可复现
17.1.2 核心概念
Graph 三要素:
1. Node(节点)—— 执行单元
- LLM Node:调用大模型
- Tool Node:调用工具/函数
- Human Node:等待人工输入
- 自定义 Node:任意逻辑
2. Edge(边)—— 连接节点,定义执行顺序
- 普通边:A → B(无条件跳转)
- 条件边:A → B/C/D(根据条件选择)
3. State(状态)—— 在节点间传递的数据
- 类似一个共享的 Map,每个节点可读写
17.2 StateGraph 构建
17.2.1 基本用法
/**
* 构建一个简单的 Graph:分类 → 处理 → 回复
*/
public CompiledGraph buildSimpleGraph(ChatModel chatModel) {
StateGraph graph = new StateGraph("customer-service");
// 定义节点
graph.addNode("classify", state -> {
// 意图分类
String intent = chatModel.call("判断以下问题的意图(咨询/投诉/退款):" + state.get("input"));
state.put("intent", intent.trim());
return state;
});
graph.addNode("handleQuery", state -> {
String answer = chatModel.call("回答用户咨询:" + state.get("input"));
state.put("output", answer);
return state;
});
graph.addNode("handleComplaint", state -> {
state.put("output", "已记录您的投诉,工单号:" + UUID.randomUUID().toString().substring(0, 8));
return state;
});
graph.addNode("handleRefund", state -> {
state.put("output", "已提交退款申请,预计 3-5 个工作日到账。");
return state;
});
// 定义边
graph.setEntryPoint("classify");
// 条件路由:根据意图分发到不同节点
graph.addConditionalEdge("classify", state -> {
String intent = (String) state.get("intent");
if (intent.contains("投诉")) return "handleComplaint";
if (intent.contains("退款")) return "handleRefund";
return "handleQuery";
}, Map.of(
"handleQuery", "handleQuery",
"handleComplaint", "handleComplaint",
"handleRefund", "handleRefund"
));
// 所有处理节点都指向结束
graph.addEdge("handleQuery", StateGraph.END);
graph.addEdge("handleComplaint", StateGraph.END);
graph.addEdge("handleRefund", StateGraph.END);
return graph.compile();
}
17.2.2 执行 Graph
🔒 解锁完整内容
本章剩余内容需要解锁后查看
以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。
加入知识星球你将获得:
- ✅ 全部 26 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。