聊《LangGraph 工作流:用小项目验证核心能力》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。
摘要
本文概述文章目标、核心观点和实践价值。
之前面试几家大厂,面试官常问一个问题:"你做的 Agent 如果卡住了,或者流程跑偏了,你怎么兜底?"
很多候选人会搬出 ReAct 循环或者简单的 Chain 拼接,说"加个重试机制"。但在实际工程里,这种黑盒式的调用链一旦复杂起来,调试成本极高。你根本不知道是 LLM 幻觉了,还是工具返回了错误数据,亦或是业务逻辑本身就有死锁。
这就是我最近把重心从 LangChain 的 Chain 转向 LangGraph 的原因。对于想构建可靠 Agent 系统的后端和 AI 开发者来说,LangGraph 不仅仅是一个库,它提供了一种"图状态机"的思维模式。
今天我不讲大道理,直接拿一个我在做的"智能客服工单处理"小项目为例,聊聊怎么用 LangGraph 把不可控的脚本变成可控的系统,顺便说说这个项目怎么放进你的简历里,体现工程价值。
目录
- 为什么需要图工作流?
- State 与 Node:给数据加个"容器"
- Edge 与条件分支:掌控流程的"红绿灯"
- 人工审批节点:让 Agent 具备"敬畏心"
- 工程化落地:从 Demo 到生产
- 总结
为什么需要图工作流?

传统的 LangChain SequentialChain 或 LLMChain 适合线性任务,比如:用户提问 -> LLM 提取实体 -> 查数据库 -> 回答。
但真实业务往往是非线性的。比如客服场景:
-
识别意图。
-
如果是投诉,进入情绪安抚流程;如果是咨询,进入知识库检索流程。
-
知识库检索失败时,触发人工介入。
-
人工介入后,根据反馈决定是继续检索还是关闭工单。
这种分支、循环、回溯,用链式调用写出来就是一堆嵌套的 if-else,代码臃肿且难以维护。LangGraph 的核心优势在于:显式地管理状态(State)和控制流(Flow)。你把逻辑画成一张图,每个节点是纯函数,边是转移条件。这种解耦让测试变得异常简单------你可以单独测试"情绪分析节点",而不必启动整个 LLM 链路。
State 与 Node:给数据加个"容器"

在 LangGraph 中,StateGraph 是骨架,而 State 是血液。
很多人容易忽略 State 的设计,直接传参。但在复杂工作流中,定义一个清晰的 TypedDict 或 pydantic model 至关重要。它不仅定义了节点间交换的数据契约,还决定了并行执行时的数据合并策略。
以我的工单处理为例,State 设计如下:
python
from typing import TypedDict, Annotated, List
import operator
class AgentState(TypedDict):
# 原始用户输入
input: str
# 当前工单状态:open, pending_human, resolved
status: str
# 关键信息提取结果
extracted_info: dict
# 对话历史(用于后续节点访问上下文)
history: List[str]
# 累积的工具调用结果
tool_outputs: List[dict]
这里有个细节:tool_outputs 用了累加器 operator.add(隐式或通过配置),这意味着无论哪个节点调用了工具,结果都会追加到这个列表中,而不是覆盖。这在多步推理中非常有用。
Node 的设计原则:每个 Node 应该是无副作用的纯函数(除了写入 State)。不要在一个 Node 里既做 LLM 调用又做复杂的数据库事务。保持单一职责,方便单元测试。

Edge 与条件分支:掌控流程的"红绿灯"
图的力量体现在边(Edges)上。LangGraph 支持两种边:普通边和条件边。
普通边是确定性的:A -> B。
条件边则根据当前 State 动态决定下一步去哪。这解决了最头疼的"路由"问题。
在我的项目中,意图识别后的路由是这样写的:
python
def route_intent(state: AgentState) -> str:
intent = state.get("extracted_info", {}).get("intent")
if intent == "complaint":
return "empathy_node"
elif intent == "technical_query":
return "knowledge_retrieval"
else:
return "general_response"
graph.add_conditional_edges(
"intent_recognition",
route_intent,
{
"empathy_node": "empathy_node",
"knowledge_retrieval": "knowledge_retrieval",
"general_response": "end"
}
)
踩坑经验 :刚开始我习惯用 Python 的 if-elif-else 硬编码逻辑,后来发现随着节点增多,分支判断函数变得极其庞大且难以阅读。LangGraph 的条件路由虽然看起来代码量大,但它将"控制逻辑"从"业务逻辑"中剥离了出来。你可以单独对 route_intent 进行单元测试,传入不同的 extracted_info,验证其返回值是否正确指向了下一个节点。这种可测试性是工程化的基石。
人工审批节点:让 Agent 具备"敬畏心"
这是我觉得 LangGraph 最适合展示工程价值的地方:Human-in-the-loop。
在金融或高敏感场景中,Agent 不能自动决定删除用户数据或发送大额优惠券。你需要一个节点暂停执行,等待人类确认。
LangGraph 提供了 interrupt_before 机制。
python
# 定义需要人工干预的节点
HUMAN_APPROVAL_NODES = ["send_compensation"]
# 创建图时指定中断点
builder = StateGraph(AgentState)
# ... 添加节点和边 ...
graph = builder.compile(interrupt_before=HUMAN_APPROVAL_NODES)
当工作流运行到 send_compensation 节点前,会自动暂停。此时,你可以查询 Graph 的状态,获取当前的 state,展示给用户界面,并等待用户点击"批准"或"拒绝"。
获取中间状态并更新:
python
# 假设你在 Web API 中收到用户的确认信号
thread_config = {"configurable": {"thread_id": "session_123"}}
checkpoint = graph.get_state(thread_config)
current_state = checkpoint.values
# 用户批准
new_state = current_state.copy()
new_state["status"] = "approved_by_human"
# 恢复执行
graph.update_state(thread_config, new_state)
简历亮点:在简历中,不要只说"实现了人机协作"。要强调"通过引入非阻塞的人工审批节点,解决了自动化决策在敏感业务场景下的合规风险,并将误操作率降低了 X%"。这才是 HR 和技术面想听到的工程思维。
工程化落地:从 Demo 到生产
光会写代码不够,还要考虑怎么跑通。
-
可视化调试 :LangGraph 内置了
plot_graph()方法,能生成 SVG 图。在本地开发时,这张图比看日志直观得多。你可以清楚地看到数据流向。 -
持久化存储 :生产环境必须依赖
Checkpointer(如 SQLitePostgresSaver)。否则服务重启,所有状态丢失。我在项目中使用了 SQLite,因为它轻量且足够应对大多数中小型场景。记得在 Dockerfile 中挂载数据卷。 -
版本控制:图的拓扑结构经常变。建议将图的构建逻辑封装在独立模块中,并利用 LangGraph Cloud 或简单的 Git 管理图版本。每次发布前,运行集成测试确保所有路径都能正常流转。
总结
LangGraph 并不是要取代 LangChain,而是为了解决 LangChain 在复杂工作流管理上的短板。
对于求职者来说,做一个基于 LangGraph 的小项目,比单纯调用几个 API 要有说服力得多。它展示了你对状态管理、流程控制、异常处理以及人机协作的理解。
记住,好的 Agent 不是越聪明越好,而是越可控越好。用图的思想去重构你的工作流,你会发现,那些曾经让人头疼的 Bug,现在都变成了图中清晰可见的路径。
如果你正在准备面试,不妨试试把我上面提到的"工单处理 + 人工审批"流程复现一遍,把代码推到 GitHub,并在 README 里画出那张 Flowchart。这比千言万语的介绍信都管用。
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。





如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。
