一、前言

Spring AI 提供跨 AI 供应商(如 OpenAI、Hugging Face 等)的一致性 API, 通过分装的ChatModelChatClient即可轻松调动LLM进行流式或非流式对话。

本专栏主要围绕着通过OpenAI方式调用各种大语言模型展开学习(因为95%以上模型都兼容OpenAI方式调用接口),接下来我们先从调用深度求索的DeepSeek模型开始探索吧~

上一篇文章:1. Spring AI概述-CSDN博客

二、术语

2.1 ChatModel 和ChatClient的区分

Spring AI 中的 ChatModel ChatClient 是两种不同层级的 API 设计,分别针对不同复杂度的 AI 交互场景。以下是两者的核心差异、典型用法及适用场景分析:

PS : ChatClient是对ChatModel的高级封装, 是官方推荐的核心API

a. 首次引入版本

    • 里程碑版本:ChatClient 在 1.0.0-M5 中首次出现,但接口设计尚未稳定。
    • 稳定版本:从 1.0.0-M7 开始接口基本定型,并在 1.0.0-M8 中进一步优化。
    • 正式生产版本1.0.0 GA(2025年5月20日发布)是首个稳定且支持生产环境的版本,ChatClient 成为官方推荐的核心 API

b. 当前推荐版本

    • 1.0.0 GA:功能完善,支持同步/流式调用、多模型切换、工具调用等企业级特性,是生产环境首选

2.2 OpenAI标准

OpenAI的API设计已成为行业事实标准,开发者生态庞大。国内绝大部分模型(如通义千问、DeepSeek、文心一言、智谱GLM、Kimi等)均提供与OpenAI兼容的API接口,开发者仅需替换base_urlapi_key model 参数,即可快速调动大模型能力!

主流模型兼容OpenAI接口对比表:

三、DeepSeek开放平台

注册开放平台账号(DeepSeek),充值5块钱(开发够用了),然后创建API KEY

四、代码

4.1 项目依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.better</groupId><artifactId>spring-ai-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>models/chat/chat-openai-deepseek</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.5</version><relativePath/></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency></dependencies><!--Spring AI模块的依赖版本管理--><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><!--正式生产版本:1.0.0 GA(2025年5月20日发布)是首个稳定且支持生产环境的版本,ChatClient 成为官方推荐的核心 API--><version>1.0.0</version> <!-- GA 版本 --><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

4.2 模型配置

server:port: 8321
spring:ai:openai:base-url: https://api.deepseek.comapi-key: ${OPENAI_API_KEY}chat:options:model: deepseek-chat  # 可选模型:deepseek-chat/deepseek-reasonertemperature: 0.6      # 响应随机性控制,默认值

4.3 ChatClient

