4. ChatClient 的初始,快速使用上手
4. ChatClient 的初始,快速使用上手
文章目录
- 4. ChatClient 的初始,快速使用上手
- ChatClient
- 基本使用
- 流式
- ChatClient 《多个模型动态切管理实战》
- 最后:
ChatClient
ChatClient 基于ChatModel进行了封装提供了通用的 API,它适用所有的大模型, 使用ChatClient可以让你面向SpringAi通用的api 而无需面向为每一种不同的模型的api(比如我们之前的什么 DashScopeChatModel,XXXModel,使用 ChatClient 就无效关心这里是那个大模型 ModelL )来进行编程, 虽然您仍然可以使用 ChatModel 来实现某些模型更加个性化的操作(ChatModel更偏向于底层),但 ChatClient 提供了灵活、更全面的方法来构建您的客户端选项以与模型进行交互: 比如系统提示词、格式式化响应、聊天记忆 、tools 都更加易用和优雅,所以除非ChatClient无法实现,否则我们优先考虑用ChatClient。
所以我们后续基于ChatClient来进行学习应用。 基于ChatModel来学习源码,因为ChatClient底层依然还是ChatModel的封装。
基本使用
- 必须通过ChatClient.Builder 来进行构造
@SpringBootTest
public class ChatClientTest {@Test // 注意:这里我们是装配一个 ChatClient.Builder ,ChatClient是没有直接提供的public void testChatClient(@Autowired ChatClient.Builder builder) {ChatClient chatClient = builder.build();String content = chatClient.prompt() // 链式写法.user("Hello").call().content();System.out.println(content);}
}
这种方式会在底层自动注入1个<font style="background-color:rgba(0, 0, 0, 0.06);">ChatModel </font>
, 如果你配置了多个模型依赖, 会无法注入。
可以通过这种方式动态选择ChatModel:
@SpringBootTest
public class ChatClientTest {@Testpublic void testChatOptions(@AutowiredDeepSeekChatModel chatModel) {ChatClient chatClient = ChatClient.builder(chatModel).build();String content = chatClient.prompt().user("Hello").call() // 阻塞输出.content();System.out.println(content);}
}
流式
@Testpublic void testChatStream() {Flux<String> content = chatClient.prompt().user("Hello").stream() // 流式输出.content();// 阻塞输出content.toIterable().forEach(System.out::println);}
ChatClient 《多个模型动态切管理实战》
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:4b
<!-- DeepSeek --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-deepseek</artifactId>
</dependency>
<!-- Ollama -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
定义3个ChatClient的bean。 也可以根据请求动态创建, 看需求
/***/
@Configuration
public class AiConfig {@Beanpublic 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();}@Beanpublic 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();}@Beanpublic 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();}}
请求:
@RestController
public class MultiModelsController {@Autowiredprivate Map<String, ChatClient> 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;}
}
最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”