💎 本文价值提示
你将获得什么?
- 彻底理解为什么传统的 Chain(链式)架构无法应对复杂任务。
- 掌握 LangGraph 的核心概念:State(状态)、Nodes(节点)与 Edges(边)。
- 实战演练:手把手教你设计一个具备“自我修正”能力的数据分析师 Agent。
- 架构师视角:如何设计“人机回环”机制,确保 AI 不会在生产环境中“裸奔”。
👋 前言:从“鹦鹉学舌”到“独立思考”
在之前的三个专题中,我们已经打下了坚实的基础:
- Python 高级工程化:让我们有了打造稳固系统的手艺。
- 大模型基础理论:让我们理解了 LLM 的“大脑”是如何运作的。
- RAG 架构与向量数据库:我们给大脑装上了海量的“长期记忆”。
但是,现在的系统还缺一样东西——“手脚”和“逻辑”。
目前的很多 LLM 应用,就像是一个只会照着菜谱做菜的厨师(Chain 模式)。第一步切菜,第二步炒菜,第三步上菜。如果第二步把菜炒糊了,它依然会机械地执行第三步“上菜”,最后端给用户一盘黑乎乎的东西。
真正的智能 Agent(智能体),应该像一个大厨:炒菜时尝一口,发现淡了(Observation),就加点盐(Action);发现糊了,就倒掉重做(Loop/Correction)。
今天,我们就来学习如何用 LangGraph,把线性的“死流程”,变成有生命力的“活循环”。
🚀 一、 核心思维转变:从 DAG 到 Cyclic Graph
作为大数据工程师出身的你,一定对 DAG(有向无环图) 不陌生。Airflow、Spark 的任务调度都是线性的:A -> B -> C。
但在 Agent 的世界里,线性是最大的敌人。
1.1 为什么 Chain 不够用?
LangChain 早期的核心是 Chain。它假设任务是确定的。
- 用户:帮我写个贪吃蛇游戏。
- Chain:写代码 -> 运行 -> 结束。
- 结果:代码报错了,任务结束,用户得到一堆报错信息。
1.2 LangGraph 的循环思维
LangGraph 是 LangChain 团队推出的新一代编排框架,它的核心是 State Machine(状态机) 和 Cyclic Graph(有环图)。
它允许流程“回头”。
- Agent:写代码 -> 运行 -> 报错了吗?
- 是:把错误信息喂回给 LLM,让它修改代码 -> 再次运行(进入循环)。
- 否:输出结果。
这一个简单的“回头”,就是 Agent 从“指令执行”进化到“自主决策”的关键。
🛠️ 二、 解剖 LangGraph:Agent 的器官
要玩转 LangGraph,你只需要掌握三个核心概念,它们构成了 Agent 的骨架。
1. State(状态):Agent 的“短期记忆”
想象一下,几个工人在接力干活,他们中间有一个剪贴板,上面记录着当前任务的所有信息。
- 上一个工人做了什么?
- 现在的工具输出是什么?
- 用户的原始需求是什么?
在 LangGraph 中,这个剪贴板就是 State。它通常是一个 TypedDict 或 Pydantic 模型。
from typing import TypedDict, Annotated, List
import operator
class AgentState(TypedDict):
messages: Annotated[List[str], operator.add] # 聊天记录
code: str # 生成的代码
execution_result: str # 代码运行结果
retry_count: int # 重试次数
2. Nodes(节点):干活的“工人”
Node 就是具体的 Python 函数。它们接收当前的 State,干活(比如调用 LLM、执行 SQL、搜索谷歌),然后更新 State。
3. Edges(边):指挥交通的“红绿灯”
Edge 决定了下一个该谁干活。
- 普通边:A 做完 B 做。
- Conditional Edges(条件边):这是最精彩的地方!
- LLM 觉得任务完成了吗? -> 结束。
- LLM 觉得需要调用工具? -> 去工具节点。
- 代码运行报错了? -> 回到生成代码节点。
⚔️ 三、 深度实战:构建“数据分析师 Agent”
光说不练假把式。我们要构建一个能自动写代码、自动纠错的数据分析 Agent。
3.1 任务流程设计
我们要解决的问题是:用户上传一个 CSV,问“分析一下销售趋势”。
流程图如下(Mermaid):

