递归顾问
什么是递归顾问?
递归顾问是一种特殊类型的顾问,可以多次循环下游顾问链。
当你需要反复调用LLM直到满足某个条件时,这种模式非常有用,例如:
-
在循环中执行工具调用,直到不需要再调用工具
-
验证结构化输出,验证失败时重试
-
实现对请求进行修改的评估逻辑
-
实现重试逻辑并对请求进行修改
这CallAdvisorChain.copy(CallAdvisor 之后)方法是实现递归顾问模式的关键工具。
它创建了一个新的顾问链,只包含原链中指定顾问之后的顾问
并允许递归顾问根据需要调用该子链。
这种方法确保了:
-
递归顾问可以循环链中剩余的顾问
-
链中的其他顾问可以观察并拦截每次迭代
-
顾问链保持正确的顺序和可观测性
-
递归顾问不会重新执行之前的顾问
内置递归顾问
Spring AI 提供了两个内置递归顾问,展示了这一模式:
工具呼叫顾问
这工具呼叫顾问将工具调用循环作为顾问链的一部分实现,而非依赖模型内部工具的执行。这使得链中其他顾问能够拦截并观察工具调用过程。
主要特点:
-
通过设置禁用模型的内部工具执行
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();
结构化输出验证顾问
这结构化输出验证顾问验证结构化的JSON输出与生成的JSON模式对照,并在验证失败时重试调用,最多可尝试指定次数。
主要特点:
-
自动从预期输出类型生成 JSON 模式
-
验证LLM响应是否符合该模式
-
如果验证失败,可以重试呼叫,最多可配置次数
-
在重试时通过验证错误信息增强提示,帮助LLM纠正输出
-
使用
callAdvisorChain.copy(this)为递归调用创建子链 -
可选地支持自定义
对象映射器用于 JSON 处理
用例:
var validationAdvisor = StructuredOutputValidationAdvisor.builder()
.outputType(MyResponseType.class)
.maxRepeatAttempts(3)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 1000)
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(validationAdvisor)
.build();