基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南


基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南

基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南

  • 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南
    • 一、注册火山引擎账号
    • 二、RAG技术核心原理
    • 三、环境与工具准备
      • 1. 核心组件
      • 2. 依赖配置(Maven)
    • 四、代码实现步骤
      • 步骤1:初始化DeepSeek模型
      • 步骤2:构建本地知识库
      • 步骤3:执行RAG
    • 五、效果验证与优化
      • 1. 测试示例
      • 2. 性能优化建议
    • 六、总结

随着大语言模型(LLM)的普及,如何结合企业私有知识库提升模型输出的准确性和专业性成为关键挑战。 检索增强生成(Retrieval-Augmented Generation, RAG) 技术通过将外部知识库与生成模型结合,有效解决模型幻觉和时效性问题。本文将基于 LangChain4j(Java版LangChain框架)与火山引擎的 DeepSeek R1 模型,手把手搭建一个RAG知识库系统,并提供完整代码实现步骤。

RAG技术详解可参考:详解RAG技术:大模型时代让AI更懂你的智能知识引擎
RAG技术落地:核心痛点与应对策略全面解析: RAG技术落地:核心痛点与应对策略全面解析


一、注册火山引擎账号

访问地址:火山引擎官网访问 点击进入 注册账号,注册即享免费token调用额度

点击控制台:
在这里插入图片描述
创建在线推理API key
在这里插入图片描述
记住模型名称、地址,使用自己的key,后续代码要使用。
在这里插入图片描述

二、RAG技术核心原理

RAG通过以下流程增强大模型的生成能力:

  1. 检索(Retrieval):从向量数据库中检索与用户问题相关的文档片段。
  2. 增强(Augmentation):将检索结果作为上下文输入大模型。
  3. 生成(Generation):模型结合上下文生成最终答案。

优势

  • 数据安全性:知识库本地存储,无需上传至公网。
  • 动态更新:可随时扩展知识库内容,无需重新训练模型。

三、环境与工具准备

1. 核心组件

工具/服务作用
LangChain4j提供RAG流程的模块化支持(文档加载、分块、检索链等)
火山引擎DeepSeek R1提供高性能开源LLM,支持API调用与本地部署
向量数据库存储文档向量(示例使用内存数据库InMemoryEmbeddingStore

2. 依赖配置(Maven)

<!-- LangChain4j 核心依赖 -->  
<dependency>  
    <groupId>dev.langchain4j</groupId>  
    <artifactId>langchain4j-core</artifactId>  
    <version>0.31.0</version>  
</dependency>  
<!-- 火山引擎DeepSeek集成 -->  
<dependency>  
    <groupId>dev.langchain4j</groupId>  
    <artifactId>langchain4j-openai</artifactId>  
    <version>0.31.0</version>  
</dependency>  
<!-- 文本嵌入模型(示例使用Ollama) -->  
<dependency>  
    <groupId>dev.langchain4j</groupId>  
    <artifactId>langchain4j-ollama</artifactId>  
    <version>0.31.0</version>  
</dependency>  

四、代码实现步骤

步骤1:初始化DeepSeek模型

配置火山引擎API密钥与模型参数:

String apiKey = "YOUR_VOLC_ENGINE_API_KEY";  
String modelName = "deepseek-r1-250120";  
String apiBaseUrl = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";  

ChatLanguageModel chatModel = OpenAiChatModel.builder()  
        .apiKey(apiKey)  
        .modelName(modelName)  
        .baseUrl(apiBaseUrl)  
        .build();  

步骤2:构建本地知识库

文档加载与分块

// 加载本地文档(示例为TXT文件)  
Path documentPath = Paths.get("src/main/resources/knowledge.txt");  
Document document = FileSystemDocumentLoader.loadDocument(documentPath);  

// 分块策略:每段500字符,重叠50字符  
DocumentSplitter splitter = DocumentSplitters.recursive(500, 50, new OpenAiTokenizer());  
List<TextSegment> segments = splitter.split(document);  

// 生成向量并存储  bge-m3的模型key也需要申请
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
                .modelName("bge-m3")
                .apiKey("none")
                .baseUrl("url")
                .build();
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();  
List<Embedding> embeddings = embeddingModel.embedAll(subList).content();
// 将嵌入结果存储到嵌入存储中
embeddingStore.addAll(embeddings, subList);

步骤3:执行RAG


String question = "如何配置火山引擎的DeepSeek模型?";  
Query userQuery = Query.from(question);

EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
                .modelName("bge-m3")
                .apiKey("none")
                .baseUrl("url")
                .build();
ChatLanguageModel openAiModel = OpenAiChatModel.builder()  
        .apiKey(apiKey)  
        .modelName(modelName)  
        .baseUrl(apiBaseUrl)  
        .build();  
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
        .embeddingStore(embeddingStore)
        .embeddingModel(embeddingModel)
        .maxResults(5)
        .minScore(0.6)
        .build();

List<Content> contentList = new ArrayList<>();
contentList.addAll(retriever.retrieve(userQuery));

ContentInjector contentInjector = new DefaultContentInjector();

UserMessage promptMessage = contentInjector.inject(contentList, userMessage);
log.info("promptMessage: {}", promptMessage.singleText());

Response<AiMessage> generate = openAiModel.generate(promptMessage);
log.info("AI响应: {}", generate);

五、效果验证与优化

1. 测试示例

输入问题:

“DeepSeek R1支持哪些部署方式?”

输出结果:

“根据火山引擎文档,DeepSeek R1支持两种部署方式:1) 在火山引擎机器学习平台(veMLP)中自定义部署;2) 通过火山方舟API直接调用预训练模型,适用于快速集成场景。”

