一、工具执行
工具执行是使用提供的输入参数调用工具并返回结果的过程。工具执行由ToolCallingManager接口处理,该接口负责管理工具执行生命周期。
publicinterfaceToolCallingManager{/** * 从模型的工具调用选项中解析工具定义。 */List<ToolDefinition>resolveToolDefinitions(ToolCallingChatOptionschatOptions);/** * 执行模型请求的工具调用。 */ToolExecutionResultexecuteToolCalls(Promptprompt,ChatResponsechatResponse);}如果您使用任何Spring AI Spring Boot Starters,DefaultToolCallingManager是ToolCallingManager接口的自动配置实现。您可以通过提供自己的ToolCallingManager bean来自定义工具执行行为。
@BeanToolCallingManagertoolCallingManager(){returnToolCallingManager.builder().build();}默认情况下,Spring AI在每个ChatModel实现内部透明地为您管理工具执行生命周期。但您可以选择退出此行为并自己控制工具执行。本节描述了这两种场景。
1.1 框架控制的工具执行
使用默认行为时,Spring AI将自动拦截来自模型的任何工具调用请求,调用工具并将结果返回给模型。所有这些都由每个使用ToolCallingManager的ChatModel实现透明地完成。
框架控制的工具执行生命周期
当我们希望向模型提供工具时,我们在聊天请求(Prompt)中包含其定义,并调用将请求发送给AI模型的ChatModel API。
当模型决定调用工具时,它会发送一个响应(ChatResponse),其中包含工具名称和根据定义的架构建模的输入参数。
ChatModel将工具调用请求发送给ToolCallingManager API。
ToolCallingManager负责识别要调用的工具并使用提供的输入参数执行它。
工具调用的结果返回给ToolCallingManager。
ToolCallingManager将工具执行结果返回给ChatModel。
ChatModel将工具执行结果发送回AI模型(ToolResponseMessage)。
AI模型使用工具调用结果作为附加上下文生成最终响应,并通过ChatClient将其发送回调用者(ChatResponse)。
目前,与模型交换的有关工具执行的内部消息不向用户公开。如果您需要访问这些消息,则应使用用户控制的工具执行方法。
确定工具调用是否有资格执行的逻辑由ToolExecutionEligibilityPredicate接口处理。默认情况下,工具执行资格通过检查ToolCallingChatOptions的internalToolExecutionEnabled属性是否设置为true(默认值),以及ChatResponse是否包含任何工具调用来确定。
publicclassDefaultToolExecutionEligibilityPredicateimplementsToolExecutionEligibilityPredicate{@Overridepublicbooleantest(ChatOptionspromptOptions,ChatResponsechatResponse){returnToolCallingChatOptions.isInternalToolExecutionEnabled(promptOptions)&&chatResponse!=null&&chatResponse.hasToolCalls();}}在创建ChatModel bean时,您可以提供自己的ToolExecutionEligibilityPredicate实现。
1.2 用户控制的工具执行
有些情况下,您可能希望自己控制工具执行生命周期。您可以通过将ToolCallingChatOptions的internalToolExecutionE