欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot或SpringAI對接DeepSeek大模型的詳細步驟

 更新時間:2025年02月13日 09:38:06   作者:無名指的等待712  
這篇文章主要介紹了DeepSeek智能助手的使用方法和步驟,包括引入庫、配置環(huán)境變量和配置,文章詳細描述了流式請求和非流式請求的實現(xiàn)方式,需要的朋友可以參考下

我看很多的博客內(nèi)容是流式請求雖然返回時正常的,但是他并不是實時返回,而是全部響應結(jié)束之后返回,是有問題的,我這里的這個方法彌補了這個缺陷

這里需要仔細看一下了

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

一、DeepSeek是什么?

我是由中國的深度求索(DeepSeek)公司開發(fā)的智能助手DeepSeek-V3。

  • 開發(fā)者:深度求索(DeepSeek),一家專注于實現(xiàn)AGI(通用人工智能)的中國科技公司。

  • 技術架構(gòu):基于大規(guī)模語言模型(LLM),通過深度學習技術訓練,具備自然語言理解、生成和推理能力。

  • 數(shù)據(jù)來源:訓練數(shù)據(jù)涵蓋多領域公開文本(如書籍、網(wǎng)頁、學術論文等),經(jīng)過嚴格清洗和過濾,符合倫理與安全規(guī)范。

二、使用步驟

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.配置環(huán)境變量

spring:
  ai:
    deepseek:
      api-key: 這里填寫自己的APIKey
      api-host: https://api.deepseek.com/chat/completions

3.配置

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.流式請求

@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 {
        // 初始化 OkHttpClient
        OkHttpClient client = new OkHttpClient().newBuilder().build();
        // 創(chuàng)建動態(tài)請求體,使用流式傳輸
        RequestBody body = new RequestBody() {
            @Override
            public okhttp3.MediaType contentType() {
                return okhttp3.MediaType.parse("application/json");
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {
                // 構(gòu)建請求體 JSON 數(shù)據(jù)
                String requestBodyJson = "{\n" +
                        "  \"messages\": [\n" +
                        "    {\n" +
                        "      \"content\": \"" + message + "\",\n" +  // 動態(tài)插入用戶消息
                        "      \"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" +
                        "}";
                // 寫入請求體數(shù)據(jù)
                sink.writeUtf8(requestBodyJson);
            }
        };
        // 創(chuàng)建 Headers
        Headers headers = new Headers.Builder()
                .add("Content-Type", "application/json")
                .add("Accept", "application/json")
                .add("Authorization", "Bearer " + config.getDeepSeekConfigUrl())  // 使用您的 API 密鑰
                .build();
        // 創(chuàng)建 HttpUrl
        HttpUrl url = HttpUrl.parse(config.getDeepSeekConfigHost()); // 使用您的 API URL
        if (url == null) {
            throw new IllegalArgumentException("您此時未攜帶URL參數(shù)");
        }
        // 構(gòu)造 Request
        okhttp3.Request request = new okhttp3.Request.Builder()
                .url(url)
                .post(body)  // 使用流式請求體
                .headers(headers)
                .build();
        // 執(zhí)行請求并返回 Flux 流
        return Flux.create(sink -> {
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {
                    // 異常發(fā)生時調(diào)用 sink.error()
                    sink.error(e);
                }
                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                    ResponseBody responseBody = response.body();
                    BufferedSource source = responseBody.source();
                    while (true) {
                        // 逐行讀取響應數(shù)據(jù)
                        String line = source.readUtf8Line();
                        if (line == null) {
                            break;
                        } else if (line.startsWith("data:")) {
                            String data = line.substring(5).trim();
                            // 檢查數(shù)據(jù)是否為結(jié)束信號"[DONE]"
                            if (!"[DONE]".equals(data)) {
                                // 解析接收到的數(shù)據(jù)為JSON對象
                                JSONObject jsonResponse = new JSONObject(data);
                                String finishReason = jsonResponse.getJSONArray("choices").getJSONObject(0).optString("finish_reason");
                                if ("stop".equals(finishReason)) {
                                    // 結(jié)束時推送數(shù)據(jù)并完成
                                    sink.next(data);
                                    sink.complete();
                                    break;
                                } else {
                                    // 否則繼續(xù)推送數(shù)據(jù)
                                    sink.next(data);
                                }
                                // 打印調(diào)試信息
                                System.out.println(jsonResponse.getJSONArray("choices"));
                            }
                        }
                    }
                }
            });
        });
    }

2.非流失請求

