Chat Client API
ChatClient 提供了一个用于与 AI Model 通信的流式 API。
它支持同步和流式两种编程模型。
NOTE: 请参阅本文档底部的 实现说明,了解
ChatClient中命令式和响应式编程模型结合使用的相关信息。
流式 API 提供了用于构建传递给 AI model 作为输入的 Prompt 的各个组成部分的方法。
Prompt 包含用于指导 AI model 输出和行为的指令文本。从 API 的角度来看,prompts 由消息集合组成。
AI model 处理两种主要类型的消息:用户消息(来自用户的直接输入)和系统消息(由系统生成以指导对话)。
这些消息通常包含占位符,这些占位符在运行时根据用户输入进行替换,以 自定义 AI model 对用户输入的响应。
还可以指定 Prompt 选项,例如要使用的 AI Model 名称和控制生成输出随机性或创造性的 temperature 设置。
创建 ChatClient
ChatClient 使用 ChatClient.Builder 对象创建。
您可以为任何 ChatModel Spring Boot 自动配置获取自动配置的 ChatClient.Builder 实例,或以编程方式创建一个。
使用自动配置的 ChatClient.Builder
在最简单的用例中,Spring AI 提供 Spring Boot 自动配置,为您创建一个原型 ChatClient.Builder bean,以便注入到您的类中。
以下是一个简单的示例,展示如何获取对简单用户请求的 String 响应。
@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 model 发送请求,content() 方法将 AI model 的响应作为 String 返回。
使用多个 Chat Model
在单个应用程序中,您可能需要使用多个 chat model 的场景包括:
- 为不同类型的任务使用不同的模型(例如,为复杂推理使用强大的模型,为简单任务使用更快、更便宜的模型)
- 当一个 model 服务不可用时实现回退机制
- 对不同的模型或配置进行 A/B 测试
- 根据用户偏好为用户提供模型选择
- 组合专用模型(一个用于代码生成,另一个用于创意内容等)
默认情况下,Spring AI 自动配置单个 ChatClient.Builder bean。
但是,您可能需要在应用程序中使用多个 chat model。
以下是处理此场景的方法:
在所有情况下,您需要通过设置属性 spring.ai.chat.client.enabled=false 来禁用 ChatClient.Builder 自动配置。
这允许您手动创建多个 ChatClient 实例。
使用单一 Model 类型的多个 ChatClient
本节介绍一个常见用例,您需要创建多个 ChatClient 实例,它们都使用相同的基础 model 类型但具有不同的配置。
// 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();
不同 Model 类型的 ChatClient
在使用多个 AI model 时,您可以为每个 model 定义单独的 ChatClient bean:
import org.springframework.ai.chat.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ChatClientConfig {
@Bean
public ChatClient openAiChatClient(OpenAiChatModel chatModel) {
return ChatClient.create(chatModel);
}
@Bean
public ChatClient anthropicChatClient(AnthropicChatModel chatModel) {
return ChatClient.create(chatModel);
}
}
然后,您可以使用 @Qualifier 注解将这些 bean 注入到应用程序组件中:
@Configuration
public class ChatClientExample {
@Bean
CommandLineRunner cli(
@Qualifier("openAiChatClient") ChatClient openAiChatClient,
@Qualifier("anthropicChatClient") ChatClient anthropicChatClient) {
return args -> {
var scanner = new Scanner(System.in);
ChatClient chat;
// Model selection
System.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
System.out.print("\nEnter your question: ");
String input = scanner.nextLine();
String response = chat.prompt(input).call().content();
System.out.println("ASSISTANT: " + response);
scanner.close();
};
}
}
多个 OpenAI 兼容的 API 端点
OpenAiApi 和 OpenAiChatModel 类提供了一个 mutate() 方法,允许您创建具有不同属性的现有实例的变体。
当您需要与多个 OpenAI 兼容的 API 一起工作时,这特别有用。
@Service
public class MultiModelService {
private static final Logger logger = LoggerFactory.getLogger(MultiModelService.class);
@Autowired
private OpenAiChatModel baseChatModel;
@Autowired
private OpenAiApi baseOpenAiApi;
public void multiClientFlow() {
try {
// Derive a new OpenAiApi for Groq (Llama3)
OpenAiApi groqApi = baseOpenAiApi.mutate()
.baseUrl("https://api.groq.com/openai")
.apiKey(System.getenv("GROQ_API_KEY"))
.build();
// Derive a new OpenAiApi for OpenAI GPT-4
OpenAiApi gpt4Api = baseOpenAiApi.mutate()
.baseUrl("https://api.openai.com")
.apiKey(System.getenv("OPENAI_API_KEY"))
.build();
// Derive a new OpenAiChatModel for Groq
OpenAiChatModel groqModel = baseChatModel.mutate()
.openAiApi(groqApi)
.defaultOptions(OpenAiChatOptions.builder().model("llama3-70b-8192").temperature(0.5).build())
.build();
// Derive a new OpenAiChatModel for GPT-4
OpenAiChatModel gpt4Model = baseChatModel.mutate()
.openAiApi(gpt4Api)
.defaultOptions(OpenAiChatOptions.builder().model("gpt-4").temperature(0.7).build())
.build();
// Simple prompt for both models
String prompt = "What is the capital of France?";
String groqResponse = ChatClient.builder(groqModel).build().prompt(prompt).call().content();
String gpt4Response = ChatClient.builder(gpt4Model).build().prompt(prompt).call().content();
logger.info("Groq (Llama3) response: {}", groqResponse);
logger.info("OpenAI GPT-4 response: {}", gpt4Response);
}
catch (Exception e) {
logger.error("Error in multi-client flow", e);
}
}
}
ChatClient 流式 API
ChatClient 流式 API 允许您使用重载的 prompt 方法以三种不同的方式创建 prompt,以启动流式 API:
-
prompt():此无参数方法让您开始使用流式 API,允许您构建用户、系统和其他 prompt 部分。 -
prompt(Prompt prompt):此方法接受Prompt参数,允许您传入使用 Prompt 的非流式 API 创建的Prompt实例。 -
prompt(String content):这是一个便捷方法,类似于前一个重载。它接受用户的文本内容。