用deepseek4j开发私有大模型知识库

news/2025/2/24 7:08:24/文章来源:https://www.cnblogs.com/liucs/p/18718067

DeepSeek R1 凭借其强大的思维链能力在开发者中广受欢迎,但 Spring AI 等主流框架对其支持不足,特别是在思维链内容保留和流式输出方面存在诸多限制。deepseek4j 1.4 版本重磅发布支持向量模型等重要更新。

背景

deepseek4j 提供了一套强大的 API,涵盖了 Reasoner、Function Calling、JSON 解析等特性。本工具旨在简化 DeepSeek API 的集成,让开发者能够快速调用相关能力并集成到自己的应用中。然而,DeepSeek 官方并未提供向量模型,因此本工具在最初设计时未考虑向量搜索的集成。

现状

  • deepseek4j 已全面支持 DeepSeek 的 Reasoner、Function Calling、JSON 解析等功能。
  • R1 模型的私有知识库需求正在增长,许多开发者希望在 DeepSeek 之上实现私有知识库。

经过深入的技术方案评估,我们选择了一个优雅的解决方案:通过兼容 OpenAI 协议标准来集成向量模型能力。这种方案具有以下优势:

  1. 零额外依赖:无需引入新的依赖包,保持框架轻量
  2. 完美兼容性:与现有架构无缝衔接,确保向后兼容
  3. 标准化接入:采用业界通用的 OpenAI 协议,降低学习成本

快速上手

本文章将带领大家从零开始构建一个基础 RAG 系统。通过白盒编码的方式,不仅能深入理解 RAG 的核心原理,还可以根据实际需求灵活调整和优化各个环节。相比直接使用现有的开源 RAG 产品,这种方式能让我们更好地掌控系统行为,实现更精准的知识检索和问答效果。

 1. 环境准备

在开始构建 RAG 系统之前,我们需要准备以下环境:

1.1 Ollama 模型准备

首先安装 Ollama,然后下载以下必要的模型:

# 下载推理模型 - 用于理解和生成回答
ollama run deepseek-r1:14b# 下载向量模型 - 用于文本向量化
ollama run bge-m3:latest

1.2 向量数据库准备

这里使用 Milvus 作为向量数据库,你可以选择以下两种方式之一进行安装:

方式一:使用 milvus 测试环境

  • 访问 Zilliz Cloud 中文版:https://cloud.zilliz.com.cn

  •  获取连接信息(后续配置需要用到)

方式二:Docker 安装

# 1. 下载安装脚本
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh

# 2. 启动 Docker 容器
bash standalone_embed.sh start
  • 初始化向量数据:创建本次知识库存储、获取链接信息和表信息:

 1.3 项目依赖

在你的 Maven 项目中添加以下依赖:

<dependency><groupId>io.github.pig-mesh.ai</groupId><artifactId>deepseek-spring-boot-starter</artifactId><version>1.4.0</version>
</dependency>
<!-- 链接 milvus SDK-->
<dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.5.3</version>
</dependency>

application.yml 配置:

# 推理模型链接信息
deepseek:base-url: http://127.0.0.1:11434/v1model: deepseek-r1:14bapi-key: ollama-local
# 向量模型链接信息
embedding:api-key: ${deepseek.api-key}base-url: ${deepseek.base-url}model: bge-m3:latest

2. 初始化私有知识

在构建 RAG 系统时,第一步是将已有的知识内容转换为向量形式并存储到向量数据库中。

2.1 创建链接 链接客户端

// 1. Connect to Milvus server
ConnectConfig connectConfig = ConnectConfig.builder().uri(CLUSTER_ENDPOINT) // 1.2 获取的 Milvus 链接端点.token(TOKEN)  // 1.2 获取的 Milvus 链接信息
        .build();MilvusClientV2 milvusClientV2 = new MilvusClientV2(connectConfig);

2.2 准备资料并向量化上传

以下示例为了节约篇幅,以处理纯文本资料。对于 Office 文档、图片、PDF、音视频等其他格式的文件处理,deepseek4j 提供了完整的解决方案。

 

@Autowired
EmbeddingClient embeddingClient;{// 这里以2025最新的我司保密条例演示,可以换成你自己的String law = FileUtil.readString("/Users/lengleng/Downloads/law.txt", Charset.defaultCharset());String[] lawSplits = StrUtil.split(law, 400);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("deepseek4j_test").data(data).build();milvusClientV2.insert(insertReq);
}

3. 创建 RAG 接口

@GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ChatCompletionResponse> chat(String prompt) {MilvusClientV2 milvusClientV2 = new MilvusClientV2(connectConfig);List<Float> floatList = embeddingClientOptional.get().embed(prompt);SearchReq searchReq = SearchReq.builder().collectionName("deepseek4j_test").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:14b").addUserMessage(String.format("你要根据用户输入的问题:%s \n \n 参考如下内容: %s  \n\n 整理处理最终结果", prompt, resultList)).build();
return deepSeekClient.chatFluxCompletion(request); }

前端测试

 

总结

