LangGraph 工作流:从基础调用到稳定运行

聊《LangGraph 工作流:从基础调用到稳定运行》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。

摘要

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

前阵子线上出了一个让人头疼的问题:我们的客服 Agent 在处理退款请求时,偶尔会把“部分退款”执行成“全额退款”,而且没有触发任何预警。排查日志发现,Agent 内部状态流转是线性的,一旦 LLM 判定需要退款,它就直接调用了 refund_tool,中间没有任何校验环节。

这就是典型的“脚本式 Agent”陷阱——代码写起来快,跑起来像脱缰野马。为了解决这个问题,我们重构了底层逻辑,引入了 LangGraph。今天不聊那些花哨的概念,就聊聊怎么把这个图结构真正变成生产环境里可控、可观测、可回滚的系统。

目录

  • 为什么需要图工作流
  • State 与 Node:定义系统的“记忆”
  • Edge 与条件分支:掌控流量走向
  • 人工审批节点:给 AI 装上“刹车”
  • 工程化落地:监控、版本与回滚
  • 总结

为什么需要图工作流

文章插图 1

很多开发者刚接触 LangChain 时,喜欢用 Chain 串联模块。Chain 适合简单的顺序执行,比如“检索文档 -> 组装 Prompt -> 调用 LLM”。但在复杂的业务场景下,Chain 显得力不从心:

1. 循环依赖:如果 LLM 生成的答案需要自我反思(Self-Correction),Chain 很难表达这种迭代过程。
2. 条件分支复杂:根据用户意图不同,后续调用不同的工具集,用 Chain 写一堆 if-else 会让逻辑变得难以维护。
3. 状态丢失:Chain 往往是无状态的,每一步的输出直接作为下一步的输入,难以保存整个对话的历史上下文快照。

LangGraph 的核心价值在于它将 Agent 的工作流建模为有向图(Directed Graph)。节点(Node)代表执行单元,边(Edge)代表控制流。这种抽象让我们能像画流程图一样设计 Agent,更重要的是,它支持持久化状态人工干预

State 与 Node:定义系统的“记忆”

文章插图 2

在 LangGraph 中,State 是整个系统的灵魂。不同于普通函数传参,State 是一个共享的字典,所有 Node 都可以读写它。

我们在项目中定义了一个 AgentState,它不仅包含用户输入和当前回复,还记录了工具调用的历史、置信度分数以及是否触发了人工审核标志。

from typing import TypedDict, Annotated
import operator

class AgentState(TypedDict):
    messages: Annotated[list, add_messages] # 消息列表,自动合并
    tool_calls: list # 待执行的工具调用
    is_human_review_needed: bool # 是否需要人工介入
    confidence_score: float # LLM 输出的置信度
    final_decision: str # 最终决策结果

def llm_node(state: AgentState) -> AgentState:
    # 模拟 LLM 推理
    response = call_llm(state['messages'])

    # 简单策略:如果涉及金钱操作且置信度低,标记需要人工审核
    needs_review = False
    if "refund" in response.content.lower() and response.confidence < 0.8:
        needs_review = True

    return {
        "messages": [response],
        "is_human_review_needed": needs_review,
        "confidence_score": response.confidence,
        "tool_calls": response.tool_calls
    }

这里有一个关键的工程取舍:State 的序列化与持久化。在生产环境中,State 必须能被序列化(如 JSON),以便存入 Redis 或数据库。这样当服务重启或迁移时,Agent 可以从断点恢复,而不是从头开始。这也是实现“可回滚”的基础。

CSDN资料领取方式

Edge 与条件分支:掌控流量走向

有了 State,接下来就是定义 Edge。LangGraph 提供了两种边:

1. Conditional Edges:根据当前 State 决定下一步去哪个 Node。
2. Normal Edges:确定性地跳转到下一个 Node。

在我们的退款场景中,我们使用条件边来路由流程:

def route_after_llm(state: AgentState) -> str:
    if state['is_human_review_needed']:
        return "human_review_node"
    elif state['tool_calls']:
        return "tool_execution_node"
    else:
        return "final_response_node"

workflow.add_conditional_edges(
    "llm_node",
    route_after_llm,
    {
        "human_review_node": "human_review_node",
        "tool_execution_node": "tool_execution_node",
        "final_response_node": "end"
    }
)

这种写法比硬编码 if-else 清晰得多。如果将来我们要增加一个新的审核维度(比如风控拦截),只需要修改 route_after_llm 的判断逻辑,而不需要改动其他 Node 的内部实现。这就是关注点分离带来的工程优势。

人工审批节点:给 AI 装上“刹车”

回到最初的问题:如何防止错误的全额退款?答案就是引入人机协同(Human-in-the-loop)机制。

在 LangGraph 中,我们可以暂停图的执行,等待外部信号(如人类确认)后才继续。这对于高风险操作至关重要。

def human_review_node(state: AgentState) -> AgentState:
    # 这里通常会阻塞,直到收到人工确认
    # 实际生产中,通过 API 将请求推送到审批后台
    approval = get_human_approval()

    if not approval.approved:
        # 拒绝则生成拒绝理由,并结束或重新引导
        return {
            "messages": [AIMessage(content=f"Request denied: {approval.reason}")],
            "final_decision": "denied"
        }

    # 批准则继续执行工具
    return {
        "is_human_review_needed": False,
        "approved_by_human": True
    }

这个节点不仅仅是个开关,它还是监控的关键入口。我们记录了每次人工干预的时间、原因和操作者。这些数据事后可以反哺模型,优化置信度阈值,减少未来的误判。

工程化落地:监控、版本与回滚

代码写得好只是第一步,要让 Agent 在生产环境稳定运行,还需要解决以下工程问题:

1. 版本管理

LangGraph 的图结构应该像代码一样进行版本控制。我们使用 CompiledGraph 的序列化功能,每次发布新版本的图逻辑时,记录版本号。用户会话可以指定使用哪个版本的图执行,方便灰度发布和快速回滚。

2. 可观测性

每一个 Node 的执行耗时、输入输出、异常信息都必须上报到监控系统(如 Prometheus + Grafana)。特别是条件边的跳转频率,能直观反映模型的不确定性。如果某个分支被触发的频率异常高,说明 Prompt 或模型可能需要调整。

3. 超时与熔断

Agent 可能陷入无限循环(例如反复调用工具但无法达成共识)。必须在编译图时设置最大步数限制(Max Iterations),并在每个 Node 中加入超时熔断机制。一旦触发,立即切换到兜底策略(如转接人工客服)。

总结

从脚本到系统,LangGraph 提供的不仅是状态管理和流程控制,更是一种工程化的思维方式。它迫使我们在设计 Agent 时,先思考“数据在哪里流动”、“哪里可能出错”、“如何人工干预”,而不是仅仅关注“Prompt 怎么写”。

对于后端开发者来说,掌握 LangGraph 意味着你能构建出更健壮、更可控的 AI 应用。不要害怕引入复杂度,因为当你的 Agent 开始处理真实世界的脏数据和高频并发时,这种复杂度正是稳定性的来源。

下次当你想要用简单的 Chain 解决问题时,不妨停下来问问自己:这个流程未来会扩展吗?如果出现异常,我能回滚吗?如果不能,也许现在是时候画图了。

资料展示

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

AI大模型资料展示 1

AI大模型资料展示 2

AI大模型资料展示 3

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

CSDN官方大礼包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值