Lazy loaded image
AI Agent 到底是怎么工作的?拆两个开源项目讲清楚
字数 1707阅读时长 5 分钟
2026-3-15
2026-3-15
type
Post
status
Published
date
Mar 15, 2026
slug
ai-agent-how-it-works
summary
拆解了两个开源 Agent 项目的代码,把 AI Agent 的核心工作原理讲清楚。理解底层机制,能帮你更好地理解 Agent 产品。
tags
AI
Agent
产品思考
技术原理
category
技术分享
icon
password
最近半年,AI Agent 是个高频词。
但我发现一个现象:很多人在用 Agent、在聊 Agent,但对 Agent 到底是怎么工作的,其实没有一个清晰的技术图景。
我最近拆了两个开源 Agent 项目的代码——一个是基于 Claude SDK 的 Proma,另一个是兼容所有 OpenAI 格式模型的 OpenClaw。这篇文章把我看到的核心原理讲清楚,希望对你理解 Agent 有帮助。

先说结论:Agent 的三个核心组件

一个 AI Agent 的核心由三样东西组成:
1. 一个大语言模型(比如 Claude、GPT-4)
2. 一份工具清单(告诉模型"你能用这些工具")
3. 一个循环(不断调用模型,直到它说"我做完了")
这三个组件的组合方式,构成了目前主流 Agent 产品的底层架构。

普通 Chat 和 Agent 的核心区别

普通的 AI 对话是这样的:
```
你问一个问题 → AI 回答 → 结束
```
一问一答,每次都是独立的。AI 不能读你的文件,不能上网搜索,不能操作任何东西。它只能基于你给的文字来回答。
Agent 模式多了一个关键能力:AI 可以决定"我需要先做点什么,再回答你"。
具体来说,每次 AI 返回结果时,它有两种选择:
```
选择 A:直接回答(返回文本)→ 对话结束
选择 B:请求使用工具(返回工具调用指令)→ 对话继续
```
就是这个分叉点,让 Agent 能"自主行动"。

用一个真实场景来理解

假设你对 Agent 说:"帮我看看这个项目用了什么技术栈。"
整个过程是这样的:
```
你: "帮我看看这个项目用了什么技术栈"
┌─ 第1轮:发给 AI ─────────────────────────┐
│ AI 判断:信息不够,我需要先看看文件列表 │
│ 返回:请求调用 [列出文件] 工具 │
│ 状态:tool_use(还没完) │
└──────────────────────────────────────────┘
│ 执行工具,拿到文件列表
┌─ 第2轮:把文件列表发给 AI ───────────────┐
│ AI 判断:看到了 package.json,我要读一下 │
│ 返回:请求调用 [读取文件] 工具 │
│ 状态:tool_use(还没完) │
└──────────────────────────────────────────┘
│ 执行工具,拿到文件内容
┌─ 第3轮:把文件内容发给 AI ───────────────┐
│ AI 判断:信息够了,可以回答了 │
│ 返回:"这个项目用的是 React + Vite" │
│ 状态:end_turn(结束) │
└──────────────────────────────────────────┘
展示给你
```
注意看:AI 自己并没有在"循环"。每一轮它只做一个决策——要么请求工具,要么给出回答。是外面的程序在循环调用 AI。

核心循环的伪代码

把 Agent 的核心逻辑写成伪代码,大概 15 行:
```
function agentLoop(用户消息, 工具清单) {
消息历史 = [用户消息]
while (true) {
AI返回 = 调用大模型(消息历史, 工具清单)
if (AI返回.状态 == "end_turn") {
// AI 说完了,展示给用户
return AI返回.文本内容
}
if (AI返回.状态 == "tool_use") {
// AI 要用工具,执行它
工具结果 = 执行工具(AI返回.工具名, AI返回.参数)
消息历史.追加(工具结果)
// continue → 带着工具结果再问一次 AI
}
}
}
```
Proma 用的 Claude SDK 把这个循环封装好了,调一次 `sdk.run()` 就完成整个过程。OpenClaw 用的 pi-agent-core 也做了类似的封装。不同的封装方式,底层都是这个循环结构。

AI 怎么知道自己能用工具?

这是很多人好奇的点。答案很简单:你告诉它的。
在第一次调用 AI 的时候,除了发送用户的消息,还会附带一份工具清单。这份清单用结构化的格式描述了每个工具的名称、功能和参数。比如:
```
工具清单:
├── read_file(读取文件)
│ 参数:file_path(文件路径)
├── run_command(执行命令)
│ 参数:command(命令内容)
├── search_web(搜索网页)
│ 参数:query(搜索关键词)
└── write_file(写入文件)
参数:file_path, content
```
AI 模型在训练阶段就学会了:当你给我工具清单时,我可以在需要的时候请求使用这些工具。它返回的不是"帮我查一下"这种自然语言,而是结构化的指令——工具名 + 参数,外面的程序解析后直接执行。

为什么不会无限循环?

三道保险:
1. AI 自己会停 — 当它判断信息足够回答问题时,就返回文本而不是工具调用。这是模型训练出来的能力。
2. 最大轮次限制 — 程序会设置一个上限(比如最多跑 50 轮),超过就强制停止。
3. 上下文长度限制 — 每轮对话的历史都会累积,超过模型的上下文窗口后,要么压缩要么截断。
实际使用中,大部分任务在 3-10 轮内就能完成。

两个开源项目的对比

我拆的两个项目,架构思路一样,但实现方式不同:
```
Proma OpenClaw
─────────────────────────────────────────────────
上一篇
谷歌搜索反垃圾政策完整解读(2026年1月)| 谷歌命令禁止的几类垃圾SEO行为
下一篇
为什么你的 b 站播放量低?今天来聊聊B站推荐算法中最关键的两个时间点