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

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 实战实用技巧的小伙伴,请关注后期发布的文章,认真看完一定能让你有所收获。

http://www.xdnf.cn/news/14437.html

相关文章:

  • YOLOv3 正负样本划分详解
  • OpenIPC-aviateur上位机程序编译环境配置
  • 【AI大模型】Elasticsearch9 + 通义大模型实现语义检索操作详解
  • Logos心法:一份认知进化的活地图
  • Spring Boot 实训项目 - 图书信息网站
  • 哪些元器件对信号频率比较敏感
  • 从混沌到宝藏:数据治理、清洗与资产化的炼金术
  • 【图像质量评价技术专题】-PSNR和SSIM
  • 从代码学习深度学习 - 词的相似性和类比任务 PyTorch版
  • linux 阻塞和非阻塞
  • 【JAVA】支付,积分相关代码开发总结
  • Linux信号机制:进程异步通信的秘密
  • 黑马python(六)
  • 【Canvas与艺术】三只堂前燕
  • DAY49 超大力王爱学Python
  • 深度解析Vue路由原理与实战指南
  • AUTOSAR Adaptive系统如何进行时间同步与延迟分析?
  • YOLOv11改进 | Conv/卷积篇 | 2024最新ECCV最新大感受野的小波卷积WTConv助力YOLOv11有效涨点(二次创新C3k2)
  • 【 C++ 模板中 `template<typename T>` 与 `template<class T>` 的深度解析】
  • springboot测试类原理
  • AI编程:正在拉开新一轮“人与人”的差距
  • Kafka多副本机制
  • python 将字典的值替换为键名作为变量名的形式(带缩进)
  • 基于51单片机的直流电动控制速度系统proteus仿真
  • leetcode 分割回文串 java
  • 总结用ubuntu一直以来遇到的问题
  • 加盐加密算法
  • 浏览器基础及缓存
  • 【Linux】Linux 信号驱动I/O
  • Git 配置 SSH 密钥与私钥教程(跨平台完整指南)