最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot調用DeepSeek?API的完整操作指南

 更新時間:2025年02月10日 08:17:48   作者:老大白菜  
這篇文章主要為大家詳細介紹了SpringBoot調用DeepSeek?API的完整操作指南,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

1. 項目依賴

在 pom.xml 中添加以下依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
</dependencies>

2. 項目結構

deepseek-project/
├── src/main/java/com/example/deepseek/
│   ├── DeepSeekApplication.java
│   ├── config/
│   │   └── DeepSeekConfig.java
│   ├── model/
│   │   ├── ChatRequest.java
│   │   ├── ChatResponse.java
│   │   └── Message.java
│   └── service/
│       └── DeepSeekService.java
└── conversation.txt

3. 完整代碼實現(xiàn)

3.1 配置類 DeepSeekConfig.java

package com.example.deepseek.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
@Getter
public class DeepSeekConfig {
    @Value("${deepseek.api.url}")
    private String apiUrl;

    @Value("${deepseek.api.key}")
    private String apiKey;
}

3.2 請求/響應模型

Message.java:

package com.example.deepseek.model;

import lombok.Data;

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

ChatRequest.java:

package com.example.deepseek.model;

import lombok.Data;
import java.util.List;

@Data
public class ChatRequest {
    private String model = "deepseek-ai/DeepSeek-V3";
    private List<Message> messages;
    private boolean stream = true;
    private int max_tokens = 2048;
    private double temperature = 0.7;
    private double top_p = 0.7;
    private int top_k = 50;
    private double frequency_penalty = 0.5;
    private int n = 1;
    private ResponseFormat response_format = new ResponseFormat("text");

    @Data
    public static class ResponseFormat {
        private String type;
        
        public ResponseFormat(String type) {
            this.type = type;
        }
    }
}

ChatResponse.java:

package com.example.deepseek.model;

import lombok.Data;
import java.util.List;

@Data
public class ChatResponse {
    private List<Choice> choices;

    @Data
    public static class Choice {
        private Delta delta;
    }

    @Data
    public static class Delta {
        private String content;
    }
}

3.3 服務類 DeepSeekService.java

package com.example.deepseek.service;

import com.example.deepseek.config.DeepSeekConfig;
import com.example.deepseek.model.ChatRequest;
import com.example.deepseek.model.ChatResponse;
import com.example.deepseek.model.Message;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.Scanner;

@Service
@RequiredArgsConstructor
public class DeepSeekService {
    private final DeepSeekConfig config;
    private final WebClient.Builder webClientBuilder;
    private final ObjectMapper objectMapper = new ObjectMapper();

    public void startInteractiveChat() {
        try (Scanner scanner = new Scanner(System.in);
             PrintWriter fileWriter = new PrintWriter(new FileWriter("conversation.txt", true))) {

            while (true) {
                System.out.print("\n請輸入您的問題 (輸入 q 退出): ");
                String question = scanner.nextLine().trim();

                if ("q".equalsIgnoreCase(question)) {
                    System.out.println("程序已退出");
                    break;
                }

                // 保存問題
                saveToFile(fileWriter, question, true);

                // 發(fā)起對話請求
                Flux<String> responseFlux = sendChatRequest(question);

                StringBuilder fullResponse = new StringBuilder();
                responseFlux
                    .doOnNext(chunk -> {
                        System.out.print(chunk);
                        fullResponse.append(chunk);
                    })
                    .doOnComplete(() -> {
                        // 保存完整回復
                        saveToFile(fileWriter, fullResponse.toString(), false);
                        System.out.println("\n----------------------------------------");
                        fileWriter.println("\n----------------------------------------");
                        fileWriter.flush();
                    })
                    .blockLast();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private Flux<String> sendChatRequest(String question) {
        ChatRequest request = new ChatRequest();
        Message userMessage = new Message();
        userMessage.setRole("user");
        userMessage.setContent(question);
        request.setMessages(Collections.singletonList(userMessage));

        return webClientBuilder.build()
            .post()
            .uri(config.getApiUrl())
            .header("Authorization", "Bearer " + config.getApiKey())
            .header("Content-Type", "application/json")
            .bodyValue(request)
            .retrieve()
            .bodyToFlux(String.class)
            .filter(line -> line.startsWith("data: ") && !line.equals("data: [DONE]"))
            .map(line -> {
                try {
                    String jsonStr = line.substring(6);
                    ChatResponse response = objectMapper.readValue(jsonStr, ChatResponse.class);
                    return response.getChoices().get(0).getDelta().getContent();
                } catch (Exception e) {
                    return "";
                }
            })
            .filter(content -> !content.isEmpty());
    }

    private void saveToFile(PrintWriter fileWriter, String content, boolean isQuestion) {
        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        if (isQuestion) {
            fileWriter.printf("\n[%s] Question:\n%s\n\n[%s] Answer:\n", timestamp, content, timestamp);
        } else {
            fileWriter.print(content);
        }
        fileWriter.flush();
    }
}

3.4 主應用類 DeepSeekApplication.java

package com.example.deepseek;

import com.example.deepseek.service.DeepSeekService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class DeepSeekApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DeepSeekApplication.class, args);
        DeepSeekService deepSeekService = context.getBean(DeepSeekService.class);
        deepSeekService.startInteractiveChat();
    }
}

3.5 配置文件 application.properties

