SpringBoot两种方式接入DeepSeek

news2025/2/25 17:10:44

方式一:基于HttpClient

步骤 1:准备工作

获取 DeepSeek API 密钥:访问 DeepSeek 的开发者平台,注册并获取 API 密钥。

步骤 2:引入依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

步骤 3:配置 DeepSeek API

配置参数:在 application.yml 文件里,把 DeepSeek 的 API 端点和密钥写进去:

在 application.properties 或 application.yml 中配置 DeepSeek 的 API 密钥和端点:

deepseek.api.key=sk-xxxxxxxxxx
deepseek.api.url=https://api.deepseek.com/v1/chat/completions

步骤 4:自定义  DeepSeek Client Service

(1)自定义请求头

public record DeepSeekRequest(
        String model,
        List<Message> messages,
        double temperature,
        int max_tokens
) {
    public record Message(String role, String content) {}
}

(2)自定义响应体

public record DeepSeekResponse(
        String id,
        String object,
        long created,
        String model,
        List<Choice> choices
) {
    public record Choice(
            int index,
            Message message,
            String finish_reason
    ) {
        public record Message(String role, String content) {}
    }
}

(3)service


import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@Service
public class DeepSeekService {

    @Value("${deepseek.api.url}")
    private String apiUrl;

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

    private final RestTemplate restTemplate;

    public DeepSeekService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    public String getChatResponse(String userMessage) {
        // 构造请求体
        DeepSeekRequest request = new DeepSeekRequest(
                "deepseek-chat",
                List.of(new DeepSeekRequest.Message("user", userMessage)),
                0.7,
                1000
        );

        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setBearerAuth(apiKey);

        HttpEntity<DeepSeekRequest> entity = new HttpEntity<>(request, headers);

        // 发送请求
        ResponseEntity<DeepSeekResponse> response = restTemplate.exchange(
                apiUrl,
                HttpMethod.POST,
                entity,
                DeepSeekResponse.class
        );

        // 处理响应
        if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
            return response.getBody().choices().get(0).message().content();
        }
        throw new RuntimeException("API请求失败: " + response.getStatusCode());
    }
}

请求体中可以指定:调整模型、温度、最大 token 数等

什么是温度(Temperature)?

温度是控制模型生成文本的“创造力”或“随机性”的一个参数。你可以把它想象成调节模型的“脑洞大小”。

  • 温度低(比如 0.1)

模型会变得非常保守,倾向于选择最确定、最安全的答案。

适合需要准确性和一致性的任务,比如回答事实性问题。

例子:问“1+1等于几?”,模型会回答“2”,不会瞎编。

  • 温度高(比如 1.0 或更高)

模型会变得更有创造力,可能会给出一些意想不到的回答。

适合需要创意或多样性的任务,比如写故事、生成诗歌。

例子:问“写一首关于秋天的诗”,模型可能会生成一些充满想象力的句子。

  • 温度适中(比如 0.7)

模型会在保守和创意之间找到一个平衡点。

适合大多数任务,既能保证一定的准确性,又能有一些变化。

总结

  • 温度低 → 模型像“学霸”,回答严谨但可能无聊。

  • 温度高 → 模型像“艺术家”,回答有趣但可能不靠谱。

  • 温度适中 → 模型像“聪明人”,回答既靠谱又有趣。

最大 token 数(Max Tokens)

token 是模型处理文本的基本单位,可以理解为一个词或一部分词。

比如:

  • 英文单词“hello”是一个 token。

  • 中文“你好”可能是两个 token(每个字一个 token)。

  • 长单词或复杂字符可能会被拆成多个 token。

最大 token 数就是限制模型生成的文本长度。可以把它想象成给模型一个“字数限制”。

  • 设置较小的最大 token 数(比如 50)

模型生成的文本会非常短,可能只回答问题的核心部分。

例子:问“介绍一下太阳系”,模型可能只回答“太阳系包括太阳和八大行星”。

  • 设置较大的最大 token 数(比如 500)

模型生成的文本会更长,可能会包含更多细节。

例子:问“介绍一下太阳系”,模型可能会详细描述每颗行星的特点。

  • 不设置最大 token 数

模型可能会一直生成文本,直到达到它的内部限制(通常是几千个 token)。

这可能会导致生成的文本过长,甚至跑题。

总结

  • 最大 token 数小 → 模型像“话少的人”,回答简短。

  • 最大 token 数大 → 模型像“话多的人”,回答详细。

  • 不设置最大 token 数 → 模型像“话痨”,可能会一直说个不停。

