SpringBoot或SpringAI对接DeekSeek大模型

devtools/2025/1/30 6:26:11/
aidu_pl">

今日除夕夜,deepseek可是出尽了风头,但是我看网上还没有这方面的内容对接,官网也并没有,故而本次对接是为了完成这个空缺

我看很多的博客内容是流式请求虽然返回时正常的,但是他并不是实时返回,而是全部响应结束之后返回,是有问题的,我这里的这个方法弥补了这个缺陷

下一次我应该会开源一个Starter,让大家使用起来更加方便,下一次直接开源出来,供大家参考,应该就在这一两天,可以期待一下

这里需要仔细看一下了

因为我使用的是JDK21,不过你也可以使用JDK8去做这件事情,但是前提fastjson和okHttp的版本,因为有些方法可能不是很兼容,如果想要完成可能有一些方法需要替换一下,但是肯定是可以用的

文章目录

  • 前言
  • ain-toc" name="tableOfContents">目录

    文章目录

    一、DeepSeek是什么?

    二、使用步骤

    1.引入库

    2.配置环境变量

     3.配置

    三、 请求

    1.流式请求

     2.非流失请求

    1.定义类

     2.非流式请求

     四、返回结果

    1.流式结果

     2.非流式请求

    总结



一、DeepSeek是什么?

我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-V3。

  • 开发者:深度求索(DeepSeek),一家专注于实现AGI(通用人工智能)的中国科技公司。

  • 技术架构:基于大规模语言模型(LLM),通过深度学习技术训练,具备自然语言理解、生成和推理能力。

  • 数据来源:训练数据涵盖多领域公开文本(如书籍、网页、学术论文等),经过严格清洗和过滤,符合伦理与安全规范。

二、使用步骤

1.引入库

代码如下(示例):

        <!--fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.66</version></dependency><!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency>

2.配置环境变量

java">spring:ai:deepseek:api-key: 这里填写自己的APIKeyapi-host: https://api.deepseek.com/chat/completions

 3.配置

java">package com.hhh.springai_test.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class ChatConfig {@Value("${spring.ai.deepseek.api-key}")private String DeepSeekConfigUrl;@Value("${spring.ai.deepseek.api-host}")private String DeepSeekConfigHost;public String getDeepSeekConfigUrl() {return DeepSeekConfigUrl;}public String getDeepSeekConfigHost() {return DeepSeekConfigHost;}}

三、 请求

1.流式请求

