|
此版本仍在开发中,尚未被视为稳定版。为了获取最新的快照版本,请使用Spring AI 1.1.3! |
递归顾问
什么是递归顾问?
递归顾问是一种特殊类型的顾问,可以多次遍历下游顾问链。
当需要重复调用LLM直到满足特定条件时,此模式非常有用,例如:
-
在循环中执行工具调用,直到没有更多需要调用的工具为止
-
验证结构化输出,并在验证失败时重试
-
使用对请求的修改来实现评估逻辑
-
使用对请求的修改实现重试逻辑
CallAdvisorChain.copy(CallAdvisor after) 方法是实现递归通知器模式的关键工具。
它创建了一个新的通知器链,该链仅包含原始链中指定通知器之后的通知器,
并允许递归通知器根据需要调用此子链。
这种方法确保了:
-
递归顾问可以遍历链中剩余的顾问
-
链中的其他通知器可以观察并拦截每次迭代
-
通知器链保持了正确的顺序和可观测性
-
递归通知器不会重新执行在它之前的通知器
内置递归顾问
Spring AI 提供了两个内置的递归顾问(recursive advisors),用于演示此模式:
工具调用顾问
ToolCallAdvisor 将工具调用循环作为顾问链的一部分来实现,而不是依赖模型的内部工具执行。这使得链中的其他顾问能够拦截并观察工具调用过程。
主要特性:
-
通过设置
setInternalToolExecutionEnabled(false)来禁用模型的内部工具执行 -
遍历顾问链,直到不再存在工具调用为止
-
支持“直接返回”功能 - 当工具执行的返回值为
returnDirect=true时,将中断工具调用循环,并将工具执行结果直接返回给客户端应用,而不是将其发送回大语言模型(LLM) -
使用
callAdvisorChain.copy(this)为递归调用创建子链 -
包含空安全性检查,以处理聊天响应可能为 null 的情况
-
通过
conversationHistoryEnabled支持可配置的对话历史管理
示例用法:
var toolCallAdvisor = ToolCallAdvisor.builder()
.toolCallingManager(toolCallingManager)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 300)
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(toolCallAdvisor)
.build();
会话历史管理
ToolCallAdvisor 包含一个 conversationHistoryEnabled 配置选项,用于控制在工具调用迭代过程中对话历史的管理方式。
默认情况下(conversationHistoryEnabled=true),顾问会在工具调用迭代期间在内部维护完整的对话历史。这意味着在工具调用循环中的每次后续LLM调用都会包含所有之前的消息(用户消息、助手回复、工具回复)。
使用 .disableInternalConversationHistory() 方法可禁用内部对话历史管理。禁用后,仅将上一次工具响应消息传递给下一次迭代。这在以下情况下很有用:
-
您在链中的下一个位置已注册了一个聊天记忆顾问,该顾问已负责管理对话历史
-
您希望减少Tokens使用量,避免重复管理历史记录
-
你正在与外部对话记忆系统进行集成
对话历史禁用的示例:
var toolCallAdvisor = ToolCallAdvisor.builder()
.toolCallingManager(toolCallingManager)
.disableInternalConversationHistory() // Disable internal history - let ChatMemory handle it
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 300)
.build();
var chatMemoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 200) // Positioned before ToolCallAdvisor
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(chatMemoryAdvisor, toolCallAdvisor)
.build();
结构化输出验证顾问
StructuredOutputValidationAdvisor 会将结构化的 JSON 输出与生成的 JSON 模式进行验证,如果验证失败,则最多重试指定次数。
主要特性:
-
自动根据预期输出类型生成 JSON 模式
-
根据模式验证LLM的响应
-
如果验证失败,则重试调用,最多可配置指定次数的尝试
-
在重试尝试时,通过添加验证错误消息来增强提示,以帮助大语言模型纠正其输出
-
使用
callAdvisorChain.copy(this)为递归调用创建子链 -
可选地支持为JSON处理指定自定义的
JsonMapper
示例用法:
var validationAdvisor = StructuredOutputValidationAdvisor.builder()
.outputType(MyResponseType.class)
.maxRepeatAttempts(3)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 1000)
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(validationAdvisor)
.build();