Agent 是当前大模型应用最前沿的方向之一。本文深入剖析 Agent 的核心机制,从最简单的工具调用到复杂的多 Agent 协作系统,提供完整的工程化实践指南。
一、什么是真正意义上的 Agent?
一个简单的 LLM 调用不是 Agent。Agent 的本质是让 LLM 具备自主规划和执行能力:
- 普通 LLM:输入 → 单次推理 → 输出
- Agent:目标 → 规划任务 → 调用工具 → 观察结果 → 调整计划 → 循环直到完成
Agent 具备三个核心要素:
- 感知(Perception):理解用户意图和当前环境状态
- 规划(Planning):将复杂目标分解为可执行的步骤序列
- 行动(Action):调用工具或 API 执行具体操作
二、Agent 核心模式详解
ReAct 模式(最基础也最经典)
ReAct(Reasoning + Acting)是目前使用最广泛的 Agent 范式:
思考(Thought):我需要查找今天北京的天气
行动(Action):weather_api(city="北京", date="today")
观察(Observation):{"temperature": 22, "weather": "晴", "humidity": 45}
思考(Thought):已获取天气信息,可以给出答案了
最终答案:今天北京天气晴,气温22°C,湿度45%
用 LangChain 实现 ReAct Agent:
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain import hub
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# 定义工具
tools = [search_tool, calculator_tool, weather_tool]
# 使用 ReAct Prompt 模板
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=10, # 防止无限循环
handle_parsing_errors=True
)
result = agent_executor.invoke({"input": "查询北京今天天气,并告诉我穿什么衣服合适"})
Function Calling 模式(生产首选)
OpenAI 的 Function Calling 让工具调用更加结构化和可靠:
import openai
import json
# 定义工具 Schema
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"},
"date": {"type": "string", "description": "日期,格式 YYYY-MM-DD"}
},
"required": ["city"]
}
}
}
]
# 第一次调用:模型决定使用哪个工具
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=tools,
tool_choice="auto"
)
# 执行工具调用
if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
weather_result = get_weather(**args)
# 第二次调用:将工具结果注入,生成最终答案
final_response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "北京今天天气怎么样?"},
response.choices[0].message,
{"role": "tool", "tool_call_id": tool_call.id, "content": str(weather_result)}
]
)
Plan-and-Execute 模式(复杂任务专用)
对于需要多步骤规划的复杂任务,Plan-and-Execute 将规划和执行分离:
规划阶段(Planner LLM):
目标:分析竞争对手并生成报告
步骤1:搜索竞争对手 A 的最新财报
步骤2:搜索竞争对手 B 的产品更新
步骤3:对比两家公司的核心指标
步骤4:生成 Markdown 格式分析报告
执行阶段(Executor LLM):
逐步执行每个计划步骤
每步完成后更新状态
遇到异常时向 Planner 请求重新规划
三、工具(Tool)设计最佳实践
工具设计质量直接决定 Agent 的能力上限:
from langchain.tools import tool
from pydantic import BaseModel, Field
class SearchInput(BaseModel):
query: str = Field(description="搜索关键词,尽量精确")
max_results: int = Field(default=5, description="返回结果数量,1-10之间")
@tool("web_search", args_schema=SearchInput)
def web_search(query: str, max_results: int = 5) -> str:
"""
搜索互联网获取最新信息。
适用于:需要实时数据、新闻、最新文档时使用。
不适用于:本地文件查询、数据库操作。
"""
results = search_engine.search(query, num=max_results)
return "\n".join([f"- {r.title}: {r.snippet}" for r in results])
工具设计原则:
- 功能单一:每个工具只做一件事
- 描述清晰:LLM 通过 description 决定何时调用工具,描述决定调用准确率
- 参数有限:参数越少,LLM 越容易正确传参
- 错误友好:工具执行失败时返回清晰的错误信息,而非抛出异常
四、多 Agent 协作架构
监督者-工作者模式(Supervisor Pattern)
用户请求
↓
监督者 Agent(路由决策)
├── 研究员 Agent(信息搜集)
├── 分析师 Agent(数据分析)
└── 写作 Agent(报告生成)
用 LangGraph 实现多 Agent 协作:
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
class AgentState(TypedDict):
messages: Annotated[list, operator.add]
next_agent: str
def supervisor_node(state: AgentState):
"""决定下一步由哪个 Agent 执行"""
# 分析当前状态,决定路由
decision = supervisor_llm.invoke(state["messages"])
return {"next_agent": decision.next}
def researcher_node(state: AgentState):
"""执行信息搜集任务"""
result = researcher_agent.invoke(state)
return {"messages": [result]}
# 构建工作流图
workflow = StateGraph(AgentState)
workflow.add_node("supervisor", supervisor_node)
workflow.add_node("researcher", researcher_node)
workflow.add_node("analyst", analyst_node)
workflow.add_conditional_edges(
"supervisor",
lambda state: state["next_agent"],
{"researcher": "researcher", "analyst": "analyst", "FINISH": END}
)
五、Agent 稳定性工程
生产环境的 Agent 系统面临诸多稳定性挑战:
| 问题 | 表现 | 解决方案 |
|---|---|---|
| 无限循环 | Agent 重复调用同一工具 | 设置 max_iterations 上限 |
| 工具幻觉 | 调用不存在的工具 | 严格的工具名称校验 |
| 上下文溢出 | 长会话超出 Token 限制 | 历史消息摘要压缩 |
| 并发冲突 | 多 Agent 操作同一资源 | 资源锁 + 事务机制 |
| 成本失控 | Token 消耗超预算 | 动态 max_tokens 控制 + 预算告警 |
六、实战案例:法律文档智能分析 Agent
# 一个完整的法律文档分析 Agent 示例
tools = [
legal_search_tool, # 搜索法律法规数据库
contract_parser_tool, # 解析合同文本结构
risk_detector_tool, # 检测合同风险条款
summary_generator_tool # 生成摘要报告
]
system_prompt = """
你是一位专业的法律文档分析专家。
分析用户提供的合同时,请:
1. 首先识别合同类型和主要条款
2. 搜索相关法律法规进行合规性检查
3. 标记高风险条款并提供修改建议
4. 最终生成结构化的分析报告
"""
legal_agent = create_react_agent(llm, tools, prompt_template)
七、总结
Agent 技术正在从实验走向生产。掌握 Agent 开发的关键不是理解某个框架的 API,而是:
- 理解核心范式:ReAct、Plan-and-Execute、多 Agent 协作
- 设计好工具:工具质量是 Agent 能力的天花板
- 处理失败场景:稳定性工程决定系统可用性
- 评估与迭代:构建 Agent 评估体系,量化改进效果
标签:AI Agent | 智能体 | LangChain | LangGraph | Function Calling | 多智能体