Spring Boot AI 之 Chat Client API 使用大全
ChatClient提供了一套流畅的API用于与AI模型交互,同时支持同步和流式两种编程模型。
流畅API包含构建Prompt组成元素的方法,这些Prompt将作为输入传递给AI模型。从API角度来看,Prompt由一系列消息组成,其中包含指导AI模型输出和行为的指令文本。
AI模型主要处理两类消息:
- 用户消息(User Messages) - 来自用户的直接输入
- 系统消息(System Messages) - 由系统生成用于引导对话
这些消息通常包含占位符,运行时将根据用户输入进行替换,从而定制AI模型对用户输入的响应。
此外还可指定Prompt选项,例如:
- 使用的AI模型名称
- 控制生成输出随机性/创造性的temperature参数设置
创建ChatClient
ChatClient通过ChatClient.Builder对象创建。可以通过以下两种方式获取构建器实例:
- 使用Spring Boot自动配置的ChatModel获取预构建的ChatClient.Builder
- 通过编程方式自行创建Builder实例
使用自动配置的ChatClient.Builder
在最简单的使用场景中,Spring AI提供了Spring Boot自动配置功能,会预先创建一个原型ChatClient.Builder bean供您注入到类中。以下是一个获取简单用户请求字符串响应的基础示例:
@RestController
class MyController {private final ChatClient chatClient;public MyController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@GetMapping("/ai")String generation(String userInput) {return this.chatClient.prompt().user(userInput).call().content();}
}
在这个简单的示例中,用户输入会设定用户消息的内容。call() 方法会向人工智能(AI)模型发送请求,而 content() 方法则将 AI 模型的响应以字符串(String)形式返回。
与多个聊天模型协作
在单个应用程序中,可能会在以下几种场景下需要与多个聊天模型协作:
- 为不同类型的任务使用不同的模型(例如,使用功能强大的模型处理复杂推理任务,使用速度更快、成本更低的模型处理简单任务)
- 在某个模型服务不可用时,实施回退机制
- 对不同模型或配置进行 A/B 测试
- 根据用户偏好为用户提供模型选择
- 结合专用模型(一个用于代码生成,另一个用于创意内容创作等)
默认情况下,Spring AI 会自动配置一个单一的 ChatClient.Builder bean。然而,在应用程序中,可能需要与多个聊天模型协作。以下是处理这种情况的方法:
在所有情况下,通过设置属性 spring.ai.chat.client.enabled=false 来禁用 ChatClient.Builder 的自动配置。
这样,就可以手动创建多个 ChatClient 实例了。
使用单一模型类型的多个 ChatClient 实例
本节将介绍一种常见用例,即需要创建多个 ChatClient 实例,这些实例都使用相同的底层模型类型,但配置不同。
// Create ChatClient instances programmatically
ChatModel myChatModel = ... // already autoconfigured by Spring Boot
ChatClient chatClient = ChatClient.create(myChatModel);// Or use the builder for more control
ChatClient.Builder builder = ChatClient.builder(myChatModel);
ChatClient customChatClient = builder.defaultSystemPrompt("You are a helpful assistant.").build();
为不同模型类型定义 ChatClient
当与多个 AI 模型协作时,可以为每个模型定义单独的 ChatClient bean:
import org.springframework.ai.chat.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ChatClientConfig {@Beanpublic ChatClient openAiChatClient(OpenAiChatModel chatModel) {return ChatClient.create(chatModel);}@Beanpublic ChatClient anthropicChatClient(AnthropicChatModel chatModel) {return ChatClient.create(chatModel);}
}
然后,可以使用 @Qualifier 注解将这些 bean 注入到应用程序组件中:
@Configuration
public class ChatClientExample {@BeanCommandLineRunner cli(@Qualifier("openAiChatClient") ChatClient openAiChatClient,@Qualifier("anthropicChatClient") ChatClient anthropicChatClient) {return args -> {var scanner = new Scanner(System.in);ChatClient chat;// Model selectionSystem.out.println("\nSelect your AI model:");System.out.println("1. OpenAI");System.out.println("2. Anthropic");System.out.print("Enter your choice (1 or 2): ");String choice = scanner.nextLine().trim();if (choice.equals("1")) {chat = openAiChatClient;System.out.println("Using OpenAI model");} else {chat = anthropicChatClient;System.out.println("Using Anthropic model");}// Use the selected chat client