欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > RAG:实现基于本地知识库结合大模型生成(LangChain4j快速入门#1)

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

2025/2/1 0:44:26 来源:https://blog.csdn.net/2201_75299492/article/details/145369196  浏览:    关键词: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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com