LangGraph 工作流:用小项目验证核心能力

聊《LangGraph 工作流:用小项目验证核心能力》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。

摘要

本文概述文章目标、核心观点和实践价值。

之前面试几家大厂,面试官常问一个问题:"你做的 Agent 如果卡住了,或者流程跑偏了,你怎么兜底?"

很多候选人会搬出 ReAct 循环或者简单的 Chain 拼接,说"加个重试机制"。但在实际工程里,这种黑盒式的调用链一旦复杂起来,调试成本极高。你根本不知道是 LLM 幻觉了,还是工具返回了错误数据,亦或是业务逻辑本身就有死锁。

这就是我最近把重心从 LangChain 的 Chain 转向 LangGraph 的原因。对于想构建可靠 Agent 系统的后端和 AI 开发者来说,LangGraph 不仅仅是一个库,它提供了一种"图状态机"的思维模式。

今天我不讲大道理,直接拿一个我在做的"智能客服工单处理"小项目为例,聊聊怎么用 LangGraph 把不可控的脚本变成可控的系统,顺便说说这个项目怎么放进你的简历里,体现工程价值。

目录

  • 为什么需要图工作流?
  • State 与 Node:给数据加个"容器"
  • Edge 与条件分支:掌控流程的"红绿灯"
  • 人工审批节点:让 Agent 具备"敬畏心"
  • 工程化落地:从 Demo 到生产
  • 总结

为什么需要图工作流?

传统的 LangChain SequentialChainLLMChain 适合线性任务,比如:用户提问 -> LLM 提取实体 -> 查数据库 -> 回答。

但真实业务往往是非线性的。比如客服场景:

  1. 识别意图。

  2. 如果是投诉,进入情绪安抚流程;如果是咨询,进入知识库检索流程。

  3. 知识库检索失败时,触发人工介入。

  4. 人工介入后,根据反馈决定是继续检索还是关闭工单。

这种分支、循环、回溯,用链式调用写出来就是一堆嵌套的 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 到生产

光会写代码不够,还要考虑怎么跑通。

  1. 可视化调试 :LangGraph 内置了 plot_graph() 方法,能生成 SVG 图。在本地开发时,这张图比看日志直观得多。你可以清楚地看到数据流向。

  2. 持久化存储 :生产环境必须依赖 Checkpointer(如 SQLitePostgresSaver)。否则服务重启,所有状态丢失。我在项目中使用了 SQLite,因为它轻量且足够应对大多数中小型场景。记得在 Dockerfile 中挂载数据卷。

  3. 版本控制:图的拓扑结构经常变。建议将图的构建逻辑封装在独立模块中,并利用 LangGraph Cloud 或简单的 Git 管理图版本。每次发布前,运行集成测试确保所有路径都能正常流转。

总结

LangGraph 并不是要取代 LangChain,而是为了解决 LangChain 在复杂工作流管理上的短板。

对于求职者来说,做一个基于 LangGraph 的小项目,比单纯调用几个 API 要有说服力得多。它展示了你对状态管理、流程控制、异常处理以及人机协作的理解。

记住,好的 Agent 不是越聪明越好,而是越可控越好。用图的思想去重构你的工作流,你会发现,那些曾经让人头疼的 Bug,现在都变成了图中清晰可见的路径。

如果你正在准备面试,不妨试试把我上面提到的"工单处理 + 人工审批"流程复现一遍,把代码推到 GitHub,并在 README 里画出那张 Flowchart。这比千言万语的介绍信都管用。

资料展示

下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。

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