从“问答机器”到“智能体”:AI Agent 是如何自主工作的?

从"问答机器"到"智能体":AI Agent 是如何自主工作的?


一、普通 AI 对话,到底缺了什么?

打开任何一个对话式 AI 产品,你问一句,它答一句------这已经成了我们使用 AI 的肌肉记忆。

比如你对它说:"帮我写一封邮件。"它几乎立刻就能输出一封格式工整的邮件正文,然后......就结束了。

这就是普通 AI 对话的典型模式:一问一答,输出即终止。

笔记中把这总结为:问答机器,输出一次,没有后续。

这种模式在处理单轮、封闭式任务时非常高效。但当我们面对一个需要多步推理、信息搜集、动态决策的复杂任务时,这种"一次性输出"的范式就显得捉襟见肘了。

举个例子:如果我对普通 AI 说------"帮我调研三家竞品的最新动态,然后写一份分析报告。"

它大概率会给出一个看起来像模像样的回答,但仔细一看,内容要么是基于训练数据的陈旧信息,要么就是泛泛而谈的通用描述。它不会主动去搜索不会去查财报不会去对比数据------因为它的"生命"在输出完成的那一刻就结束了。

这就是普通 AI 对话的天花板:它没有"持续运转"的能力


二、Agent 智能体:一个会"持续运转"的结构

笔记中给出了一个很关键的定义:

Agent 不一样,它有一个持续运转的结构。你给它一个任务,它会去拆任务,决定下一步,去调工具,看结果。这个过程是一个循环,直到任务完成。

这个描述把 Agent 和普通对话的本质差异点出来了------结构决定能力

普通对话的结构是线性的:输入 → 推理 → 输出 → 结束。

Agent 的结构是循环的:思考 → 行动 → 观察 → 再思考 → 再行动 → 再观察......直到任务完成。

这张图可以很直观地展示两者的差异:

graph TD subgraph 普通对话 A[用户提问] --> B[AI 推理] B --> C[输出结果] C --> D[结束] end subgraph Agent 工作流 E[用户下达任务] --> F[思考/拆解任务] F --> G[行动/调用工具] G --> H[观察/分析结果] H --> I{任务完成?} I -->|否| F I -->|是| J[输出最终结果] end

正如笔记中提到的------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 的"行动力"才是关键

回顾整篇笔记,我们可以提炼出一条清晰的逻辑线:

  1. 普通 AI 对话:线性、一次性、无状态
  2. Agent 智能体:循环、迭代、状态驱动
  3. ReAct 框架:思考 → 行动 → 观察 → 循环
  4. Tool Use:工具是 Agent 的手和脚
  5. Promise 类比:异步状态管理与 Agent 循环在逻辑上相通

笔记中最让我印象深刻的一句话是:

Agent 最核心的动作,就是 Tool Use。工具是 Agent 的手和脚,没有工具,它只能在脑子里转。

这句话其实揭示了一个更深层的趋势:AI 的"思考力"正在快速普及,但"行动力"才是未来竞争的关键。

一个 AI 能写出多好的文章、生成多美的图片,这些固然重要------但更重要的,是它能否真正帮我们完成一个任务 ,能否自主地调用工具、获取信息、做出决策、交付结果

从"问答机器"到"智能体",本质上是 AI 从"大脑"到"完整的行动系统"的进化。而这种进化的核心,就是笔记中反复强调的------持续运转的循环结构不断扩展的工具能力


📌 本文内容基于作者的技术笔记整理,涵盖 Agent 工作方式、ReAct 框架、Tool Use 机制以及 JavaScript Promise 异步编程的对比思考。欢迎交流讨论。


如果你对 AI Agent 的技术实现、工具生态或异步编程模式感兴趣,欢迎在评论区留言,我们一起探讨。

相关推荐
秦先生在广东1 小时前
Loop Engineering:用系统设计取代手动提示,构建 AI 编码代理的自动化循环
人工智能
知足常乐3201 小时前
【Agent失败复盘】从 ReAct 到白箱工作流:一个数据分析 Agent 被现实按着重构的过程
人工智能
weedsfly1 小时前
前端懒加载全家桶:图片、路由、组件的按需加载
前端·javascript·面试
Kel1 小时前
多 Tab 聊天不翻车:纯前端实现跨标签页消息同步的三层协同架构
前端·javascript·人工智能
林泽毅1 小时前
Qwen3.5 DPO 模型对齐实战(pytrio训练版)
人工智能·python·算法
半个落月1 小时前
Promise 入门:理解 async/await 与 Promise.all
前端·javascript
Token炼金师1 小时前
四段式淬炼:预训练、持续预训练、中训练、冷启动 SFT —— 课程学习与训练阶段编排
人工智能·深度学习·机器学习
RisunJan1 小时前
AI 前沿速报 · 周报第28周
人工智能