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

SpringBoot調(diào)用DeepSeek?API的完整操作指南

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

1. 項(xiàng)目依賴

在 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. 項(xiàng)目結(jié)構(gòu)

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. 完整代碼實(shí)現(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 請(qǐng)求/響應(yīng)模型

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 服務(wù)類 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ǐng)輸入您的問題 (輸入 q 退出): ");
                String question = scanner.nextLine().trim();

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

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

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

                StringBuilder fullResponse = new StringBuilder();
                responseFlux
                    .doOnNext(chunk -> {
                        System.out.print(chunk);
                        fullResponse.append(chunk);
                    })
                    .doOnComplete(() -> {
                        // 保存完整回復(fù)
                        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 主應(yīng)用類 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 關(guān)鍵特性

使用 Spring WebFlux 的響應(yīng)式編程模型

流式處理 API 響應(yīng)

文件記錄對(duì)話

錯(cuò)誤處理和異常管理

4.2 主要組件

DeepSeekConfig: 管理 API 配置

DeepSeekService: 處理對(duì)話邏輯和 API 交互

模型類: 定義請(qǐng)求和響應(yīng)結(jié)構(gòu)

5. 使用方法

替換 application.properties 中的 YOUR_API_KEY

運(yùn)行 DeepSeekApplication

在控制臺(tái)輸入問題

輸入 ‘q’ 退出程序

查看 conversation.txt 獲取對(duì)話記錄

6. 性能和可擴(kuò)展性

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

靈活的配置管理

易于擴(kuò)展和定制

7. 注意事項(xiàng)

確保正確配置 API Key

處理網(wǎng)絡(luò)異常

注意內(nèi)存使用

總結(jié)

Spring Boot 實(shí)現(xiàn)提供了一個(gè)健壯、可擴(kuò)展的 DeepSeek API 調(diào)用方案,利用響應(yīng)式編程提供高效的流式對(duì)話體驗(yàn)。

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

相關(guān)文章

  • Java引用隊(duì)列和虛引用實(shí)例分析

    Java引用隊(duì)列和虛引用實(shí)例分析

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

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

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

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

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

    Java必備知識(shí)之位運(yùn)算及常見進(jìn)制解讀

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

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

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

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

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

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

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

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

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

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

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

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

    在使用FeignClient進(jìn)行GET請(qǐng)求時(shí),如果參數(shù)接收不到,通常是因?yàn)镕eign默認(rèn)將參數(shù)綁定為@RequestBody,而GET請(qǐng)求無(wú)法包含請(qǐng)求體,解決方法是在Feign接口中為參數(shù)添加@RequestParam注解,或者在SpringMVC的Controller中使用@RequestBody接收參數(shù)
    2024-11-11

最新評(píng)論

宝兴县| 无极县| 海原县| 灌南县| 城固县| 揭阳市| 淳安县| 昭通市| 慈利县| 江山市| 钟山县| 宿松县| 新邵县| 刚察县| 海淀区| 潢川县| 牟定县| 安达市| 遂昌县| 武穴市| 永昌县| 望江县| 安阳市| 夏邑县| 舞钢市| 漳平市| 沂南县| 苍溪县| 乐山市| 凌云县| 开远市| 大英县| 长沙县| 兴化市| 五常市| 横山县| 梅州市| 汕头市| 舒城县| 天津市| 岑溪市|