0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java开发者LLM实战——使用LangChain4j构建本地RAG系统

京东云 来源:jf_75140285 作者:jf_75140285 2024-07-02 10:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、引言

由于目前比较火的chatGPT是预训练模型,而训练一个大模型是需要较长时间(参数越多学习时间越长,保守估计一般是几个月,不差钱的可以多用点GPU缩短这个时间),这就导致了它所学习的知识不会是最新的,最新的chatGPT-4o只能基于2023年6月之前的数据进行回答,距离目前已经快一年的时间,如果想让GPT基于近一年的时间回复问题,就需要RAG(检索增强生成)技术了。

wKgZomaDZquAZySvAALANhIlghM326.png

此外,对于公司内部的私有数据,为了数据安全、商业利益考虑,不能放到互联网上的数据,因此GPT也没有这部分的知识,如果需要GPT基于这部分私有的知识进行回答,也需要使用RAG技术。

wKgZomaDZq-AGF5DAAMJVqUI0Gw144.png

本文将通过实战代码示例,意在帮助没有大模型实战经验的Java工程师掌握使用LangChain4j框架进行大模型开发。

2、基本概念

2.1 什么是RAG

RAG(Retrieval-Augmented Generation)的核心思想是:将传统的信息检索(IR)技术与现代的生成式大模型(如chatGPT)结合起来。

具体来说,RAG模型在生成答案之前,会首先从一个大型的文档库或知识库中检索到若干条相关的文档片段。再将这些检索到的片段作为额外的上下文信息,输入到生成模型中,从而生成更为准确和信息丰富的文本。

RAG的工作原理可以分为以下几个步骤:

1.接收请求:首先,系统接收到用户的请求(例如提出一个问题)。

2.信息检索(R):系统从一个大型文档库中检索出与查询最相关的文档片段。这一步的目标是找到那些可能包含答案或相关信息的文档。

3.生成增强(A):将检索到的文档片段与原始查询一起输入到大模型(如chatGPT)中,注意使用合适的提示词,比如原始的问题是XXX,检索到的信息是YYY,给大模型的输入应该类似于:请基于YYY回答XXXX。

4.输出生成(G):大模型基于输入的查询和检索到的文档片段生成最终的文本答案,并返回给用户。

第2步骤中的信息检索,不一定必须使用向量数据库,可以是关系型数据库(如MySQL)或全文搜索引擎(如Elasticsearch, ES),

但大模型应用场景广泛使用向量数据库的原因是:在大模型RAG的应用场景中,主要是要查询相似度高的某几个文档,而不是精确的查找某一条(MySQL、ES擅长)。

相似度高的两个文档,可能不包含相同的关键词。 例如,句子1: "他很高兴。" 句子2: "他感到非常快乐。" 虽然都是描述【他】很开心快乐的心情,但是不包含相同的关键词;

包含相同的关键词的两个文档可能完全没有关联,例如:句子1: "他喜欢苹果。" 句子2: "苹果是一家大公司。" 虽然都包含相同的关键词【苹果】,但两句话的相似度很低。

2.2 LangChain4j简介

LangChain4j是LangChiain的java版本,

LangChain的Lang取自Large Language Model,代表大语言模型,

Chain是链式执行,即把语言模型应用中的各功能模块化,串联起来,形成一个完整的工作流。

它是面向大语言模型的开发框架,意在封装与LLM对接的细节,简化开发流程,提升基于LLM开发的效率。

更多介绍,详见: https://github.com/langchain4j/langchain4j/blob/main/README.md

2.3 大模型开发 vs. 传统JAVA开发

大模型开发——大模型实现业务逻辑:

开发前,开发人员关注数据准备(进行训练)、选择和微调模型(得到更好的效果,更能匹配业务预期),

开发过程中(大多数时候),重点在于如何有效的与大模型(LLM)进行沟通,利用LLM的专业知识解决特定的业务问题,

开发中更关注如何描述问题(提示工程 Propmt Engineering)进行有效的推理,关注如何将大模型的使用集成到现有的业务系统中。

传统的JAVA开发——开发者实现业务逻辑:

开发前,开发人员关注系统架构的选择(高并发、高可用),功能的拆解、模块化等设计。

开发过程中(大多数时候)是根据特定的业务问题,设计特定的算法、数据存储等以实现业务逻辑,以编码为主。

3. 实战经验

3.1 环境搭建

3.1.1 向量库(Chroma)

Windows:

先安装python,参考: https://docs.python.org/zh-cn/3/using/windows.html#the-full-installer

PS:注意需要配置环境变量

验证-执行:

python --version

