前言

到目前为止我们讲的大模型用法——不管是普通对话还是 RAG——本质上都是”你问一句,它答一句”。

Agent(智能体)让模型更进一步:给一个目标,它自己规划步骤、调用工具、检查结果、修正错误,直到把事办成。就像你交代下属一个任务,不需要把每个细节都告诉他怎么做。


一、Agent 和普通 Chat 的区别

1
2
3
4
5
6
7
8
9
10
普通 Chat:
你: "今天北京天气怎么样?"
模型: "抱歉,我无法获取实时天气信息。"

Agent:
你: "帮我查一下北京今天的天气,如果下雨就提醒我带伞"
Agent 做了三件事:
1. 调用天气 API: get_weather("北京") → "多云转小雨,15-22°C"
2. 分析结果:有小雨
3. "今天北京多云转小雨,15-22°C,出门记得带伞。"

Agent 本质上是 LLM + 工具 + 循环 的组合。LLM 负责思考规划,工具负责执行实际操作,循环负责检查修正。


二、ReAct 模式

这是目前 Agent 最主流的实现模式,全称是 Reasoning + Acting(推理 + 行动)。

其核心循环由三个阶段交替驱动:

  1. 思考(Thought):大模型根据当前上下文分析还缺少什么信息、下一步应当做什么;
  2. 行动(Action):输出结构化的工具调用请求(工具名 + 参数);
  3. 观察(Observation):宿主程序执行工具,并将真实返回值拼接回上下文,供下一轮思考使用。

一个具体的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
用户: "帮我在淘宝上搜索 500 元以内的机械键盘,选评分最高的三款"

Agent 思考链:
Thought: 我需要搜索"机械键盘",限制价格 < 500 元
Action: 调用 search_product("机械键盘", max_price=500)
Observation: 返回 47 个结果

Thought: 我需要按评分排序,取前 3
Action: 调用 sort_by_rating(结果, top_k=3)
Observation: [罗技K835(4.8分), 达尔优A87(4.7分), 黑峡谷GK715(4.6分)]

Thought: 已拿到结果,整理输出
Final Answer: 根据评分,推荐以下三款...(附价格和评分对比)

三、使用 OpenAI Agents SDK 构建 Agent

OpenAI 在 2025 年初发布了轻量级的 Agents SDK,比 LangChain 更简洁。

1
pip install openai-agents

基础 Agent

1
2
3
4
5
6
7
8
9
10
11
from agents import Agent, Runner

agent = Agent(
name="Code Reviewer",
instructions="你是一个资深代码审查专家。审查代码并给出具体建议。",
model="gpt-4o"
)

result = Runner.run_sync(agent, "审查这段代码的安全问题:\n```python\n"
"query = f\"SELECT * FROM users WHERE name='{user_input}'\"\n```")
print(result.final_output)

带工具的 Agent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from agents import Agent, Runner, function_tool
import requests

# 定义一个工具
@function_tool
def get_weather(city: str) -> str:
"""查询指定城市的实时天气"""
# 实际项目中调用真实的天气 API
weather_data = {
"北京": "晴,22°C,湿度 45%",
"上海": "多云,25°C,湿度 65%",
"深圳": "阵雨,28°C,湿度 80%",
}
return weather_data.get(city, f"未找到 {city} 的天气数据")

@function_tool
def calculate(expression: str) -> str:
"""执行数学计算"""
try:
return str(eval(expression)) # 生产环境请用更安全的方式
except:
return f"无法计算: {expression}"

agent = Agent(
name="Assistant",
instructions="你可以调用工具来帮助用户。回答要简洁。",
tools=[get_weather, calculate]
)

result = Runner.run_sync(
agent,
"北京今天天气怎么样?摄氏温度 22 度换算成华氏是多少?"
)
print(result.final_output)

四、用 Dify 低代码搭建 Agent

如果不想写代码,Dify 是一个不错的选择(支持私有部署)。

Dify 搭建 Agent 的步骤:

  1. 创建 Agent 应用,选择基座模型(GPT-4o / DeepSeek 等)
  2. 在”工具”面板添加工具——支持 API 调用、数据库查询、代码执行等
  3. 写 Agent 指令(相当于 system prompt):
1
2
3
4
5
6
你是一个数据分析助手。当用户提出数据相关的问题时:
1. 先理解用户的需求
2. 使用 data_query 工具获取相关数据
3. 使用 chart_generator 工具生成可视化图表
4. 用简洁的语言解释数据含义
如果没有合适的工具,诚实告诉用户你做不到。
  1. 调试:在调试面板输入问题,观察 Agent 的思考过程和工具调用
  2. 发布:一键发布为 Web 应用或 API 端点