java">@Resource
private ChatConfig config;@GetMapping(value = "/ai/generateStreamAsString2", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> generateStreamAsString2(@RequestParam(value = "message") String message) throws Exception {// 初始化 OkHttpClientOkHttpClient client = new OkHttpClient().newBuilder().build();// 创建动态请求体,使用流式传输RequestBody body = new RequestBody() {@Overridepublic okhttp3.MediaType contentType() {return okhttp3.MediaType.parse("application/json");}@Overridepublic void writeTo(BufferedSink sink) throws IOException {// 构建请求体 JSON 数据String requestBodyJson = "{\n" +"  \"messages\": [\n" +"    {\n" +"      \"content\": \"" + message + "\",\n" +  // 动态插入用户消息"      \"role\": \"user\"\n" +"    }\n" +"  ],\n" +"  \"model\": \"deepseek-chat\",\n" +"  \"frequency_penalty\": 0,\n" +"  \"max_tokens\": 1024,\n" +"  \"presence_penalty\": 0,\n" +"  \"response_format\": {\n" +"    \"type\": \"text\"\n" +"  },\n" +"  \"stop\": null,\n" +"  \"stream\": true,\n" +"  \"stream_options\": null,\n" +"  \"temperature\": 1,\n" +"  \"top_p\": 1,\n" +"  \"tools\": null,\n" +"  \"tool_choice\": \"none\",\n" +"  \"logprobs\": false,\n" +"  \"top_logprobs\": null\n" +"}";// 写入请求体数据sink.writeUtf8(requestBodyJson);}};// 创建 HeadersHeaders headers = new Headers.Builder().add("Content-Type", "application/json").add("Accept", "application/json").add("Authorization", "Bearer " + config.getDeepSeekConfigUrl())  // 使用您的 API 密钥.build();// 创建 HttpUrlHttpUrl url = HttpUrl.parse(config.getDeepSeekConfigHost()); // 使用您的 API URLif (url == null) {throw new IllegalArgumentException("您此时未携带URL参数");}// 构造 Requestokhttp3.Request request = new okhttp3.Request.Builder().url(url).post(body)  // 使用流式请求体.headers(headers).build();// 执行请求并返回 Flux 流return Flux.create(sink -> {client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {// 异常发生时调用 sink.error()sink.error(e);}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {ResponseBody responseBody = response.body();BufferedSource source = responseBody.source();while (true) {// 逐行读取响应数据String line = source.readUtf8Line();if (line == null) {break;} else if (line.startsWith("data:")) {String data = line.substring(5).trim();// 检查数据是否为结束信号"[DONE]"if (!"[DONE]".equals(data)) {// 解析接收到的数据为JSON对象JSONObject jsonResponse = new JSONObject(data);String finishReason = jsonResponse.getJSONArray("choices").getJSONObject(0).optString("finish_reason");if ("stop".equals(finishReason)) {// 结束时推送数据并完成sink.next(data);sink.complete();break;} else {// 否则继续推送数据sink.next(data);}// 打印调试信息System.out.println(jsonResponse.getJSONArray("choices"));}}}}});});}

 2.非流失请求

1.定义类

java">package com.hhh.springai_test.model.dto.DeepSeekChat;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatCompletionResponse {private String id;private String object;private long created;private String model;private List<Choice> choices;private Usage usage;private String system_fingerprint;@Data@AllArgsConstructor@NoArgsConstructorpublic static class Choice {private int index;private Message message;private Object logprobs;private String finish_reason;}@Data@AllArgsConstructor@NoArgsConstructorpublic static class Message {private String role;private String content;}@Data@AllArgsConstructor@NoArgsConstructorpublic static class Usage {private int prompt_tokens;private int completion_tokens;private int total_tokens;private PromptTokensDetails prompt_tokens_details;private int prompt_cache_hit_tokens;private int prompt_cache_miss_tokens;}@Data@AllArgsConstructor@NoArgsConstructorpublic static class PromptTokensDetails {private int cached_tokens;}
}

 2.非流式请求

java">//引入这个bean
@Resource
private ChatConfig config;@GetMapping(value = "/ai/generateAsString3")public ChatCompletionResponse generateStreamAsString3(@RequestParam(value = "message") String message) {// 初始化 OkHttpClientOkHttpClient client = new OkHttpClient().newBuilder().build();okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");RequestBody requestBody = RequestBody.create(mediaType, "{\n" +"  \"messages\": [\n" +"    {\n" +"      \"content\": \"" + "请介绍一下你自己" + "\",\n" +  // 动态插入用户消息"      \"role\": \"user\"\n" +"    },\n" +"    {\n" +"      \"content\": \"" + message + "\",\n" +  // 动态插入用户消息"      \"role\": \"user\"\n" +"    }\n" +"  ],\n" +"  \"model\": \"deepseek-chat\",\n" +"  \"frequency_penalty\": 0,\n" +"  \"max_tokens\": 1024,\n" +"  \"presence_penalty\": 0,\n" +"  \"response_format\": {\n" +"    \"type\": \"text\"\n" +"  },\n" +"  \"stop\": null,\n" +"  \"stream\": false,\n" +"  \"stream_options\": null,\n" +"  \"temperature\": 1,\n" +"  \"top_p\": 1,\n" +"  \"tools\": null,\n" +"  \"tool_choice\": \"none\",\n" +"  \"logprobs\": false,\n" +"  \"top_logprobs\": null\n" +"}");Buffer buffer = new Buffer();try {requestBody.writeTo(buffer);System.out.println("Request Body Content: " + buffer.readUtf8());} catch (IOException e) {e.printStackTrace();}// 创建 HeadersHeaders headers = new Headers.Builder().add("Content-Type", "application/json").add("Accept", "application/json").add("Authorization", "Bearer " + config.getDeepSeekConfigUrl())  // 使用您的 API 密钥.build();// 创建 HttpUrlHttpUrl url = HttpUrl.parse(config.getDeepSeekConfigHost());if (url == null) {throw new IllegalArgumentException("您此时未携带URL参数");}// 构造 Requestokhttp3.Request request = new okhttp3.Request.Builder().url(url).post(requestBody).headers(headers).build();// 执行请求并打印响应try (Response response = client.newCall(request).execute()) {String responseBody = response.body().string();System.out.println(responseBody);ChatCompletionResponse responseVo = JSON.parseObject(responseBody, ChatCompletionResponse.class);return responseVo;} catch (IOException e) {throw new RuntimeException(e);}}

 四、返回结果

1.流式结果

 2.非流式请求


总结

因为我使用的是JDK21,不过你也可以使用JDK8去做这件事情,但是前提fastjson和okHttp的版本,因为有些方法可能不是很兼容,如果想要完成可能有一些方法需要替换一下,但是肯定是可以用的


http://www.ppmy.cn/devtools/154535.html

相关文章

【小白学AI系列】NLP 核心知识点(六)Softmax函数介绍

Softmax 函数 Softmax 函数是一种常用的数学函数&#xff0c;广泛应用于机器学习中的分类问题&#xff0c;尤其是在神经网络的输出层。它的主要作用是将一个实数向量“压缩”成一个概率分布&#xff0c;使得所有输出的值在 0 到 1 之间&#xff0c;并且总和为 1。换句话说&…

[免费]基于Python的Django博客系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的Django博客系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展&#xff0c;信息的传播与…

基于Django的个人博客系统的设计与实现

【Django】基于Django的个人博客系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统采用Python作为主要开发语言&#xff0c;结合Django框架构建后端逻辑&#xff0c;并运用J…

基于nodejs+json+websocket+html的聊天应用

实现 html <html lang"zh-CN"><head><meta charset"UTF-8"><title>Instant Messaging</title><!-- 引入Bootstrap CSS --><link href"https://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/css/bootstrap.min.…

【8】思科IOS AP升级操作

1.概述 本文主要针对思科AP的升级操作进行记录,思科的AP目前主要分为IOS和COS AP,IOS AP是我们常见的AP3502/AP1602/AP2702等等型号的AP,而COS AP是AP2802/3802等型号的AP。当然这里所指的都是一些室内AP,如AP1572等室外AP也同样适用。本文先对IOS AP的升级操作进行总结,…

π0:仅有3B数据模型打通Franka等7种机器人形态适配,实现0样本的完全由模型自主控制方法

Chelsea Finn引领的Physical Intelligence公司&#xff0c;专注于打造先进的机器人大模型&#xff0c;近日迎来了一个令人振奋的里程碑。在短短不到一年的时间内&#xff0c;该公司成功推出了他们的首个演示版本。这一成就不仅展示了团队的卓越技术实力&#xff0c;也预示着机器…

MongoDB平替数据库对比

背景 项目一直是与实时在线监测相关&#xff0c;特点数据量大&#xff0c;读写操作大&#xff0c;所以选用的是MongoDB。但按趋势来讲&#xff0c;需要有一款国产数据库可替代&#xff0c;实现信创要求。选型对比如下 1. IoTDB 这款是由清华大学主导的开源时序数据库&#x…

微服务学习-Nacos 配置中心实战

1. Nacos 配置中心配置方法的变化 在 SpringBoot2.4 这个大版本中一项非常重要的改动&#xff1a;出于对云原生多配置文件的支持&#xff0c;默认关闭了对 bootstrap.yml 的使用。 解决方案&#xff1a; 方案一&#xff1a;重新启用 bootstrap.yml&#xff08;不推荐&#x…