当前位置: 首页 > news >正文

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;}
}

最后:

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

在这里插入图片描述

http://www.dtcms.com/a/410314.html

相关文章:

  • 【编号525】1969-2008北京五环路历年道路路网数据
  • 淘宝团购上线:本地生活的“两种解法”
  • 直播一级a做爰片免费网站学校做网站方案
  • Syslog和Windows事件日志分析工具
  • request库的详解
  • 如何做一家类似携程的网站南昌专业的网站建设公司
  • C# WPF实现ComboBox实时搜索与数据绑定
  • eBay自养号系统构建指南:打造安全稳定的测评采购环境
  • Java读取Excel图片技术详解:悬浮式与嵌入式图片的三种实现方案(支持WPS嵌入和Office Excel嵌入)
  • 【LLIE技术专题】 SCI代码讲解
  • QT5绘图和数据可视化的CustomPlot C++组件安装及使用
  • 了解ddp和fsdp
  • Linux的POSIX信号量和生产消费模型的环形队列实现
  • 如何用家庭电脑做网站wordpress无法移除旧插件.
  • 网络公司手机网站平台营销型网站
  • Python 将 HTML 转换为纯文本 TXT (HTML 文本提取)
  • glibc pthread_mutex_lock/unlock futex 互斥锁的实现
  • 做网站怎么做小图标百度怎么精准搜索
  • ASP.NET Razor VB 变量
  • Linux系统之----POSIX信号量
  • 让人做网站 需要准备什么软件查看网站dns服务器
  • LangChain第三页【操作指南】_【如何缓存对话模型响应】翻译完成
  • 移动硬盘上的文件消失了?以下是Mac电脑解决方法
  • AWS Route 53 详解:不只是 DNS,还能做智能流量调度
  • AWS EKS + Karpenter Spot实例优化实践指南
  • docker和k3s安装kafka,go语言发送和接收kafka消息
  • GraphRAG(知识图谱结合大模型)对人工智能中自然语言处理的深层语义分析的影响与启示
  • 石化建设分会网站广州市城市建设档案馆网站
  • 建网站是自己做还是用CMS邢台做网站咨询
  • MySQL GTID一致性错误全解析:从连接池复用到完美解决方案