Dify 适合:内部工具、原型验证、非技术团队使用 AI。


五、Agent 的常见问题

1. 无限循环

Agent 有时候会陷入”调用工具 → 结果不满意 → 调用工具 → …”的死循环。

对策:

  • 设置最大调用步数(比如最多 10 步)
  • 在指令中明确:”如果 3 次工具调用还没得到满意结果,就向用户报告目前已知信息”

2. 幻觉工具调用

Agent 可能会”凭空”调用一个不存在的工具,或者给工具传递不合理的参数。

对策:

  • 给每个工具写好详细的 description
  • 对工具输入做校验(类型检查、范围检查)

3. 效率低

简单问题 Agent 也会走完整的”思考 → 工具调用 → 观察”循环,明明一步就能回答的。

对策:

  • 指令中明确:”对于简单的事实性问题,直接回答,不要调用工具”
  • 用更小的模型判断问题复杂度,简单问题走 fast path

六、什么时候用 Agent,什么时候用普通 Chat

场景 用什么 原因
闲聊 Chat 不需要工具
问一个事实性问题 RAG 检索+回答,单轮就够了
自动写周报(需要查 Jira + 查 Git) Agent 需要多步工具调用
客服机器人(查订单、查物流、退换货) Agent 需要根据情况调用不同 API
数据分析(查询 → 计算 → 绘图) Agent 多步操作,步骤间有依赖
代码生成 Chat 输入代码,输出代码,一步搞定

不是所有事情都需要 Agent。Agent 的引入会增加复杂度和延迟,如果单一的 Chat 或 RAG 就能解决问题,就不要上 Agent。


七、从 Demo 到生产架构演进

Demo 跑通往往只需要几十行代码,但在真实生产系统中,Agent 的失控风险极高。构建企业级 Agent 系统需要建立以下四道“安全护栏”:

1. 状态管理与状态图(Stateful Checkpoints)

千万不要将 Agent 设计成无状态的纯内存循环。生产系统应基于状态图(State Graph,如 LangGraph):

  • 每一轮的 Thought/Action/Observation 必须持久化存储在 Redis 或 Postgres 中(Checkpointer 机制);
  • 支持中途崩溃恢复与会话回溯,避免用户网络闪断后前功尽弃。

2. 人在回路(Human-in-the-Loop, HITL)

对于可能产生持久化副作用的操作(如:修改生产数据库、提交转账、向全员发送邮件、执行危险 shell 命令):

  • 绝对不允许 Agent 自主直接执行;
  • 触发高风险工具时,Agent 自动进入 Suspended(挂起)状态,向前端抛出审批确认卡片;
  • 只有收到人工管理员的授权信号(Approve)后,工作流才继续前进。

3. 工具熔断与防死循环限流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 生产级 Agent 必配的防死循环熔断示例
class CircuitBreaker:
def __init__(self, max_steps=10, max_same_tool_repeats=3):
self.max_steps = max_steps
self.max_same_tool_repeats = max_same_tool_repeats
self.step_count = 0
self.tool_history = []

def check(self, tool_name: str):
self.step_count += 1
self.tool_history.append(tool_name)
if self.step_count > self.max_steps:
raise RuntimeError(f"已达到最大执行步数限制 ({self.max_steps}),强制终止防死循环。")
if len(self.tool_history) >= self.max_same_tool_repeats:
if all(t == tool_name for t in self.tool_history[-self.max_same_tool_repeats:]):
raise RuntimeError(f"工具 {tool_name} 连续失败重试超限,熔断保护。")

4. 单智能体 vs 多智能体(Multi-Agent)选型

当业务复杂度上升时,不要试图训练一个“全知全能的超级 Agent”,而应采用职责分离的多 Agent 协同架构:

  • Router Agent(路由专家):专职意图识别,将需求快速分发给垂直子 Agent;
  • Worker Agent(垂直执行者):各司其职,专注特定工具集(如数据分析 Agent、代码审查 Agent);
  • Reviewer Agent(审计复核者):负责对照原始需求进行验收与输出格式校验。

核心建议:Agent 是一把双刃剑,它用不确定性的推理带来了灵活性,但也牺牲了确定性与延迟。在能够用确定的代码逻辑、工作流(Workflow)或单轮 RAG 解决的问题上,坚决不要过度引入自主 Agent。让代码负责确定性,让大模型负责创造性与语义理解。