一、大模型开发范式
1.RAG
RAG的全称是Retrieval-Augmented Generation,中文翻译为检索增强生成。它是一个为大模型提供外部知识源的概念,这使它们能够生成准确且符合上下文的答案,同时能够减少模型幻觉。
RAG的架构如图中所示,简单来讲,RAG就是通过检索获取相关的知识并将其融入Prompt,让大模型能够参考相应的知识从而给出合理回答。因此,可以将RAG的核心理解为“检索+生成”,前者主要是利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和Prompt工程,将召回的知识合理利用,生成目标答案。
完整的RAG应用流程主要包含两个阶段:
数据准备阶段:数据提取——>文本分割——>向量化(embedding)——>数据入库
应用阶段:用户提问——>数据检索(召回)——>注入Prompt——>LLM生成答案
2.LangChain 简介
LangChain 框架是一个开源工具,通过为各种 LLM 提供通用接口来简化应用程序的开发流程,帮助开发者自由构建 LLM应用。
LangChain 的核心组成模块:
链(Chains):将组件组合实现端到端应用,通过一个对象封装实现一系列 LLM 操作
Eg. 检索问答链,覆盖实现了 RAG(检索增强生成)的全部流程
下面是基于LangChain搭建RAG应用的流程图:
二、构建向量库
步骤为:加载源文件–文档分块 --文档向量化
具体流程为:
1.确定源文件类型,针对不同类型源文件选用不同的加载器
核心在于将带格式文本转化为无格式字符串
2.由于单个文档往往超过模型上下文上限,我们需要对加载的文档进行切分
一般按字符串长度进行分割
可以手动控制分割块的长度和重叠区间长度
3.使用向量数据库来支持语义检索,需要将文档向量化存入向量数据库
可以使用任意一种 Embedding 模型来进行向量化
可以使用多种支持语义检索的向量数据库,一般使用轻量级的 Chroma
三、基于internlm构建检索问答链
步骤如下:
1.LangChain 提供了检索问答链模版,可以自动实现知识检索、Prompt 嵌入、LLM 问答的全部流程
2.将基于 InternLM 的自定义 LLM 和已构建的向量数据库接入到检索问答链的上游
3.调用检索问答链,即可实现知识库助手的核心功能
四、实验步骤
1.知识库构建
1. 数据收集
本次选用由上海人工智能实验室开源的一系列大模型工具开源仓库作为语料库来源,选用上述仓库中所有的 markdown、txt 文件作为示例语料库。
2. 加载数据
得到所有目标文件路径之后,我们可以使用 LangChain 提供的 FileLoader 对象来加载目标文件,得到由目标文件解析出的纯文本内容。由于不同类型的文件需要对应不同的 FileLoader,我们判断目标文件类型,并针对性调用对应类型的 FileLoader,同时,调用 FileLoader 对象的 load 方法来得到加载之后的纯文本对象。比如使用UnstructuredMarkdownLoader加载MD文件,使UnstructuredFileLoader加载TXT文件。
3. 构建向量数据库
得到该列表之后,我们就可以将它引入到 LangChain 框架中构建向量数据库。由纯文本对象构建向量数据库,我们需要先对文本进行分块,接着对文本块进行向量化。并使用
开源词向量模型 Sentence Transformer 来进行文本向量化。
2.构建检索问答链
LangChain 通过提供检索问答链对象来实现对于 RAG 全流程的封装。所谓检索问答链,即通过一个对象完成检索增强问答(即RAG)的全流程,针对 RAG 的更多概念,我们会在视频内容中讲解,也欢迎读者查阅该教程来进一步了解:《LLM Universe》。我们可以调用一个 LangChain 提供的 RetrievalQA 对象,通过初始化时填入已构建的数据库和自定义 LLM 作为参数,来简便地完成检索增强问答的全流程,LangChain 会自动完成基于用户提问进行检索、获取相关文档、拼接为合适的 Prompt 并交给 LLM 问答的全部流程。
具体实验步骤参考:
https://github.com/InternLM/tutorial/tree/main/langchain
视频教程:
https://www.bilibili.com/video/BV1sT4y1p71V/
其他参考文档:
一文搞懂大模型RAG应用