RAG
产生
-
知识密集型任务 指如果不依靠外部知识,即使是人类也不能取得很好的表现的任务
① 模型容量再大,也记不住所有知识。
② 难以方便地扩展或修改全部知识
检索增强生成 (Retrieval Augmented Generation)
-
思路:根据收到的问题从外挂的知识库检索相关上下文背景提供准确和最新的知识。
- 阶段① 合了序列到序列(Seq2Seq)模型和生成对抗网络(GAN)的思想,利用向量数据库的高效存储和检索能力,在检索阶段召回目标知识
- 阶段② 利用大模型/提示词工程实现增强,将召回的知识合理利用,生成目标答案
-
目的:
-
①提高质量(允许对新增数据使用相同的模型处理无需调整和微调模型,拓展可用性)
-
②减少错误(降低幻觉的可能)
-
③保证私域数据安全(本地知识库) 实现 "开卷"答题
相当于为参数化的seq2seq模型赋予了检索式的非参数记忆,实现拿到问题后先查资料再答题的效果
-
模型工作流程
以LangChain架构图为例:
-
- 文档加载与处理 加载文档(Local Documents):从本地文档中获取原始数据。
文档预处理(Unstructured Loader):解析文档并转换为文本格式。
文本处理(Text):存储解析后的文本。
文本分块(Text Splitter):将大文本分割为小的文本片段(Chunks)。
-
- 索引构建 文本嵌入(Embedding):使用嵌入模型将文本块转换为向量表示。
存储向量(VectorStore):存储文本块的向量表示,以便快速检索。
-
- 查询处理 用户查询(Query):用户输入查询。
查询嵌入(Embedding):将查询转换为向量表示。
生成查询向量(Query Vector)。
-
- 检索相关文本 计算相似度(Vector Similarity):计算查询向量与存储向量的相似度。
检索相关文本(Related Text Chunks):根据相似度找到最相关的文本片段。
-
- 生成回答 填充提示模板(Prompt Template):将检索到的文本填充到提示模板中。
构造最终Prompt(Prompt)。
输入LLM(LLM):将最终Prompt输入大语言模型。
生成答案(Answer):大语言模型基于检索的文本和用户查询生成最终答案。
实现
主要组成部分
- 检索器(Retriever):检索器从大规模语料库中检索与给定目标文本相关的上下文,并使用这些上下文来增强生成器的输入。检索器通常使用预训练的语言模型进行查询和匹配操作。
- 生成器(Generator):生成器使用检索器检索到的上下文和目标文本作为输入,并生成与目标文本相关的响应或文本。生成器通常采用Seq2Seq模型结构,将上下文和目标文本拼接在一起作为输入,并输出生成的响应文本。
- 判别器(Discriminator):判别器的目的是区分生成的文本和真实的语料库文本。它使用深度学习技术,如卷积神经网络(CNN)或循环神经网络(RNN),来对生成的文本进行分类和打分,以评估其真实性和质量。
各模块的思路与实现方法
- 文本结构化前处理
- 文本分割方法
- 向量嵌入
- 索引构建与检索
- 增强与生成