C9VBI23t6L 发表于 2025-2-14 02:33:57

十分钟手把手教学:用DeepSeek4j开发私有大模型知识库

背景

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


[*]deepseek4j 已全面支持 DeepSeek 的 Reasoner、Function Calling、JSON 解析等功能。
[*]R1 模型的私有知识库需求正在增长,许多开发者希望在 DeepSeek 之上实现私有知识库。
经过深入的技术方案评估,我们选择了一个优雅的解决方案:通过兼容 OpenAI 协议标准来集成向量模型能力。这种方案具有以下优势:

[*]零额外依赖:无需引入新的依赖包,保持框架轻量
[*]完美兼容性:与现有架构无缝衔接,确保向后兼容
[*]标准化接入:采用业界通用的 OpenAI 协议,降低学习成本
详细的技术讨论和方案细节可参考 GitHub Issue: 向量化模型支持 #15
快速上手

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

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

首先安装 Ollama,然后下载以下必要的模型:
# 下载推理模型 - 用于理解和生成回答ollama run deepseek-r1:14b# 下载向量模型 - 用于文本向量化ollama run bge-m3:latest

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.





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.
[*]2.
[*]3.
[*]4.
[*]5.







注意:如果选择 Docker 安装方式,请确保你的网络环境能够正常访问 Github。


[*]初始化向量数据:创建本次知识库存储、获取链接信息和表信息:
1739410521
1.3 项目依赖

在你的 Maven 项目中添加以下依赖:
    io.github.pig-mesh.ai    deepseek-spring-boot-starter    1.4.0    io.milvus    milvus-sdk-java    2.5.3

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.





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

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.





2. 初始化私有知识

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

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

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.





2.2 准备资料并向量化上传

以下示例为了节约篇幅,以处理纯文本资料。对于 Office 文档、图片、PDF、音视频等其他格式的文件处理,deepseek4j 提供了完整的解决方案,可点击查看笔者开源的office2md 项目。
图片
office2md 2.0 发布,支持并发视觉理解和图片自我矫正。
@AutowiredEmbeddingClient embeddingClient;{    // 这里以 2025最新的我司保密条例演示,可以换成你自己的    String law = FileUtil.readString("/Users/lengleng/Downloads/law.txt", Charset.defaultCharset());    String[] lawSplits = StrUtil.split(law, 400);    List data = new ArrayList();    for (String lawSplit : lawSplits) {      List floatList = embeddingClient.embed(lawSplit);      JsonObject jsonObject = new JsonObject();      // 将 List 转换为 JsonArray      JsonArray 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);}

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
[*]33.





3. 创建 RAG 接口

@GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux chat(String prompt) {    MilvusClientV2 milvusClientV2 = new MilvusClientV2(connectConfig);    List 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 resultList = new ArrayList();    List searchResults = searchResp.getSearchResults();    for (List 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);}

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.





前端测试

1739410900
总结

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

[*]环境准备:部署推理模型和向量模型
[*]知识库构建:向量化存储
[*]检索增强:通过语义搜索获取关联知识
[*]推理生成:结合上下文生成最终回答
要让 RAG 系统达到生产可用水平,每个环节都需要进一步优化和完善:

[*]检索策略优化:结合关键词和语义的混合检索,提高召回准确度
[*]重排序优化:对检索结果进行二次排序,确保最相关内容排在前面
[*]提示词工程:优化 Prompt 模板,引导模型生成更准确的回答
[*]知识库管理:定期更新和维护知识库,保证数据时效性
[*]性能调优:优化向量检索和模型推理的性能
页: [1]
查看完整版本: 十分钟手把手教学:用DeepSeek4j开发私有大模型知识库