ReAct 模式在 Neovate 中的应用

什么是ReAct模式?

ReAct = Reasoning (推理) + Acting(行动)

ReAct是一种让AI能够边思考边行动的架构模式,模仿人类解决问题的思维方式:

  1. 思考 (Reasoning) - 分析当前情况,决定下一步做什么
  2. 行动 (Acting) - 执行具体的操作(调用工具)
  3. 观察 (Observation) - 获取行动的结果
  4. 重复 - 基于新信息继续思考,直到完成任务

ReAct在Neovate中的实现架构

核心循环 (src/loop.ts)

typescript 复制代码
while (true) {
  // 🧠 REASONING: AI思考并生成响应
  const result = await runner.run(agent, agentInput);

  // 解析AI响应(思考+行动)
  const parsed = parseMessage(text);

  // 🔧 ACTING: 如果有工具调用,执行行动
  const toolUse = parsed.find(item => item.type === 'tool_use');
  if (toolUse) {
    const toolResult = await opts.tools.invoke(toolUse.name, toolUse.params);

    // 👀 OBSERVATION: 将结果反馈给AI
    await history.addMessage({
      role: 'user',
      content: [{
        type: 'tool_result',
        result: toolResult
      }]
    });
  }

  // 🏁 如果没有工具调用,任务完成
  if (!hasToolUse) break;
}

消息解析 (src/utils/parse-message.ts)

AI的响应被解析为交替的思考行动块:

typescript 复制代码
// AI响应格式:
"我来帮你创建文件。\n\n<use_tool>\n<tool_name>write</tool_name>\n<arguments>{\"path\": \"test.js\", \"content\": \"console.log('hello')\"}</arguments>\n</use_tool>\n\n文件创建完成!"

// 解析结果:
[
  { type: 'text', content: "我来帮你创建文件。", partial: false },    // 🧠 思考
  { type: 'tool_use', name: 'write', params: {...}, partial: false }, // 🔧 行动
  { type: 'text', content: "文件创建完成!", partial: false }         // 🧠 思考
]

ReAct流程示例

场景:用户要求"创建一个React按钮组件"

第一轮循环:

  • 🧠 思考:"我来帮你创建React组件。首先检查项目结构。"
  • 🔧 行动 :调用 ls 工具查看目录
  • 👀 观察:获取目录列表

第二轮循环:

  • 🧠 思考:"看起来components目录存在。现在创建Button组件。"
  • 🔧 行动 :调用 write 工具创建 Button.tsx
  • 👀 观察:文件创建成功

第三轮循环:

  • 🧠 思考:"组件创建完成!还需要添加样式文件。"
  • 🔧 行动 :调用 write 工具创建 Button.css
  • 👀 观察:样式文件创建成功

第四轮循环:

  • 🧠 思考:"完成!我已经为你创建了一个可重用的Button组件。"
  • 🏁 结束:没有工具调用,循环终止

安全退出机制

虽然使用while (true),但有多个退出条件:

  1. 最大轮次限制 - 默认50轮,防止无限循环
  2. 用户取消 - 支持Ctrl+C中断
  3. 任务完成 - 无工具调用时正常退出
  4. 工具被拒绝 - 用户拒绝执行工具时退出

工具系统

Neovate实现了完整的工具生态:

内置工具 (src/tools/)

  • read - 读取文件
  • write - 写入文件
  • edit - 编辑文件
  • bash - 执行命令
  • glob - 文件搜索
  • grep - 文本搜索

外部工具 (MCP)

  • 支持Model Context Protocol服务器
  • 可动态加载外部工具
  • 支持stdio、sse、http连接方式

流式处理

支持实时流式响应:

  • AI可以边思考边输出
  • 工具调用可以实时解析
  • 用户可以看到完整思考过程
typescript 复制代码
// 流式事件处理
for await (const chunk of result.toStream()) {
  if (chunk.data.event.type === 'text-delta') {
    // 实时显示AI思考过程
    await opts.onTextDelta?.(chunk.data.event.textDelta);
  }
}

错误处理与恢复

JSON修复

typescript 复制代码
// 如果JSON解析失败,尝试修复
try {
  currentToolUse.params = JSON.parse(jsonString);
} catch (e) {
  // 使用jsonrepair库修复不完整的JSON
  const repairedJsonString = jsonrepair(jsonString);
  currentToolUse.params = JSON.parse(repairedJsonString);
}

工具执行错误

  • 工具执行失败会反馈给AI
  • AI可以基于错误信息调整策略
  • 支持重试机制

ReAct模式的优势

1. 透明性

  • 用户可以看到AI的完整思考过程
  • 每一步操作都有明确的目标
  • 易于理解和调试

2. 可靠性

  • 有完整的错误处理机制
  • 支持任务完成检测
  • 防止无限循环

3. 灵活性

  • AI可以根据结果动态调整策略
  • 支持复杂的编程任务
  • 适应不同的开发场景

4. 可扩展性

  • 易于添加新工具
  • 支持外部MCP服务器
  • 插件化架构

实际应用场景

  • 代码生成 - 逐步创建文件和目录
  • Bug修复 - 分析问题、修改代码、运行测试
  • 代码重构 - 逐步重构代码结构
  • 测试编写 - 创建测试文件、运行测试、修复问题

总结

ReAct模式让Neovate的AI表现得像一个真正的程序员:

  • 边思考边编码,而不是一次性生成所有代码
  • 逐步解决问题,每一步都有明确目标
  • 实时反馈和调整,根据执行结果优化策略
  • 透明和可调试,用户可以看到完整的思考过程

这种架构使Neovate能够处理复杂的编程任务,同时保持高度的可靠性和用户体验。

相关推荐
天空属于哈夫克315 小时前
企业微信二次开发:精准实现关键词自动回复
架构·企业微信
子兮曰15 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰15 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万16 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝16 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋16 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
晨米酱17 小时前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
这个DBA有点耶17 小时前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
卡布鲁17 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄17 小时前
JavaScript 隐式全局变量解析
javascript