wKgaomaDZrCAU7OgAAAXfU9xWxQ204.png

再安装chroma,参考:https://docs.trychroma.com/getting-started

验证-执行:

chroma run

wKgZomaDZrGAVPT8AAB6U8_1Dr4536.png

Mac:

现先安装python

brew install python

或者下载安装: https://www.python.org/downloads/macos/

验证-执行:

python --version

wKgaomaDZrKAVN8hAACFwKUj46Q886.png

安装chroma(同上),参考:https://docs.trychroma.com/getting-started

验证-执行:

chroma run

wKgZomaDZrOAZIeNAAG22JJ75Y0986.png



3.1.2 集成LangChain4j

< properties >
        < langchain4j.version >0.31.0< /langchain4j.version >
< /properties >
< dependency >
	< groupId >dev.langchain4j< /groupId >
	< artifactId >langchain4j-core< /artifactId >
	< version >${langchain4j.version}< /version >
< /dependency >
< dependency >
	< groupId >dev.langchain4j< /groupId >
	< artifactId >langchain4j< /artifactId >
	 < version >${langchain4j.version}< /version > 
< /dependency >
< dependency >
	< groupId >dev.langchain4j< /groupId >
	< artifactId >langchain4j-open-ai< /artifactId >
	 < version >${langchain4j.version}< /version > 
< /dependency >
< dependency >
	< groupId >dev.langchain4j< /groupId >
	< artifactId >langchain4j-embeddings< /artifactId >
	 < version >${langchain4j.version}< /version > 
< /dependency >
< dependency >
	< groupId >dev.langchain4j< /groupId >
	< artifactId >langchain4j-chroma< /artifactId >
	 < version >${langchain4j.version}< /version > 
< /dependency >
< dependency >
	< groupId >io.github.amikos-tech< /groupId >
	< artifactId >chromadb-java-client< /artifactId >
	 < version >${langchain4j.version}< /version > 
< /dependency >

3.2 程序编写

3.2.1 项目结构

LangChain ├── core │ ├── src │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn.jdl.tech_and_data.ka │ │ │ │ ├── ChatWithMemory │ │ │ │ ├── Constants │ │ │ │ ├── Main │ │ │ │ ├── RagChat │ │ │ │ └── Utils │ │ │ ├── resources │ │ │ │ ├── log4j2.xml │ │ │ │ └── 笑话.txt │ │ ├── test │ │ │ └── java │ ├── target ├── pom.xml ├── parent [learn.langchain.parent] ├── pom.xml



3.2.2 知识采集

一般是公司内网的知识库中或互联网上进行数据采集,获取到的文本文件、WORD文档或PDF文件,本文使用resources目录下的【笑话.txt】作为知识采集的结果文件

URL docUrl = Main.class.getClassLoader().getResource("笑话.txt");
if(docUrl==null){
    log.error("未获取到文件");
}
Document document = getDocument(docUrl);
if(document==null){
    log.error("加载文件失败");
}
private static Document getDocument(URL resource) {
    Document document = null;
    try{
        Path path = Paths.get(resource.toURI());
        document = FileSystemDocumentLoader.loadDocument(path);
    }catch (URISyntaxException e){
        log.error("加载文件发生异常", e);
    }
    return document;
}

3.2.3 文档切分

使用dev.langchain4j.data.document.splitter.DocumentSplitters#recursize

它有三个参数:分段大小(一个分段中最大包含多少个token)、重叠度(段与段之前重叠的token数)、分词器(将一段文本进行分词,得到token)

其中,重叠度的设计是为了减少按大小拆分后切断原来文本的语义,使其尽量完整。

wKgaomaDZrSAN4cuAAG9bAJR9OQ826.png

DocumentSplitter splitter = DocumentSplitters.recursive(150,10,new OpenAiTokenizer());
splitter.split(document);

关于Token(标记)

Token是经过分词后的文本单位,即将一个文本分词后得到的词、子词等的个数,具体取决于分词器(Tokenizer),

比如:我喜欢吃苹果,可以拆分成我/喜欢/吃/苹果,token数量=4, 也可以拆分成我/喜/欢/吃/苹果,token数量=5

chatGPT使用的是BPE(Byte Pair Encoding)算法进行分词,参见: https://en.wikipedia.org/wiki/Byte_pair_encoding

对于上面文本的分词结果如下:

18:17:29.371 [main] INFO  TokenizerTest - 待分词的文本:我喜欢吃苹果
18:17:30.055 [main] INFO  cn.jdl.tech_and_data.ka.Utils - 当前的模型是:gpt-4o
18:17:31.933 [main] INFO  TokenizerTest - 分词结果:我 / 喜欢 / 吃 / 苹果

