最适合机器人的视频基座模型:被中国团队开源了
2026-07-10
2026-07-12 0
本文分为两大模块:第一部分讲清 AI Agent 和普通对话大模型的本质区别、ReAct 循环与工具调用核心逻辑;第二部分围绕浏览器异步请求代码,逐行拆解 Promise、async、await、.then() 的底层运行逻辑与并发特性,完整代码放置在代码解析模块末尾。
日常使用的普通对话 AI,执行链路是一次性闭环:用户输入指令 → LLM 读取训练静态知识生成文本 → 输出内容后任务直接终止。整个过程不存在自主循环逻辑,也无法主动操作外部资源。举个例子:让普通 AI 写竞品分析报告,它仅依靠训练时沉淀的旧知识生成文字,不会主动联网查询竞品最新动态、抓取财务数据,输出完成流程直接结束,不存在自我校验、补充信息的能力。
Agent 最核心的特征是拥有可持续循环的执行链路,标准执行流程命名为 ReAct,由三步动作循环往复运行,直到任务完成或触发终止条件:
一轮循环结束后会自动回到「思考」步骤,持续迭代。
工具是 Agent 连接现实世界的唯一载体,没有工具的 Agent 和普通对话 LLM 没有本质区别,仅能输出纯文本内容。可用工具集合直接决定 Agent 的能力边界:
补充说明:ReAct 只是一套通用执行标准,不属于 LangChain 这类开发框架,市面上所有 Agent 开发框架底层都基于这套循环逻辑封装实现。
Promise 是 JS 中专门处理异步操作(网络请求、定时器、文件读取)的标准化对象,诞生目的是解决多层嵌套回调形成的「回调地狱」问题。
三种不可逆状态:
.then() 回调逻辑.catch() 回调逻辑状态一旦切换为 fulfilled /rejected,就永久固定,无法再次修改;
浏览器原生接口 fetch,发起网络请求后返回的值本身就是一个 Promise 对象。
代码中定义了两个请求函数:
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')
async 仅能用来修饰函数,放置在函数声明、箭头函数的前方;
无论函数内部返回何种类型的值,async 都会自动将返回值包装为 Promise:
return 123,等价于 Promise.resolve(123);Promise.reject(错误信息);示例中 fetch 本身就返回 Promise,外层叠加 async 修饰后,调用 getStory()、getRatp() 依旧会得到独立的 Promise 对象,对应两个互不依赖的网络请求。
源码中注释了一段串行请求写法:
javascript
运行
// const story = await getStory();// const ratp = await getRatp();
await 存在使用限制:只能写在被 async 修饰的函数内部,单独在全局使用会直接抛出语法错误;await 核心作用:暂停当前函数内后续代码执行,等待后方 Promise 执行完成并拿到 resolved 结果后,才会继续执行下一行代码;Promise.all 并行写法形成明显性能差异,无依赖接口推荐并行执行。javascript
运行
Promise.all([getStory(), getRatp()])
入参要求:接收一个由多个 Promise 实例组成的数组;
执行逻辑:数组内所有 Promise 同步并发发起,两个网络请求同时发送,总耗时等于耗时最长的接口执行时间,性能远优于串行 await;
返回规则:
.then() 回调;[一言结果, 壁纸结果] 的顺序;标志性特性「快速失败」:数组中任意一个 Promise 执行失败(404、网络中断、请求报错),整个 Promise.all 会立刻终止执行,直接跳转 .catch(),直接丢弃其余未完成 Promise 的返回结果。
javascript
运行
.then(response => {return Promise.all(response.map(res => res.json()))})
.then() 的入参,是上一层 Promise.all 成功返回的数组,数组内存储两个 fetch 得到的 Response 响应对象;res.json() 是 Response 对象自带的异步方法,作用是将接口返回的 JSON 字符串解析为 JS 对象,该方法执行本身依旧返回 Promise;response.map 遍历全部 Response 对象,批量调用 .json() 生成一组全新 Promise,再次使用 Promise.all 并行完成所有 JSON 解析操作;.then 内部若存在 return 语句,返回值会自动包装为 Promise 对象,传递给下一层链式回调,这也是 Promise 链式调用的底层基础。javascript
运行
.catch(response => {console.log(response)})
.catch() 可以捕获整条 Promise 链路中任意位置的失败:包含第一层 Promise.all 接口请求失败、第二层 res.json() 解析时格式报错等所有异常;Promise.all 的快速失败特性:只要任意一步异步操作抛出错误,代码会直接跳转到当前 catch,不会执行任何后续 .then 逻辑;async/await 串行写法,需要搭配 try/catch 语法才能捕获异常,.then/.catch 链式写法可以集中统一处理全链路异常。javascript
运行
async function main() {Promise.all([getStory(), getRatp()]).then(response => {return Promise.all(response.map(res => res.json()))}).catch(response => {console.log(response)})}main();
main 被 async 修饰,理论内部可使用 await,本次代码完全依靠 Promise 静态方法实现并发逻辑,未使用 await;main(),页面加载完成后自动触发整套异步请求逻辑,一次性发起两个网络接口调用。Promise.all 存在快速失败特性,若业务场景需要等待所有请求走完、无论成功失败都保留全部结果,可替换为 Promise.allSettled。html
预览
><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Documenttitle>head><body><script>// const streetCarsPromise = fetch('http://data.ratp.fr/api/datasets/1.0/search/?q=paris');// console.log(streetCarsPromise);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')async function main() {// 不存在依赖关系 , 并行以下 Promise 一系列静态方法// const story = await getStory();// const ratp = await getRatp();// 并发的效果 // 参数是promise 数组// 不管谁先解决,谁后, resolve 的结果会按promise 数组// 顺序来收集。最后一个promise resolved 之后, 停下来 Promise.all([getStory(), getRatp()]).then(response => {return Promise.all(response.map(res => res.json()))}).catch(response => {console.log(response)}) }main();script>body>html>
async 用于修饰函数,让函数天然返回 Promise;await 用于阻塞等待异步结果,多用于存在数据依赖的串行异步逻辑。Promise.all 实现无依赖异步任务并发,搭配多层 .then() 链式处理分层异步逻辑,.catch() 统一捕获整条链路的所有异常。.json() 解析操作依旧属于异步 Promise,批量解析多接口 JSON 需要二次使用 Promise.all 并行处理。