4. ChatClient 的初始,快速使用上手

B站影视 港台电影 2025-09-27 12:10 1

摘要:ChatClient 基于 ChatModel 进行了封装提供了通用的 API,它适用所有的大模型,使用 ChatClient 可以让你面向 SpringAi 通用的 api 而无需面向为每一种不同的模型的 api(比如我们之前的什么 DashScopeCha

ChatClient 基于 ChatModel 进行了封装提供了通用的 API,它适用所有的大模型,使用 ChatClient 可以让你面向 SpringAi 通用的 api 而无需面向为每一种不同的模型的 api(比如我们之前的什么 DashScopeChatModel,XXXModel,使用 ChatClient 就无效关心这里是那个大模型 ModelL )来进行编程,虽然您仍然可以使用 ChatModel 来实现某些模型更加个性化的操作(ChatModel 更偏向于底层),但 ChatClient 提供了灵活、更全面的方法来构建您的客户端选项以与模型进行交互:比如系统提示词、格式式化响应、聊天记忆 、tools 都更加易用和优雅,所以除非 ChatClient 无法实现,否则我们 优先考虑用 ChatClient

所以我们后续基于 ChatClient 来进行学习应用。基于 ChatModel 来学习源码,因为 ChatClient 底层依然还是 ChatModel 的封装。 #技术分享

必须通过ChatClient.Builder 来进行构造@SpringBootTestpublic class ChatClientTest { @Test public void testChatClient(@Autowired ChatClient.Builder builder) {ChatClient chatClient = builder.build; String content = chatClient.prompt .user("Hello") .call .content; System.out.println(content); } }

这种方式会在底层自动注入1个 ChatModel ,如果你配置了多个模型依赖,会无法注入。

可以通过这种方式动态选择 ChatModel:

@SpringBootTestpublic class ChatClientTest {@Test public void testChatOptions(@Autowired DeepSeekChatModel chatModel) {ChatClient chatClient = ChatClient.builder(chatModel).build; String content = chatClient.prompt .user("Hello") .call .content; System.out.println(content); } }@Test public void testChatStream { Flux content = chatClient.prompt .user("Hello") .stream .content;content.toIterable.forEach(System.out::println); }

1)application.properties

# DeepSeek 配置spring.ai.deepseek.chat.api-key=你的 APIKey spring.ai.deepseek.chat.options.model=deepseek-chat# Ollama 配置,模型暂定qwen3:4b已拉取到本地spring.ai.ollama.chat.base-url=http://localhost:11434 spring.ai.ollama.chat.options.model=qwen3:4borg.springframework.aispring-ai-starter-model-deepseekorg.springframework.aispring-ai-starter-model-ollama

定义3个 ChatClient 的 bean。也可以根据请求动态创建,看需求

@Configurationpublic class AiConfig {@Bean public ChatClient deepseekR1(DeepSeekChatProperties chatProperties) {DeepSeekApi deepSeekApi = DeepSeekApi.builder .apiKey(System.getenv("DEEP_SEEK_KEY")) .build;DeepSeekChatModel deepSeekChatModel = DeepSeekChatModel.builder .deepSeekApi(deepSeekApi) .defaultOptions(DeepSeekChatOptions.builder.model(DeepSeekApi.ChatModel.DEEPSEEK_REASONER).build) .build;return ChatClient.builder(deepSeekChatModel).build; }@Bean public ChatClient deepseekV3 {DeepSeekApi deepSeekApi = DeepSeekApi.builder .apiKey(System.getenv("DEEP_SEEK_KEY")) .build;DeepSeekChatModel deepSeekChatModel = DeepSeekChatModel.builder .deepSeekApi(deepSeekApi) .defaultOptions( DeepSeekChatOptions.builder .model(DeepSeekApi.ChatModel.DEEPSEEK_CHAT) .build ) .build;return ChatClient.builder(deepSeekChatModel).build; }@Bean public ChatClient ollama(@Autowired OllamaApi ollamaApi, @Autowired OllamaChatProperties options) { OllamaChatModel ollamaChatModel = OllamaChatModel.builder .ollamaApi(ollamaApi) .defaultOptions(OllamaOptions.builder.model(options.getModel).build) .build;return ChatClient.builder(ollamaChatModel).build; }}

请求:

@RestControllerpublic class MultiModelsController {@Autowired private Map chatClientMap;@GetMapping("/chat") String generation(@RequestParam String message, @RequestParam String model) { ChatClient chatClient = chatClientMap.get(model); String content = chatClient.prompt.user(message).call.content; return content; } }

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

来源:墨码行者

相关推荐