关于token与字符的关系:GPT-4o的回复:

wKgZomaDZraAKm17AAQnu5woQdQ880.png

关于文档拆分的目的

由于与LLM交互的时候输入的文本对应的token长度是有限制的,输入过长的内容,LLM会无响应或直接该报错,

因此不能将所有相关的知识都作为输入给到LLM,需要将知识文档进行拆分,存储到向量库,

每次调用LLM时,先找出与提出的问题关联度最高的文档片段,作为参考的上下文输入给LLM。

入参过长,LLM报错:

wKgaomaDZreAGn0uAAEoBn5eOd8152.png

虽然根据响应,允许输入1048576个字符=1024K个字符=1M个字符,

但官网文档给的32K tokens,而一般1个中文字符对应1-2个Token,因此字符串建议不大于64K,实际使用中,为了保障性能,也是要控制输入不要过长。

如下是常见LLM给定的token输入上限:

模型名称 Token 输入上限(最大长度)
GPT-3 (davinci) 4096 tokens
GPT-3.5 (text-davinci-003) 4096 tokens
GPT-4 (8k context) 8192 tokens
GPT-4 (32k context) 32768 tokens
LLaMA (7B) 2048 tokens
LLaMA (13B) 2048 tokens
LLaMA (30B) 2048 tokens
LLaMA (65B) 2048 tokens
讯飞星火(SparkDesk) 8192 tokens
文心一言(Ernie 3.0) 4096 tokens
智源悟道(WuDao 2.0) 2048 tokens
阿里巴巴 M6 2048 tokens
华为盘古(Pangu-Alpha) 2048 tokens
言犀大模型(ChatJd) 2048 tokens

文档拆分的方案langchain4j中提供了6种:

wKgZomaDZriABvhzAAKflZsl2jk436.png

1、基于字符的:逐个字符(含空白字符)分割

2、基于行的:按照换行符(n)分割

3、基于段落的:按照连续的两个换行符(nn)分割

4、基于正则的:按照自定义正则表达式分隔