1.定義類

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
    @NoArgsConstructor
    public static class Choice {
        private int index;
        private Message message;
        private Object logprobs;
        private String finish_reason;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Message {
        private String role;
        private String content;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public 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
    @NoArgsConstructor
    public static class PromptTokensDetails {
        private int cached_tokens;
    }
}

2.非流式請求

//引入這個bean
@Resource
private ChatConfig config;
 
   @GetMapping(value = "/ai/generateAsString3")
    public ChatCompletionResponse generateStreamAsString3(@RequestParam(value = "message") String message) {
        // 初始化 OkHttpClient
        OkHttpClient client = new OkHttpClient().newBuilder().build();
        okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");
        RequestBody requestBody = RequestBody.create(mediaType, "{\n" +
                "  \"messages\": [\n" +
                "    {\n" +
                "      \"content\": \"" + "請介紹一下你自己" + "\",\n" +  // 動態(tài)插入用戶消息
                "      \"role\": \"user\"\n" +
                "    },\n" +
                "    {\n" +
                "      \"content\": \"" + message + "\",\n" +  // 動態(tài)插入用戶消息
                "      \"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();
        }
        // 創(chuàng)建 Headers
        Headers headers = new Headers.Builder()
                .add("Content-Type", "application/json")
                .add("Accept", "application/json")
                .add("Authorization", "Bearer " + config.getDeepSeekConfigUrl())  // 使用您的 API 密鑰
                .build();
        // 創(chuàng)建 HttpUrl
        HttpUrl url = HttpUrl.parse(config.getDeepSeekConfigHost());
        if (url == null) {
            throw new IllegalArgumentException("您此時未攜帶URL參數(shù)");
        }
        // 構(gòu)造 Request
        okhttp3.Request request = new okhttp3.Request.Builder()
                .url(url)
                .post(requestBody)
                .headers(headers)
                .build();
        // 執(zhí)行請求并打印響應
        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);
        }
    }

四、返回結(jié)果

1.流式結(jié)果

2.非流式請求

總結(jié)

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

到此這篇關于SpringBoot或SpringAI對接DeekSeek大模型的文章就介紹到這了,更多相關SpringBoot或SpringAI對接DeekSeek內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot 會員管理系統(tǒng)之處理文件上傳功能

    Spring Boot 會員管理系統(tǒng)之處理文件上傳功能

    Spring Boot會員管理系統(tǒng)的中,需要涉及到Spring框架,SpringMVC框架,Hibernate框架,thymeleaf模板引擎。這篇文章主要介紹了Spring Boot會員管理系統(tǒng)之處理文件上傳功能,需要的朋友可以參考下
    2018-03-03
  • Java 實現(xiàn)LZ78壓縮算法的示例代碼

    Java 實現(xiàn)LZ78壓縮算法的示例代碼

    這篇文章主要介紹了Java 實現(xiàn)LZ78壓縮算法的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • 1秒實現(xiàn)Springboot 圖片添加水印功能

    1秒實現(xiàn)Springboot 圖片添加水印功能

    這篇文章主要介紹了1秒實現(xiàn)Springboot 圖片添加水印功能,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 詳解SpringBoot容器的生命周期

    詳解SpringBoot容器的生命周期

    在使用SpringBoot進行開發(fā)時,我們經(jīng)常需要對Spring容器的生命周期進行了解和掌握,本文將介紹SpringBoot容器的生命周期,包括容器的創(chuàng)建、初始化、銷毀等過程,并提供相應的代碼示例
    2023-06-06
  • 解決IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題

    解決IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題

    這篇文章主要給大家解決了IDEA開發(fā)工具右側(cè)沒有Maven工具欄的問題,文中有詳細的解決步驟,如果有遇到一樣問題的小伙伴,可以參考閱讀本文
    2023-09-09
  • Jackson的用法實例分析

    Jackson的用法實例分析

    這篇文章主要介紹了Jackson的用法實例分析,用于處理Java的json格式數(shù)據(jù)非常實用,需要的朋友可以參考下
    2014-08-08
  • 詳解JVM虛擬機的類加載機制

    詳解JVM虛擬機的類加載機制

    這篇文章主要介紹了詳解JVM虛擬機的類加載機制,虛擬機把描述類的數(shù)據(jù)從 Class 文件加載到內(nèi)存,并對數(shù)據(jù)進行校驗、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型,這就是虛擬機的類加載機制,需要的朋友可以參考下
    2023-08-08
  • SpringMVC事件監(jiān)聽ApplicationListener實例解析

    SpringMVC事件監(jiān)聽ApplicationListener實例解析

    這篇文章主要介紹了SpringMVC事件監(jiān)聽ApplicationListener實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例

    Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例

    這篇文章主要介紹了Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例的相關資料,需要的朋友可以參考下
    2017-02-02
  • java郵件發(fā)送的實現(xiàn)

    java郵件發(fā)送的實現(xiàn)

    本篇是用于java來實現(xiàn)郵件的發(fā)送的實例代碼,基于smtp服務,有需要的可以參考一下。
    2016-10-10

最新評論