LangGraph实战揭秘:如何用「有向循环图」实现AI Agent的自主决策与工具链开发?
AI Agent
Agent架构:
- 通过LLM,能够自主理解、规划、执行复杂任务的系统。给它一个目标,AI Agents就能完成剩下的全部工作;
- 规划(Planning):将任务分解为较小的、可管理的子目标;
- 记忆(Memory):短期记忆(近5轮的session对话),进行上下文学习;长期记忆(储存记忆.md文件),一般通过外部载体储存和快速检索来实现;
- 工具使用(Tool use):调用外部API,获取额外信息,在这阶段也会有plan、memory,简称to-do-list;

OpenClaw、Hermes Agent:
Agent + Tool - Skills(内置了一些Skills)
Skills(元数据 name ,description —> 决定调用什么工具;指导说明书SKILL.md —> 怎么调)
Agent会先调用read_file通过加载这个skill.md了解具体的调用方法。
| 工具 | 核心定位 | 架构特点 | 适用场景 |
|---|---|---|---|
| LangChain | 开源LLM应用开发框架 | 基于链(Chain)的线性或分支工作流,支持Agent模式 | 快速构建RAG、对话系统、工具调用等线性任务 |
| LangGraph | LangChain的扩展,专注于复杂工作流 | 基于图(Graph)的循环和条件逻辑,支持多Agent协作 | 需要循环、动态分支或状态管理的复杂任务(如自适应RAG、多Agent系统) |
| Qwen-Agent | 通义千问的AI Agent框架 | 基于阿里云大模型,支持多模态交互与工具调用 | 开源,集成多种工具,MCP调用 |
| Coze | 字节跳动的无代码AI Bot平台 | 可视化拖拽界面,内置知识库、多模态插 件 | 快速部署社交平台机器人、轻量级工作流 |
| Dify | 开源LLM应用开发平台 | API优先,支持Prompt工程与灵活编排 | 开发者定制化LLM应用,需深度集成或私有化部署 |
Generative Agents
Google和Stanford学者构造了一个《西部世界》小镇,打造模拟人类行为的Agent:Generative Agents。
Generative Agents(生成式智能体),利用生成模型来模拟可信人类行为的Agent,并证明它们能生成可信的个人和突发的群体行为。

25个Agent居住在 Smallville小镇,每个Agent都可以:
- 与别人和环境交流;
- 记住并回忆它们所做的和观察到的事情;
- 反思这些观察结果;
- 制定每天的计划
大家感兴趣可以通过 西部世界 打开Web页面,进行 play:

用自然语言设定每个Agent的角色,包括它们的职业,与其他Agent的关系,比如:John Lin 是一名药店店主,他乐于助人。他一直在寻找使客户更容易获得药物的方法。John Lin 的妻子是大学教授 Mei Lin ,它们和学习音乐理论的儿子 Eddy Lin 住在一起;John Lin 非常爱它的家人;John Lin 认识隔壁的老夫妇 Sam Moore 和Jennifer Moore 好几年了……
在沙盒的每个Step,Agent都输出一个自然语句,描述它们当前的动作,比如:Isabella Rodriguez 正在写日记、Isabella Rodriguez 正在查看邮件等。
然后这些自然语言将转化为影响沙盒的具体动作,动作以一组表情符号显示在沙盒界面上,这些表情符号提供了动作的抽象表征。

Smallville 小镇有许多公共场景,包括咖啡馆、酒吧、公园、学校、宿舍、房屋和商店。每个公共场景包括自己的功能和设施,比如房子中有厨房、厨房中有炉子。
在Agent的生活空间中有床、桌子、衣柜、架子、浴室、厨房等。Agent可以在 Smallville小镇随意走动,导航前往一座建筑,或者去接近另一个Agent。

