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
相关产品推荐
相关产品推荐

