当前位置: 首页 > news >正文

基于SpringBoot的DeepSeek-demo 深度求索-demo 支持流式输出、历史记录

文章目录
    • 文件下载
    • 效果展示
      • Idea
      • Python
      • Postman
    • 使用说明
    • 核心代码
      • controller
      • Service

文件下载

百度网盘 提取码: jsfc

蓝奏云 密码:5kxz

效果展示

Idea

Python

Postman

注:postman中只有websocket才有流式效果

使用说明

  • 修改配置文件

  • 请求路径为/chat

  • 在请求体中传入对话列表(可以携带对话的历史记录)

    [ { "content": "你是一个乐于助人的助手。", "role": "system" }, { "content": "记住a=1,b=2", "role": "user" }, { "content": "好的,我已经记住了:**a = 1**,**b = 2**。如果有其他问题或需要进一步帮助,请告诉我! ??", "role": "assistant" }, { "content": "a + b等于什么", "role": "user" } ] 响应结果如下: 根据我记住的 **a = 1** 和 **b = 2**,**a + b = 1 + 2 = 3**。 结果是 **3**!还有其他问题吗? ??

核心代码

controller
import com.deepseek.deepseekdemo.service.AiChatService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; import reactor.core.scheduler.Schedulers; import java.util.List; import java.util.Map; @RestController public class AiChatController { @Autowired private AiChatService aiChatService; @GetMapping(value = "/chat", produces = "application/stream+json") public Flux<String> chat(@RequestBody List<Map<String, String>> messages) { Flux<String> responseFlux = aiChatService.chat(messages); return Flux.create(sink -> { responseFlux.subscribeOn(Schedulers.boundedElastic()) .subscribe( sink::next, // 返回流式字符串 sink::error, // 返回错误,请在调用端完成错误处理 sink::complete // 返回完成事件 ); }); } }
Service
import com.deepseek.deepseekdemo.config.DeepSeekConfig; import com.deepseek.deepseekdemo.dto.AiMessageDto; import com.deepseek.deepseekdemo.dto.DefaultAiMessageDto; import com.deepseek.deepseekdemo.dto.StreamingAiMessageDto; import com.deepseek.deepseekdemo.service.AiChatService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @Service public class AiChatServiceA implements AiChatService { Map<String, Object> body = new HashMap<>(); Headers headers; AiMessageDto aiMessageDto; @Autowired private DeepSeekConfig deepSeekConfig; @Autowired private OkHttpClient httpClient; // 初始化 @PostConstruct public void init() { body.put("model", deepSeekConfig.getModel()); body.put("frequency_penalty", deepSeekConfig.getFrequencyPenalty()); body.put("max_tokens", deepSeekConfig.getMaxTokens()); body.put("presence_penalty", deepSeekConfig.getPresencePenalty()); body.put("response_format", deepSeekConfig.getResponseFormat()); body.put("stop", deepSeekConfig.getStop()); body.put("stream", deepSeekConfig.getStream()); if (deepSeekConfig.getStream()) { body.put("stream_options", deepSeekConfig.getStreamOptions()); } body.put("temperature", deepSeekConfig.getTemperature()); body.put("top_p", deepSeekConfig.getTopP()); body.put("tools", deepSeekConfig.getTools()); body.put("tool_choice", deepSeekConfig.getToolChoice()); if (deepSeekConfig.getLogprobs()) { body.put("logprobs", deepSeekConfig.getLogprobs()); body.put("top_logprobs", deepSeekConfig.getTopLogprobs()); } // 构建请求头 headers = new Headers.Builder().add("Authorization", "Bearer " + deepSeekConfig.getApiKey()).add("Content-Type", "application/json").build(); if (deepSeekConfig.getStream()) { aiMessageDto = new StreamingAiMessageDto(); } else { aiMessageDto = new DefaultAiMessageDto(); } } @Override public Flux<String> chat(List<Map<String, String>> question) { body.put("messages", question); // 将请求体转换为 JSON 字符串 ObjectMapper objectMapper = new ObjectMapper(); String payload; try { payload = objectMapper.writeValueAsString(body); } catch (JsonProcessingException e) { throw new RuntimeException("无法将负载转换为JSON", e); } // 构建请求 Request request = new Request.Builder().url(deepSeekConfig.getUrl()).post(RequestBody.create(payload, MediaType.parse("application/json"))).headers(headers).build(); // 返回 Flux<String> 以流式返回数据 return Flux.create(emitter -> { try (Response response = httpClient.newCall(request).execute()) { if (!response.isSuccessful()) { emitter.error(new IOException("请求失败响应码: " + response.code())); return; } // 处理流式响应 ResponseBody responseBody = response.body(); if (responseBody != null) { while (!responseBody.source().exhausted()) { String line = responseBody.source().readUtf8Line(); if (line != null && !line.isEmpty()) { try { emitter.next(aiMessageDto.getMessage(line)); // 逐步发送数据 } catch (Exception e) { log.error("处理数据时发生错误: ", e); } } } emitter.complete(); // 完成流 } } catch (IOException e) { emitter.error(e); } }); } }
http://www.jsqmd.com/news/458331/

相关文章:

  • Flutter 组件 clipper2 适配鸿蒙 HarmonyOS 实战:高性能几何裁剪,构建工业级多边形布尔运算与路径治理架构
  • 【Linux网络】传输层协议UDP
  • 2026年忻州源头钢结构厂家价格大揭秘,按需定制费用多少? - 工业品网
  • Linux camera驱动开发(ARM、FPGA、DDR共享总线)
  • Linux将多条指令合并为一条执行
  • C++多态:动态绑定的核心机制
  • 初识MySQL · 库的操作
  • 细聊2026年科学仪器展会服务,实验室仪器展会怎么选择靠谱的 - 工业品牌热点
  • Flutter 组件 native_shuttle 的适配 鸿蒙Harmony 实战 - 驾驭极致原生通讯性能、实现鸿蒙端 Dart 与 ArkTS 之间的高频底层穿梭方案
  • Flutter 组件 conventional 适配鸿蒙 HarmonyOS 实战:约定式提交标准,构建自动化版本治理与 CI/CD 质量治理架构
  • 本地GEO推广好用吗,湖南有哪些值得推荐的渠道商 - 工业设备
  • 基于Spring Cloud的电商系统设计与实现——用户与商品模块的研究(上)
  • Harmonyos应用示例40. 复习和关联:知识网络图
  • 【Linux】Linux第一个小程序 - 进度条
  • 从实验室到万吨产线:青岛福尔蒂以校企联合将博士论文转化为抗静电母粒量产方案
  • 用实力说话!降AIGC软件 千笔AI VS 文途AI,本科生专属推荐
  • 5 分钟手把手教你打造 AI 知识库!附 OpenClaw「龙虾」养成指南(建议收藏)
  • 存储过程(SQL)
  • openclaw 常用命令
  • 【Linux】深入浅出 Linux 自动化构建:make 与 Makefile 的实用指南
  • C语言进阶指南(类型转换、整型提升)
  • 显卡(Graphics Processing Unit,GPU)架构详细解读
  • 学生成绩管理系统(MySQL)
  • 基于Spring Cloud的电商系统设计与实现——用户与商品模块的研究(下)
  • 完美解决org.mybatis.spring.MyBatisSystemException nested exception is org.apache.ibatis.reflection.Refl
  • 【C语言-第33章 标准输入输出】-002篇
  • 深度解析 Android 开发(影像类 APP 方向)职位:技术全景、面试指南与职业进阶
  • 最新SQL Server 2022保姆级安装教程【附安装包】
  • 【C语言-第34章 字符与字符串的输入输出】-001篇
  • Flutter 组件 genkit 的适配 鸿蒙Harmony 实战 - 驾驭大模型开发套件、实现鸿蒙端 AI 智能流式响应与提示词工程自动化方案