deepseek.api.url=https://api.siliconflow.cn/v1/chat/completions
deepseek.api.key=YOUR_API_KEY

4. 代碼詳解

4.1 關鍵特性

使用 Spring WebFlux 的響應式編程模型

流式處理 API 響應

文件記錄對話

錯誤處理和異常管理

4.2 主要組件

DeepSeekConfig: 管理 API 配置

DeepSeekService: 處理對話邏輯和 API 交互

模型類: 定義請求和響應結構

5. 使用方法

替換 application.properties 中的 YOUR_API_KEY

運行 DeepSeekApplication

在控制臺輸入問題

輸入 ‘q’ 退出程序

查看 conversation.txt 獲取對話記錄

6. 性能和可擴展性

使用響應式編程提高并發(fā)性能

靈活的配置管理

易于擴展和定制

7. 注意事項

確保正確配置 API Key

處理網(wǎng)絡異常

注意內(nèi)存使用

總結

Spring Boot 實現(xiàn)提供了一個健壯、可擴展的 DeepSeek API 調用方案,利用響應式編程提供高效的流式對話體驗。

到此這篇關于SpringBoot調用DeepSeek API的完整操作指南的文章就介紹到這了,更多相關SpringBoot調用DeepSeek API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java引用隊列和虛引用實例分析

    Java引用隊列和虛引用實例分析

    這篇文章主要介紹了Java引用隊列和虛引用,結合實例形式分析了java引用隊列和虛引用相關概念、原理與使用方法,需要的朋友可以參考下
    2019-08-08
  • Java中Stream的flatMap與map使用場景及區(qū)別詳解

    Java中Stream的flatMap與map使用場景及區(qū)別詳解

    這篇文章主要介紹了Java中Stream的flatMap與map使用場景及區(qū)別詳解,Stream 流式操作,一般用于操作集合即 List 一類的數(shù)據(jù)結構,簡單來說 Stream 的 map 使得其中的元素轉為另一種元素的映射(map)方法,需要的朋友可以參考下
    2024-01-01
  • Java封裝數(shù)組之添加元素操作實例分析

    Java封裝數(shù)組之添加元素操作實例分析

    這篇文章主要介紹了Java封裝數(shù)組之添加元素操作,結合實例形式分析了Java封裝數(shù)組實現(xiàn)元素追加、插入等相關操作技巧,需要的朋友可以參考下
    2020-03-03
  • Java必備知識之位運算及常見進制解讀

    Java必備知識之位運算及常見進制解讀

    從現(xiàn)代計算機中所有的數(shù)據(jù)二進制的形式存儲在設備中。即 0、1 兩種狀態(tài),計算機對二進制數(shù)據(jù)進行的運算(+、-、*、/)都是叫位運算,即將符號位共同參與運算的運算
    2021-10-10
  • Java?靜態(tài)機制之靜態(tài)變量、方法、代碼塊與類加載深入理解

    Java?靜態(tài)機制之靜態(tài)變量、方法、代碼塊與類加載深入理解

    本文全面解析了Java中static關鍵字的特性與應用,靜態(tài)機制使成員與類本身關聯(lián),包括靜態(tài)變量(存儲在方法區(qū),所有對象共享)、靜態(tài)方法(可通過類名直接調用,不能訪問實例成員)和靜態(tài)代碼塊(類加載時執(zhí)行),感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Hibernate中Session增刪改查操作代碼詳解

    Hibernate中Session增刪改查操作代碼詳解

    這篇文章主要介紹了Hibernate中Session增刪改查操作代碼詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Springboot使用JustAuth實現(xiàn)各種第三方登陸

    Springboot使用JustAuth實現(xiàn)各種第三方登陸

    本文主要介紹了Springboot使用JustAuth實現(xiàn)各種第三方登陸,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Java實現(xiàn)的分頁工具類與用法示例

    Java實現(xiàn)的分頁工具類與用法示例

    這篇文章主要介紹了Java實現(xiàn)的分頁工具類與用法,結合完整實例形式分析了java分頁工具類的定義、使用方法及相關操作技巧,需要的朋友可以參考下
    2019-10-10
  • scala 操作數(shù)據(jù)庫的方法

    scala 操作數(shù)據(jù)庫的方法

    這篇文章主要介紹了scala 操作數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • 解決FeignClient Get請求參數(shù)接收不到的問題

    解決FeignClient Get請求參數(shù)接收不到的問題

    在使用FeignClient進行GET請求時,如果參數(shù)接收不到,通常是因為Feign默認將參數(shù)綁定為@RequestBody,而GET請求無法包含請求體,解決方法是在Feign接口中為參數(shù)添加@RequestParam注解,或者在SpringMVC的Controller中使用@RequestBody接收參數(shù)
    2024-11-11

最新評論

永德县| 嵊州市| 辽宁省| 南郑县| 富阳市| 淄博市| 璧山县| 宜昌市| 普兰县| 冕宁县| 洛扎县| 迭部县| 阜宁县| 清原| 库伦旗| 上蔡县| 西盟| 西平县| 黑山县| 松桃| 西吉县| 南华县| 婺源县| 称多县| 陕西省| 巴东县| 广宁县| 资源县| 区。| 禄劝| 海门市| 秀山| 双江| 石城县| 兴宁市| 枣阳市| 许昌县| 若羌县| 泾阳县| 遂溪县| 高唐县|