递归顾问
什么是递归顾问?
递归顾问是一种特殊类型的顾问,可以多次循环执行下游顾问链。当您需要重复调用 LLM 直到满足某个条件时,此模式非常有用,例如:
-
循环执行工具调用直到不再需要调用工具
-
验证结构化输出并在验证失败时重试
-
使用对请求的修改来实现评估逻辑
-
使用对请求的修改来实现重试逻辑
CallAdvisorChain.copy(CallAdvisor after) 方法是实现递归顾问模式的关键实用程序。它创建一个新的顾问链,其中仅包含原始链中指定顾问之后的顾问,并允许递归顾问根据需要调用此子链。这种方法确保了:
-
递归顾问可以循环执行链中剩余的顾问
-
链中的其他顾问可以观察和拦截每次迭代
-
顾问链保持正确的顺序和可观察性
-
递归顾问不会重新执行在其之前执行过的顾问
内置递归顾问
Spring AI 提供了两个内置的递归顾问来演示这种模式
ToolCallAdvisor
ToolCallAdvisor 将工具调用循环作为顾问链的一部分实现,而不是依赖模型的内部工具执行。这使得链中的其他顾问能够拦截和观察工具调用过程。
主要功能
-
通过设置
setInternalToolExecutionEnabled(false)禁用模型的内部工具执行 -
循环执行顾问链,直到不再存在工具调用
-
支持“直接返回”功能——当工具执行具有
returnDirect=true时,它会中断工具调用循环并将工具执行结果直接返回给客户端应用程序,而不是将其发送回 LLM -
使用
callAdvisorChain.copy(this)创建子链以进行递归调用 -
包含空安全检查,以处理聊天响应可能为空的情况
示例用法
var toolCallAdvisor = ToolCallAdvisor.builder()
.toolCallingManager(toolCallingManager)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 300)
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(toolCallAdvisor)
.build();
StructuredOutputValidationAdvisor
StructuredOutputValidationAdvisor 根据生成的 JSON Schema 验证结构化 JSON 输出,并在验证失败时重试调用,最多重试指定次数。
主要功能
-
从预期输出类型自动生成 JSON Schema
-
根据 Schema 验证 LLM 响应
-
如果验证失败,重试调用,最多可配置次数
-
在重试尝试时通过验证错误消息增强提示,以帮助 LLM 纠正其输出
-
使用
callAdvisorChain.copy(this)创建子链以进行递归调用 -
可选支持自定义
ObjectMapper用于 JSON 处理
示例用法
var validationAdvisor = StructuredOutputValidationAdvisor.builder()
.outputType(MyResponseType.class)
.maxRepeatAttempts(3)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 1000)
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(validationAdvisor)
.build();