ReAct范式全流程详解
ReAct范式是推理(Reasoning)-> 行动(Acting)-> 观察(Observe)的闭环循环,让AI从“纸上谈兵”的纯语言模型,变成“手脑并用”的智能执行体。ReAct三大核心优势:1. 突破幻觉边界传统LLM问题:遇到知识盲区时编造答案ReAct解决方案:不知道就去查,通过工具调用获取实时、准确的外部信息实际效果:回答的准确性从“模型训练数据的局限”提升到“真实世界的边界”2. 克
目录
一、ReAct范式概述
ReAct范式核心思想
ReAct(Reasoning + Acting)范式是一种将推理(Reasoning)与行动(Acting)紧密结合的人工智能框架。其核心思想是让智能体通过内部推理来规划思考步骤,再通过外部行动与环境交互获取新信息,形成"思考-行动-观察"的循环,最终完成复杂任务。
与传统方法的对比
纯推理模型(如传统CoT):仅依赖内部知识进行链式思考,无法获取实时信息或操作外部系统,遇到知识盲区即失效。
纯行动模型(如传统API调用):机械执行预设动作,缺乏对任务整体逻辑的理解和适应性调整。
ReAct的优势:结合两者之长,通过推理指导行动选择,通过行动结果修正推理,实现动态问题求解。
典型应用场景
-
智能对话系统:理解用户深层意图→查询知识库→生成个性化回复
-
自动化决策系统:分析业务数据→调用预测模型→制定优化方案
-
研究助理:解析研究问题→检索相关文献→综合分析→生成报告
-
流程自动化:理解任务需求→操作软件/API→验证执行结果
二、ReAct核心组件
推理模块
动态问题分解:将复杂问题拆解为可执行的子任务序列
一个简单的例子如下:
原始问题:"分析公司A营收下降原因并给出建议"
→ 子任务1:获取A财务数据
→ 子任务2:对比历史同期数据
→ 子任务3:识别主要变动因素
→ 子任务4:生成改进建议
逻辑链生成:基于当前信息和目标,构建推理路径
-
因果推理:"如果A,那么B;因为观察到C,所以可能需要D"
-
溯因推理:"观察到现象X,可能的原因包括Y1、Y2、Y3"
-
约束推理:"必须在预算内完成,且时间不超过2天"
多步推理机制:
这里我们使用简单的java代码来模拟推理过程:
private ChatResponse callWithTools(Prompt prompt, ChatOptions options) {
try {
// 复制消息列表,用于累积对话历史
List<Message> messages = new ArrayList<>(prompt.getMessages());
// 最多尝试 15 次工具调用(防止无限循环)
int maxIterations = 15;
for (int i = 0; i < maxIterations; i++) {
// 1. 构建新的 Prompt
Prompt currentPrompt = new Prompt(messages, prompt.getOptions());
// 2. 调用 API
JSONObject requestBody = buildRequestBody(currentPrompt);
HttpResponse response = HttpRequest.post(API_URL)
.header("Authorization", "Bearer " + apiKey)
.header("Content-Type", "application/json")
.body(requestBody.toString())
.timeout(60000) // 工具调用可能会慢,增加超时
.execute();
if (!response.isOk()) {
throw new RuntimeException("DeepSeek API call failed: " + response.getStatus());
}
// 3. 解析响应
JSONObject jsonResponse = JSONUtil.parseObj(response.body());
JSONArray choices = jsonResponse.getJSONArray("choices");
JSONObject choice = choices.getJSONObject(0);
JSONObject message = choice.getJSONObject("message");
// 4. 检查是否有工具调用请求
if (message.containsKey("tool_calls") && message.getJSONArray("tool_calls") != null) {
// AI 请求调用工具
JSONArray toolCallsJson = message.getJSONArray("tool_calls");
// 将 JSON 转换为 ToolCall 对象列表
List<ToolCall> toolCalls = new ArrayList<>();
for (int j = 0; j < toolCallsJson.size(); j++) {
JSONObject toolCallJson = toolCallsJson.getJSONObject(j);
JSONObject function = toolCallJson.getJSONObject("function");
ToolCall toolCall = new ToolCall(
toolCallJson.getStr("id"),
toolCallJson.getStr("type"),
function.getStr("name"),
function.getStr("arguments")
);
toolCalls.add(toolCall);
}
// 将 AI 的消息添加到历史(包含工具调用请求)
String assistantContent = message.getStr("content");
if (assistantContent == null || assistantContent.isEmpty()) {
assistantContent = ""; // 工具调用时 content 可能为空
}
messages.add(new AssistantMessage(assistantContent, toolCalls));
// 执行所有工具调用并添加结果
for (ToolCall toolCall : toolCalls) {
String toolResult = executeToolCall(toolCall, options.getTools());
messages.add(new ToolMessage(toolCall.id(), toolResult));
}
// 继续循环,让 AI 使用工具结果生成最终响应
continue;
}
// 5. 没有工具调用,返回最终响应
String content = message.getStr("content");
AssistantMessage assistantMessage = new AssistantMessage(content);
messages.add(assistantMessage); // 添加最终响应到消息链
Generation generation = new Generation(assistantMessage);
List<Generation> generations = new ArrayList<>();
generations.add(generation);
// 6. 创建包含完整消息链的 ChatResponse
Map<String, Object> metadata = new HashMap<>();
// 只保存工具调用相关的消息(不包括原始的 user message 和 system message)
List<Message> toolCallMessages = new ArrayList<>();
for (Message msg : messages) {
// 跳过原始 prompt 中的消息,只保存新增的工具调用相关消息
if (!prompt.getMessages().contains(msg)) {
toolCallMessages.add(msg);
}
}
if (!toolCallMessages.isEmpty()) {
metadata.put(ChatResponse.METADATA_FULL_MESSAGE_CHAIN, toolCallMessages);
}
return new ChatResponse(generations, metadata);
}
throw new RuntimeException("Tool calling exceeded maximum iterations");
} catch (Exception e) {
throw new RuntimeException("Failed to call DeepSeek API with tools", e);
}
}
总的来说ReAct的核心行为就是以下几步操作:
1.初始化推理记录 - 创建一个列表来保存每一步的推理过程
2.循环执行直到任务完成 - 通过while循环不断迭代处理
3.获取当前状态 - 了解当前的问题解决进度和环境信息
4.进行AI推理 - 基于当前状态和目标生成推理思考
5.记录推理步骤 - 保存推理过程供后续分析或学习
6.提取行动指令 - 从推理结果中确定具体要执行的操作
7.执行行动 - 调用工具、API或执行具体操作
8.更新状态 - 根据执行结果更新问题解决状态
行动模块
工具调用标准化:
规定大模型主动调用后端工具的标准形式,json样式如下:
{
"action": "search_database",
"parameters": {
"query": "...",
"table": "...",
"filters": {"...": "..."}
},
"confidence": 0.85
}
环境交互流程:
1.动作执行:调用API、操作UI、查询数据库等
2.反馈捕获:获取执行结果、状态码、错误信息
3.结果解析:提取关键信息,转换为推理模块可理解的格式
反馈处理策略:
-
成功:整合新信息到上下文
-
部分成功:标记不确定性,考虑备用方案
-
失败:分析错误原因,调整行动策略
协同机制
循环迭代流程:
1.初始化状态
2.推理生成计划
3.选择、执行、观察行为
4.评估结果
4.1若未完成则更新状态继续推理
5.输出结果
错误恢复机制:
-
重试策略:相同动作有限次重试
-
替代方案:寻找功能等效的不同工具
-
降级处理:用近似方法完成核心功能
-
人工干预:无法自动恢复时请求协助
自适应策略:
-
基于历史成功率动态调整工具优先级
-
根据任务复杂度调整推理深度
-
学习有效模式,优化后续决策
三、技术实现流程
输入解析阶段
自然语言理解:
public ParsedInput parseUserInput(String text) {
// 1. 意图识别
Intent intent = classifyIntent(text);
// 2. 实体提取
List<Entity> entities = extractEntities(text);
// 3. 约束识别
Constraints constraints = identifyConstraints(text);
// 4. 任务拆解
List<SubTask> subTasks = decomposeTask(intent, entities, constraints);
return ParsedInput.builder()
.intent(intent)
.entities(entities)
.constraints(constraints)
.subTasks(subTasks)
.build();
}
上下文记忆管理:
-
工作记忆:当前任务相关的最新信息(滑动窗口)
-
长期记忆:历史交互记录、学到的模式(向量数据库)
-
工具记忆:可用工具的功能、调用格式、成功率统计
推理-行动循环
推理链生成(CoT扩展):
用户问题:上海明天会下雨吗?
思考过程:
1. 用户想知道上海明天的天气情况
2. 我需要获取上海的地理位置信息
3. 需要确定明天的具体日期
4. 需要查询天气预报数据
5. 需要考虑数据来源的可靠性
6. 准备调用天气API
行动规划:
第一步:获取当前日期,计算明天日期
第二步:调用天气API查询上海天气预报
第三步:解析返回数据,提取降水概率
第四步:用自然语言回答用户
动作选择与参数化:
大模型会根据传入的prompt中的信息提取工具信息,当用户问题需要工具调用时,大模型组装Response响应,后端程序需要按照预设的标准来解析数据。
JSONObject jsonResponse = JSONUtil.parseObj(response.body());
JSONArray choices = jsonResponse.getJSONArray("choices");
JSONObject choice = choices.getJSONObject(0);
JSONObject message = choice.getJSONObject("message");
// 1.检查是否有工具调用请求
if (message.containsKey("tool_calls") && message.getJSONArray("tool_calls") != null) {
// AI 请求调用工具
JSONArray toolCallsJson = message.getJSONArray("tool_calls");
// 2. 将 JSON 转换为 ToolCall 对象列表
List<ToolCall> toolCalls = new ArrayList<>();
for (int j = 0; j < toolCallsJson.size(); j++) {
JSONObject toolCallJson = toolCallsJson.getJSONObject(j);
JSONObject function = toolCallJson.getJSONObject("function");
ToolCall toolCall = new ToolCall(
toolCallJson.getStr("id"),
toolCallJson.getStr("type"),
function.getStr("name"),
function.getStr("arguments")
);
toolCalls.add(toolCall);
}
// 3. 将 AI 的消息添加到历史(包含工具调用请求)
String assistantContent = message.getStr("content");
if (assistantContent == null || assistantContent.isEmpty()) {
assistantContent = ""; // 工具调用时 content 可能为空
}
messages.add(new AssistantMessage(assistantContent, toolCalls));
// 4. 执行所有工具调用并添加结果
for (ToolCall toolCall : toolCalls) {
String toolResult = executeToolCall(toolCall, options.getTools());
messages.add(new ToolMessage(toolCall.id(), toolResult));
}
// 5. 继续循环,让 AI 使用工具结果生成最终响应
continue;
}
环境反馈整合:
对大模型输出的结果进行评估,若不符合预期则重新推理
public IntegrationResult integrate(Reasoning previousReasoning, ActionResult actionResult) {
// 验证结果是否符合预期
boolean isValid = validateResult(actionResult);
if (!isValid) {
// 结果无效,需要重新推理
Reasoning newReasoning = diagnoseFailure(previousReasoning, actionResult);
return IntegrationResult.builder()
.status(Status.RETRY_NEEDED)
.updatedReasoning(newReasoning)
.lessonLearned(extractFailureReason(actionResult))
.build();
} else {
// 结果有效,更新知识状态
Knowledge newKnowledge = extractKnowledge(actionResult);
return IntegrationResult.builder()
.status(Status.SUCCESS)
.newInformation(newKnowledge)
.confidence(calculateConfidence(actionResult))
.build();
}
}
输出生成阶段
结果综合:
当所有步骤执行完后会整合所有结果,进行置信度评估后输出最后结果
public SynthesisResult synthesize(List<ActionResult> allResults, String originalQuestion) {
// 整合所有步骤的结果
ConsolidatedData consolidatedData = consolidateData(allResults);
// 评估整体置信度
double overallConfidence = calculateOverallConfidence(
allResults.stream()
.map(ActionResult::getConfidence)
.collect(Collectors.toList())
);
// 生成最终答案
String answer;
if (overallConfidence > CONFIDENCE_THRESHOLD) {
answer = generateDefinitiveAnswer(consolidatedData, originalQuestion);
} else {
answer = generateCautiousAnswer(consolidatedData, originalQuestion);
}
return SynthesisResult.builder()
.answer(answer)
.confidence(overallConfidence)
.supportingData(consolidatedData)
.build();
}
可解释性输出:
最后,我们对输出结果进行json的格式化,至此,所有流程结束。
四、关键技术与优化
长上下文处理
当prompt过长时(记忆和工具的增加都会导致)我们程序的效率就会下降,这时,为了应对长上下文的发生,可以从以下几个方面解决。
记忆窗口管理:
-
最近优先:保留最近N轮对话(如最近10轮)
-
重要性筛选:基于信息熵或任务相关性保留关键信息
-
分层存储:原始对话、提取的要点、学到的规则分开存储
关键信息压缩技术
-
实体-关系提取:识别对话中的核心实体及其相互关系
-
摘要生成:使用抽象式摘要技术生成简洁版本
-
图结构表示:将对话转换为知识图谱,保留语义结构
-
增量更新策略:仅存储状态变化,而非完整上下文
上下文压缩算法
-
重要性评分:基于TF-IDF、位置权重、查询相关性计算内容重要性
-
冗余检测:识别并去除重复或相似内容
-
结构化保留:优先保留数字、日期、名称等结构化信息
-
语义完整性检查:确保压缩后不丢失关键语义
工具增强策略
由于大模型在一般情况下只能回答训练时的数据,这时候就必须使用外部工具进行辅助增强。
工具在注册、选择以及使用上也有着它的规则
工具注册与发现
-
统一描述规范:工具使用标准化JSON Schema描述接口、参数、返回格式
-
语义索引:建立工具功能的向量化索引,支持语义检索
-
分类体系:按功能领域(搜索、计算、API调用等)分类管理
智能工具选择
-
多维度匹配:同时考虑功能匹配度、历史成功率、执行效率
-
上下文感知:根据当前对话状态调整工具优先级
-
冷启动处理:新工具的初始置信度分配和快速验证机制
-
组合策略:多个工具协同工作的编排逻辑
工具调用优化
预执行验证
-
参数格式检查
-
权限验证
-
配额限制检查
-
预期结果格式验证
异常处理机制
-
降级策略:主工具失败时自动切换到备用工具
-
重试逻辑:网络波动时的智能重试,支持指数退避
-
部分成功处理:工具返回不完整结果时的补全策略
-
用户确认机制:高风险操作前的用户确认流程
五、简单实战案例解析
复杂问答系统
任务:回答"爱因斯坦哪年获得诺贝尔奖?获奖原因是什么?对现代物理有什么影响?"
ReAct流程:
步骤1:推理
- 问题包含三个子问题:获奖时间、获奖原因、影响
- 需要查询爱因斯坦的诺贝尔奖信息
- 可能需要查询物理学史资料
步骤2:行动
- 调用知识库API:查询爱因斯坦诺贝尔奖信息
- 结果:1921年获得诺贝尔物理学奖,因光电效应研究
步骤3:推理
- 光电效应的具体内容是什么?
- 对现代物理的影响:量子力学发展、光电子技术等
- 需要更详细的信息
步骤4:行动
- 调用学术数据库:查询光电效应详细资料
- 调用物理学史资料:查询量子力学发展史
步骤5:综合
- 整合所有信息
- 生成结构化回答
自动化流程执行
任务:为用户预订下周从北京到上海的航班,要求上午出发、经济舱、价格低于2000元
ReAct流程:
步骤1:解析需求
- 出发地:北京
- 目的地:上海
- 时间:下周,上午出发
- 舱位:经济舱
- 预算:<2000元
步骤2:推理
- 需要确定具体日期
- 需要查询航班信息
- 需要比较价格和时刻
- 可能需要用户确认
步骤3:行动
- 调用日历API:确定下周日期范围
- 调用航班查询API:搜索符合条件的航班
- 结果:找到5个符合条件的航班
步骤4:推理
- 航班A:时间合适但2100元超预算
- 航班B:1900元但下午出发
- 航班C:1850元,上午10点出发,最优选项
- 需要用户确认
步骤5:行动
- 生成选择界面供用户确认
- 用户确认选择航班C
步骤6:行动
- 调用订票API预订航班C
- 发送确认信息给用户
六、ReAct范式总结
ReAct范式是推理(Reasoning)-> 行动(Acting)-> 观察(Observe)的闭环循环,让AI从“纸上谈兵”的纯语言模型,变成“手脑并用”的智能执行体。
ReAct三大核心优势:
1. 突破幻觉边界
-
传统LLM问题:遇到知识盲区时编造答案
-
ReAct解决方案:不知道就去查,通过工具调用获取实时、准确的外部信息
-
实际效果:回答的准确性从“模型训练数据的局限”提升到“真实世界的边界”
2. 克服能力局限
-
传统LLM问题:只能说,不能做
-
ReAct解决方案:想到了就去做,通过工具执行具体操作
-
实际效果:从信息提供者升级为问题解决者,可完成订票、查询、计算等具体任务
3. 实现动态适应
-
传统LLM问题:一次性生成答案,错了就全错
-
ReAct解决方案:做错了就调整,基于执行结果修正推理路径
-
实际效果:具备试错和调整能力,处理复杂任务的鲁棒性大幅提升
制作不易,如果对你有帮助请点赞,评论,收藏,感谢大家的支持

更多推荐



所有评论(0)