Agent的移动由 Generative Agents 的架构和沙盒引擎控制(当模型指示Agent移动到某个位置时,它会计算Agent到达目的地的步行路径,然后开始移动)。
在公共环境中,Agent会影响其他人的状态,比如:某Agent睡觉时床是被占用的,当Agent用完早餐冰箱可能是空的。
Generative Agents具有社交属性,信息可以在Agent之间进行传播。比如Sam 和 Tom 在杂货店中相遇,Sam 告诉了 Tom他在竞选镇长;在 Sam 离开后,Tom 和 John 讨论了 Sam 赢得选举的机会;逐渐地,Sam 的竞选成为镇上的热门话题,有人支持他,有人犹豫不决。
随着时间的推移,小镇上的Agent形成了新的关系,并记住了它们与其他Agent的互动。比如Sam 一开始不认识 Latoya。在约翰逊公园散步时,Sam 碰到了 Latoya,互相做了自我介绍,Latoya 提到自己正在进行一个摄影项目:Latoya:我正在这里给一个项目拍摄照片。 在后来他们又相遇了,Sam 与 Latoya 的对话表明了他们还记得这件事 Sam:Latoya,你的项目进展如何?Latoya:进展得很好!

记忆流:
- 是Generative Agents 的核心模块,全面记录Agent经验的数据库。
- Agent会从记忆流中检索相关记录,用来规划Agent的动作,并对环境做出适当反应。每次行为都会被记录,从而生成更高级别的行为指令。
- 所有的内容都会被记录,并以自然语言进行推理,这样Agent能够使用大语言模型(GPT3.5或GPT4.0)进行推理。
Generative Agents核心模块:
- 长期记忆: Agent要做多轮决策,所以要考虑更长的上下文,这些信息会超过 GPT 模型的 token 上限;
- 外部工具: 使用外部工具可以让GPT调用更多的服务作为输入/输出,增强GPT的能力,这好比人会使用这些外部工具,那么GPT也可以使用;
- 短期记忆: 基于Attention机制将长期记忆中最相关的部分喂给GPT,生成结果;

自主规划设计
自主智能体的力量
Agent 通常被实现为LLM通过工具调用(基于环境反馈)在循环中执行动作的系统。
正如Anthropic指出的,Agent可以处理复杂的任务,但其实现很简单。它们通常是LLM根据环境反馈使用工具的循环。因此,清晰全面的设计工具集以及文档对于Agent的成功至关重要。

Agent适用于那些开放性问题,这些问题很难或无法预测所需的步骤数量,并且无法硬编码固定路径。
有固定流程的,可以使用工作流。
LLM 可能会运行多个回合,因此你需要对其决策能力有一定的信任。
智能体的自主性使其非常适合在受信任的环境中扩展任务。然而,自主性也意味着更高的成本和可能出现的错误累积。
建议在沙盒环境中进行广泛的测试,并设置适当的防护栏。
- 编程Agent可以解决涉及对多个文件进行编辑的任务。
- Computer Use 实现中,Claude通过计算机完成任务。
打造Best Practice
AI智能体和工作流是互补的,可以集成在一起以实现最佳效果,尤其是在复杂的现实世界应用中。
- 增强自动化: AI智能体可以自主处理特定任务,而工作流则将这些任务协调成一个连贯、高效的过程。
- 可扩展性: 在结构化工作流中结合多个AI智能体,可以使组织高效扩展运营,减少人工工作量,提高生产力。
- 弹性与适应性: 虽然单个智能体可以应对局部变化,但工作流可以动态调整整体流程,用来与战略目标保持一致。
在智能制造系统中:
- AI智能体可以监控设备性能、预测维护需求并优化生产计划。
- 工作流则负责原材料采购、生产排序、质量保证和物流,确保从原材料到产品交付的无缝过渡。
选择适合你的系统才是成功的关键:
- 在AI领域,成功并不是关于构建复杂的系统,而是构建最适合需求的系统。
- 从简单的提示开始,只有在简单方案解决步了时,再添加多步智能体系统。
在实现智能体时,有三个核心原则:
- 保持智能体设计的简洁性: 避免不必要的复杂性,专注于核心功能。
- 优先考虑透明性: 明确展示智能体的规划步骤,让用户清楚了解其决策过程。
- 打造Function/MCP: 打造工具,以及说明文档和测试,确保Agent与外部环境的交互。
用公式表达:Agent = LLM + Tool + RAG + Prompt
Prompt = system prompt + tool prompt + rag prompt + user prompt + memory prompt + context工程
框架可以帮助你快速上手,但不要害怕在进入生产阶段时减少抽象层,直接使用基础组件。遵循这些原则,你可以创建出不仅强大而且可靠、可维护且值得用户信赖的智能体系统。
反应式(Reactive)
反应式架构:快速决策的“直觉型”智能体,处理简单问题,无复杂推理。
反应式架构是AI智能体设计中最简单直接的模式。在这种架构中,一个大型语言模型(LLM)首先分析当前情况,确定下一步要采取的行动。然后,在环境中执行该行动,产生观察结果作为反馈。LLM处理这些观察结果,重新评估下一步行动,选择另一个行动,并继续这个循环,直到任务完成。

