springboot、deepseek4j、bge-m3和milvus
1、pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lee</groupId><artifactId>deepseektest</artifactId><version>0.0.1</version><name>deepseektest</name><description>deepseektest</description><properties><java.version>23</java.version><spring-ai.version>1.0.0-M5</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.github.pig-mesh.ai</groupId><artifactId>deepseek-spring-boot-starter</artifactId><version>1.4.5</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp-sse</artifactId><version>4.12.0</version></dependency><dependency><groupId>com.fasterxml.jackson</groupId><artifactId>jackson-bom</artifactId><version>2.12.4</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83_noneautotype</version></dependency><!-- 链接 milvus SDK--><dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.5.3</version></dependency></dependencies><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
2、配置文件
# 推理模型链接信息
deepseek.api-key=sk-bedafbqsexpyunwgfawojwcachflvafxxksdgszvdsahwtlu
deepseek.model=deepseek-r1:32b
deepseek.base-url=http://172.16.50.25:11434/v1
# 向量模型链接信息
embedding.api-key=sk-bedafbqsexpyunwgfawojwcachflvafxxksdgszvdsahwtlu
embedding.base-url=http://172.16.50.25:11434/v1
embedding.model=bge-m3:latest
3、向量数据库 milvus代码
package com.lee.deepseektest.config;import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MilvusConfig {@Beanpublic MilvusClientV2 MilvusClientV2() {ConnectConfig config = ConnectConfig.builder().uri("http://xxx.xxx.xxx.xxx:19530").build();MilvusClientV2 client = new MilvusClientV2(config);return client;}
}
4、向量数据库插入数据
package com.lee.deepseektest.controller;import ch.qos.logback.core.util.FileUtil;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import io.github.pigmesh.ai.deepseek.core.EmbeddingClient;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.InsertReq;
import io.milvus.v2.service.vector.response.InsertResp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RestController
public class MilvusController {@AutowiredMilvusClientV2 milvusClientV2;@AutowiredEmbeddingClient embeddingClient;@GetMapping("/milvus")public String insert() {// 这里以 2025最新的我司保密条例演示,可以换成你自己的
// String law = FileUtil.readString("/Users/lengleng/Downloads/law.txt", Charset.defaultCharset());
// String[] lawSplits = StrUtil.split(law, 400);String[] lawSplits = new String[]{"高速公路", "航运"};List<JsonObject> data = new ArrayList<>();for (String lawSplit : lawSplits) {List<Float> floatList = embeddingClient.embed(lawSplit);JsonObject jsonObject = new JsonObject();// 将 List<Float> 转换为 JsonArrayJsonArray jsonArray = new JsonArray();for (Float value : floatList) {jsonArray.add(value);}jsonObject.add("vector", jsonArray);jsonObject.addProperty("text", lawSplit);data.add(jsonObject);}InsertReq insertReq = InsertReq.builder().collectionName("deepseek4jtest").data(data).build();InsertResp insertResp = milvusClientV2.insert(insertReq);System.out.println(insertResp.getInsertCnt());return "ok";}}
5、deepseek模型使用
package com.lee.deepseektest.controller;import io.github.pigmesh.ai.deepseek.core.DeepSeekClient;
import io.github.pigmesh.ai.deepseek.core.Json;
import io.github.pigmesh.ai.deepseek.core.chat.ChatCompletionChoice;
import io.github.pigmesh.ai.deepseek.core.chat.ChatCompletionRequest;
import io.github.pigmesh.ai.deepseek.core.chat.ChatCompletionResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;import java.util.HashMap;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;@RestController
public class DeepSeekController {@Autowiredprivate DeepSeekClient deepSeekClient;public final static HashMap<String, String> cache = new HashMap<>();Function<List<ChatCompletionChoice>, String> choicesProcess = list -> list.stream().map(e -> e.delta().content()).collect(Collectors.joining());Function<String, String> elt = s -> s.replaceAll("<think>[\\s\\S]*?</think>", "").replaceAll("\n", "");/*** 流式返回示例* @param prompt* @return*/@GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatCompletionResponse> chat(String prompt) {return deepSeekClient.chatFluxCompletion(prompt);}@GetMapping(value = "/sync/chat")public ChatCompletionResponse syncChat(String prompt) {ChatCompletionRequest request = ChatCompletionRequest.builder()// 根据渠道模型名称动态修改这个参数
// .model(deepSeekProperties.getModel()).addUserMessage(prompt).build();return deepSeekClient.chatCompletion(request).execute();}@GetMapping(value = "/chat/advanced", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatCompletionResponse> chatAdvanced(String prompt, String cacheCode) {ChatCompletionRequest request = ChatCompletionRequest.builder()
// .model(deepSeekProperties.getModel()).addUserMessage(prompt).addAssistantMessage(elt.apply(cache.getOrDefault(cacheCode, ""))).addSystemMessage("你是一个专业的助手").maxCompletionTokens(5000).build();// 只保留上一次回答内容cache.remove(cacheCode);return deepSeekClient.chatFluxCompletion(request).doOnNext(i -> {String content = choicesProcess.apply(i.choices());// 其他ELT流程cache.merge(cacheCode, content, String::concat);}).doOnError(e -> System.out.println(e.getMessage()));}}
6、deepseek4j官方文档
deepseek4j简介 - 零基础入门Java AI
7、测试推理过程
deepseek 调试
8、向量数据库中的collections在使用时必须要先加载
判断和加载向量数据库milvus中的collection
package com.lee.deepseektest.service;import io.milvus.param.R;
import io.milvus.param.collection.LoadCollectionParam;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.GetLoadStateReq;
import io.milvus.v2.service.collection.request.HasCollectionReq;
import io.milvus.v2.service.collection.request.LoadCollectionReq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MilvusService {@AutowiredMilvusClientV2 milvusClientV2;public boolean loadCollection(String collectionName) {//先判断是否有 collectionHasCollectionReq hasCollectionReq = HasCollectionReq.builder().collectionName(collectionName).build();boolean hasCollection = milvusClientV2.hasCollection(hasCollectionReq);//在判断是否已加载 collectionGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder().collectionName(collectionName).build();boolean hasLoad = milvusClientV2.getLoadState(getLoadStateReq);// 加载集合到内存LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder().collectionName(collectionName).build();milvusClientV2.loadCollection(loadCollectionReq);hasCollection = milvusClientV2.hasCollection(hasCollectionReq);return hasCollection;}
}
9、RAG接口
package com.lee.deepseektest.controller;import io.github.pigmesh.ai.deepseek.core.DeepSeekClient;
import io.github.pigmesh.ai.deepseek.core.EmbeddingClient;
import io.github.pigmesh.ai.deepseek.core.Json;
import io.github.pigmesh.ai.deepseek.core.chat.ChatCompletionChoice;
import io.github.pigmesh.ai.deepseek.core.chat.ChatCompletionRequest;
import io.github.pigmesh.ai.deepseek.core.chat.ChatCompletionResponse;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.request.data.FloatVec;
import io.milvus.v2.service.vector.response.SearchResp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;@RestController
public class DeepSeekController {@Autowiredprivate DeepSeekClient deepSeekClient;@AutowiredMilvusClientV2 milvusClientV2;@AutowiredEmbeddingClient embeddingClient;public final static HashMap<String, String> cache = new HashMap<>();Function<List<ChatCompletionChoice>, String> choicesProcess = list -> list.stream().map(e -> e.delta().content()).collect(Collectors.joining());Function<String, String> elt = s -> s.replaceAll("<think>[\\s\\S]*?</think>", "").replaceAll("\n", "");/*** 流式返回示例* @param prompt* @return*/@GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatCompletionResponse> chat(String prompt) {return deepSeekClient.chatFluxCompletion(prompt);}@GetMapping(value = "/sync/chat")public ChatCompletionResponse syncChat(String prompt) {ChatCompletionRequest request = ChatCompletionRequest.builder()// 根据渠道模型名称动态修改这个参数
// .model(deepSeekProperties.getModel()).addUserMessage(prompt).build();return deepSeekClient.chatCompletion(request).execute();}/*** 多轮会话* @param prompt* @param cacheCode* @return*/@GetMapping(value = "/chat/advanced", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatCompletionResponse> chatAdvanced(String prompt, String cacheCode) {ChatCompletionRequest request = ChatCompletionRequest.builder()
// .model(deepSeekProperties.getModel()).addUserMessage(prompt).addAssistantMessage(elt.apply(cache.getOrDefault(cacheCode, ""))).addSystemMessage("你是一个专业的助手").maxCompletionTokens(5000).build();// 只保留上一次回答内容cache.remove(cacheCode);return deepSeekClient.chatFluxCompletion(request).doOnNext(i -> {String content = choicesProcess.apply(i.choices());// 其他ELT流程cache.merge(cacheCode, content, String::concat);}).doOnError(e -> System.out.println(e.getMessage()));}/*** RAG知识库接口* @param prompt* @return*/@GetMapping(value = "/rag/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatCompletionResponse> ragchat(String prompt) {List<Float> floatList = embeddingClient.embed(prompt);SearchReq searchReq = SearchReq.builder().collectionName("test1").data(Collections.singletonList(new FloatVec(floatList))).outputFields(Collections.singletonList("text")).topK(3).build();SearchResp searchResp = milvusClientV2.search(searchReq);List<String> resultList = new ArrayList<>();List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();for (List<SearchResp.SearchResult> results : searchResults) {System.out.println("TopK results:");for (SearchResp.SearchResult result : results) {resultList.add(result.getEntity().get("text").toString());}}ChatCompletionRequest request = ChatCompletionRequest.builder()// 根据渠道模型名称动态修改这个参数.model("deepseek-r1:32b").addUserMessage(String.format("你要根据用户输入的问题:%s \n \n 参考如下内容: %s \n\n 整理处理最终结果", prompt, resultList)).build();return deepSeekClient.chatFluxCompletion(request);}
}
相关文章:
springboot、deepseek4j、bge-m3和milvus
1、pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …...
会话与会话管理:Cookie与Session的深度解析
一、什么是会话? 二、Cookie:客户端存储技术 1. Cookie的工作原理 2、在后端设置cookie 3、在前端设置cookie 三、浏览器开启了cookie禁用怎么办? 一、什么是会话? 会话(Session)是指一个用户与服务器之间…...
etcd部署硬件资源推荐
etcd部署硬件资源推荐 原文:https://etcd.io/docs/v3.5/op-guide/hardware/ etcd 通常在开发或测试环境中运行良好,即使资源有限;在笔记本电脑或廉价云服务器上开发时,使用 etcd 也很常见。然而,在生产环境中运行 etcd…...
MAVlink链路环境搭建并解决“ModuleNotFoundError: No module named ‘xxx’”问题
MAVlink链路常用于云台相机与飞控以及地面站之间的数据传输,搭建MAVlink链路环境需要安装Python、Future、MAVLink、pymavlink四样工具用于生成mavlink代码。 Python 直接从官网下载默认安装即可https://www.python.org/downloads/ 在电脑命令行进行安装验证&#x…...
ROS2软件调用架构和机制解析:Publisher创建
术语 DDS (Data Distribution Service): 用于实时系统的数据分发服务标准,是ROS 2底层通信的基础RMW (ROS Middleware): ROS中间件接口,提供与具体DDS实现无关的抽象APIQoS (Quality of Service): 服务质量策略,控制通信的可靠性、历史记录、…...
Android -- 使用Sharepreference保存List储存失败,原因是包含Bitmap,drawable等类型数据
1.报错信息如下: class android.content.res.ColorStateList declares multiple JSON fields named mChangingConfigurations 2.Bean类属性如下: data class AppInfoBean( val appName: String?, val appIcon: Drawable, val appPackage: String?,…...
java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类
(以下内容全部来自上述课程) 1.抽象类 父类定义抽象方法后,子类的方法就必须重写,抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样…...
Go - 泛型的使用
泛型的语法 泛型为Go语言添加了三个新的重要特性: 函数和类型的类型参数。将接口类型定义为类型集,包括没有方法的类型。类型推断,它允许在调用函数时在许多情况下省略类型参数。 类型参数 类型参数的使用 除了函数中支持类型参数列表外,…...
蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)
[NOIP 2007 普及组] 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始对这个荒岛…...
内容中台的企业CMS架构是什么?
企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计,通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档,也能生成高并发的营销落地页,配合版本控制机制确保内…...
算法题(81):询问学号
审题: 需要我们根据给出的n值确定录入数据个数,然后根据给出的数据存储学号。再根据m值确定需要输出的学号个数,然后根据数组内容输出学号 思路: 我们可以利用数组进行数据顺序存储,以及随机读取完成本题 由于学号最大为1e9&#…...
React antd的datePicker自定义,封装成组件
一、antd的datePicker自定义 需求:用户需要为日期选择器的每个日期单元格添加一个Tooltip,当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码,确保Tooltip正确显示,并且数据…...
C++ AVL树详解(含模拟实现)
目录 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的旋转(难点) AVL树的验证 AVL树的删除(本文不做具体的模拟实现) AVL树的性能 AVL树的模拟实现 AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索…...
Spring Boot 3.x 系列【3】Spring Initializr快速创建Spring Boot项目
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言安装JDK 17创建Spring Boot 项目 方式1:网页在线生成方式2&#…...
Elasticsearch:过滤 HNSW 搜索,快速模式
作者:来自 Elastic Benjamin Trent 通过我们的 ACORN-1 算法实现,探索我们对 Apache Lucene 中的 HNSW 向量搜索所做的改进。 多年来,Apache Lucene 和 Elasticsearch 一直支持使用 kNN 查询的过滤搜索,允许用户检索符合指定元数据…...
TCP长连接与短连接
TCP长连接与短连接 TCP(传输控制协议)中的长连接和短连接是两种不同的连接管理方式,各有优缺点: 短连接 短连接是指客户端与服务器完成一次数据交换后就断开连接。下次需要通信时,再重新建立连接。 特点࿱…...
【AI测试学习】AnythingLLM+Ollama+DeepSeek部署私人知识库
1.搭建DeepSeek大语言模型 1.1Ollama大预言模型部署 Ollama简化了大型语言模型的运行,让每个人都能在本地轻松体验AI的强大,打开浏览器-下载Ollama-输入命令-搞定,这是本地部署大语言模型的全新方式。 这里我们借助Ollama大预言模型部署工具进行搭建 官网如下:Ollama …...
防流、节抖、重绘、回流原理,以及实现方法和区别
防流、节抖、重绘、回流原理,以及实现方法和区别,还有就是为什么会出现这种情况? 防抖(Debounce) 原理 防抖就像是你坐电梯,如果你一直不停地按开门按钮,电梯不会每次都开门,而是…...
通义灵码插件安装入门教学 - IDEA(安装篇)
在开发过程中,使用合适的工具和插件可以极大地提高我们的工作效率。今天,我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件,这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者,本文都将为你提供…...
ES、OAS、ERP、电子政务、企业信息化(高软35)
系列文章目录 ES、OAS、ERP、电子政务、企业信息化 文章目录 系列文章目录前言一、专家系统(ES)二、办公自动化系统(OAS)三、企业资源规划(ERP)四、典型信息系统架构模型1.政府信息化和电子政务2.企业信息…...
用大白话解释缓存Redis +MongoDB是什么有什么用怎么用
Redis和MongoDB是什么? Redis:像你家的“小冰箱”,专门存高频使用的食物(数据)。它是基于内存的键值数据库,读写速度极快(每秒超10万次操作)。比如你每次打开手机App,用…...
华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径
华为数通Datacom(Data Communication)课程是华为认证体系中的核心方向之一,聚焦企业网络通信与数据通信技术,适合从事网络规划、部署和运维的人员。 一、数通Datacom课程体系 华为数通Datacom认证分为 三个级别,逐级递…...
PyTorch 的 nn.NLLLoss:负对数似然损失全解析
PyTorch 的 nn.NLLLoss:负对数似然损失全解析 在 PyTorch 的损失函数家族中,nn.NLLLoss(Negative Log Likelihood Loss,负对数似然损失)是一个不太起眼但非常重要的成员。它经常跟 LogSoftmax 搭配出现,尤…...
《数据安全架构设计与实战》的目录
《数据安全架构设计与实战》的目录如下1: 第一部分 安全架构基础 第 1 章 架构第 2 章 安全架构 2.1 什么是安全2.2 为什么使用 “数据安全” 这个术语2.3 什么是安全架构2.4 安全架构 5A 方法论2.5 安全架构 5A 与 CIA 的关系 第二部分 产品安全架构 …...
python-leetcode-删除并获得点数
740. 删除并获得点数 - 力扣(LeetCode) 解法 1:动态规划(O(n) 时间,O(n) 空间) class Solution:def deleteAndEarn(self, nums: List[int]) -> int:if not nums:return 0# 统计每个数的贡献points Cou…...
助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全
在数字化转型的浪潮中,越来越多的企业选择私有化部署AI技术,以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术,其技术可以支持企业私有化部署,企业需要一站式服务私有化部署,涵盖硬件采…...
Android JNI开发指南
了解Android JNI开发。首先,我需要回忆一下JNI的基本概念和作用。JNI允许Java代码与本地代码(如C/C)交互,这在需要高性能或者使用现有C/C库时非常有用。 接下来,我应该整理开发步骤。用户可能想知道如何开始ÿ…...
【每天认识一个漏洞】url重定向
🌝博客主页:菜鸟小羊 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 常见应用场景 主要是业务逻辑中需要进行跳转的地方。比如登录处、注册处、访问用户信息、订单信息、加入购物车、分享、收…...
纯代码实战--用Deepseek+SQLite+Ollama搭建数据库助手
如何用Python调用本地模型实现DeepSeek提示词模板:一步步教你高效解决13种应用场景 从零到一:纯代码联合PyQt5、Ollama、Deepseek打造简易版智能聊天助手 用外接知识库武装大模型:基于Deepseek、Ollama、LangChain的RAG实战解析 纯代码实战–…...
2025 最新版鸿蒙 HarmonyOS 开发工具安装使用指南
为保证 DevEco Studio 正常运行,建议电脑配置满足如下要求: Windows 系统 操作系统:Windows10 64 位、Windows11 64 位内存:16GB 及以上硬盘:100GB 及以上分辨率:1280*800 像素及以上 macOS 系统 操作系统…...
