SpringBoot 集成 DeepSeek 大模型——基于 OpenAI SDK 优雅实现

前言

DeepSeek 是深度求索推出的高性能大语言模型,其 API 接口完全兼容 OpenAI 协议,这意味着我们无需编写专属 SDK,直接使用成熟的 OpenAI Java SDK 即可快速集成,极大降低了开发成本。

本文将手把手带你实现 SpringBoot + OpenAI SDK + DeepSeek 的完整集成方案,支持流式/非流式对话、自定义模型参数等核心功能,开箱即用。

一、核心前提

  1. 已获取 DeepSeek API Key(前往 DeepSeek 开放平台 注册创建)
  2. SpringBoot 版本 ≥ 2.7.x(推荐 3.x)
  3. JDK 版本 ≥ 1.8

二、项目搭建与依赖引入

1. 创建 SpringBoot 项目

新建标准 SpringBoot 项目,引入Web 依赖(用于接口测试)。

2. 引入 OpenAI SDK

pom.xml 中添加官方 Java SDK,这是集成的核心依赖:

<dependencies>
    <!-- SpringBoot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- OpenAI Java SDK (兼容 DeepSeek) -->
    <dependency>
        <groupId>com.theokanning.openai-client</groupId>
        <artifactId>openai-java-client</artifactId>
        <version>0.18.0</version>
    </dependency>

    <!-- 工具类 -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.25</version>
    </dependency>
</dependencies>

三、配置文件编写

application.yml 中配置 DeepSeek 相关信息,重点修改 API Key 和接口地址

spring:
  application:
    name: deepseek-demo

# DeepSeek 配置 (兼容 OpenAI 协议)
deepseek:
  # 官方 API 地址
  api-host: https://api.deepseek.com
  # 你的 API Key
  api-key: sk-xxxxxxxxxxxxxxxxxxxxxxxx
  # 默认模型
  default-model: deepseek-chat

四、核心配置类开发

创建配置类,将 OpenAiService 注入 Spring 容器,实现全局复用:

import com.theokanning.openai.service.OpenAiService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

/**
 * DeepSeek 配置类 (基于 OpenAI SDK)
 */
@Configuration
public class DeepSeekConfig {

    @Value("${deepseek.api-host}")
    private String apiHost;

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

    /**
     * 注入 OpenAiService Bean
     */
    @Bean
    public OpenAiService openAiService() {
        // 自定义超时时间
        Duration timeout = Duration.ofSeconds(60);
        // 构建服务:传入 API Key + 自定义接口地址
        return new OpenAiService(apiKey, timeout, apiHost);
    }
}

五、业务层实现(非流式对话)

创建 Service 层,实现非流式大模型对话(一次性返回完整结果):

import com.theokanning.openai.completion.chat.ChatCompletionRequest;
import com.theokanning.openai.completion.chat.ChatMessage;
import com.theokanning.openai.completion.chat.ChatMessageRole;
import com.theokanning.openai.service.OpenAiService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * DeepSeek 业务实现
 */
@Service
public class DeepSeekService {

    @Resource
    private OpenAiService openAiService;

    @Value("${deepseek.default-model}")
    private String defaultModel;

    /**
     * 非流式对话:一次性返回完整回答
     * @param prompt 用户问题
     * @return 大模型回答
     */
    public String chat(String prompt) {
        // 1. 构建对话消息列表
        List<ChatMessage> messages = new ArrayList<>();
        // 添加用户消息
        messages.add(new ChatMessage(ChatMessageRole.USER.value(), prompt));

        // 2. 构建请求参数
        ChatCompletionRequest request = ChatCompletionRequest.builder()
                .model(defaultModel) // 模型名称
                .messages(messages)  // 对话内容
                .temperature(0.7)   // 随机性(0-2)
                .maxTokens(2000)    // 最大响应长度
                .build();

        // 3. 调用 DeepSeek API 并返回结果
        return openAiService.createChatCompletion(request)
                .getChoices().get(0)
                .getMessage()
                .getContent();
    }
}

六、控制层开发(接口暴露)

创建 Controller 提供 HTTP 接口,方便前端/测试调用:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * DeepSeek 接口控制器
 */
@RestController
@RequestMapping("/deepseek")
public class DeepSeekController {

    @Resource
    private DeepSeekService deepSeekService;

    /**
     * 非流式对话接口
     * @param prompt 用户问题
     * @return 回答结果
     */
    @GetMapping("/chat")
    public String chat(@RequestParam String prompt) {
        return deepSeekService.chat(prompt);
    }
}

七、进阶:流式对话实现(推荐)

流式对话可以逐字返回结果,提升用户体验,同样基于 OpenAI SDK 实现:

1. 流式 Service 方法

/**
 * 流式对话:逐字返回结果
 * @param prompt 用户问题
 * @return 流式响应字符串
 */
public String streamChat(String prompt) {
    List<ChatMessage> messages = new ArrayList<>();
    messages.add(new ChatMessage(ChatMessageRole.USER.value(), prompt));

    ChatCompletionRequest request = ChatCompletionRequest.builder()
            .model(defaultModel)
            .messages(messages)
            .temperature(0.7)
            .stream(true) // 开启流式输出
            .build();

    StringBuilder result = new StringBuilder();
    // 订阅流式响应
    openAiService.streamChatCompletion(request)
            .doOnError(Throwable::printStackTrace)
            .subscribe(chunk -> {
                // 获取流式返回的内容
                String content = chunk.getChoices().get(0).getMessage().getContent();
                if (content != null) {
                    result.append(content);
                }
            }).blockingAwait(); // 阻塞等待流式结束

    return result.toString();
}

2. 流式接口

@GetMapping("/stream-chat")
public String streamChat(@RequestParam String prompt) {
    return deepSeekService.streamChat(prompt);
}

八、接口测试

启动 SpringBoot 项目,访问接口:

  1. 非流式:http://localhost:8080/deepseek/chat?prompt=你好
  2. 流式:http://localhost:8080/deepseek/stream-chat?prompt=写一篇SpringBoot教程

正常情况下,会直接返回 DeepSeek 大模型的回答。

九、关键注意事项

  1. API 地址必须正确:DeepSeek 地址为 https://api.deepseek.com,不能使用 OpenAI 官方地址
  2. 模型名称:常用 deepseek-chat(对话模型)、deepseek-coder(代码模型)
  3. 权限问题:确保 API Key 有调用权限,且余额充足
  4. 超时设置:大模型响应较慢,建议超时时间 ≥ 60秒
  5. 流式响应:生产环境推荐结合 SSE 技术,实现前端实时展示打字效果

作 者:南烛
链 接:https://www.itnotes.top/archives/1423
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