2. 性能优化建议

  • 分块策略:根据文档类型调整分块大小(如技术文档建议chunk_size=800)。
  • 混合检索:结合关键词检索(如Elasticsearch)与向量检索,提升召回率。

六、总结

本文通过 LangChain4j火山引擎DeepSeek R1 实现了企业级RAG知识库的搭建。关键步骤包括:知识库向量化、检索链构建、模型集成。此方案既能保障数据隐私,又能动态扩展知识,适用于客服、内部知识问答等场景。

扩展方向

  • 接入企业数据库(如Doris)实现海量知识管理。
  • 结合微调(Fine-tuning)进一步提升领域专业性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLO11深度学习的医学X光骨折检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Unity百游修炼(2)——Brick_Breaker详细制作全流程

一、项目简介 Brick Breaker 是一款经典的打砖块游戏&#xff0c;本次案例将使用 Unity 引擎来实现该游戏的核心功能。 游戏画面如下&#xff1a; Brick_ breaker 二、项目结构概览和前期准备 &#xff08;1&#xff09;在 Unity 项目视图中&#xff0c;我们可以看到几个重要…

DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库

项目地址&#xff1a;https://github.com/deepseek-ai/DeepEP 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天 (2/5)&#xff01; ​ ​ 引言 在大模型训练中&#xff0c;混合专家模型&#xff08;Mixture-of-Experts, MoE&#xff09;因其动…

前端面试基础知识整理(一)

1.vue生命周期 beforeCreate 创建 注入依赖 初始化非响应式数据 beforeCreate created 数据请求&#xff0c;初始化数据 设置全局时间监听 beforeMount挂载 模版编译完成后的调试 操作 dom初始化 操作dom初始化第三方插件 更新 在更新前查看 DOM 状态&#xff0c;不建议修改数据…

【单片机】MSP430MSP432入门

文章目录 0 前言1 开发方式选择2 CCS和开发相关软件3 Keil开发MSP4324 IAR for 430开发MSP4305 总结 0 前言 最近因为想学DSP&#xff0c;所以把之前卸载的CCS给装回来了&#xff0c;手头也还有之前电赛剩下的MSP430和MSP432的板子&#xff0c;由于年代久远&#xff0c;想着花点…

【Linux探索学习】第二十七弹——信号(上):Linux 信号基础详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 前面我们已经将进程通信部分讲完了&#xff0c;现在我们来讲一个进程部分也非常重要的知识点——信号&#xff0c;信号也是进程间通信的一…

74道高级Java面试合集,java开发模式面试题

前言 今天我们来说说Redis为什么高性能&#xff1f;如何做高可用&#xff1f; Redis为什么这么快&#xff1f; Redis是单线程的&#xff0c;避免了多线程的上下文切换和并发控制开销&#xff1b;Redis大部分操作时基于内存&#xff0c;读写数据不需要磁盘I/O&#xff0c;所以速…

【江科协-STM32】5. 输出比较

1. 输出比较简介 OC(Output Compare)输出比较。 输出比较可以通过CNT&#xff08;CNT计数器&#xff09;与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形。 :::tip CNT计数器是正向计数器。它只能正向累…

轻量级日志管理平台Grafana Loki

