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

引言

⭐Tips:

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

场景解释以及适用场景

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

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

RAG是什么

RAG 是 Retrieval-Augmented Generation 的缩写,中文可以翻译为 检索增强生成。

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

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

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

RAG示意流程图

LangChain4j是什么

LangChain 是一个开源框架,用于帮助开发者构建基于 大型语言模型(LLM) 的应用程序,特别是那些需要与外部数据源进行交互的应用。LangChain 旨在简化与 LLM 的集成,提供结构化工具,使得开发者能够更高效地构建和部署复杂的自然语言处理(NLP)应用。

LangChain 使得用户能够将语言模型与各种外部资源(如数据库、API、搜索引擎、知识库等)结合起来,进行更复杂的任务,如 检索增强生成(RAG)、对话系统、文档理解等。

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

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

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


快速入门

为了快速入门不展示过多废话导致看不下去,此处展示最简单的本地知识库。

复杂应用推荐看官网文档自己手搓,架构可能需要别种设计

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

xml 复制代码
		<dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
            <version>1.0.0-alpha1</version>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>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]

接下来,创建一个向量数据库,并把你的文档扔进去预处理。

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.langchain4j.dev/tutorials/rag#what-is-rag

相关推荐
wu_yi_min21 分钟前
Spring Boot 日志:项目的“行车记录仪”
java·数据库·spring boot
小万编程23 分钟前
【2025最新计算机毕业设计】基于SpringBoot+Vue爬虫技术的咖啡与茶饮料文化平台(高质量源码,可定制,提供文档,免费部署到本地)
java·vue.js·spring boot·毕业设计·课程设计·计算机毕业设计·项目源码
x-cmd38 分钟前
[250125] DeepSeek 发布开源大模型 R1,性能比肩 OpenAI o1 | 希捷推出高达 36TB 的硬盘
ai·开源·llm·openai·存储·硬件·deepseek
kongxx1 小时前
Maven运行任何命令都报错“Internal error: java.lang.ArrayIndexOutOfBoundsException”
java·开发语言·maven
怜渠客1 小时前
关于Java的HttpURLConnection重定向问题 响应码303
android·java
tingting01191 小时前
私有包上传maven私有仓库nexus-2.9.2
java·maven
天天向上杰1 小时前
简识JVM中并发垃圾回收器和多线程并行垃圾回收器的区别
java·jvm·算法
UVCuttt2 小时前
三天急速通关JavaWeb基础知识:Day 1 后端基础知识
java·servlet·java-ee·tomcat
细心的莽夫2 小时前
SpringBoot Web开发(SpringMVC)
spring boot·后端
Ciderw2 小时前
Go的垃圾回收(GC)机制
开发语言·c++·后端·面试·golang·gc