前面的文章我们已经学习了 LangGraph 的核心能力:
textState Checkpoint Memory Interrupt Tool Stream Subgraph这些解决的是 Agent 如何运行、保存状态以及恢复执行。
但是一个真正的 Agent 工作流还有一个核心问题:
模型如何决定下一步做什么?工具调用后结果如何重新回到模型?
1. Workflow 和 Agent 的区别
固定 Workflow:
text
用户问题
↓
检索节点
↓
生成节点
↓
结束
特点:
text
开发者决定下一步执行什么
适合:
- RAG
- 数据处理
- 固定业务流程
Agent:
text
用户输入
↓
LLM 判断
↓
选择行动
↓
执行
↓
观察结果
↓
继续判断
特点:
text
模型决定下一步做什么
核心思想:
text
Reasoning
↓
Action
↓
Observation
↓
Reasoning
2. LangGraph Agent 基本结构
典型 Agent:
text
START
↓
Agent节点
↓
是否需要调用工具?
/ \
否 是
↓ ↓
END ToolNode
↓
Agent节点
与普通 Chain 最大区别:
text
Agent存在循环
执行过程:
text
Agent
↓
Tool
↓
Agent
↓
Tool
↓
...
直到模型认为任务完成。
3. Agent 节点负责什么?
Agent 节点通常调用模型:
python
def agent_node(state):
response = model.invoke(
state["messages"]
)
return {
"messages":[response]
}
主要负责:
读取 State
例如:
python
state["messages"]
包含:
text
用户问题
历史消息
工具结果
调用模型
模型判断:
text
是否需要工具?
调用哪个工具?
参数是什么?
返回 AIMessage
如果不需要工具:
text
直接回答
如果需要工具:
text
AIMessage.tool_calls
4. Tool Calling 完整流程
完整链路:
text
用户输入
↓
Agent节点
↓
LLM生成 tool_calls
↓
ToolNode执行工具
↓
ToolMessage返回结果
↓
Agent继续推理
↓
最终回答
5. bind_tools 到底做什么?
例如:
python
model_with_tools = model.bind_tools(
tools
)
它不会执行工具。
作用只是告诉模型:
text
有哪些工具
工具参数
工具用途
模型产生:
python
AIMessage(
tool_calls=[
{
"name":"get_weather",
"args":{
"city":"北京"
}
}
]
)
此时只是:
text
提出调用请求
真正执行需要:
text
ToolNode
6. ToolNode 如何工作?
ToolNode 负责:
text
读取 tool_calls
↓
查找工具
↓
执行工具
↓
生成 ToolMessage
例如:
text
调用:
get_weather("北京")
↓
返回:
北京今天晴天
然后:
text
ToolMessage
回到 Agent。
7. Agent 为什么需要循环?
现实任务通常不是一步完成。
例如:
用户:
text
分析苹果公司的股票情况
Agent:
第一次:
text
查询股票价格
第二次:
text
查询相关新闻
第三次:
text
整理分析报告
所以 Agent 是:
text
输入
↓
思考
↓
行动
↓
观察
↓
继续思考
↓
输出
8. Agent 为什么比 Workflow 复杂?
Workflow:
text
A → B → C
路径固定。
Agent:
text
A
↓
LLM决定
↓
可能B
可能C
可能D
问题:
调试困难
需要观察:
text
messages
tool_calls
checkpoint
成本不可控
一次任务可能:
text
LLM
↓
工具
↓
LLM
↓
工具
需要限制
生产环境通常需要:
text
最大循环次数
超时控制
工具白名单
人工审批
结合:
text
Checkpoint
Interrupt
Retry
Timeout
9. 企业级 Agent 通常是混合模式
实际项目:
text
用户请求
↓
Router
↓
----------------
固定流程 Agent
RAG流程 复杂任务
----------------
↓
Tool
↓
Evaluator
↓
结果
也就是说:
text
确定流程
使用 Workflow
不确定任务
使用 Agent