Spring Boot整合DeepSeek实现AI对话

embedded/2025/2/12 18:36:54/
aidu_pl">

本篇博文会分为DeepSeek开放平台上的API,以及本地私有化部署DeepSeek R1模型两种方式来整合使用,本地化私有部署可以参考这篇博文:DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型

Spring AI

Spring AI 是由 Spring(一个广泛使用的开源框架)推出的一个新项目,旨在将 人工智能(AI) 集成到 Spring 应用程序中。Spring 是一个支持 Java 开发的框架,而 Spring AI 使得 Java 开发人员能够更容易地构建、管理和集成人工智能模型和机器学习功能。
我们这里直接使用Spring官方提供的相关依赖来整合,官网地址:https://docs.spring.io/spring-ai/reference/api/chat/deepseek-chat.html
本篇博文主要就是采用的spring ai提供的两个starter依赖进行配置整合,分别是spring-ai-openai-spring-boot-starterspring-ai-ollama-spring-boot-starter

版本依赖

根据官网的描述,spring ai框架支持的SpringBoot版本应该是3.2.x 和 3.3.x
https://www.chengpei.top/upload/spring-<a class=ai-version.png" />
而SpringBoot 3.2.x 和 3.3.x依赖的JDK版本最低应该也是JDK17,所以这里演示整合的代码都是基于spring boot 3.3.8 以及 JDK17

整合DeepSeek API key

进入DeepSeek开放平台页面,注册账号登录后,可以创建API key,新账号有赠送的10元额度,具体价格可以参考这里:https://api-docs.deepseek.com/zh-cn/quick_start/pricing/
有了API key后我们可以开始构建工程了,基于springboot 3.3.8版本搭建一个工程,引入以下依赖:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

增加以下配置:

spring:ai:openai:base-url: https://api.deepseek.comapi-key: sk-xxxxxxxxxxxxxxxxxchat:options:model: deepseek-chat

项目会自动装配OpenAiAutoConfiguration,就可以在需要的地方注入OpenAiChatModel
代码如下:

@Resource
private OllamaChatModel chatModel;private final List<Message> chatHistoryList = new ArrayList<>();@PostConstruct
public void init() {chatHistoryList.add(new SystemMessage("You are a helpful assistant."));
}@GetMapping("/chat")
public ChatResponse test(String message) {chatHistoryList.add(new UserMessage(message));Prompt prompt = new Prompt(chatHistoryList);ChatResponse chatResponse = chatModel.call(prompt);if (chatResponse.getResult() != null && chatResponse.getResult().getOutput() != null) {chatHistoryList.add(chatResponse.getResult().getOutput());}return chatResponse;
}

整合本地化部署的DeepSeek R1模型

本地化私有部署可以参考这篇博文:DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型
部署完成后同样是基于springboot 3.3.8版本搭建一个工程,引入的依赖就换为:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>

增加以下配置:

spring:ai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:1.5b

项目会自动装配OllamaAutoConfiguration,就可以在需要的地方注入ollamaChatModel
代码跟使用spring-ai-openai-spring-boot-starter几乎一样,只是注入的ChatModel类换成了OllamaChatModel
而且实测本地化部署也可以使用spring-ai-openai-spring-boot-starter,修改配置文件如下:

spring:ai:openai:base-url: http://localhost:11434api-key: xxxxxxxchat:options:model: deepseek-r1:1.5b

其他也就一样了,只是把地址换成了本地ollama的服务地址,api-key不需要了但是也不能不填,不填会报错,模型就配置本地有的模型即可
如果想像网站那样可以一个字一个字的输出,也可以调用chatModel.stream流式输出爱的回复


http://www.ppmy.cn/embedded/161662.html

相关文章

Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统

Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统 需求 在实际生成操作过程中&#xff0c;一般会遇到物理服务器存在多块盘的情况。 安装过程中&#xff0c;磁盘的标签是随机分配的&#xff0c;并不是空间较小的盘&#xff0c;就会使用较小的磁盘标签 而需求往往需要…

【机器学习】 特征归一化的重要性及方式

特征归一化 V1.0特征归一化的重要性特征归一化的方式最大最小值归一化最大最小值归一化的局限性 零均值归一化 测试集的归一化 V1.0 特征归一化的重要性 特征归一化的问题产生于&#xff0c;我们在使用特征向量中不同的特征数据时&#xff0c;特征数据尺度&#xff08;或者说…

react 19 useOptimistic 竞争更新乐观值时阻塞

react 19 刚刚出&#xff0c;我在官网上调试这个 useOptimistic api 时&#xff0c;发现了一个竞争调用时的阻塞状态。当连续多次调用 updateFn 参数&#xff0c;且每次更新时间较长时&#xff0c;乐观状态的更新被阻塞了。 前往官网 useOptimistic 一节&#xff0c;修改末尾 …

PyCharm 批量替换

选择替换的内容 1. 打开全局替换窗口 有两种方式可以打开全局替换窗口&#xff1a; 快捷键方式&#xff1a; 在 Windows 或 Linux 系统下&#xff0c;按下 Ctrl Shift R。在 Mac 系统下&#xff0c;按下 Command Shift R。菜单操作方式&#xff1a;点击菜单栏中的 Edit&…

hi3516cv610用海思arm-v01c02-linux-musleabi-strip工具,对库进行瘦身

hi3516cv610用海思arm-v01c02-linux-musleabi-strip工具&#xff0c;对库进行瘦身 执行 arm-v01c02-linux-musleabi-strip libcrypto.so.1.1 应用该工具&#xff0c;对程序裁剪很实用

PC端自动化测试实战教程-5-pywinauto 操作PC端应用程序窗口 - 下篇(详细教程)

1.简介 上一篇宏哥主要讲解和介绍了如何获取PC端应用程序窗口信息和如何连接窗口对其进行操作的常用的几种方法。今天宏哥接着讲解和分享一下窗口的基本操作&#xff1a;最大化、最小化、恢复正常、关闭窗口、获取窗口状态和获取窗口坐标。以及窗口的其他打开方法和选择方法。…

服务器有多少线程?发起一个请求调用第三方服务,是新增加一个请求吗?如果服务器线程使用完了怎么办?

目录 1. 服务器有多少线程? (1)服务器类型 (2)配置参数 (3)硬件资源 2. 发起一个请求调用第三方服务,是新增加一个线程吗? (1)同步调用 (2)异步调用 (3)HTTP 客户端 3. 如果服务器线程使用完了怎么办? (1)请求被拒绝 (2)性能下降 (3)解决方案…

HTML5--网页前端编程(下)

HTML5–网页前端编程(下) 9.常用标签下 (1)表格标签 用来展示数据,显示数据,规整条理,可读性好 基本语法 <table><tr> <td>单元格内的文字</td> <td>单元格内的文字</td>… </tr> <tr> <td>单元格内的文字&l…