AI Agent:从"回答问题"到"主动行动"的智能体
引言:当AI从"思考者"变成"行动派"
到目前为止,我们讨论的所有AI应用都有一个共同点:被动响应。你问一个问题,模型给出一个回答。就像一位知识渊博但从不主动行动的学者。
而 AI Agent(智能体) 将彻底改变这个模式。它不再是单纯的"问答机器人",而是一个能够自主理解目标、规划步骤、调用工具、执行行动的智能系统。
用一个形象的比喻来理解AI的进化:
| 阶段 | 比喻 | 能力 |
|---|---|---|
| 基础LLM | 刚毕业的大学生 | 知识丰富,但只会回答问题 |
| RAG增强 | 配备了图书馆的大学生 | 能查阅资料,回答更准确 |
| 微调模型 | 经过专业培训的专家 | 在特定领域更精通 |
| AI Agent | 项目经理 + 执行团队 | 能接收任务,规划执行,调用资源,交付成果 |
一、什么是AI Agent?
1.1 核心定义
AI Agent(智能体) 是一个能够感知环境、自主决策、执行行动以达到特定目标的智能系统。它具备以下核心特征:
自主性:无需人工干预,自主运作
目标导向:所有行动都围绕达成目标
工具使用:能调用外部工具完成任务
记忆能力:记住历史,持续优化
规划能力:将复杂任务拆解为可执行的步骤
1.2 Agent vs 传统程序 vs LLM
| 对比维度 | 传统程序 | 大语言模型(LLM) | AI Agent |
|---|---|---|---|
| 工作方式 | 按固定逻辑执行 | 按输入生成输出 | 自主规划并执行 |
| 灵活性 | 低,只能做预设的事 | 中,能处理多种问题 | 高,能适应新任务 |
| 工具使用 | 内置固定功能 | 无(需外部配合) | 主动调用各种工具 |
| 记忆能力 | 有状态但有限 | 会话级记忆 | 长期记忆+经验积累 |
| 目标理解 | 执行指令 | 理解问题 | 理解意图并拆解 |
1.3 一个生动的例子
用户请求:“帮我安排下周去上海的商务行程,包括机票、酒店和会议预约。”
传统程序:需要专门开发一个"行程安排"功能,且只能按固定流程执行。
LLM直接回答:“您可以预订XX航空的机票,住在XX酒店…"(只给建议,不行动)
AI Agent:
理解目标:安排完整的商务行程
规划步骤:
查询下周的航班
预订合适的机票
查找公司协议酒店
预订酒店房间
查看日程,预约会议时间
生成行程单
执行行动:调用航班API、酒店API、日历API
交付结果:返回完整的行程安排+预订确认
二、Agent的核心原理
2.1 Agent的认知架构
一个完整的AI Agent由以下核心组件构成:
flowchart TD
A[用户目标] --> B[大脑<br>大语言模型]
B --> C[规划模块<br>Planning]
B --> D[记忆模块<br>Memory]
B --> E[工具模块<br>Tools]
C --> F[任务拆解<br>子任务列表]
F --> G[执行循环]
D --> H[短期记忆<br>对话上下文]
D --> I[长期记忆<br>向量数据库]
E --> J[API调用]
E --> K[代码执行]
E --> L[数据库查询]
G --> M[行动]
M --> N[观察结果]
N --> C
2.2 核心工作原理:ReAct范式
Agent最经典的工作模式是 ReAct(Reason + Act,推理+行动) 循环。这是一个"思考-行动-观察"的迭代过程:
循环开始
↓
[思考] 当前状态是什么?下一步该做什么?
↓
[行动] 执行一个具体动作(调用工具、查询信息等)
↓
[观察] 查看行动结果,获取新信息
↓
[思考] 基于新信息,下一步计划是什么?
↓
... 循环直到任务完成
具体示例(安排行程的Agent思考过程):
用户:帮我订一张明天去北京的机票
第一轮:
思考:我需要知道用户的出发城市、偏好航班时间
行动:询问用户"请问您从哪个城市出发?偏好什么时间?"
观察:用户回复"从上海出发,上午10点以后"
第二轮:
思考:有了出发地、时间和目的地,可以查询航班
行动:调用航班查询API,参数:上海→北京,明天,10:00以后
观察:API返回3个可选航班
第三轮:
思考:需要让用户选择,然后完成预订
行动:向用户展示航班选项,询问选择
观察:用户选择"东方航空 MU5101"
第四轮:
思考:用户已选择,执行预订
行动:调用预订API,完成订票
观察:预订成功,获得订单号
第五轮:
思考:任务完成,汇总信息
行动:向用户返回预订成功信息+订单详情
2.3 Agent的三大核心能力
2.3.1 规划 (Planning)
Agent将复杂任务拆解为可执行的子任务,主要有两种模式: 1. 链式思考 (Chain of Thought):
原始任务:写一篇关于AI的文章
拆解:
1. 确定文章大纲
2. 收集AI发展史资料
3. 收集AI应用案例
4. 撰写引言
5. 按大纲填充各章节
6. 撰写结论
7. 润色修改
2. 任务分解 (Task Decomposition):
复杂任务:组织一场技术会议
分解为并行子任务:
├─ 场地组:预订场地、布置会场
├─ speaker组:邀请讲师、确认议程
├─ 市场组:宣传推广、报名管理
├─ 后勤组:餐饮安排、物料准备
2.3.2 记忆 (Memory)
Agent需要不同类型的记忆来保持连贯性:
| 记忆类型 | 存储内容 | 实现方式 | 类比 |
|---|---|---|---|
| 短期记忆 | 当前对话上下文 | 在Prompt中包含最近N轮对话 | 工作中的便签 |
| 长期记忆 | 用户偏好、历史事实 | 向量数据库 + 检索 | 个人档案 |
| 经验记忆 | 成功/失败的案例 | 数据库存储,用于反思优化 | 工作经验 |
2.3.3 工具使用 (Tool Use)
工具是Agent连接外部世界的桥梁。每个工具都是一个可以被调用的函数,需要清晰描述功能和参数。
工具定义示例:
// 定义工具
$tools = [
[
'type' => 'function',
'function' => [
'name' => 'search_flights',
'description' => '查询航班信息',
'parameters' => [
'type' => 'object',
'properties' => [
'from' => ['type' => 'string', 'description' => '出发城市'],
'to' => ['type' => 'string', 'description' => '到达城市'],
'date' => ['type' => 'string', 'description' => '日期 YYYY-MM-DD']
],
'required' => ['from', 'to', 'date']
]
]
],
[
'type' => 'function',
'function' => [
'name' => 'book_hotel',
'description' => '预订酒店',
'parameters' => [
'type' => 'object',
'properties' => [
'city' => ['type' => 'string'],
'check_in' => ['type' => 'string'],
'check_out' => ['type' => 'string']
],
'required' => ['city', 'check_in', 'check_out']
]
]
]
];
// Agent根据用户请求,决定调用哪个工具
三、Agent的构建模式
3.1 模式一:单Agent模式
最简单的形式,一个Agent负责所有事情。
适用场景:
任务相对简单
不需要多角色协作
资源有限
实现示例(使用PHP调用OpenAI Function Calling):
<?php
class SimpleAgent
{
protected $llm;
protected $tools;
protected $memory;
public function __construct()
{
$this->llm = new OpenAIClient();
$this->tools = $this->registerTools();
$this->memory = [];
}
public function run($task)
{
$messages = [
['role' => 'system', 'content' => '你是一个能调用工具的AI助手'],
['role' => 'user', 'content' => $task]
];
$maxIterations = 10; // 防止无限循环
$iteration = 0;
while ($iteration < $maxIterations) {
$response = $this->llm->chat([
'model' => 'gpt-4',
'messages' => $messages,
'tools' => $this->tools,
'tool_choice' => 'auto'
]);
$message = $response['choices'][0]['message'];
// 如果模型决定调用工具
if (isset($message['tool_calls'])) {
// 执行工具调用
$toolResult = $this->executeTool($message['tool_calls'][0]);
// 将结果加入对话
$messages[] = $message;
$messages[] = [
'role' => 'tool',
'tool_call_id' => $message['tool_calls'][0]['id'],
'content' => json_encode($toolResult)
];
// 继续循环,让模型处理结果
} else {
// 任务完成,返回最终答案
return $message['content'];
}
$iteration++;
}
return "任务执行超时";
}
protected function registerTools()
{
return [
[
'type' => 'function',
'function' => [
'name' => 'search_web',
'description' => '搜索网络信息',
'parameters' => [
'type' => 'object',
'properties' => [
'query' => ['type' => 'string']
]
]
]
],
// 更多工具...
];
}
protected function executeTool($toolCall)
{
$function = $toolCall['function']['name'];
$args = json_decode($toolCall['function']['arguments'], true);
switch ($function) {
case 'search_web':
return $this->searchWeb($args['query']);
// 其他工具...
}
}
}
3.2 模式二:多Agent协作模式
多个Agent组成一个团队,各司其职,协同完成复杂任务。
典型架构:
[协调者Agent]
/ | \
/ | \
[研究员Agent] [执行Agent] [质检Agent]
\ | /
\ | /
[结果汇总]
实现思路:
class MultiAgentSystem
{
protected $coordinator;
protected $researcher;
protected $executor;
protected $inspector;
public function solve($task)
{
// 协调者理解任务,制定计划
$plan = $this->coordinator->plan($task);
// 研究员收集信息
$info = $this->researcher->research($plan);
// 执行者完成任务
$result = $this->executor->execute($plan, $info);
// 质检者检查结果
$quality = $this->inspector->inspect($result);
if ($quality['score'] < 0.8) {
// 质量不达标,重新执行或调整
return $this->refine($result, $quality['feedback']);
}
return $result;
}
}
3.3 模式三:Agentic RAG
这是我们在上一轮提到的Agent和RAG的深度融合。Agent不再是被动地"检索一次”,而是可以主动决定检索策略。
工作流程:
flowchart TD
A[用户问题] --> B[Agent思考]
B --> C{需要什么信息?}
C -->|基础概念| D[检索百科知识库]
C -->|实时数据| E[调用API查询]
C -->|内部文档| F[检索公司知识库]
C -->|多源对比| G[多路检索]
D --> H[信息整合]
E --> H
F --> H
G --> H
H --> I{信息够了吗?}
I -->|不够| B
I -->|够了| J[生成最终答案]
典型场景(分析公司财务状况的Agent):
用户:分析一下我们公司和主要竞品去年的表现
Agent思考:
1. 需要我们的财报 → 检索内部数据库
2. 需要竞品财报 → 搜索公开信息
3. 需要行业平均数据 → 调用行业数据API
4. 需要解读这些数据 → 用分析工具计算指标
Agent行动:
- 第一轮检索:获取本公司财报 → 得到数据A
- 第二轮检索:搜索竞品财报 → 找到3个主要竞品的数据B
- 第三轮行动:调用计算工具 → 计算市场份额、增长率
- 第四轮检索:查询行业报告 → 获取行业平均数据C
Agent整合:将A、B、C整合分析
Agent生成:输出带图表的分析报告
四、Agent的落地实践
4.1 主流Agent框架对比
| 框架 | 特点 | 适合场景 | PHP生态 |
|---|---|---|---|
| LangChain | 最流行,组件丰富 | 复杂Agent应用 | 有社区版 |
| AutoGen | 微软出品,多Agent协作 | 研究实验 | 无 |
| CrewAI | 角色扮演,简单易用 | 中小型项目 | 有API |
| Dify | 可视化编排,开箱即用 | 快速搭建 | REST API |
| Coze | 字节跳动,无代码 | 业务人员 | API调用 |
4.2 PHP开发者的Agent实践路径
作为PHP开发者,你有三条路径可以实践Agent:
路径一:调用Agent服务API(最快上手)
使用Coze(扣子)或Dify搭建Agent,然后通过API调用:
路径二:用PHP实现简单Agent(深入理解)
基于OpenAI Function Calling,用PHP实现基础Agent:
<?php
namespace App\Services;
class PHPAgent
{
protected $llm;
protected $tools = [];
protected $maxSteps = 10;
public function addTool($name, $description, $parameters, callable $callback)
{
$this->tools[] = [
'type' => 'function',
'function' => [
'name' => $name,
'description' => $description,
'parameters' => $parameters
],
'callback' => $callback
];
return $this;
}
public function run($task)
{
$messages = [
['role' => 'system', 'content' => '你是一个能调用工具的AI助手'],
['role' => 'user', 'content' => $task]
];
$steps = [];
for ($i = 0; $i < $this->maxSteps; $i++) {
// 准备工具定义(去掉callback)
$toolDefinitions = array_map(function($tool) {
unset($tool['callback']);
return $tool;
}, $this->tools);
// 调用LLM
$response = $this->callLLM($messages, $toolDefinitions);
$message = $response['choices'][0]['message'];
// 记录步骤
$steps[] = [
'thought' => $message['content'] ?? '',
'tool_calls' => $message['tool_calls'] ?? []
];
// 如果没有工具调用,任务完成
if (!isset($message['tool_calls'])) {
return [
'answer' => $message['content'],
'steps' => $steps
];
}
// 执行工具调用
foreach ($message['tool_calls'] as $toolCall) {
$toolName = $toolCall['function']['name'];
$args = json_decode($toolCall['function']['arguments'], true);
// 找到对应的工具
$tool = collect($this->tools)->firstWhere('function.name', $toolName);
if ($tool) {
// 执行回调
$result = ($tool['callback'])($args);
// 将结果加入对话
$messages[] = $message;
$messages[] = [
'role' => 'tool',
'tool_call_id' => $toolCall['id'],
'content' => json_encode($result)
];
}
}
}
return [
'error' => '达到最大步骤数',
'steps' => $steps
];
}
protected function callLLM($messages, $tools)
{
// 调用OpenAI API或其他LLM
// 这里简化处理,实际需要用HTTP客户端
}
}
// 使用示例
$agent = new PHPAgent();
// 添加工具
$agent->addTool(
'search_flights',
'查询航班信息',
[
'type' => 'object',
'properties' => [
'from' => ['type' => 'string'],
'to' => ['type' => 'string'],
'date' => ['type' => 'string']
],
'required' => ['from', 'to', 'date']
],
function($args) {
// 实际查询航班的逻辑
return ['flights' => [...]];
}
);
// 运行Agent
$result = $agent->run('帮我查一下明天从上海到北京的航班');
路径三:使用Dify搭建可视化Agent(推荐)
这是目前最推荐的方案,结合了低代码的便捷和PHP调用的灵活性。
在Dify中搭建Agent:
访问 Dify官网 或自托管
创建"Agent"类型应用
可视化编排工作流:
添加工具节点(搜索引擎、数据库、API)
设置Agent指令
配置知识库(RAG)
发布应用
PHP调用Dify Agent:
<?php
class DifyAgentClient
{
protected $apiKey;
protected $baseUrl;
public function __construct($apiKey, $baseUrl = 'https://api.dify.ai/v1')
{
$this->apiKey = $apiKey;
$this->baseUrl = $baseUrl;
}
public function run($query, $user = 'default-user')
{
$ch = curl_init($this->baseUrl . '/chat-messages');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $this->apiKey,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'query' => $query,
'user' => $user,
'response_mode' => 'blocking' // 或 'streaming'
]));
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
}
// 使用示例
$client = new DifyAgentClient('app-xxxxxx');
$result = $client->run('帮我分析一下上个月的销售数据');
echo $result['answer'];
五、Agent实战项目推荐
- 智能客服Agent(最适合入门)
自动回答产品咨询
查询订单状态(调用订单API)
处理退换货申请(调用工单系统)
升级人工(复杂问题转接)
- 数据分析Agent(最有价值)
“上个月销售额前十的产品”
“对比今年和去年同期的增长”
“预测下个月的库存需求”
- 个人助理Agent(最有趣)
邮件分类和摘要
日程安排和提醒
待办事项管理
信息检索和整理
- 多Agent协作系统(最有挑战)
用户请求
↓
[项目经理Agent] - 任务分解和调度
├─ [研究员Agent] - 信息收集和分析
├─ [执行Agent] - 具体操作执行
├─ [质检Agent] - 结果检查和优化
└─ [报告Agent] - 最终输出整合
↓
最终交付