AI Agent 智能体开发实战:从单一工具调用到多 Agent 协作系统

2 阅读1分钟

Agent 是当前大模型应用最前沿的方向之一。本文深入剖析 Agent 的核心机制,从最简单的工具调用到复杂的多 Agent 协作系统,提供完整的工程化实践指南。

一、什么是真正意义上的 Agent?

一个简单的 LLM 调用不是 Agent。Agent 的本质是让 LLM 具备自主规划和执行能力

  • 普通 LLM:输入 → 单次推理 → 输出
  • Agent:目标 → 规划任务 → 调用工具 → 观察结果 → 调整计划 → 循环直到完成

Agent 具备三个核心要素:

  1. 感知(Perception):理解用户意图和当前环境状态
  2. 规划(Planning):将复杂目标分解为可执行的步骤序列
  3. 行动(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])

工具设计原则

  1. 功能单一:每个工具只做一件事
  2. 描述清晰:LLM 通过 description 决定何时调用工具,描述决定调用准确率
  3. 参数有限:参数越少,LLM 越容易正确传参
  4. 错误友好:工具执行失败时返回清晰的错误信息,而非抛出异常

四、多 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,而是:

  1. 理解核心范式:ReAct、Plan-and-Execute、多 Agent 协作
  2. 设计好工具:工具质量是 Agent 能力的天花板
  3. 处理失败场景:稳定性工程决定系统可用性
  4. 评估与迭代:构建 Agent 评估体系,量化改进效果

标签:AI Agent | 智能体 | LangChain | LangGraph | Function Calling | 多智能体