从"问答机器"到"智能体":AI Agent 是如何自主工作的?
一、普通 AI 对话,到底缺了什么?
打开任何一个对话式 AI 产品,你问一句,它答一句------这已经成了我们使用 AI 的肌肉记忆。
比如你对它说:"帮我写一封邮件。"它几乎立刻就能输出一封格式工整的邮件正文,然后......就结束了。
这就是普通 AI 对话的典型模式:一问一答,输出即终止。
笔记中把这总结为:问答机器,输出一次,没有后续。
这种模式在处理单轮、封闭式任务时非常高效。但当我们面对一个需要多步推理、信息搜集、动态决策的复杂任务时,这种"一次性输出"的范式就显得捉襟见肘了。
举个例子:如果我对普通 AI 说------"帮我调研三家竞品的最新动态,然后写一份分析报告。"
它大概率会给出一个看起来像模像样的回答,但仔细一看,内容要么是基于训练数据的陈旧信息,要么就是泛泛而谈的通用描述。它不会主动去搜索 ,不会去查财报 ,不会去对比数据------因为它的"生命"在输出完成的那一刻就结束了。
这就是普通 AI 对话的天花板:它没有"持续运转"的能力。
二、Agent 智能体:一个会"持续运转"的结构
笔记中给出了一个很关键的定义:
Agent 不一样,它有一个持续运转的结构。你给它一个任务,它会去拆任务,决定下一步,去调工具,看结果。这个过程是一个循环,直到任务完成。
这个描述把 Agent 和普通对话的本质差异点出来了------结构决定能力。
普通对话的结构是线性的:输入 → 推理 → 输出 → 结束。
Agent 的结构是循环的:思考 → 行动 → 观察 → 再思考 → 再行动 → 再观察......直到任务完成。
这张图可以很直观地展示两者的差异:
正如笔记中提到的------Agent 会自己干活 ,但这不仅仅是"自动执行",而是自主决策、动态调整、持续迭代。
三、Agent 的工作方式:ReAct 框架
笔记中提到了 Agent 工作的三个核心动作:
- 思考(Reasoning):分析当前状态,决定下一步做什么
- 行动(Act):执行具体的操作,比如调用工具、查询数据
- 观察(Observe):获取行动后的结果,作为下一轮思考的输入
这个"思考→行动→观察"的循环,在业内被称为 ReAct 框架。
笔记中特别强调了一句话:
ReAct 是一套标准的执行流程/Agent 工作框架,不是 LangChain 那种大型开发库,是 Agent 通用的循环工作标准。
这一点很重要。很多人一听到 Agent 就想到 LangChain、AutoGPT 这些框架,但 ReAct 本质上是一种思维范式 ,是一种工作方法论,而不是某个具体的代码库。
举一个具体的例子
笔记中给出了一个很生动的场景:
帮我分析竞品,然后去写一份报告。Agent 会怎么做?
第一轮:
- 思考:我需要先去搜索竞品的信息
- 行动:调用搜索工具,查询三家竞品的最新动态
- 观察:信息量挺大,拿到了不少资料
第二轮:
- 再思考:现有的信息还不够,缺少财务数据
- 再行动:去官网或调用股市 API 抓取财务数据
- 再观察:拿到了营收、利润等关键指标
第三轮、第四轮......
- 持续补充信息,交叉验证,直到最后输出完整的分析报告。
这个循环过程,完美诠释了 ReAct 的工作机制。
四、Agent 的核心能力:Tool Use(工具使用)
笔记中有一个非常精辟的比喻:
工具是 Agent 的手和脚,没有工具,它只能在脑子里转。转完之后,还是只有文字。
这句话点出了 Agent 能力的本质------思考很重要,但行动力更重要。
一个 Agent 再聪明,如果它不能调用外部工具,它的能力就被限制在了"文本生成"这个范畴里。而一旦它拥有了工具,它的能力边界就被大大扩展了。
笔记中列举了几类常见的工具:
| 工具类型 | 作用 | 典型场景 |
|---|---|---|
| 搜索工具 | 获取实时信息 | 查询最新新闻、政策、动态 |
| 代码执行器 | 运行代码并查看结果 | 数据分析、算法验证 |
| 文件读写 I/O | 读取和写入文件 | 处理文档、生成报告 |
| 浏览器操控 | 打开网页、点击、提交表单 | 自动化操作、数据采集 |
| API 调用 | 对接外部服务 | 调用数据库、第三方接口 |
笔记中还特别提到了一个观点:
工具的覆盖范围,直接决定 Agent 的能力边界。选择 Agent 的核心,就是看它集成了多少工具、什么样的工具。
这句话其实也给出了一个评判 Agent 产品优劣的实用标准------不要只看它的"脑子"有多聪明,更要看它的"手"能伸多远。
五、从 Agent 到 JavaScript Promise:异步协作的启发
聊完了 Agent 的工作方式,再来看笔记中关于 Promise 的部分,会发现一个有趣的映射关系。
笔记中关于 Promise 的记录很简短:
- make a promise: new Promise,状态从 pending → fulfilled | rejected,且一旦改变不可再变
- 只要有一个失败,整体失败,不再等待其他 promise 执行
这看起来是在讲 JavaScript 的异步编程,但如果我们把它放到 Agent 的语境下重新审视,会发现一些有意思的相通之处。
1. Promise 的"状态不可逆" vs Agent 的"任务确定性"
Promise 一旦从 pending 变为 fulfilled 或 rejected,就不可再变。这其实对应了 Agent 执行任务的一个特性:一个任务要么完成,要么失败,状态是确定的。
Agent 在循环执行 ReAct 的过程中,会在某个节点判断"任务完成"或"任务失败"(比如超出循环次数、达到 token 上限、连续得到相同结果等),然后终止循环。这和 Promise 的状态固化在逻辑上是同构的。
2. Promise.all 的"快速失败" vs Agent 的"依赖链"
笔记中提到:
只要有一个失败,整体失败,不再等待其他 promise 执行。
这是 Promise.all 的经典行为------快速失败。在 Agent 的多工具协作场景中,这种逻辑其实也经常出现:
比如 Agent 要完成一个任务需要依次调用三个工具------查询数据库、调用 API、生成报告。如果第二步的 API 调用失败了,那么第三步生成报告也就失去了意义。此时 Agent 就需要"快速失败",而不是继续执行无意义的后续步骤。
六、代码解析:从注释中看异步与并发的实战
笔记中附了一份完整的 HTML 代码,我们逐段来看,结合注释深入理解。
1. 定义异步函数
javascript
const getStory = async () =>
fetch('https://v1.hitokoto.cn/?c=i&encode=json')
const getRatp = async () =>
fetch('https://api.1314.cool/bingimg/?type=json&rand=1')
这两个函数分别请求两个不同的 API 接口:
getStory:获取一句随机的一言(hitokoto)getRatp:获取一张随机图片
它们都被定义为 async 函数,返回值是一个 Promise------这正好对应了笔记中关于 Promise 的笔记。
2. main 函数中的关键逻辑
javascript
async function main() {
// 不存在依赖关系,并行执行以下 Promise
// 使用 Promise.all 实现并发效果
const res = await Promise.all([getStory(), getRatp()])
console.log(res);
const jsonPromises = res.map(item => item.json());
const result = await Promise.all(jsonPromises);
console.log(result);
}
这里体现了几个关键点:
第一,并发执行。 两个请求互不依赖,所以使用 Promise.all 并行发起,而不是用 await 串行等待。笔记注释中明确写了:
不管谁先解决,谁后,resolve 的结果会按 promise 数组顺序来收集。最后一个 promise resolved 之后,停下来。
第二,响应处理。 拿到响应数组后,用 map 生成一个新的 Promise 数组------每个 Promise 都是调用 res.json() 的结果。然后再用 Promise.all 一次性解析所有 JSON 数据。
第三,顺序保证。 虽然请求是并发的,但 Promise.all 保证了结果的顺序和传入的 Promise 数组顺序一致。
3. 链式调用的写法
注释中还提供了一种更简洁的链式写法:
javascript
Promise.all([getStory(), getRatp()])
.then(response => {
return Promise.all(response.map(res => res.json()));
})
.catch(response => {
console.log(response);
})
这里用 .then() 替代了 await,用 .catch() 统一处理错误。这体现了 Promise 的链式调用特性,也对应了笔记中"只要有一个失败,整体失败"的快速失败机制。
七、从笔记到思考:Agent 与异步编程的哲学关联
看完代码,我们不妨再跳出来,从更高的维度思考一下:Agent 的工作方式和异步编程之间,是否存在着某种深刻的联系?
1. 都是"非阻塞"的思维
普通对话是"阻塞式"的:你输入,它等待,它输出,你等待。整个过程是串行的。
Agent 的工作方式是"非阻塞"的:它发起一个工具调用后,不会"傻等",而是会去处理其他事情,或者在循环中继续评估状态。这就像 Promise.all 并发执行多个异步任务一样------充分利用时间,提升效率。
2. 都是"状态驱动"的
Agent 的每一轮 ReAct 循环,都是基于当前状态(观察结果)来决定下一步动作。这类似于 Promise 的状态机:pending → fulfilled / rejected,状态的每一次变化都触发了后续的行为(.then() 或 .catch())。
3. 都是"可组合"的
Agent 的工具可以任意组合,就像 Promise 可以链式调用一样。一个 Agent 可以调用搜索工具 → 分析工具 → 报告生成工具,每个工具的输出成为下一个工具的输入。这种管道式组合的能力,是 Agent 和 Promise 共同的魅力所在。
八、写在最后:AI 的"行动力"才是关键
回顾整篇笔记,我们可以提炼出一条清晰的逻辑线:
- 普通 AI 对话:线性、一次性、无状态
- Agent 智能体:循环、迭代、状态驱动
- ReAct 框架:思考 → 行动 → 观察 → 循环
- Tool Use:工具是 Agent 的手和脚
- Promise 类比:异步状态管理与 Agent 循环在逻辑上相通
笔记中最让我印象深刻的一句话是:
Agent 最核心的动作,就是 Tool Use。工具是 Agent 的手和脚,没有工具,它只能在脑子里转。
这句话其实揭示了一个更深层的趋势:AI 的"思考力"正在快速普及,但"行动力"才是未来竞争的关键。
一个 AI 能写出多好的文章、生成多美的图片,这些固然重要------但更重要的,是它能否真正帮我们完成一个任务 ,能否自主地调用工具、获取信息、做出决策、交付结果。
从"问答机器"到"智能体",本质上是 AI 从"大脑"到"完整的行动系统"的进化。而这种进化的核心,就是笔记中反复强调的------持续运转的循环结构 和不断扩展的工具能力。
📌 本文内容基于作者的技术笔记整理,涵盖 Agent 工作方式、ReAct 框架、Tool Use 机制以及 JavaScript Promise 异步编程的对比思考。欢迎交流讨论。
如果你对 AI Agent 的技术实现、工具生态或异步编程模式感兴趣,欢迎在评论区留言,我们一起探讨。