反应式架构(Reactive Architecture)
特点: 基于当前环境即时决策,无长期规划,依赖预设规则快速响应。
也可以搭配RAG来使用,RAG可以提供指导说明书 few shot示例。
RAG = faq.txt(CoT作为错题本)
情况1:如果用户提问了xxxx,你可以通过XXXTool、Tool2查找相关信息。
工作原理:
- 感知: 获取环境输入(如传感器数据)。
- 决策: LLM或规则系统立即生成响应动作。
- 执行: 执行动作并观察结果,循环往复直至任务完成。
优势:
- 速度快: 无复杂推理,适合毫秒级响应的场景(如机器人避障、高频交易)。
- 简单可靠: 行为由明确规则驱动,易于设计和验证。
局限:
- 缺乏适应性: 无法处理未预见的场景或需多步规划的任务。
- 短视性: 仅优化当前动作,可能陷入局部循环(如机器人绕圈)。
典型应用:
- 机器人: 扫地机器人避障、无人机紧急悬停。
- 游戏NPC: 敌人对玩家攻击的即时反应。
- **工业控制:**传感器超限时触发警报或停机。
适用场景: 任务规则明确、响应需实时,且无需长期策略的简单环境。
“条件反射”——像膝跳反应一样快速直接,但无法应对复杂变化。
深思熟虑(Deliberative)
深思熟虑智能体(Deliberative Agent)
特点: 基于内部模型进行规划,通过推理选择最优行动方案,具有长期目标导向性。
简而言之,由多个工具形成pipeline。

核心流程:
- 感知: 获取环境信息;
- 建模: 更新内部世界状态表示;
- 推理: 生成候选计划并模拟结果;
- 决策: 选择最优方案执行;
优势:
- 能处理多步复杂任务;
- 优化长期目标而非即时反馈;
- 适应动态变化环境;
典型示例,路径规划智能体:
- 生成多条候选路线
- 评估安全性/耗时等指标
- 选择最优路径执行
适用场景: 需战略规划的任务(如物流调度、投资决策等)
像下棋高手——每步棋都经过推演,而非凭直觉反应。
案例: 使用langGraph为基础的智能投研助手

混合式(Hybrid)
混合智能体架构(Hybrid Agent Architecture)
特点: 结合反应式的"快速本能"和深思熟虑的"战略规划",实现智能与效率的平衡。
三层设计:
- 底层(反应式): 即时处理紧急任务(如避障);
- 中层(协调): 管理任务优先级(可选);
- 顶层(深思熟虑): 进行长期目标规划(如路径优化);
运作机制, 通过仲裁系统(如监督器)动态切换模式:
- 紧急情况: 启用反应式快速响应;
- 常规情况: 启动深思熟虑规划;

典型示例,自动驾驶车辆:
- 突发障碍: 立即刹车(反应式);
- 正常行驶: 规划最优路线(深思熟虑);
核心优势:
- 兼具实时响应能力(毫秒级);
- 保留战略规划优势(长期目标);
案例: 混合式LangGraph的财富管理投顾AI助手

