当前位置: 首页 > article >正文

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示例,我们需要的依赖项如下:

		<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示例)

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内存,轻松嵌入^^( ఠൠఠ )ノ

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

再抽取一个Assistant接口

public interface Assistant {
    String chat(String userMessage);

    <T> String chat(String userMsg, StreamingResponseHandler<AiMessage> streamingResponseHandler);
}

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

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


http://www.kler.cn/a/521098.html

相关文章:

  • 多模态论文笔记——ViViT
  • leetcode刷题-贪心03
  • 【Docker】Docker入门了解
  • Vue3 provide/inject用法总结
  • Kafka运维宝典 (三)- Kafka 最大连接数超出限制问题、连接超时问题、消费者消费时间超过限制问题详细介绍
  • Open FPV VTX开源之ardupilot双OSD配置摄像头
  • 【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
  • ollama使用详解
  • JavaScript 的 Promise 对象和 Promise.all 方法的使用
  • 验证二叉搜索树(力扣98)
  • Pandas基础03(数据的合并操作/concat()/append()/merge())
  • 第五节 MATLAB命令
  • 【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍Transformer相较于CNN的优缺点?
  • WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用
  • 对比OpenAI的AI智能体Operator和智谱的GLM-PC,它们有哪些不同?
  • MongoDB的事务机制
  • 智慧园区解决方案助力数字化转型与智能生态系统建设
  • 基于SpringBoot电脑组装系统平台系统功能实现三
  • PostgreSQL技术内幕23:PG统计信息的收集和应用
  • 【Leetcode 热题 100】300. 最长递增子序列
  • [SWPUCTF 2022 新生赛]js_sign
  • 【java数据结构】哈希表
  • 2025年美赛数学建模F题 为农业再培养腾出空间
  • 葡萄果品分级以及葡萄簇识别-目标检测数据集
  • SOAFEE 技术研讨会:汽车软件定义与自动驾驶技术探讨
  • arduino学习