文章目录 轻量级日志管理平台Grafana Loki背景什么是Loki为什么使用 Grafana Loki&#xff1f;架构Log Storage Grafana部署使用基于 Docker Compose 安装 LokiMinIO K8s集群部署Loki采集Helm 部署方式和案例 参考 轻量级日志管理平台Grafana Loki 背景 在微服务以及云原生时…

使用 Postman 访问 Keycloak 端点

1. 引言 在本教程中&#xff0c;我们将首先快速回顾 OAuth 2.0、OpenID 和 Keycloak。然后&#xff0c;我们将了解 Keycloak REST API 以及如何在 Postman 中调用它们。 2. OAuth 2.0 OAuth 2.0 是一个授权框架&#xff0c;它允许经过身份验证的用户通过令牌向第三方授予访问…

WEB1~6通杀

##解题思路 这六道题&#xff0c;通杀了&#xff0c;只因为是PHP的特性 来&#xff0c;看web6&#xff0c;过滤最复杂的正则&#xff0c;而且不能解析成大于999的值&#xff0c;但是&#xff0c;php是弱类型的语言&#xff0c;我只要输入任意字符数字&#xff0c;最终值就为0&…

I2C协议简介:串行通信的关键技术

目录 一、总线通信基本概念 二、I2C总线协议介绍 1. 时序图解析 &#xff08;1&#xff09;起始信号 &#xff08;2&#xff09;应答信号 &#xff08;3&#xff09;终止信号 &#xff08;4&#xff09;设备地址 &#xff08;5&#xff09;I2C传输方法 ​编辑 &#…

第二十四:5.2【搭建 pinia 环境】axios 异步调用数据

第一步安装&#xff1a;npm install pinia 第二步&#xff1a;操作src/main.ts 改变里面的值的信息&#xff1a; <div class"count"><h2>当前求和为&#xff1a;{{ sum }}</h2><select v-model.number"n">  // .number 这里是…

Web漏洞——命令注入漏洞学习

一、什么是命令注入漏洞 想象一下&#xff0c;你家有一个智能管家机器人。这个机器人可以通过你发出的指令来完成各种任务&#xff0c;比如“请打开电视机、播放音乐、开灯等等”。你只需要对它说&#xff1a;“请打开电视”&#xff0c;它就会去执行这个任务。但是&#xff0…

大模型自动提示优化(APO)综述笔记

自大型语言模型&#xff08;LLMs&#xff09;出现以来&#xff0c;提示工程一直是各种自然语言处理&#xff08;NLP&#xff09;任务中激发期望响应的关键步骤。然而&#xff0c;由于模型的快速进步、任务的多样性和相关最佳实践的变化&#xff0c;提示工程对最终用户来说仍然是…

快速排序(详解)c++

快速排序(Quick Sort)&#xff0c;既然敢起这样的名字&#xff0c;说明它是常⻅排序算法中较为优秀的。事实上&#xff0c;在很多情况下&#xff0c;快排确实是效率较⾼的算法&#xff1b;c的排序是以快排为基础&#xff0c;再加上堆排和插入排序做优化实现的&#xff0c;我们这…

【工具变量】公司企业数字领导力(2004-2023年)

数据简介&#xff1a;企业数字化领导力是指在数字经济时代&#xff0c;领导者通过战略性地使用数字资产、引领组织变革&#xff0c;使企业在数字化环境中获得持续成功的能力。对于上市公司而言&#xff0c;这种领导力尤为重要&#xff0c;因为它直接关系到企业的战略方向、市场…

浅谈新能源汽车充电桩建设问题分析及解决方案

摘要&#xff1a; 在全球倡导低碳减排的大背景下&#xff0c;新能源成为热门行业在全球范围内得以开展。汽车尾气排放会在一定程度上加重温室效应&#xff0c;并且化石能源的日渐紧缺也迫切对新能源汽车发展提出新要求。现阶段的新能源汽车以电力汽车为主&#xff0c;与燃油汽…

seacmsv9报错注入

1、seacms的介绍 ​ seacms中文名&#xff1a;海洋影视管理系统。是一个采用了php5mysql架构的影视网站框架&#xff0c;因此&#xff0c;如果该框架有漏洞&#xff0c;那使用了该框架的各个网站都会有相同问题。 2、源码的分析 漏洞的部分源码如下&#xff1a; <?php …

python学习四

python运算符与表达式 表达式: Python中的表达式是一种计算结果的代码片段。它可以包 含变量、运算符、常数和函数调用,用于执行各种数学、逻辑 和功能操作 算术运算符: 比较(关系)运算符: 赋值运算符: 逻辑运算符: 位运算符: 成员运算符: 身份运算符 <