一文梳理有效提升RAG效果的方法
在大模型实际落地的时候,存在一些问题,主要集中在以下方面:
- **缺少垂直领域知识:**虽然大模型压缩了大量的人类知识,但在垂直场景上明显存在短板,需要专业化的服务去解决特定问题。
- **存在幻觉、应用有一定门槛:**在大模型使用上有一些幻觉、合规问题,没有办法很好地落地,配套工作不足,缺乏现成的方案来管理非结构化文本、进行测试、运营和管理等。
- **存在重复建设:**各业务孤立摸索,资产无法沉淀,存在低水平重复建设,对公司来说ROI低,不够高效。
站在应用的角度,需要一种能够有效解决大模型在垂直领域知识短板、降低应用门槛、提高效率并发挥规模优势的技术方案。
当前业内RAG是一种相对有效的解决上面问题的方案(平台化能力、开箱即用垂直私域数据)。
实现一个基本的不难,但要真正优化RAG的效果,还需要投入大量的精力。这里根据个人的理解,梳理总结一些常见的RAG优化方法,以便日后在实践RAG时提供参考。
- 首先,介绍几篇关于RAG优化的论文;
- 然后,记录一些常见的RAG工程实践经验;
希望能给大家带来一些参考,后续个人也会重点投入在RAG这块,希望和大家多多交流。
RAG介绍
RAG 是 “Retrieval-Augmented Generation”(检索增强生成)的缩写,它通过结合检索系统和生成模型来提高语言生成的准确性和相关性。
RAG 的优势在于它能够在生成响应时引入外部知识,这使得生成的内容更加准确和信息丰富,对于处理需要专业知识或大量背景信息的问题尤其有效。随着大型语言模型(LLMs)的发展,RAG 技术也在不断进化,以适应更长的上下文和更复杂的查询。
- 目前,大部分公司倾向于使用 RAG方法进行信息检索,因为相比长文本的使用成本,使用向量数据库的成本更低。
- 而在 RAG 应用过程中,一些公司会使用微调的 Embedding Model,以增强RAG 的检索能力;另一些些公司会选择使用知识图谱或者ES 等非向量数据库的 RAG 方法。
- 大多数第三方个人和企业开发者会使用集成好的 RAG 框架(例如llamaindex、langchain、etcs),或者直接使用LLMOps 里内建的RAG 工具。
相关优化论文
RAPTOR
论文地址:https://arxiv.org/pdf/2401.18059
传统的RAG方法通常仅检索较短的连续文本块,这限制了对整体文档上下文的全面理解。RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval)通过递归嵌入、聚类和总结文本块,构建一个自底向上的树形结构,在推理时从这棵树中检索信息,从而在不同抽象层次上整合来自长文档的信息。
1.树形结构构建:
- **文本分块:**首先将检索语料库分割成短的、连续的文本块。
- **嵌入和聚类:**使用SBERT(基于BERT的编码器)将这些文本块嵌入,然后使用高斯混合模型(GMM)进行聚类。
- **摘要生成:**对聚类后的文本块使用语言模型生成摘要,这些摘要文本再重新嵌入,并继续聚类和生成摘要,直到无法进一步聚类,最终构建出多层次的树形结构。
2.查询方法:
- **树遍历:**从树的根层开始,逐层选择与查询向量余弦相似度最高的节点,直到到达叶节点,将所有选中的节点文本拼接形成检索上下文。
- **平铺遍历:**将整个树结构平铺成一个单层,将所有节点同时进行比较,选出与查询向量余弦相似度最高的节点,直到达到预定义的最大token数。
3.**实验结果:**RAPTOR在多个任务上显著优于传统的检索增强方法,特别是在涉及复杂多步推理的问答任务中。RAPTOR与GPT-4结合后,在QuALITY基准上的准确率提高了20%。
- 代码:RAPTOR的源代码将在GitHub上公开。
- 数据集:实验中使用了NarrativeQA、QASPER和QuALITY等问答数据集。
参考视频:https://www.youtube.com/watch?v=jbGchdTL7d0
Self-RAG
论文地址:https://arxiv.org/pdf/2310.11511
SELF-RAG(自反思检索增强生成)是一种新框架,通过让语言模型在生成过程中进行自我反思,来提高生成质量和事实正确性,同时不损失语言模型的多样性。
主要过程:
解释:
- 生成器语言模型 M
- 检索器 R
- 段落集合 {d1,d2,…,dN}
**输入:**接收输入提示 ( x ) 和之前生成的文本 (y<t) ,其中(y-t)是模型基于本次问题生成的文本?
**检索预测:**模型 ( M ) 预测是否需要检索(Retrieve),基于 ( (x, y<t) )。
检索判断:
如果 ( Retrieve ) == 是:
1.**检索相关文本段落:**使用 ( R ) 基于 ( (x, y<t) ) 检索相关文本段落 ( D )。
2.**相关性预测:**模型 ( M ) 预测相关性 ( ISREL ),基于 ( x ),段落 ( d ) 和 ( y<t ) 对每个 ( d ) 进行评估。
3.**支持性和有用性预测:**模型 ( M ) 预测支持性 ( ISSUP ) 和有用性 ( ISUSE ),基于 ( x, y<t, d ) 对每个 ( d ) 进行评估。
4.**排序:**基于 ( ISREL ), ( ISSUP ), 和 ( ISUSE ) 对 ( y<t ) 进行排序。
如果 ( Retrieve ) == 否:
1.生成下一个段落:模型 ( M ) 基于 ( x ) 生成 ( y_t )。
2.**有用性预测:**模型 ( M ) 预测有用性 ( ISUSE ),基于 ( x, y_t ) 进行评估。
- **传统RAG:**先检索固定数量的文档,然后将这些文档结合生成回答,容易引入无关信息或虚假信息。
- **SELF-RAG:**通过自反思机制,按需检索相关文档,并评估每个生成段落的质量,选择最佳段落生成最终回答,提高生成的准确性和可靠性。
CRAG
论文地址:https://arxiv.org/pdf/2401.15884
纠错检索增强生成(Corrective RetrievalAugmented Generation, CRAG),旨在解决现有大语言模型(LLMs)在生成过程中可能出现的虚假信息(hallucina