4.3.1 非流式对话

    @GetMapping("/chat")String chat(String question) {return chatClient.prompt(question).call().content();

4.3.2 流式对话

    @GetMapping(value = "/chat/stream",produces = MediaType.TEXT_EVENT_STREAM_VALUE)Flux<String> chatStream(String question) {return chatClient.prompt(question).stream().content();}

4.3.3 通用LLM配置

适用于所有支持的 LLM 提供商,跨平台兼容性高,适配 OpenAI、DeepSeek等

    @GetMapping("/chat/generic-options")String chatGenericOptions(String question) {return chatClient.prompt(question).options(ChatOptions.builder().model("deepseek-reasoner")  // 指定模型(deepSeek的推理模型).temperature(0.9) // 指定温度值.build()).call().content();}

4.3.4 OpenAI配置

    @GetMapping("/chat/provider-options")String chatProviderOptions(String question) {return chatClient.prompt(question).options(OpenAiChatOptions.builder().logprobs(true) // 用于请求模型在生成文本时返回每个生成toke的对数概率.build()).call().content();}

4.3.5 完整代码

package com.better.springai;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;/*** 高级封装ChatClient*/
@RestController
class ChatClientController {private final ChatClient chatClient;public ChatClientController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}/*** 非流式对话* @param question 问题* return java.lang.String* @author luchuyan* @time 2025/7/19 18:59**/@GetMapping("/chat")String chat(String question) {return chatClient.prompt(question).call().content();}/*** 流式对话* @param question* return reactor.core.publisher.Flux<java.lang.String>* @author luchuyan* @time 2025/7/19 19:00**/@GetMapping(value = "/chat/stream",produces = MediaType.TEXT_EVENT_STREAM_VALUE)Flux<String> chatStream(String question) {return chatClient.prompt(question).stream().content();}/*** 非流式对话-通用LLM配置* PS: 适用于所有支持的 LLM 提供商,跨平台兼容性高,适配 OpenAI、DeepSeek等* @param question* return java.lang.String* @author luchuyan* @time 2025/7/19 19:09**/@GetMapping("/chat/generic-options")String chatGenericOptions(String question) {return chatClient.prompt(question).options(ChatOptions.builder().model("deepseek-reasoner")  // 指定模型(deepSeek的推理模型).temperature(0.9) // 指定温度值.build()).call().content();}/*** 非流式对话-OpenAI专属配置* PS: 仅适用于 OpenAI 或兼容 OpenAI 接口的服务(如 DeepSeek)* @param question* return java.lang.String* @author luchuyan* @time 2025/7/19 19:13**/@GetMapping("/chat/provider-options")String chatProviderOptions(String question) {return chatClient.prompt(question).options(OpenAiChatOptions.builder().logprobs(true) // 用于请求模型在生成文本时返回每个生成toke的对数概率.build()).call().content();}}

4.4 ChatModel

用户和ChatClient差不多, 不再赘述~

4.4.1 完整代码

package com.better.springai;import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;/*** 基础封装ChatModel*/
@RestController
@RequestMapping("/model")
class ChatModelController {private final ChatModel chatModel;ChatModelController(ChatModel chatModel) {this.chatModel = chatModel;}/*** 非流式对话* @param question 问题* return java.lang.String* @author luchuyan* @time 2025/7/19 20:48**/@GetMapping("/chat")String chat(String question) {return chatModel.call(question);}/*** 流式对话* @param question* return reactor.core.publisher.Flux<java.lang.String>* @author luchuyan* @time 2025/7/19 19:00**/@GetMapping(value = "/chat/stream",produces = MediaType.TEXT_EVENT_STREAM_VALUE)Flux<String> chatStream(String question) {return chatModel.stream(question);}/*** 非流式对话-通用LLM配置* PS: 适用于所有支持的 LLM 提供商,跨平台兼容性高,适配 OpenAI、DeepSeek等* @param question* return java.lang.String* @author luchuyan* @time 2025/7/19 19:09**/@GetMapping("/chat/generic-options")String chatGenericOptions(String question) {return chatModel.call(new Prompt(question, ChatOptions.builder().model("deepseek-reasoner")  // 指定模型(deepSeek的推理模型).temperature(0.9).build())).getResult().getOutput().getText();}/*** 非流式对话-OpenAI专属配置* PS: 仅适用于 OpenAI 或兼容 OpenAI 接口的服务(如 DeepSeek)* @param question* return java.lang.String* @author luchuyan* @time 2025/7/19 19:13**/@GetMapping("/chat/provider-options")String chatProviderOptions(String question) {return chatModel.call(new Prompt(question, OpenAiChatOptions.builder().logprobs(true).build())).getResult().getOutput().getText();}}

五、参考资料

5.1 Spring AI官网文档

    • Chat Client API :: Spring AI Reference 、
    • OpenAI Chat :: Spring AI Reference

5.2 阿里云Maven仓库

  • 仓库服务

5.3 Spring AI 依赖仓库

  • JFrog

5.4 DeepSeek开发文档

  • 首次调用 API | DeepSeek API Docs

---------------------------如果文章对你有帮助,别忘了点赞支持一下,谢谢~---------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89719.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89719.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/89719.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:字符串(Strings)

目录 第一性问题&#xff1a;计算机如何表示文字&#xff1f; ASCII&#xff1a;最早的字符编码标准&#xff08;美国人写的&#xff09; Unicode&#xff1a;解决全球语言的编码方案 字符&#xff08;Character&#xff09; ​编辑 为什么字符常量必须加上单引号 &#…

【vue-5】Vue 3 中的 v-model:双向数据绑定的全面指南

在 Vue 开发中&#xff0c;v-model 是实现表单输入和应用状态之间双向绑定的关键指令。Vue 3 对 v-model 进行了重大改进&#xff0c;使其更加灵活和强大。本文将深入探讨 Vue 3 中 v-model 的工作原理、新特性以及最佳实践。 1. v-model 基础 1.1 什么是 v-model v-model 是 V…

结合自身,制定一套明确的 Web3 学习路线和技术栈建议

目录 ✅ 一、结合自身&#xff0c;明确方向和目的 ✅ 二、技术路线和建议 &#x1f9ed; 技术路线图&#xff08;按阶段划分&#xff09; 第一阶段&#xff1a;巩固 Web3 基础&#xff08;1-2 周&#xff09; 第二阶段&#xff1a;NFT 平台开发实战&#xff08;4-6 周&…

SPARKLE:深度剖析强化学习如何提升语言模型推理能力

摘要&#xff1a;强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;已经成为赋予语言模型高级推理能力的主导范式。尽管基于 RL 的训练方法&#xff08;例如 GRPO&#xff09;已经展示了显著的经验性收益&#xff0c;但对其优势的细致理解仍然不足。为了填…

【Linux服务器】-MySQL数据库参数调优

一、基础配置 [mysqld] # 声明以下配置属于MySQL服务器&#xff08;mysqld&#xff09;[mysqld]&#xff1a;配置文件的模块标识&#xff0c;表示这是 MySQL 服务器的配置段。 二、路径与基础设置 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock pid-file/var/run/mys…

sqli-labs靶场通关笔记:第32-33关 宽字节注入

第32关 宽字节注入查看一下本关的源代码&#xff1a;function check_addslashes($string) // 定义一个用于过滤特殊字符的函数&#xff0c;目的是转义可能用于注入的特殊符号 {$string preg_replace(/. preg_quote(\\) ./, "\\\\\\", $string); // 转义…

基于Eureka和restTemple的负载均衡

在微服务架构中&#xff0c;基于 Eureka&#xff08;服务注册中心&#xff09;和 RestTemplate&#xff08;HTTP 客户端&#xff09;实现负载均衡是常见的方案&#xff0c;核心是通过 Eureka 获取服务实例列表&#xff0c;再结合负载均衡策略选择具体服务实例进行调用。以下是详…

子线程不能直接 new Handler(),而主线程可以

在 Android 中&#xff0c;子线程不能直接 new Handler()&#xff0c;而主线程可以&#xff0c;原因在于 Looper 机制。下面详细解释&#xff1a;1. 为什么主线程可以直接 new Handler()&#xff1f; 主线程&#xff08;UI 线程&#xff09;在启动时&#xff0c;系统会自动调用…

Android无需授权直接访问Android/data目录漏洞

从android11开始&#xff0c;访问/sdcard/Android/data目录需要URI授权&#xff0c;而从更高的版本开始甚至URI权限也被收回&#xff0c;返回“无法使用此文件夹”的提示&#xff0c;这里提供一种方法&#xff0c;可以越权强制访问data目录&#xff0c;当然也包括obb、media等目…

本地部署 Kimi K2 全指南(llama.cpp、vLLM、Docker 三法)

Kimi K2 是 Moonshot AI 于2025年7月11日发布的高性能多专家语言模型&#xff08;MoE&#xff09;&#xff0c;支持最大 128K 上下文&#xff0c;激活参数规模为 32B&#xff0c;具备极强的推理、代码生成与多轮对话能力。自从其权重以多种格式开源以来&#xff0c;许多开发者希…

使用python的pillow模块将图片转化为灰度图和相关的操作

使用python的pillow模块可以将图片转化为灰度图&#xff0c; 可以获取灰度图的特定点值&#xff0c;区域值&#xff0c; 修改值并保存到图片 图片转换为灰度图 from PIL import Image# 打开图片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

【网络安全】大型语言模型(LLMs)及其应用的红队演练指南

未经许可,不得转载。 文章目录 什么是红队演练? 为什么 RAI 红队演练是一项重要实践? 如何开展和规划 LLM 的红队演练 1.测试前的准备 规划:由谁负责测试 规划:测试内容 规划:测试方式 规划:数据记录方式 2.测试过程中 3.每轮测试后 报告数据 区分“识别”与“测量” 本…

ROS2安装ros-humble-usb-cam 404错误导致失败的解决方法

ROS2安装ros-humble-usb-cam遇到404错误导致安装失败&#xff0c;如图&#xff1a;解决方法&#xff1a; 备份 sources.list sudo cp /etc/apt/sources.list.d/ros2.list /etc/apt/sources.list.d/ros2.list.bak替换为清华源 sudo sed -i s|http://packages.ros.org/ros2/ubunt…

OllyDbg技巧学习

1 尝试在反汇编代码中找到一个函数的二进制代码 有的时候需要一个函数的二进制代码&#xff0c;注入到另外的一些地方&#xff1b;以此程序为示例&#xff0c; 八叉树的C实现与原理解析-CSDN博客 Ollydbg打开可执行文件&#xff0c;我想先找到此函数的二进制代码体&#xff0…

数据分析智能体:让AI成为你的数据科学家

数据分析智能体&#xff1a;让AI成为你的数据科学家 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&#xff0c…

K8s与Helm实战:从入门到精通

Kubernetes 简介 Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。最初由 Google 设计并捐赠给云原生计算基金会(CNCF),现已成为容器编排领域的事实标准。 核心功能 自动化容器部署:支持声明式配置和自动化部署,减少人工干预。…

根据ARM手册,分析ARM架构中,原子操作的软硬件实现的底层原理

目录 1.问题背景&#xff1a; 2.原子操作 2.1 硬件操作 2.1.1 LDREX/LDXR指令 2.1.2 STREX/STXR指令 2.2 软件操作 2.3 软件硬件操作的各性能对比 3.总结 1.问题背景&#xff1a; 我们知道&#xff0c;RTOS的任务调度算法是抢占式优先级调度算法。 既然是抢占了&…

iOS 抓包工具选择与配置指南 从零基础到高效调试的完整流程

iOS 抓包&#xff1a;复杂网络调试的必要技能 随着移动端应用越来越依赖网络交互&#xff0c;iOS 抓包作为核心调试工具之一&#xff0c;变得尤为重要。无论是调试 App 与后端的接口通信、排查 HTTPS 请求加密问题&#xff0c;还是定位网络连接超时、请求异常&#xff0c;抓包都…

Java使用FastExcel实现Excel文件导入

依赖配置 (Maven pom.xml)<dependencies><!-- FastExcel 核心库 --><dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version>1.0.0</version></dependency><!-- Apache POI…

【60】MFC入门到精通——运行后 button按键上不显示 按键名, 控件上的文字不显示

文章目录运行后&#xff0c;button按键上不显示 “Test”原因是属性&#xff0c;图标–>True&#xff0c;改为False就好了。