步骤 5:创建控制器

@RestController
@RequestMapping("/deepseek/chat")
public class DeepSeekController {
    private final DeepSeekService deepSeekService;

    public DeepSeekController(DeepSeekService deepSeekService) {
        this.deepSeekService = deepSeekService;
    }

    @PostMapping
    public ResponseEntity<?> chat(@RequestBody Map<String, String> request) {
        try {
            String response = deepSeekService.getChatResponse(request.get("message"));
            return ResponseEntity.ok(Collections.singletonMap("response", response));
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Collections.singletonMap("error", e.getMessage()));
        }
    }
}

方式二:基于spring-ai-openai

步骤基本一致,这里罗列几处实现代码

依赖:

<properties>
     <java.version>17</java.version>
     <spring-ai.version>1.0.0-M5</spring-ai.version>
</properties>
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependencyManagement>
    <dependencies>
        <dependency>
             <groupId>org.springframework.ai</groupId>
             <artifactId>spring-ai-bom</artifactId>
             <version>${spring-ai.version}</version>
             <type>pom</type>
             <scope>import</scope>
       </dependency>
    </dependencies>
</dependencyManagement>

DeepSeekConfig:

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DeepSeekConfig {
    @Bean
    public ChatClient chatClient(OpenAiChatModel openAiChatModel) {
        return ChatClient.builder(openAiChatModel).build();
    }
}

DeepSeekController:

import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.ai.chat.model.ChatResponse;

import java.util.ArrayList;
import java.util.List;


@RestController
@RequestMapping("/api")
public class ChatController {

    @Resource
    private OpenAiChatModel chatModel;

    private final List<Message> chatHistoryList = new ArrayList<>();

    @PostConstruct
    public void init() {
        chatHistoryList.add(new SystemMessage("You are a helpful assistant."));
    }

