Agent ReAct and Loop

作者:mCell日期:2025/11/1

同步至个人站点:Agent ReAct and Loop

065.png

Agent ReAct and Loop

我一直在使用 ChatGPT 或通义千问这样的 AI 工具,它们很强大,但多数情况下都是“一问一答”。我提一个问题,它给一个答案。

但我注意到,像 Manus 或 Claude Code CLI 这样的“Agent”(智能体)产品,它们似乎可以自动执行任务。你给它一个目标,它会自己去调用工具、分析结果、继续下一步,直到任务完成。

066

这到底是怎么做到的?它如何摆脱“一问一答”的限制,实现自动循环?这就是我这周探索的问题。

关键概念:ReAct

我读了一些资料,发现了一个关键概念:ReAct

这是 2022 年一篇论文(ReAct: Synergizing Reasoning and Acting in Language Models)提出的思想。它模仿了人类的工作方式:

  1. Reason(思考):分析当前情况,决定下一步该做什么。
  2. Act(行动):执行一个动作(比如调用工具、搜索信息)。

完成“行动”后,会得到一个新的“观察”(Observation),比如工具的返回结果。然后,Agent 带着这个新结果,回到第 1 步,再次“思考”,形成一个循环。

一个线索:Claude 的日志

这个“思考-行动”的循环听起来很合理。为了验证它,我做了一个小实验。

