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