5、基于句子的(使用Apache OpenNLP,只支持英文,所以可以忽略

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    3005

    浏览量

    116820
  • ChatGPT
    +关注

    关注

    31

    文章

    1599

    浏览量

    10390
  • LLM
    LLM
    +关注

    关注

    1

    文章

    350

    浏览量

    1394
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【2025夏季班正课】大模型Agent智能体开发实战 课分享

    竞争力的体现。 综上所述,拒绝碎片化,拥抱体系化,是 Agent 开发从“手工作坊”走向“工业化生产”的必由之路。它要求开发者不仅要懂算法,更要懂架构、懂工程、懂系统。通过构建标准化的
    发表于 03-29 16:12

    RAG(检索增强生成)原理与实践

    持续迭代 :基于用户反馈和评估结果不断改进 选择合适的工具栈 :根据实际需求选择Embedding模型、向量数据库和LLM RAG技术正在快速发展,掌握其原理与实践,将帮助你构建更智能、更可靠的AI应用。
    发表于 02-11 12:46

    2025华为开发者大赛暨开发者年度会议成功举办

    开发者大赛总决赛、CEO圆桌、主论坛大咖分享、分论坛技术演讲、开发者展区&CodeLabs等多元议题,推动云开发工具链、智能体开发、具身智能等前沿技术
    的头像 发表于 12-31 13:32 973次阅读

    M4-R1 开源鸿蒙(OpenHarmory)开发板丨串口调试助手实战案例

    支持与高集成度设计,成为开发者体验与学习鸿蒙系统的理想平台。无论是智慧家居、教学实验,还是设备通信,M4-R1都能提供稳定可靠的开发环境。本次分享的
    的头像 发表于 12-31 11:16 9153次阅读
    M<b class='flag-5'>4</b>-R1 开源鸿蒙(OpenHarmory)<b class='flag-5'>开发</b>板丨串口调试助手<b class='flag-5'>实战</b>案例

    使用NVIDIA Nemotron RAG和Microsoft SQL Server 2025构建高性能AI应用

    在 Microsoft Ignite 2025 大会上,随着 Microsoft SQL Server 2025 的发布,AI 就绪型企业数据库愿景成为现实,为开发者提供强大的新工具,例如内置向量
    的头像 发表于 12-01 09:31 1015次阅读
    使用NVIDIA Nemotron <b class='flag-5'>RAG</b>和Microsoft SQL Server 2025<b class='flag-5'>构建</b>高性能AI应用

    RAG实践:一文掌握大模型RAG过程

    RAG(Retrieval-Augmented Generation,检索增强生成), 一种AI框架,将传统的信息检索系统(例如数据库)的优势与生成式大语言模型(LLM)的功能结合在一起。不再
    的头像 发表于 10-27 18:23 1701次阅读
    <b class='flag-5'>RAG</b>实践:一文掌握大模型<b class='flag-5'>RAG</b>过程

    【深圳站圆满收官】开发者线下实战,睿擎工业平台Workshop精彩回顾!|新闻速递

    。经过4小时的高强度实战,所有开发者均成功完成了工业级"远程监控网关"从环境搭建到量产部署的全流程开发。深圳现场:技术人的实战盛宴深圳站现场
    的头像 发表于 09-23 20:19 891次阅读
    【深圳站圆满收官】<b class='flag-5'>开发者</b>线下<b class='flag-5'>实战</b>,睿擎工业平台Workshop精彩回顾!|新闻速递

    睿擎工业平台4小时实战 Workshop · 深圳站,9.18与开发者一起挑战工业级开发!|活动预告

    报名明日截止!工业领域的开发者们,请注意!睿擎工业开发平台深度实战Workshop·深圳站报名进入最后倒计时!9月18日(周四),我们将于深圳带来一场真正面向工业场景的4小时高强度
    的头像 发表于 09-17 18:39 735次阅读
    睿擎工业平台<b class='flag-5'>4</b>小时<b class='flag-5'>实战</b> Workshop · 深圳站,9.18与<b class='flag-5'>开发者</b>一起挑战工业级<b class='flag-5'>开发</b>!|活动预告

    迅龙软件参加昇腾 AI 开发者创享日・广东站,为开发者打造沉浸式实操体验

    7月18日,线下顶尖人才汇聚的开发者盛会——昇腾AI开发者创享日・广东站在广州举行。活动以“创未来享非凡”为主题,聚焦广东本地产业特点,分享前沿AI创新技术,搭建生态交流平台,帮助开发者
    的头像 发表于 07-23 17:18 1414次阅读
    迅龙软件参加昇腾 AI <b class='flag-5'>开发者</b>创享日・广东站,为<b class='flag-5'>开发者</b>打造沉浸式实操体验

    如何在魔搭社区使用TensorRT-LLM加速优化Qwen3系列模型推理部署

    TensorRT-LLM 作为 NVIDIA 专为 LLM 推理部署加速优化的开源库,可帮助开发者快速利用最新 LLM 完成应用原型验证与产品部署。
    的头像 发表于 07-04 14:38 2399次阅读

    使用 llm-agent-rag-llamaindex 笔记本时收到的 NPU 错误怎么解决?

    使用 conda create -n ov-nb-demos python=3.11 创建运行 llm-agent-rag-llamaindex notebook 的环境。 执行“创建
    发表于 06-23 06:26

    本地网站秒变公网可访问!开发者必备的内网穿透工具

    效率拉满! 为什么开发者需要这个技能? 远程协作 :前端开发本地页面,直接分享链接给后端/产品,无需部署到测试服务器 实时预览 :修改代码后刷新公网链接,即时看到效果,告别反复打包部署 准备工作 一台运行
    的头像 发表于 06-19 10:50 834次阅读
    <b class='flag-5'>本地</b>网站秒变公网可访问!<b class='flag-5'>开发者</b>必备的内网穿透工具

    润和软件亮相鲲鹏昇腾开发者大会2025

    近日,以“心怀挚爱,共绽光芒”为主题的鲲鹏昇腾开发者大会2025在北京中关村国际创新中心成功举办。作为鲲鹏、昇腾生态的紧密合作伙伴,江苏润和软件股份有限公司(以下简称“润和软件”)受邀出席,携手鲲鹏
    的头像 发表于 06-03 16:20 1289次阅读

    【书籍评测活动NO.61】Yocto项目实战教程:高效定制嵌入式Linux系统

    扩展、自动化的构建工具集 。它采用模块化架构、分层构建体系和软件栈管理机制,使开发者能够高效定制、优化和维护嵌入式 Linux 系统,可提高开发
    发表于 05-21 10:00

    Java开发者必备的效率工具——Perforce JRebel是什么?为什么很多Java开发者在用?

    Perforce JRebel是一款Java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序。JRebel可即时重新加载对代码的修改,无需重启或重新部署应用程序,就能让
    的头像 发表于 04-27 13:44 969次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>开发者</b>必备的效率工具——Perforce JRebel是什么?为什么很多<b class='flag-5'>Java</b><b class='flag-5'>开发者</b>在用?