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

Spring AI的ChatClient和ChatModel接口

目录

    • 介绍
    • 核心功能
    • ChatClient
    • ChatModel
    • 提示词
    • 总结

在这里插入图片描述

介绍


Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则 (如可移植性和模块化设计) 应用于 AI 领域,并促进使用 POJO 作为应用程序的构建块到 AI 领域。

核心功能


1. 统一的 API 抽象
Spring AI 提供标准化的 API 接口,支持多种主流 AI 服务提供商 (如 OpenAI、阿里云通义千问等)。开发者可通过统一的接口调用不同 AI 服务,无需关心底层差异,降低代码复杂性和维护成本。

2. 丰富的模型支持

  • 文生图模型: 支持创意图像生成 (如 OpenAI 的 DALL-E、Stability AI 的模型)。
  • 嵌入模型: 将文本或多模态内容转换为向量表示,支持语义搜索、推荐系统等场景。
  • 音频模型: 支持语音识别和语音合成功能。

3. 结构化数据输出
Spring AI 提供 OutputParser 接口,可将 AI 模型的响应解析为结构化的 Java 对象 (如 POJO),方便后续数据处理和存储。

4. 流式数据响应
支持 Flux 流式输出,适用于实时对话等高并发场景。系统可在数据生成过程中实时返回部分内容,提升用户体验,同时节省内存资源。

5. 向量数据库集成
支持主流向量数据库 (如 Pinecone、Redis、PostgreSQL/PGVector 等),结合嵌入技术实现语义搜索与知识增强生成 (RAG),提升信息检索的准确性和效率。

6. 函数调用与扩展
允许注册自定义函数,使 AI 模型能够调用外部 API 或数据库,解决知识陈旧问题。

ChatClient


ChatClient 接口提供了构建和配置聊天客户端对象的灵活性,以及发起和处理聊天请求的能力。用户可以通过 ChatClient.Builder 来定制客户端的行为,然后使用 prompt() 和 prompt(Prompt prompt) 方法设置请求规范,最后通过 call() 方法发起聊天请求。

1. 引入依赖

<dependencies><!-- spring-ai --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M5</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2. yml配置

server:port: 8001spring:application:name: spring-ai-deepseekai:openai:api-key: sk-bc8e0a85f6f640b28720******base-url: https://api.deepseek.com/v1chat:options:model: deepseek-chat# temperature参数用于控制生成文本的多样性#值越高‌,生成的文本越多样化,但也可能包含更多的随机性和不可预测的内容#值越低‌,生成的文本越接近于确定性的结果,即生成的文本会更加一致和可预测temperature: 0.7

3. 主启动类

@SpringBootApplication
public class DeepSeekMain {public static void main(String[] args) {SpringApplication.run(DeepSeekMain.class, args);}
}

4. 配置类 AIConfig

@Configuration
public class AIConfig {@Beanpublic ChatClient chatClient(ChatClient.Builder chatClientBuilder) {return chatClientBuilder.build();}
}

5. 控制类 ChatClientController

@RestController
@RequestMapping("/client")
public class ChatClientController {@Autowiredprivate ChatClient chatClient;//非流式响应@GetMapping("/chatCall")public String chatCall(@RequestParam("msg") String msg) {return chatClient.prompt()  //提示词.user(msg)   //用户输入信息.call()      //调用大模型.content();  //返回文本}//流式响应,指定编码方式,避免乱码@GetMapping(value = "/chatStream", produces = "text/html;charset=UTF-8")public Flux<String> chatStream(@RequestParam("msg") String msg) {return chatClient.prompt()  //提示词.user(msg)   //用户输入信息.stream()    //调用大模型.content();  //返回文本}
}

call和stream的区别

  • 非流式输出 call: 等待大模型把回答结果全部生成后输出给用户。
  • 流式输出 stream: 逐个字符输出,一方面符合大模型生成方式的本质,另一方面当模型推理效率不是很高时,流式输出比起全部生成后再输出大大提高用户体验。

ChatModel


ChatModel 接口中,带有 String 参数的 call() 方法简化了实际的使用,避免了更复杂的 Prompt 和 ChatResponse 类的复杂性。但是在实际应用程序中,更常见的是使用 ChatResponse call() 方法,该方法采用 Prompt 实例并返回 ChatResponse。