我查看了 Claude 编码助手(我在 Mac 上的路径是 ./claude/projects/*.jsonl)的会话日志文件。这些 .jsonl 文件记录了我和 Agent 的完整对话。

067

我发现,里面的消息(Message)并不仅仅是“我问”和“它答”,而是主要有四种类型:

  • user:用户的消息。
  • assistant:模型(Agent)的消息。
  • tool_call:模型决定调用一个工具。
  • tool_result:工具执行后返回的结果。

这揭示了一个秘密:assistant 的回复并不总是最终答案。它可能是一个 tool_call(工具调用)请求,用来告诉外部程序:“请帮我执行这个函数”。

执行完毕后,系统会把 tool_result(工具结果)再发给 assistant

流程:一个循环

看到这里,我基本想通了。Agent 的自动执行,本质上就是这样一个流程:

[用户输入] -> [LLM 思考] -> [决定:调用工具 A] -> [系统执行 A] -> [A 的结果] -> [LLM 思考] -> [决定:调用工具 B] -> [系统执行 B] -> ... -> [最终答案]

这个流程的核心,就是一个循环(Loop)

只要 LLM 返回的不是最终答案,而是一个 tool_call,系统就去执行它,然后把结果塞回去,让 LLM 继续“思考”。

Demo 快速验证

我的逻辑很清晰:一个主函数,它负责调用 LLM。调用后,检查返回结果。

  • 如果结果是普通文本(最终答案),就返回它。
  • 如果结果是 tool_call,就去执行工具,然后把工具结果和之前的对话历史“拼”在一起,递归调用自己。

下面是一个简化的伪代码:

1class SimpleAgent {
2  async chat(message) {
3    const assistantResponse = await this.callLLM(message)
4    if (assistantResponse.hasToolCall) {
5      const toolResult = await this.callTool(assistantResponse.toolCall) // 递归调用,将tool result作为新消息
6      return this.chat(toolResult)
7    }
8    return assistantResponse.content
9  }
10}
11

为了快速验证我的想法,我让 Claude Code 基于 Plasmo 快速开发了一个侧边栏形式的 Browser Agent,效果如下:

068

这不是产品,只是 Demo。仅用于验证我自己所理解的 Loop。

我的感想

在做完这些事情以后,我豁然开朗。

Agent 的“自动执行”,其核心就是这个 “LLM 思考 -> 工具执行 -> 结果反馈 -> LLM 再思考” 的循环。

当然,我这个实现非常简陋。一个工业级的 Agent 框架(比如 LangChain)要复杂得多,它们需要处理:

  1. LLM 兼容:如何适配不同厂商(OpenAI, Anthropic, Google)的接口和 tool_call 格式。
  2. 工具管理:如何动态注册、描述和安全地执行工具。
  3. 记忆(Memory):如何在循环中管理越来越长的对话历史,防止 Token 溢出。
  4. 路由(Router):当有上百个工具时,如何决定调用哪一个。

但通过亲自动手,我总算摸清了 ReAct 架构的基本原理。这对于我后续的学习,算是打下了一个很好的基础吧。

(完)


Agent ReAct and Loop》 是转载文章,点击查看原文


相关推荐


【STM32】看门狗
IT阳晨。2025/10/30

目录 一、独立看门狗1. IWDG简介2. IWDG工作原理及框图3. IWDG寄存器及函数介绍4. IWDG溢出时间计算5. IWDG配置步骤6. 小实验:独立看门狗喂狗实验 二、窗口看门狗1. WWDG简介2. WWDG工作原理及框图3. WWDG寄存器及函数介绍4. WWDG溢出时间计算5. WWDG配置步骤6. 小实验:窗口看门狗喂狗实验 一、独立看门狗 1. IWDG简介 独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检


C语言<<超全.超重要>>知识点总结
richxu202510012025/10/27

C语言<<超全.超重要>>知识点总结 #嵌入式[话题]# #电子信息[话题]# #单片机[话题]# #stm32[话题]# #校招[话题]# #秋招[话题]#


GitHub 热榜项目 - 日榜(2025-10-21)
CoderJia_2025/10/24

GitHub 热榜项目 - 日榜(2025-10-21) 生成于:2025-10-21 统计摘要 共发现热门项目:20 个 榜单类型:日榜 本期热点趋势总结 基于本期GitHub热榜项目,AI与机器学习生态系统呈现强劲发展势头,成为技术创新的核心驱动力。Claude cookbooks、系统提示词收集项目和开源NotebookLM实现等AI工具类项目表现突出,体现了大模型应用的快速普及和开发者对AI工程实践的强烈需求。同时,机器人学习框架LeRobot、OCR工具PaddleO


Python 的内置函数 callable
IMPYLH2025/10/22

Python 内建函数列表 > Python 的内置函数 callable def callable(obj): ''' 判断对象是否可调用 :param obj: 一个代对象 :return: 如果 obj 可以调用则返回 True,否则返回 False ''' Python 的内置函数 callable() 用于检查一个对象是否可以被调用(即该对象是否能像函数一样被调用)。该函数返回一个布尔值,如果对象是可调用的则返回 True,否则返回 Fa


第5部分:Netty性能优化与调优策略
lpfasd1232025/10/21

第5部分:Netty性能优化与调优策略 5.1 参数调优 线程数调优 1. EventLoopGroup线程数配置 public class ThreadOptimization { public void configureThreads() { // 获取CPU核心数 int cpuCores = Runtime.getRuntime().availableProcessors(); // Boss线程组:通常1个即可


如何将 iPhone 联系人同步到 Mac
Digitally2025/10/20

将 iPhone 联系人同步到 Mac 有许多好处。也许你换了新手机,想保留联系人列表,或者你只是想在使用 Mac 时访问 iPhone 联系人。听起来可能有些麻烦,但实际上同步联系人非常简单。使用苹果产品的一大好处是它们能够无缝协作。你的 iPhone 和 Mac 可以轻松共享数据,包括联系人。在这篇指南中,我们将向你介绍 6 种将 iPhone 联系人同步到 Mac 的简单方法。让我们开始吧! 方法 1:如何使用 iReaShare iPhone Manager 将 iPhone 联系


Java kubernetes
自由的疯2025/10/19

Kubernetes,通常简称为 K8s,是一个开源的容器编排平台,用于自动化容器化应用的部署、管理和扩展。Kubernetes 最初由 Google 的工程师设计开发,并于2014年开源,随后在2015年捐赠给云原生计算基金会(CNCF)。Kubernetes 的设计基于 Google 在内部使用的大规模容器管理系统 Borg 的经验和教训。 Kubernetes 的主要功能 自动化部署和回滚:Kubernetes 可以自动部署应用程序,并在检测到问题时自动回滚到之前的稳定版本。 自我修复:


基于springboot的民谣网站的设计与实现
舒克日记2025/10/17

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 项目介绍 系统主要分为管理员角色和用户角色 本系统主要功能需求包括歌曲信息管理、歌曲留言管理等模块。其中,密码信息、用户信息、歌曲信息、歌曲留言信息等都是非常重要的数据记录,在系统设计的过程中,需要进行一定的加密处理,确保数据安全性,切实的保护好用户的重要信息。 环境要求 1.运行环境:最好是java jdk1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Ec


Jmeter 线程组、定时器、监听器、后置处理器常用配置说明
wdlnancy2025/10/16

目录 1、线程组 1.1 多线程组关系 1.2、线程组的设置参数含义 ​编辑1.3 如何查看线程数是否全部启动成功? 2、定时器 2.1 常数吞吐量定时器 3、监听器 3.1 查看结果树 3.1.1 多个线程并发时,查看结果树频繁刷屏,如果有失败,无法停止后看到想看的失败信息,如何解决? ​编辑4.1.2 取样器结果里展示的字段都什么含义 3.2 聚合报告 3.2.1:聚合报告如何查看http请求的平均响应时间: 4、后置处理器 4.1 正则表达式提取器


1+X Web前端初级考试html涉及的知识点
期待~明天2025/10/14

HTML 基础概念 HTML(超文本标记语言)是构建网页的核心技术,用于定义网页结构和内容。考试通常涵盖以下基础知识点: HTML 文档基本结构:<!DOCTYPE> 声明、<html>、<head>(包含 <title>、<meta> 等)、<body>。常用标签:段落 <p>、标题 <h1>-<h6>、链接 <a href="">、图像 <img src="" alt="">、列表 <ul>/<ol>/<li>。文本格式化标签:<strong>、<em>、<br>、<hr>。 表单与输

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0