|
此版本仍在开发中,尚未被视为稳定版。如需最新的快照版本,请使用 Spring AI 1.1.3! |
递归顾问
什么是递归顾问?
递归顾问是一种特殊的顾问类型,可以多次循环遍历下游顾问链。
这种模式在需要重复调用LLM直到满足某个条件时非常有用,例如:
-
执行工具调用循环,直到无需再调用更多工具
-
验证结构化输出并在验证失败时重试
-
使用修改后的请求实现评估逻辑
-
使用修改请求实现重试逻辑
`0` 方法是实现递归顾问模式的关键工具。它可以根据原始链中的指定顾问创建一个新的顾问链,仅包含该指定顾问之后的所有顾问,并允许递归顾问在需要时调用这个子链。 这种做法确保了:
-
递归顾问可以遍历链中的剩余顾问
-
其他链中的顾问可以观察并拦截每个迭代
-
advisor链维护正确的顺序和可观测性
-
递归顾问不会重新执行之前已经执行过的顾问
内置递归顾问
Spring AI 提供了两个内置递归顾问,展示了这一模式:
ToolCallAdvisor
The ToolCallAdvisor 实现了工具调用循环作为顾问链的一部分,而不是依赖于模型内部的工具执行。这使得顾问链中的其他顾问能够拦截并观察工具调用的过程。
关键功能:<br/>
-
通过将
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();
返回直接功能
"返回直接"功能允许工具绕过LLM并将结果直接返回给客户端应用程序。这在以下情况下非常有用:
-
该工具的输出是最终答案,不需要进一步的LLM处理
-
您希望通过避免额外的LLM调用来减少延迟
-
The tool result should be returned as-is without interpretation
当工具执行返回returnDirect=true时,ToolCallAdvisor将会:
-
执行工具调用,请按照正常方式操作
-
检测
ToolExecutionResult中的returnDirect标志 -
跳出工具调用循环
-
将工具执行结果直接返回给客户端应用,使用
ChatResponse表示,并将工具的输出作为生成内容
StructuredOutputValidationAdvisor
StructuredOutputValidationAdvisor 根据生成的JSON模式验证结构化的JSON输出,并在验证失败时重新尝试调用,最多尝试指定次数。
关键功能:<br/>
-
自动从预期输出类型生成JSON模式
-
验证LLM响应是否符合方案
-
如果验证失败,则可配置重试次数以重新执行调用
-
使用验证错误消息增强提示,在重试尝试时帮助LLM修正其输出
-
使用
callAdvisorChain.copy(this)来创建子链用于递归调用 -
支持自定义
JsonMapper用于JSON处理(可选)
示例用法:
var validationAdvisor = StructuredOutputValidationAdvisor.builder()
.outputType(MyResponseType.class)
.maxRepeatAttempts(3)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 1000)
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(validationAdvisor)
.build();