You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring AI 1.0.0中如何在RAG工具调用时保持后续确认上下文

Spring AI工具调用中后续确认操作的状态管理方案

1. 绑定待确认工具的上下文状态

在ChatMemory中新增结构化状态存储,定义PendingToolCall对象,包含核心字段:

  • 工具唯一标识ID
  • 已收集的工具参数(如用户输入的姓名、邮箱)
  • 当前操作阶段(如"待确认执行"、"待参数修改")

当系统生成确认提示时,将该对象存入对话记忆的元数据区域,而非仅依赖自然语言历史。

示例代码片段:

// 自定义对话记忆元数据结构
public class ChatMemoryMetadata {
    private PendingToolCall pendingToolCall;
    // getter/setter
}

// 触发确认时存入状态
chatMemory.getMetadata().setPendingToolCall(new PendingToolCall(
    "saveUserTool",
    Map.of("name", "John", "email", "john@example.com"),
    "WAITING_CONFIRM"
));

2. 前置拦截:优先处理待确认状态

在工具过滤流程最前端添加状态检查逻辑:

  • 先判断对话记忆中是否存在未完成的PendingToolCall
  • 如果存在,直接跳过RAG检索步骤,将绑定的目标工具传递给大语言模型
  • 将用户的泛化确认语(如"是"、"继续")转换为工具执行指令,或根据修改请求(如"修改姓名")更新待确认参数

示例逻辑:

public List<Tool> selectTools(UserInput input, ChatMemory chatMemory) {
    ChatMemoryMetadata metadata = chatMemory.getMetadata();
    if (metadata != null && metadata.getPendingToolCall() != null) {
        PendingToolCall pending = metadata.getPendingToolCall();
        if (input.getContent().matches("是|确认|继续")) {
            // 直接返回待执行的工具
            return List.of(toolRegistry.getToolById(pending.getToolId()));
        } else if (input.getContent().contains("修改")) {
            // 更新待确认参数,重新进入确认流程
            updatePendingParams(pending, input.getContent());
            return Collections.emptyList(); // 不触发工具调用,返回修改后的确认提示
        }
    }
    // 无待确认状态时,执行原有RAG过滤逻辑
    return ragToolSelector.selectRelevantTools(input);
}

3. 工具内置上下文处理能力

为需要处理后续澄清的工具添加上下文解析逻辑:

  • 在工具的execute方法中,优先读取PendingToolCall中的参数,而非仅依赖当前用户输入
  • 支持识别用户的修改类请求,动态更新参数后再执行核心逻辑

示例工具实现:

@Component
public class SaveUserTool implements Tool {
    @Override
    public Object execute(ToolArguments arguments, ChatMemory chatMemory) {
        PendingToolCall pending = chatMemory.getMetadata().getPendingToolCall();
        Map<String, Object> params = pending.getParams();
        // 处理用户的修改请求(如"修改姓名为Tom")
        String userInput = arguments.get("userInput").toString();
        if (userInput.startsWith("修改姓名")) {
            String newName = userInput.split("为")[1].trim();
            params.put("name", newName);
            pending.setParams(params);
            return "已修改姓名为" + newName + ",是否继续保存?";
        }
        // 执行实际保存操作
        userRepository.save(new User((String) params.get("name"), (String) params.get("email")));
        // 清理待确认状态
        chatMemory.getMetadata().setPendingToolCall(null);
        return "用户详情已保存成功";
    }
}

4. 状态的清理与切换

  • 工具执行完成后,立即清除对话记忆中的PendingToolCall状态,避免干扰后续对话
  • 若用户明确取消操作(如"取消"、"放弃"),同样清理状态并返回提示

内容的提问来源于stack exchange,提问作者Sarath Molathoti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:52:38