
一、 你的Agent为何总是“一根筋”?
嗨,大家好,我是技术老金。
你有没有过这样的经历:你精心打造的AI Agent,在处理一个稍微复杂点的任务时,就像一个得了健忘症的侦探。你让它先去A网站查资料,再去B网站比对价格,最后总结报告。结果它从B网站回来后,已经完全忘了A网站的内容是什么。或者更糟,它在两个网站之间来回打转,陷入了无法终结的循环,烧掉了你大量的Token,最终只交付了一个寂寞。
你费尽心力,用ReAct模式为你手头的AI Agent配上了一堆强大的工具,它就像一个全副武装的“超级士兵”,能搜索、能计算、能执行代码。但你很快就发现,这个士兵有个致命的缺陷:它只会“一根筋”地直线冲锋。
面对这些需求,难道我们只能在代码里手写一堆复杂的if-else
和for
循环吗?那样的话,我们的代码很快就会变成一坨难以维护的“面条”。
有没有一种更优雅的方式,来为我们的Agent构建一个真正的“大脑指挥部”?
答案是肯定的。这,就是我们今天要聊的主角——LangGraph。它不是一个新工具,而是一种构建AI工作流的新思想:用“画流程图”的方式,来指挥你的AI。
二、 核心思想:LangGraph就是给AI画一张“流程图”
为了让你秒懂,我们来打个比方:
- 传统的ReAct模式,就像一条“单线程流水线”。原料从一头进去,经过固定的工序,产品从另一头出来。整个过程是线性的,无法回头,无法分支。
- LangGraph,则像一座“现代化智能工厂”。
- 工厂里有各种不同的“车间” (Nodes),每个车间都能完成一项特定的任务。
- 货物(也就是我们的“数据状态” (State))可以在这些车间之间,根据我们预先铺设好的“传送带” (Edges),进行自由的流转。
- 我们甚至可以设置“智能分拣机”,让货物根据质检结果,自动决定是流向下一个车间,还是返回上一个车间进行“返工”(也就是“循环” (Cycle))。
理解了这个比喻,你就掌握了LangGraph的三个核心概念:
- 状态 (State):在工厂里流转的“货物”,它记录了任务的所有信息。在代码里,通常是一个字典或
TypedDict
。 - 节点 (Node):工厂里的“车间”,负责处理货物。在代码里,可以是一个Agent,也可以是一个普通的Python函数。
- 边 (Edge):连接车间的“传送带”,决定了货物的下一个去向。
三、 实战演练:三步构建你的第一个“智能工厂”

光说不练假把式。我们来动手,构建一个最简单的“研究员-作家”工作流。
第一步:定义“货物规格” (State)
我们首先要定义,在我们的工厂里流转的“货物”,包含哪些信息。
from typing import TypedDict, List
class ResearchState(TypedDict):
topic: str # 研究主题
research_notes: List[str] # 研究员找到的笔记
final_report: str # 作家最终生成的报告
第二步:建设“车间” (Nodes)
我们建设两个车间:研究员和作家。为了简化,我们这里用普通的Python函数来模拟。
def researcher_node(state: ResearchState):
topic = state['topic']
print(f"--- [车间1:研究员] 正在研究主题: {topic} ---")
# 模拟研究过程
notes = [f"关于'{topic}'的笔记1", f"关于'{topic}'的笔记2"]
return {"research_notes": notes}
def writer_node(state: ResearchState):
notes = state['research_notes']
print(f"--- [车间2:作家] 正在根据笔记写作 ---")
# 模拟写作过程
report = "最终报告:\n" + "\n".join(notes)
return {"final_report": report}
第三步:铺设“传送带” (Edges)
这是最关键的一步,我们要把工厂组装起来。
from langgraph.graph import StateGraph, END
# 1. 实例化我们的“工厂蓝图”
workflow = StateGraph(ResearchState)
# 2. 在蓝图上注册我们的“车间”
workflow.add_node("researcher", researcher_node)
workflow.add_node("writer", writer_node)
# 3. 设置“入口传送带”,告诉工厂第一站去哪
workflow.set_entry_point("researcher")
# 4. 连接“车间之间的传送带”
workflow.add_edge("researcher", "writer")
# 5. 设置“终点站”,告诉工厂在哪里结束
workflow.add_edge("writer", END)
# 6. 编译蓝图,建成真正的“智能工厂”
app = workflow.compile()
# 运行!
initial_state = {"topic": "AI Agent的未来"}
final_state = app.invoke(initial_state)
print("\n--- [工厂成品] ---")
print(final_state['final_report'])
把以上代码保存并运行,你就成功地用LangGraph构建并运行了你的第一个多节点工作流!
四、 可视化你的工作流:一张图看懂你的“工厂”
为了让你更直观地理解我们刚才构建的、带“质检返工”环节的工厂,我们可以用Mermaid语法画出它的流程图。这张图,就是你用LangGraph思想在脑海里应该形成的蓝图:

看,这张图是不是比代码更清晰?这就是LangGraph的核心魅力:代码即图,图即代码。你构建的不再是晦涩的逻辑,而是一张清晰、可维护的流程图。
五、 新手避坑指南:我们总结的3个“血泪教训”
上面的例子很简单,但一旦流程复杂起来,新手非常容易踩坑。这3个教训,请你务必牢记。
血泪教训一:严禁‘原地修改’!状态更新必须是‘报告’,而不是‘篡改’
这是90%的新手都会犯的错。看下面的错误示范:
# 错误做法!
def researcher_node_wrong(state: ResearchState):
# ...
state['research_notes'] = notes # 直接修改了传入的state
return state
为什么错? LangGraph的核心机制之一,就是保证状态的“不可变性”,每一次状态的变更,都应该是一次全新的、可记录的更新。直接修改,会破坏掉它的历史记录,让你无法进行调试和“时间旅行”。这是LangGraph的“铁律”,违反它的代码,在简单的流程里看似能跑,一旦复杂起来,就是一颗定时炸弹,会让你的调试工作变成一场灾难。
正确做法:永远只返回一个只包含“变化量”的字典。
# 正确做法!
def researcher_node_correct(state: ResearchState):
# ...
notes = [...]
return {"research_notes": notes} # 只返回需要更新的部分
血泪教训二:别用if-else
写死逻辑!学会用‘条件边’,赋予Agent‘决策能力’
add_edge
只是最基础的“传送带”。LangGraph最强大的地方,在于add_conditional_edges
,它就像一个“智能分拣机”。这才是从“线性工人”到“智能主管”的关键一步。
我们来改造一下,增加一个“质检”环节,如果研究员的笔记太少,就让他“返工”。
# 1. 增加一个“质检”车间
def quality_check_node(state: ResearchState):
print("--- [质检车间] 正在检查笔记质量 ---")
if len(state['research_notes']) < 3:
print("--- [质检结果] 不合格,打回返工! ---")
return "rework" # 返回“返工”信号
else:
print("--- [质检结果] 合格,送去写作! ---")
return "proceed" # 返回“继续”信号
# 2. 改造工厂蓝图
workflow = StateGraph(ResearchState)
workflow.add_node("researcher", researcher_node)
workflow.add_node("quality_checker", quality_check_node)
workflow.add_node("writer", writer_node)
workflow.set_entry_point("researcher")
# 关键!设置“智能分拣机”
workflow.add_conditional_edges(
"researcher", # 从研究员车间出来后,进入分拣机
quality_check_node, # 用质检函数来判断
{
"rework": "researcher", # 如果判断结果是"rework",就送回研究员车间
"proceed": "writer" # 如果是"proceed",就送去作家车间
}
)
workflow.add_edge("writer", END)
app = workflow.compile()
看,通过“条件边”,我们轻松地实现了“循环”!这是ReAct模式难以企及的强大能力。
血泪教训三:拒绝‘盲人摸象’!从第一天起,就拥抱LangSmith
当你的“工厂”变得庞大时,如果出了问题,想找到是哪个环节的“货物”出错了,会非常痛苦。别等到你的流程图变成一张蜘蛛网时,才想起需要一个GPS。
- 土办法:在每个节点函数的第一行,都加上
print(f"Current state: {state}")
,手动打印状态。简单,但低效。 - 专业办法:拥抱LangSmith! 这是LangChain官方的调试神器。你只需要在代码里加两行配置,它就能把你的每一次运行、每一个节点的状态变化,都用极其精美的可视化界面呈现出来。你能清晰地看到数据是如何在“流程图”里一步步流转的。对于任何超过3个节点的Graph,LangSmith都应该是必需品,而非奢侈品。
六、 老金总结:从“提示词工程师”到“AI流程架构师”
好了,今天就聊到这里。
我们必须认识到,学习LangGraph,我们学会的,绝不仅仅是一个新的Python库。
它真正带来的,是一次思维模式的跃迁。
它迫使我们,将工作的重心,从“如何与AI聊好天、写好一个Prompt”,提升到了“如何设计一个健壮、可扩展、可观测的AI工作流”的高度。
我们正在从一个“提示词工程师”,进化为一个“AI流程架构师”。
这,或许才是AI时代,我们这些开发者,最深刻、最不可替代的核心价值。