    @PostMapping("/chat")
    public ChatResponse test(@RequestBody String message) {
        chatHistoryList.add(new UserMessage(message));
        Prompt prompt = new Prompt(chatHistoryList);
        ChatResponse chatResponse = chatModel.call(prompt);
        if (chatResponse.getResult() != null && chatResponse.getResult().getOutput() != null) {
            chatHistoryList.add(chatResponse.getResult().getOutput());
        }
        return chatResponse;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2305942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven——Maven开发经验总结(1)

摘要 本文总结了 Maven 开发中的多个关键经验&#xff0c;包括如何根据版本号决定推送到 releases 或 snapshots 仓库&#xff0c;如何在构建过程中跳过测试&#xff0c;父项目如何控制子项目依赖版本&#xff0c;父项目依赖是否能传递到子项目&#xff0c;如何跳过 Maven dep…

gitlab 解决双重认证无法登录remote: HTTP Basic: Access denied.

问题&#xff1a;gitlab开启了双因素认证导致无法正常使用 如进行了 OAuth configuration 在进行git操作时如下提示 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access…

【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注

MAC一键删除PPT中的所有备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码&#xff0c;并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“清除当前文稿中的所有备注”&#xff0c;PPT中应用。 MAC没自带&#xff0c;需要自己配置 1.搜…

人工智能 阿里云算力服务器的使用

获取免费的阿里云服务器 阿里云免费使用地址&#xff1a; https://free.aliyun.com/ 选择 人工智能平台 PAI 选择交互式建模 再选建立实例。 选择对应的GPU 和镜像&#xff0c;点击确认。 注意&#xff1a;250个小时&#xff0c;用的时候开启&#xff0c;不用的时候关闭&…

硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库

文章目录 一、引言二、安装Ollama部署DeepSeekR1三、安装Docker四、安装使用RAGFlow4.1 系统架构4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 创建知识库4.6 创建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow构建个人知识库&#xff0c;通过将…

记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!

背景 为满足实验室横向项目需求&#xff0c;在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为&#xff1a;通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。 实现过程 调研 花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、…

pytorch入门级项目--基于卷积神经网络的数字识别

文章目录 前言1.数据集的介绍2.数据集的准备3.数据集的加载4.自定义网络模型4.1卷积操作4.2池化操作4.3模型搭建 5.模型训练5.1选择损失函数和优化器5.2训练 6.模型的保存7.模型的验证结语 前言 本篇博客主要针对pytorch入门级的教程&#xff0c;实现了一个基于卷积神经网络&a…

yolov12部署(保姆级教程)

yolov12部署 戳链接访问原论文论文地址 戳链接访问原代码代码地址 直接把源代码以ZIP的形式下载到本地&#xff0c;然后解压用IDE打开就可以了&#xff08;这一步比较简单不过多介绍&#xff09; 在IDE中打开可以看见一个README.md文件&#xff0c;这里有我们将yolov12部署本…

五、Three.js顶点UV坐标、纹理贴图

一部分来自1. 创建纹理贴图 | Three.js中文网 &#xff0c;一部分是自己的总结。 一、创建纹理贴图 注意&#xff1a;把一张图片贴在模型上就是纹理贴图 1、纹理加载器TextureLoader 注意&#xff1a;将图片加载到加载器中 通过纹理贴图加载器TextureLoader的load()方法加…

汽车零部件工厂如何通过ESD监控系统闸机提升产品质量

在汽车零部件工厂的生产过程中&#xff0c;静电带来的危害不容小觑。从精密的电子元件到复杂的机械部件&#xff0c;静电都可能成为影响产品质量的 “隐形杀手”。而 ESD 监控系统闸机的出现&#xff0c;为汽车零部件工厂解决静电问题、提升产品质量提供了关键的技术支持。 一、…

Pi币与XBIT:在去中心化交易所的崛起中重塑加密市场

在加密货币市场迅猛发展的背景下&#xff0c;Pi币和XBIT正在成为投资者关注的焦点。Pi币作为一项创新的数字货币&#xff0c;通过独特的挖矿机制和广泛的用户基础&#xff0c;迅速聚集了大量追随者&#xff0c;展示了强大的市场潜力。同时&#xff0c;币应XBIT去中心化交易所的…

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源&#xff08;Tushare、AkShare、Baostock、通联数据&#xff08;DataAPI&#xff09;&#xff09;&#xff0c;分析其特点与适用场景&#xff0c;并通过实战案例展示数据获取与处理的全流程。 &#x1f449; 点击关注不迷路 &#x1f449; 点击…

首次使用WordPress建站的经验分享(一)

之前用过几种内容管理系统(CMS),如:dedeCMS、phpCMS、aspCMS,主要是为了前端独立建站,达到预期的效果,还是需要一定的代码基础的,至少要有HTML、Css、Jquery基础。 据说WordPress 是全球最流行的内容管理系统CMS,从现在开始记录一下使用WordPress 独立建站的步骤 选购…

Mysql 主从集群同步延迟问题怎么解决

目录 前言&#xff1a; 复制过程分为几个步骤&#xff1a; 一、同步延迟的危害 二、同步延迟的常见原因 1. 主库写入压力过大 2. 网络传输瓶颈 3. 从库硬件性能不足 4. 配置参数不合理 5. 特殊操作影响 三、深度诊断方法 1. 查看同步状态 2. 性能分析工具 四、十大解…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 &#xff08;1&#xff09;提取较亮区域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

三、《重学设计模式》-单例模式

单例模式 单例模式分为四大类&#xff0c;饿汉式、懒汉式、静态内部类、枚举 饿汉式 优点&#xff1a;类装载时进行实例化&#xff0c;避免同步问题 缺点&#xff1a;造成内存浪费 实现一 1.构造器私有化 2.内部创建对象实例 3.提供静态方法 public class Type1 {public s…

SpringBoot3整合Swagger3时出现Type javax.servlet.http.HttpServletRequest not present错误

目录 错误详情 错误原因 解决方法 引入依赖 修改配置信息 创建文件 访问 错误详情 错误原因 SpringBoot3和Swagger3版本不匹配 解决方法 使用springdoc替代springfox&#xff0c;具体步骤如下&#xff1a; 引入依赖 在pom.xml文件中添加如下依赖&#xff1a; <…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…

【Java毕业设计】商城购物系统(附源码+数据库脚本)

本系统是基于JavaEEServletJSPMysql实现的商城购物系统。包括用户登录、用户注册、商品分类、添加购物车、订单支付等基本功能&#xff0c;具体页面及功能如下&#xff1a; 感谢阅读&#xff01; 如需获取完整项目源码及更多项目信息&#xff0c;可添加V&#xff1a;

POST请求提交数据的三种方式及通过Postman实现

1、什么是POST请求&#xff1f; POST请求是HTPP协议中一种常用的请求方法&#xff0c;它的使用场景是向客户端向服务器提交数据&#xff0c;比如登录、注册、添加等场景。另一种常用的请求方法是GET&#xff0c;它的使用场景是向服务器获取数据。 2、POST请求提交数据的常见编…