3.2 核心代码逻辑解析
第一步:定义图结构
from langgraph.graph import StateGraph, END
# 初始化图
workflow = StateGraph(AgentState)
# 添加节点 (工人)
workflow.add_node("coder", coder_agent_node) # 负责写代码
workflow.add_node("executor", python_repl_node) # 负责运行代码
# 定义入口
workflow.set_entry_point("coder")
# 添加边 (逻辑流)
workflow.add_edge("coder", "executor") # 写完代码,必须去执行
# 添加条件边 (关键逻辑!)
def check_execution(state):
if state['execution_result'] == "Success":
return "end"
else:
return "retry"
workflow.add_conditional_edges(
"executor",
check_execution,
{
"end": END,
"retry": "coder" # 报错了?回炉重造!
}
)
# 编译图
app = workflow.compile()
第二步:自我修正的魔法
在 coder 节点中,Prompt 的设计至关重要。我们需要把“报错信息”作为上下文传回给 LLM。
System Prompt: "你是一个 Python 专家。上一次你生成的代码运行报错了,错误信息是:{error_message}。请根据错误信息修正代码。"
这就是 Self-Correction(自我修正)。在大数据工程中,ETL 报错通常需要人工介入;而在 Agent 架构中,我们利用 LLM 的推理能力,让它自己去 Debug。
🧠 四、 架构师的深层思考
作为架构师,我们不能只看 Demo 跑通,还要考虑生产环境的复杂性。
1. 避免“死循环” (Infinite Loops)
如果 LLM 一直修不好代码怎么办?难道让它无限循环下去,烧光你的 Token?
- 解决方案:在 State 中增加
retry_count。 - 逻辑:在条件边中判断,如果
retry_count > 3,强制结束并抛出异常,转人工处理。
2. 上下文爆炸 (Context Window)
LangGraph 的 State 会随着循环次数增加而变大。如果循环了 10 次,Prompt 可能会超出 LLM 的上下文限制。
- 解决方案:Trim History。在每一轮循环开始前,只保留最近的 N 条消息,或者总结之前的错误,而不是保留完整的 Stack Trace。
3. 人机回环 (Human-in-the-loop)
Agent 要执行 DROP TABLE 或者发送邮件,你敢让它全自动吗?
- LangGraph 方案:使用
interrupt_before。 - 在执行敏感操作的 Node 之前,暂停图的运行。等待用户在前端点击“批准”,再恢复执行。这是 LangGraph 相比 LangChain 最大的架构优势之一。
📝 五、 总结与展望
今天我们跨越了一个巨大的门槛:从线性的 Pipeline 迈向了循环的 Graph。
- LangChain 适合简单的问答和确定性任务。
- LangGraph 适合复杂的、需要多步推理、容错和状态管理的 Agent 任务。
掌握了 LangGraph,你就拥有了构建“类人”逻辑的能力。但现在的 Agent 还是“单打独斗”。如果任务太复杂,一个 Agent 搞不定怎么办?
下期预告:我们将进入 多智能体协作(Multi-Agent) 的世界。看看如何用 AutoGen 组建一支由产品经理、程序员、测试员组成的“AI 虚拟团队”。
🗺️ 全文思维导图

💬 互动话题
你在开发 LLM 应用时,遇到过最让你头疼的“智障”行为是什么? 是死循环复读机?还是胡乱调用工具? 欢迎在评论区吐槽,我会选出一位朋友,送出我整理的《LangGraph 常用 Pattern 代码库》!👇