目录

一、ReAct范式概述

ReAct范式核心思想

与传统方法的对比

典型应用场景

二、ReAct核心组件

推理模块

行动模块

协同机制

三、技术实现流程

输入解析阶段

推理-行动循环

输出生成阶段

四、关键技术与优化

长上下文处理

工具增强策略

工具调用优化

五、简单实战案例解析

复杂问答系统

自动化流程执行

六、ReAct范式总结


一、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.输出结果

错误恢复机制

  1. 重试策略:相同动作有限次重试

  2. 替代方案:寻找功能等效的不同工具

  3. 降级处理:用近似方法完成核心功能

  4. 人工干预:无法自动恢复时请求协助

自适应策略

  • 基于历史成功率动态调整工具优先级

  • 根据任务复杂度调整推理深度

  • 学习有效模式,优化后续决策


三、技术实现流程

输入解析阶段

自然语言理解

  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轮)

  • 重要性筛选:基于信息熵或任务相关性保留关键信息

  • 分层存储:原始对话、提取的要点、学到的规则分开存储

关键信息压缩技术

  • 实体-关系提取:识别对话中的核心实体及其相互关系

  • 摘要生成:使用抽象式摘要技术生成简洁版本

  • 图结构表示:将对话转换为知识图谱,保留语义结构

  • 增量更新策略:仅存储状态变化,而非完整上下文

上下文压缩算法

  1. 重要性评分:基于TF-IDF、位置权重、查询相关性计算内容重要性

  2. 冗余检测:识别并去除重复或相似内容

  3. 结构化保留:优先保留数字、日期、名称等结构化信息

  4. 语义完整性检查:确保压缩后不丢失关键语义

工具增强策略

由于大模型在一般情况下只能回答训练时的数据,这时候就必须使用外部工具进行辅助增强。

工具在注册、选择以及使用上也有着它的规则

工具注册与发现

  • 统一描述规范:工具使用标准化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解决方案:做错了就调整,基于执行结果修正推理路径

  • 实际效果:具备试错和调整能力,处理复杂任务的鲁棒性大幅提升


制作不易,如果对你有帮助请点赞评论收藏感谢大家的支持

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