本文通过以下核心步骤快速构建了基础 RAG 系统:

  1. 环境准备:部署推理模型和向量模型
  2. 知识库构建:向量化存储
  3. 检索增强:通过语义搜索获取关联知识
  4. 推理生成:结合上下文生成最终回答

要让 RAG 系统达到生产可用水平,每个环节都需要进一步优化和完善:

  1. 检索策略优化:结合关键词和语义的混合检索,提高召回准确度
  2. 重排序优化:对检索结果进行二次排序,确保最相关内容排在前面
  3. 提示词工程:优化 Prompt 模板,引导模型生成更准确的回答
  4. 知识库管理:定期更新和维护知识库,保证数据时效性
  5. 性能调优:优化向量检索和模型推理的性能

更多高级特性和最佳实践可以参考 :

  官方文档:https://javaai.pig4cloud.com/deepseek

  问题反馈:https://github.com/pig-mesh/deepseek4j

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单的tcp客户端协议1.0

先添加包代码部分: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using STTech.BytesIO.Co…

【OpenAISK】:实现自己的问答机器人

前ChatGPT让人惊叹的是,它好像有了真人的思维逻辑,能记住上下文,还能很融洽地和你聊天,并且回答问题让你满意。但如果你问他一些自己身边事,或者公司最新产品的事,ChatGPT的回复就天马行空了。怎么才能让他成为自己的问答机器人呢?下面给出了一个简单的事例,一起看一下…

Windows的MySQL数据库升级(安装器方式)

1、背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 。 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞。 因为 MySQL 的官方补丁,需要 Oracle 的 si 码(Support Identifier),不是免费的。 因此,只好将旧版本(5.7.33)升级到没有漏洞的新版本(5.7.44)…

OpenAISK】:SemanticKernel简说

OpenAI全身是有原生API的,也有一些开源的库,不过都是简单对原生API的封装,这个系统主要通过SemanticKernel来使用OpenAI。SemanticKernel简单称SK,是一个轻量级的使用OpenAI和Azure AI的SDK。利用SK可以更轻松,便捷的使用AI的能力,同时,它还提供编排的能力,使AI与本地服…

[开源] 分享一个自己开发的, 整合SMS/Mail/Telegram/微信四个平台的信息收发平台

起因于已有的聚合信息发送平台无法满足自己的需求. 不支持我需要的平台,或不支持接收信息后进行处理,或不放心把涉及隐私的消息通过第三方平台发送利用SMS发送短信(上一篇文章中分享的开源项目) 利用SMTP/IMAP收发邮件 利用Telegram Bot收发消息 利用企业微信应用收发消息 Web界…

[开源] 分享一个自己开发的记账工具

起因于没找到符合自己需求的记账工具, 于是写了一个多用户 自定义银行,货币类型,银行卡类型 保存银行卡信息 自定义汇率 自定义交易分类(收入/支出/转账/兑换下的子分类 创建钱包, 以及钱包下的划分, 每个划分绑定到某张银行卡 创建愿望单, 与钱包功能一致 创建债务, 与钱包功能…

chatGPT助力医保接口开发

在下面的文章中,用到反射来设计医保接口,因为国内的医保接口有一个特点,就是接口基本是统一的,接中传的数据是有一定规律的,这样方便对接后业务级的升级扩展,所以在对接医保接口时,就很容易用OOP来设计一个微框架来对应。用反射开发医保接口桂素伟,公众号:桂迹 .NET架…

BUUCTF-PWN-[第五空间2019 决赛]PWN5

学到一个新的做法,在每次分析前,先使用checksec来检查程序是否有特定的保护这里我们可以看到程序开启了NX和Canary保护:NX保护,实际上就是将数据段,设为仅对代码段可见,操作者无法对数据段中的内容进行修改,也不能被执行 Canary保护,会在栈帧中(一般是返回地址之前)插…

vxe-table grid 4.11+ 和 3.13+ 使用展开行详解

vxe-table 使用展开行的两种模式详解, vxe-table 4.11+ v3.13+展开内容支持两种方式,固定和内嵌,其中默认的固定模式是全功能的,内嵌模式不支持虚拟滚动。 官网:https://vxetable.cn 固定模式固定模式,渲染性能最好,支持冻结列、虚拟滚动和单元格选择等 <template>…

【后端】简化部署交互设计方案V2

一、部署流程 1.1 按需获取安装包 获取安装包和校验码,并校验安装包的完整性。 1.2 配置安装和升级部署 解压安装包,配置必要的参数(例如IP和主机名等),然后执行安装工具进行安装,如果授权码有误,则会退出安装。安装的时候会根据当前已经安装的版本情况,让用户选择升级…

【后端】简化部署设计方案V2——技术实现方案

一、安装部署核心内容包的结构 部署核心内容包包含了对操作系统的优化、中间件的安装配置和子平台的安装配置等类型。 1.1 现有交互式部署工具V1的小组件部署结构 目前的交互式部署工具V1进行细化的部署工作,V1工具为每个组件定义了完整的部署逻辑,同时V1工具也为每一个可变参…

最大连续和(单调队列dp)

这道题对取最大值的地方有要求,要先取最大值再入队