什么是ReAct模式?
ReAct = Reasoning (推理) + Acting(行动)
ReAct是一种让AI能够边思考边行动的架构模式,模仿人类解决问题的思维方式:
- 思考 (Reasoning) - 分析当前情况,决定下一步做什么
- 行动 (Acting) - 执行具体的操作(调用工具)
- 观察 (Observation) - 获取行动的结果
- 重复 - 基于新信息继续思考,直到完成任务
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)
,但有多个退出条件:
- 最大轮次限制 - 默认50轮,防止无限循环
- 用户取消 - 支持Ctrl+C中断
- 任务完成 - 无工具调用时正常退出
- 工具被拒绝 - 用户拒绝执行工具时退出
工具系统
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能够处理复杂的编程任务,同时保持高度的可靠性和用户体验。