我们使用的 ChatClient 底层是使用 ChatModel 作为属性的,在初始化 ChatClient 的时候可以指定 ChatModel。

@RestController
@RequestMapping("/model")
public class ChatModelController {@Autowiredprivate ChatModel chatModel;@GetMapping("/chatCall")public String chatCall(@RequestParam("msg") String msg) {return chatModel.call(msg);}@GetMapping("/chatCallByPrompt")public String chatCallByPrompt(@RequestParam("msg") String msg) {OpenAiChatOptions openAiChatOptions = OpenAiChatOptions.builder().model("deepseek-chat")  //可以更换成其他大模型.temperature(0.8).build();Prompt prompt = new Prompt(msg, openAiChatOptions);ChatResponse chatResponse = chatModel.call(prompt);return chatResponse.getResult().getOutput().getContent();}
}

提示词

提示词是引导大模型生成特定输出的输入,提示词的设计和措辞会极大地影响模型的响应结果。

Spring AI 提供了 Prompt Template 提示词模板管理抽象,开发者可以预先定义好模板,并在运行时替换模板中的关键词。在 Spring AI 与大模型交互的过程中,处理提示词首先要创建包含动态内容占位符 {占位符} 的模板,然后,这些占位符会根据用户请求或应用程序中的其他代码进行替换。在提示词模板中,{占位符} 可以用 Map 中的变量动态替换。

@RestController
@RequestMapping("/model")
public class ChatModelController {@Autowiredprivate ChatModel chatModel;//提示词@GetMapping("/chatPrompt")public String chatPrompt(@RequestParam("name") String name,@RequestParam("habit") String habit) {String msg= "给我推荐至少三种北京的旅游景点";UserMessage userMessage = new UserMessage(msg);String systemText= "你的名字是{name},你是一个旅游景点咨询助手,你应该用{habit}的旅游习惯,给人们推荐全国各地的旅游景点信息。";SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);//替换占位符Map<String, Object> map = new HashMap<>();map.put("name", name);map.put("habit", habit);Message systemMessage = systemPromptTemplate.createMessage(map);List<Message> list = new ArrayList<>();list.add(userMessage);list.add(systemMessage);Prompt prompt = new Prompt(list);List<Generation> results = chatModel.call(prompt).getResults();return results.stream().map(x -> x.getOutput().getContent()).collect(Collectors.joining(""));}
}

总结


以上主要介绍了 Spring AI 的 ChatClient 和 ChatModel 接口的相关知识,想了解更多 Spring AI 知识的小伙伴请参考 Spring AI 官网 进行学习,学习更多 Spring AI 实战实用技巧的小伙伴,请关注后期发布的文章,认真看完一定能让你有所收获。

相关文章:

  • Node.js 中的 Token 认证机制详解
  • 动态规划之斐波那契数(一)
  • java 集合 泛型
  • (LeetCode 每日一题) 1432. 改变一个整数能得到的最大差值(贪心)
  • 编译链接实战(30)strip移除了哪些内容
  • JVM 类加载过程/对象创建过程/双亲委派机制/垃圾回收机制
  • 大模型微调(Fine-tuning)概览
  • Vue-Leaflet地图组件开发(四)高级功能与深度优化探索
  • 基于51单片机的温度和液位监测系统(串口传输)
  • Vue 性能优化
  • kicad运行时出错,_Pnext->_Myproxy = nullptr;访问内存出错
  • 自我实现的量子隐喻:在可能性场域中动态拓展涌现节点
  • 安装前端vite框架,后端安装fastapi框架
  • Multisim仿真Buck电路基本拓扑
  • 进程和线程区别、管道和套接字、共享变量、TCP三次握手,是否可以少一次握手、子进程和主进程区别和API——Nodejs
  • Spring Cloud Gateway 全面学习指南
  • LabVIEW电路板焊点自动检测
  • 力扣刷题(第五十八天)
  • 【测开面试题】八股文总结
  • Kafka 可靠性保障:消息确认与事务机制(二)
  • 好久不见在线观看免费高清/求好用的seo软件
  • 成都 做网站 模版/营销推广软文案例
  • 如何做网站模版/百度seo公司一路火
  • 创建一个网站一般步骤有哪些/短视频seo推广
  • 制作网站背景怎么做/网站访问量统计工具
  • 玉溪网站建设/网络推广工作室