RAG:实现基于本地知识库结合大模型生成(LangChain4j快速入门#1)

news/2025/2/2 2:40:50/
aidu_pl">

引言

⭐Tips:

  • 你可以循序渐进从头看下去
  • 也可以选择直接跳到后面(快速入门)看代码和结果演示

场景解释以及适用场景

当我想让大模型能基于我私有化的一些本地知识进行回答,定制化特殊场景模型的时候,就可以用到这种方法。

  • 示例1: 学校官网AI,只回答学校的有关知识,把这些资料都灌进一个库就行;
  • 示例2: 个人博客AI,把自己的有关知识灌进库中,然后别人query只回答有关你的知识,不做别的多余答复(可以微调或prompt辅助稍微控制)

RAG是什么

RAG 是 Retrieval-Augmented Generation 的缩写,中文可以翻译为 检索增强生成。
传统的生成式模型(例如 GPT 系列模型)在生成文本时,依赖于模型在训练时学到的知识和参数。它们往往缺乏实时访问外部知识库的能力,可能导致生成的内容出现事实错误或不准确。为了弥补这一点,RAG 技术将 检索 和 生成 结合起来,利用外部知识库(如文档、数据库、网页等)来增强模型的生成能力。

此处一般能用网页搜索 (Google、Baidu)得到的文本扔进大模型结合回答,也可以用本地建立的知识库向量化or切片扔给大模型结合回答。

本片文章内容主要讲的是后者,搭建本地知识库。前者可以过几天更。

RAG示意流程图
在这里插入图片描述
在这里插入图片描述

ain4j_21">LangChain4j是什么

LangChain 是一个开源框架,用于帮助开发者构建基于 大型语言模型(LLM) 的应用程序,特别是那些需要与外部数据源进行交互的应用。LangChain 旨在简化与 LLM 的集成,提供结构化工具,使得开发者能够更高效地构建和部署复杂的自然语言处理(NLP)应用。
LangChain 使得用户能够将语言模型与各种外部资源(如数据库、API、搜索引擎、知识库等)结合起来,进行更复杂的任务,如 检索增强生成(RAG)、对话系统、文档理解等。

总的来说,你只需要知道LangChain4j是java用于开发大模型应用的框架就可以了。

🔨Details:
LangChain4j官方使用文档(English)

LangChain是python版本的,javaer基于LangChain也做了一套java版本,故名LangChain4j(LangChainForJava),很多xxx4j也是这么取名的。


快速入门

为了快速入门不展示过多废话导致看不下去,此处展示最简单的本地知识库。
复杂应用推荐看官网文档自己手搓,架构可能需要别种设计

此处我用的maven示例,我们需要的依赖项如下:

		<dependency><groupId>dev.ain>langchain4j</groupId><artifactId>ain>langchain4j-open-ai</artifactId><version>1.0.0-alpha1</version></dependency><dependency><groupId>dev.ain>langchain4j</groupId><artifactId>ain>langchain4j-easy-rag</artifactId><version>1.0.0-alpha1</version></dependency>

快速对接大模型接口(OpenAI示例)

java">String openAISK = "{YOUR-OPENAI-SK}^_^";
ChatLanguageModel chatModel = OpenAiChatModel.builder().apiKey(openAISK).modelName(GPT_4_O_MINI).build();
System.out.println(chatModel.generate("你好"));

generate成功打印说明对接成功了,不需要构造繁琐的入参,清理冗杂的出参。


搭建本地知识库示例

我这里直接在项目中写一个txt文件假装是一个大型的本地知识库[doge]
在这里插入图片描述

在这里插入图片描述
接下来,创建一个向量数据库,并把你的文档扔进去预处理。
ain>langchain4j的默认嵌入模型bge-small-en-v1.5在量化后仅仅需要24MB内存,轻松嵌入^^( ఠൠఠ )ノ

java">//copy你的文件的绝对路径就行,debug没问题再玩别的。
List<Document> documents = FileSystemDocumentLoader.loadDocuments("file/path");
InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
EmbeddingStoreIngestor.ingest(documents, embeddingStore);

再抽取一个Assistant接口

java">public interface Assistant {String chat(String userMessage);<T> String chat(String userMsg, StreamingResponseHandler<AiMessage> streamingResponseHandler);
}

接下来铺垫动作都做好了,可以做一个简单的问答试试看了

java">Assistant assistant = AiServices.builder(Assistant.class).chatLanguageModel(chatModel).chatMemory(MessageWindowChatMemory.withMaxMessages(10)).contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore)).build();Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {String userMsg = sc.next();String answer = assistant.chat(userMsg);System.out.println(answer);
}

结果展示

让我们尝试问他我们知识库中的内容!
在这里插入图片描述
就是如此。

More:https://docs.ain>langchain4j.dev/tutorials/rag#what-is-rag


http://www.ppmy.cn/news/1568576.html

相关文章

在5G网络中使用IEEE 1588实现保持时间同步

本文主要探讨了在电信网络中实现保持时间同步&#xff08;holdover&#xff09;的不同方法。 文档讨论了保持时间同步的作用&#xff0c;以及它从传统SONET/SDH网络到现代5G移动通信网络的演变。传统SONET/SDH网络依赖于频率同步&#xff0c;而现代5G移动通信则依赖于使用IEEE…

单片机基础模块学习——DS18B20温度传感器芯片

不知道该往哪走的时候&#xff0c;就往前走。 一、DS18B20芯片原理图 该芯片共有三个引脚&#xff0c;分别为 GND——接地引脚DQ——数据通信引脚VDD——正电源 数据通信用到的是1-Wier协议 优点&#xff1a;占用端口少&#xff0c;电路设计方便 同时该协议要求通过上拉电阻…

第P7周-Pytorch实现马铃薯病害识别(VGG16复现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 马铃薯病害数据集&#xff0c;该数据集包含表现出各种疾病的马铃薯植物的高分辨率图像&#xff0c;包括早期疫病、晚期疫病和健康叶子。它旨在帮助开发和…

SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求(定期开票)

上两章讲了贩卖契约&#xff08;框架协议&#xff09;的概要&#xff0c;以及贩卖契约中最为常用的 基本契约 - 数量契约和金额契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要&#xff0c;基本契约 - 数量契约_sap 框架协议-CSDN博客 SAP SD学习笔记27 - 贩卖契约(框架…

什么是波士顿矩阵,怎么制作?AI工具一键生成战略分析图!

当今商业环境瞬息万变&#xff0c;每个企业都面临着越来越多的挑战与机遇。如何科学合理地进行战略管理&#xff0c;成为了每个企业决策者必须直面的重要课题。 在众多战略管理框架中&#xff0c;波士顿矩阵作为一种经典的战略管理工具&#xff0c;因其简洁明了的分析方式而广…

Springboot如何使用面向切面编程AOP?

Springboot如何使用面向切面编程AOP? 在 Spring Boot 中使用面向切面编程&#xff08;AOP&#xff09;非常简单&#xff0c;Spring Boot 提供了对 AOP 的自动配置支持。以下是详细的步骤和示例&#xff0c;帮助你快速上手 Spring Boot 中的 AOP。 1. 添加依赖 首先&#xff…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

deepseek无辅助损失的负载均衡策略

无辅助损失的负载均衡策略 是一种用于解决深度学习中专家混合系统(MoE)负载不均衡问题的方法,它不依赖额外的辅助损失函数来实现负载均衡,而是通过直接调整专家接收输入的概率来平衡各个专家的负载,以下是具体介绍及举例: 策略原理 动态调整接收概率:系统会根据每个专…