LangGraph使用
LangGraph:工作流(固定流程图,mermaid)
LangGraph的使用步骤:
- 定义状态: 使用TypedDict定义工作流的状态结构;
- 创建StateGraph: 实例化StateGraph并传入状态类型;
- 定义节点函数: 编写处理逻辑函数,接收状态并返回状态更新;
- 添加节点: 使用add_node()将函数添加到工作流;
- 设置入口点: 使用set_entry_point()指定起始节点;
- 添加边: 使用add_edge()或add_conditional_edges()连接节点;
- 编译工作流: 调用compile()方法编译工作流;
- 执行工作流: 调用invoke()方法传入初始状态执行;
ChatTongyi的作用
ChatTongyi是LangChain社区提供的通义千问(Qwen)模型的封装类,用于与大语言模型进行交互。
# 导入ChatTongyi
from langchain_community.chat_models import ChatTongyi
# 创建LLM实例
llm = ChatTongyi(
model_name="qwen-turbo-latest",
dashscope_api_key=DASHSCOPE_API_KEY
)
# 绑定工具到LLM(关键步骤)
llm_with_tools = llm.bind_tools(tools)
ChatTongyi支持工具调用功能,这是实现Agent自主决策调用工具的基础。通过bind_tools()方法,LLM可以理解可用工具的描述,并在需要时生成工具调用请求。
LangGraph中的工具调用
LangGraph中的工具调用,使用 @tool 装饰器定义工具函数:
# 定义查询上证指数的工具
@tool
def query_shanghai_index() -> str:
"""查询上证指数实时行情,获取当前点位、涨跌和涨跌幅信息"""
name = "上证指数"
price = "3125.62"
change = "6.32"
pct = "0.20"
result = f"{name} 当前点位: {price},涨跌: {change},涨跌幅: {pct}%"
return result
# 工具列表
tools = [query_shanghai_index, query_portfolio_allocation, query_market_news]
工具调用流程:
用户查询 => LLM分析 => 决定调用工具 => ToolNode执行 => 返回结果 => LLM生成响应
代码实现细节:
# 绑定工具到LLM
llm_with_tools = llm.bind_tools(tools)
# 反应式Agent中使用工具
def reactive_agent(state: WealthAdvisorState) -> Dict[str, Any]:
# 准备消息
messages = state.get("messages", [])
if not messages:
messages = [HumanMessage(content=f"{system_prompt}\n\n用户问题 {state['user_query']}")]
# 调用带工具的LLM(LLM可能返回工具调用请求)
response = llm_with_tools.invoke(messages)
return {"messages": [response]}
# 判断是否需要继续调用工具
def should_continue_tools(state: WealthAdvisorState) -> str:
messages = state.get("messages", [])
last_message = messages[-1]
# 检查最后一条消息是否包含工具调用
if hasattr(last_message, "tool_calls") and last_message.tool_calls:
return "tools" # 需要执行工具
return "end" # 不需要工具,结束
工具调用是一个循环过程。LLM可能先调用一个工具获取数据,然后基于结果再调用其他工具,直到获得足够信息生成最终响应。
ToolNode的作用
ToolNode是LangGraph提供的预构建节点,专门用于执行工具调用。它接收包含工具调用请求的消息,执行相应的工具函数,并返回工具执行结果。
# 导入ToolNode
from langgraph.prebuilt import ToolNode
# 创建ToolNode实例
tool_node = ToolNode(tools)
# 将ToolNode添加到工作流
workflow.add_node("tools", tool_node)
ToolNode的工作机制:
- 接收消息: 从状态中获取最后一条AIMessage,该消息包含tool_calls属性;
- 解析工具调用: 提取工具名称和参数;
- 执行工具: 根据工具名称找到对应的工具函数并执行;
- 生成ToolMessage: 将工具执行结果封装成ToolMessage;
- 更新状态: 将ToolMessage添加到消息历史中;
StateGraph的作用
StateGraph是LangGraph的核心类,用于定义和管理Agent的状态转换图。=> 允许你构建复杂的、有状态的工作流,其中每个节点可以读取和更新共享状态。
| 功能 | 说明 | 代码 |
|---|---|---|
| 状态管理 | 维护整个工作流的共享状态,节点可以读取和更新状态 | WealthAdvisorState定义 |
| 节点定义 | 将函数封装为工作流节点 | add_node() |
| 条件路由 | 根据状态动态决定下一个节点 | add_conditional_edges() |
| 固定路由 | 节点之间的固定连接 | add_edge() |
| 入口点 | 定义工作流的起始节点 | set_entry_point() |
StateGraph支持有状态的工作流,这意味着每个节点都可以访问和修改共享状态,非常适合实现复杂的Agent逻辑。状态通过TypedDict定义,提供了类型安全。
更多推荐

所有评论(0)