AI Agent 实战:让 AI 自己干活,而不是只回答问题

Agent 是 AI 应用的下一站。如果说 ChatGPT 是"问答机器",Agent 就是"会自己干活的员工"。

一、什么是 AI Agent

1.1 定义

能感知环境 → 自主决策 → 执行动作 → 达成目标 的 AI 系统。

1.2 与传统对话 AI 的区别

维度ChatGPTAgent
输入单个问题复杂目标
输出一段回答多步操作的结果
决策单次持续规划
工具不用主动调用
反馈用户打分环境反馈

二、Agent 核心架构

┌────────────────────────────────────┐
│           Planner (规划)            │
│  决定:先做什么,再做什么          │
└─────────┬──────────────────────────┘
          ↓
┌────────────────────────────────────┐
│           Memory (记忆)             │
│  短期:当前任务状态                  │
│  长期:用户偏好、历史                │
└─────────┬──────────────────────────┘
          ↓
┌────────────────────────────────────┐
│           Tools (工具)              │
│  搜索 / 代码执行 / 数据库 / API    │
└─────────┬──────────────────────────┘
          ↓
┌────────────────────────────────────┐
│         Observation (观察)          │
│  工具执行的结果反馈给 Agent         │
└────────────────────────────────────┘

三、ReAct 模式(最经典)

ReAct = Reason + Act(推理 + 行动)

from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import DuckDuckGoSearchRun
from langchain.chat_models import ChatOpenAI

# 1. 准备工具
tools = [
    DuckDuckGoSearchRun(),  # 联网搜索
]

# 2. 创建 Agent
llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = create_react_agent(llm, tools)

# 3. 执行
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.run("""
北京今天的天气怎么样?根据天气给我推荐 3 个适合户外活动的地方。
""")
print(result)

执行流程:

Thought: 我需要查北京今天的天气
Action: 搜索 "北京今天天气"
Observation: 25℃,晴,微风

Thought: 天气很好,适合户外活动
Action: 搜索 "北京 户外活动 推荐"
Observation: 1. 颐和园 2. 奥林匹克森林公园 3. 香山

Thought: 我有足够信息回答了
Final Answer: 今天北京 25℃,晴,推荐去颐和园、奥森、香山

四、构建自定义工具

Agent 强不强取决于工具集。

from langchain.tools import tool
import sqlite3

@tool
def query_database(sql: str) -> str:
    """查询公司数据库。输入是 SQL 语句。"""
    conn = sqlite3.connect("company.db")
    cursor = conn.cursor()
    cursor.execute(sql)
    results = cursor.fetchall()
    conn.close()
    return str(results)

@tool
def send_email(to: str, subject: str, body: str) -> str:
    """发送邮件"""
    # 调用邮件 API
    return f"邮件已发送到 {to}"

# 给 Agent 装上这些工具
tools = [query_database, send_email, DuckDuckGoSearchRun()]

五、高级模式

5.1 Plan-and-Execute

先制定完整计划,再逐步执行:
planner = ChatOpenAI(model="gpt-4o")
executor = ChatOpenAI(model="gpt-4o")

plan = planner.invoke("""
为这个目标制定分步计划:'分析竞品价格并生成报告'
""")
# plan 可能是:
# 1. 列出 5 个竞品
# 2. 搜索每个竞品的价格
# 3. 整理成表格
# 4. 生成对比报告
for step in plan.steps:
    result = executor.invoke(step)

5.2 Multi-Agent

多个 Agent 协作:
  • Manager Agent:分解任务
  • Worker Agents:各自执行
  • Reviewer Agent:检查结果

适合复杂任务,例如"开发一个完整 Web 应用"。

5.3 ReAct + Reflection

每步执行后自我反思:
def reflect(result):
    return llm.invoke(f"""
执行结果:{result}
这个结果合理吗?如果不合理,应该怎么调整?
""")

六、生产环境挑战

6.1 成本控制

Agent 每步调用一次 LLM,复杂任务可能 20+ 步:
  • 每次 LLM 调用 $0.01-0.10
  • 一次 Agent 任务可能 $1-5
  • 月费可能 $100-1000+

优化策略:

  • 用小模型做简单步骤(Llama 3 / GPT-4o-mini)
  • 缓存重复查询
  • 设置 maxsteps 防止无限循环

6.2 错误处理

Agent 经常出错:
  • 选错工具
  • 工具调用参数错误
  • 陷入循环

应对:

  • 设置 maxiterations
  • 失败时回退到更简单的策略
  • 关键决策需要人确认

6.3 安全

Agent 能执行代码 → 存在提示注入风险:
  • 用户的输入可能让 Agent 执行危险操作
  • 必须有白名单机制
  • 敏感操作需要二次确认

七、实战案例

7.1 客服 Agent

用户:我的订单 #1234 怎么还没发货?
Agent:
  Thought: 需要查订单状态
  Action: query_database("SELECT * FROM orders WHERE id=1234")
  Observation: 订单状态:已发货
  Thought: 用户没看到物流信息,可能需要告诉他怎么查
  Final Answer: 您的订单已发货,可以查看顺丰物流单号 SF1234567890

7.2 数据分析 Agent

用户:分析上个月销售数据,找出增长最快的品类
Agent:
  1. query_database("SELECT category, SUM(amount) FROM sales WHERE month='2025-01' GROUP BY category")
  2. 对比上月数据
  3. 生成可视化图表
  4. 输出报告

7.3 代码 Agent

用户:在 /var/log/app.log 找最近的 ERROR 日志
Agent:
  1. run_command("grep ERROR /var/log/app.log | tail -20")
  2. 分析模式
  3. 输出报告

八、未来发展

  • 更强的推理:o1 / o3 风格的慢思考
  • 更长的记忆:无限上下文
  • 自我改进:Agent 能修改自己的代码
  • 群体智能:1000 个 Agent 协作

九、上手指南

# 1. 安装
pip install langchain langchain-openai

# 2. 准备 LLM
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")

# 3. 创建第一个 Agent
from langchain.agents import create_react_agent, AgentExecutor
from langchain_community.tools import DuckDuckGoSearchRun

agent = create_react_agent(llm, [DuckDuckGoSearchRun()])
executor = AgentExecutor(agent=agent, tools=[DuckDuckGoSearchRun()], verbose=True)

# 4. 测试
executor.invoke({"input": "2025 年最火的 AI 工具是什么?"})
Agent 是 AI 应用的最大机会。会写 Agent 的人,在未来 5 年会非常抢手。