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