AI Agent 深度解析:从「会聊天的模型」到「能干活的数字员工」
AI Agent 深度解析:从「会聊天的模型」到「能干活的数字员工」
如果 2023 年是「大模型元年」(大家都在玩 ChatGPT 式的问答),那 2025—2026 年就是 Agent 元年。模型不再只是回答问题的「嘴」,而是被装上了「手」和「脑子」——能自己定计划、调工具、改文件、跑命令,把一件复杂的事从头干到尾。
这篇文章把我这两年做 AI 编程助手(WCode)、接混元/DeepSeek 等模型的实战经验,系统性地梳理一遍:Agent 到底是什么、它由哪些部件构成、为什么「工具调用」是命门、多智能体怎么协作,以及工程落地时那些教科书不会告诉你的坑。
一、什么是 AI Agent
一句话:Agent 是以大模型为推理核心、能自主感知环境、规划步骤、调用工具、并根据结果迭代,直到完成目标的系统。
它和「聊天机器人」的本质区别有三个:
| 维度 | 聊天机器人 | AI Agent |
|---|---|---|
| 目标 | 回答这一句话 | 完成一个开放式任务 |
| 行动 | 只生成文本 | 调用工具改变外部世界 |
| 控制流 | 一问一答 | 自主循环(Plan→Act→Observe→…) |
一个典型的 Agent 任务长这样:「帮我把 blog.aibycode.com 的证书换成新下载的那张,并验证 443 端口确实在提供服务」。人类要做十几步,Agent 可以自己读文件、SSH、改 nginx、重载、用 openssl s_client 验证——每一步的结果再喂回模型,决定下一步。
二、核心架构:Agent Loop
所有 Agent 共享同一个骨架,我称为 Agent Loop(智能体循环):
┌─────────────────────────────────────────┐
│ 用户输入 / 目标 │
└───────────────────┬─────────────────────┘
▼
┌───────────────┐
│ 大模型「大脑」 │
│ (LLM / Reasoning)│
└───────┬───────┘
┌─────────────┼─────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 规划 │ │ 记忆 │ │ 工具调用 │
│ Planning │ │ Memory │ │ Tools │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└────────────┼────────────┘
▼
┌───────────────┐
│ 执行 / 观察 │ ◀── 结果回灌,循环
│ Act & Observe │
└───────┬───────┘
▼
任务完成?─是─▶ 输出结果
│否
└──▶ 回到「大脑」
五个关键部件:
- 感知(Perception):把用户输入、文件内容、命令输出、网页文本等「环境信息」喂给模型。
- 规划(Planning):模型把大目标拆成可执行的步骤。这是 Agent 智商的上限。
- 行动(Action):通过**函数调用(Function Calling / Tool Use)**真正去改变世界——读文件、发 HTTP、执行 shell。
- 观察(Observation):把行动的结果(成功/报错、返回数据)再回灌给模型。
- 记忆(Memory):短期是上下文窗口里的对话,长期是向量库/文件里沉淀的知识。
三、规划与推理:ReAct 与 Plan-and-Execute
ReAct(Reasoning + Acting) 是当前最主流的范式:模型交替产出「思考(Thought)」和「动作(Action)」,环境返回「观察(Observation)」,如此循环。它把 CoT(思维链)和工具调用拧成一股绳,显著提升复杂任务成功率。
但当任务很长时,纯 ReAct 容易「走到一半忘了初衷」。于是有了 Plan-and-Execute:先让模型一次性产出完整计划(甚至分阶段、等用户确认),再逐步执行。我自己的 WCode 就用这招——进入「计划模式」先给方案,用户 review 通过后才动手改文件,避免 Agent 自作主张乱改代码。
工程上还有一个关键细节:确认环节(approval gate)。像「删除文件」「执行支付」这类不可逆动作,必须在 Agent Loop 里插入人类确认,否则一个幻觉就可能删库。
四、工具与函数调用:Agent 的命门
没有工具调用的模型,做不成 Agent。 模型本身只能「想」和「说」,只有把 calculator、read_file、shell、http_request 这类能力以结构化 schema 暴露给它,它才能「做」。
函数调用的本质:模型输出一段 JSON,声明「我要调哪个函数、参数是什么」,由宿主程序真正执行,再把结果回填。注意——模型并不直接运行代码,它只是决定「调什么、传什么」,执行权永远在宿主手里,这是安全边界。
{
"name": "read_file",
"arguments": { "path": "/etc/nginx/nginx.conf" }
}
一个常见的致命误区:拿了不支持 function calling 的模型就硬上 Agent,结果模型退化成纯聊天,永远「我想帮你读一下文件……」却从不真调工具。所以选型第一条铁律——模型必须支持 tools / function calling,否则再聪明也只是个嘴。
五、记忆系统
- 短期记忆:就是上下文窗口(context window)。现在主流模型已经 128K–256K tokens,足以塞进一个中型代码库。但它会随对话增长而变贵、变慢。
- 长期记忆:把历史对话、知识文档做 Embedding 存进向量库(如 pgvector、Milvus),需要时按相似度检索回灌。这是让 Agent「记得你上个月聊过什么」的方式。
- 反思记忆(Reflection):Agent 自己总结「刚才哪步做错了、下次怎么改」,把结论写进记忆,形成自我进化。
六、多智能体协作
单个 Agent 容易顾此失彼。复杂系统会拆成多个「角色 Agent」:
- Supervisor(主管):拆解任务、派活、汇总。
- Worker(执行者):各司其职,比如一个管写代码、一个管测试、一个管检索。
- Critic(评审):专门挑刺,复核产出质量。
编排方式通常是「主管—下属」树状或「流水线」串列。我搭 WCode 时就把「设计 / 写方案 / 开发 / 自测」拆成节奏化阶段,等价于一个轻量多智能体。多智能体的代价是 token 消耗和延迟翻倍,所以不是越多越好,能单 Agent 解决的别上编排。
七、工程落地的关键挑战
教科书不会告诉你这些:
- 幻觉与「装作完成」:模型可能编造一个「命令执行成功」的回执。对策是以真实工具返回值(exit code、文件是否存在)为准,绝不信模型的自我描述。
- 上下文污染:长任务里早期的错误信息会一直占着窗口,带偏后续决策。需要定期压缩/摘要历史(WCode 里专门做了 token 压缩)。
- 成本与延迟:每次循环都是一次完整 LLM 调用。要设最大循环次数上限,避免「死循环烧钱」。
- 端点与密钥必须同源:我踩过的血泪坑——tokenhub 的 key 在老混元 API 端点上永远 401,因为两个平台 key 不通用。排障第一步永远是
curl用同源端点直接验证。 - 安全边界:工具权限最小化。给 Agent 一个能
rm -rf的 shell 是灾难;写文件要限定目录;不可逆操作必须人类确认。
八、一个可运行的最小 Agent
下面这段 Python,用 ReAct 循环 + 函数调用实现了「会算数的 Agent」,直接对接你正在用的 tokenhub 端点、模型 hy3:
import json, os
from openai import OpenAI
client = OpenAI(
base_url="https://tokenhub.tencentmaas.com/v1",
api_key=os.environ["WCODE_API_KEY"],
)
TOOLS = [{
"type": "function",
"function": {
"name": "calculator",
"description": "计算一个数学表达式,例如 '123 * 456'",
"parameters": {
"type": "object",
"properties": {"expr": {"type": "string"}},
"required": ["expr"],
},
},
}]
def calculator(expr: str) -> str:
# 生产环境请用安全求值器,这里仅演示
return str(eval(expr, {"__builtins__": {}}, {}))
messages = [
{"role": "system",
"content": "你是会调用工具解决问题的助手,需要做算术时必须调用 calculator。"},
{"role": "user", "content": "123 乘以 456 是多少?"},
]
for _ in range(5): # Agent Loop:最多 5 轮
resp = client.chat.completions.create(
model="hy3", messages=messages, tools=TOOLS, tool_choice="auto")
msg = resp.choices[0].message
messages.append(msg)
if msg.tool_calls: # 模型决定「动手」
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = calculator(args["expr"])
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result,
})
continue
print("最终答案:", msg.content) # 没有工具调用 = 任务完成
break
跑起来你会看到:模型第一轮先 tool_calls 调 calculator("123 * 456"),拿到 56088 后,第二轮不再调工具,直接给出自然语言答案。这就是一个最小但完整的 Agent。
九、未来展望
- 更长的记忆与更稳的规划:模型上下文继续拉长,规划会从事后补救走向「事前仿真」。
- Agent 即服务:每个 SaaS 都会暴露「可被 Agent 调用的 API」,人不再点界面,而是对 Agent 下指令。
- 端侧 Agent:手机/车机本地小模型跑 Agent,隐私数据不出设备。
- 可验证的 Agent:形式化验证 + 沙箱执行,让 Agent 的每一步都可审计、可回滚。
结语
Agent 不是又一个 AI 噱头,而是把「大模型」从「问答玩具」变成「数字员工」的必经之路。它的工程难度不在模型,而在循环控制、工具治理、记忆管理与安全边界——这恰恰是决定一个 Agent 能不能真正交付的护城河。
这篇是我「博客 AI 系列」的第一篇。接下来计划写:向量检索与 RAG 实战、 function calling 的工程化封装、以及用 WCode 讲透「计划模式」的设计哲学。欢迎在评论区点题。
如果你也在做 Agent 方向的落地,欢迎交流踩坑经验。