目录
概述
Advanced RAG
Pre-Retrieval预检索
优化索引
增强数据粒度
粗粒度
细粒度
展开说说
优化索引
Chunk策略
Small2Big方法
元数据
引入假设性问题
对齐优化
混合检索
查询优化
查询扩展
查询转换
Post-Retrieval后检索
参考
概述
Native RAG(基础RAG)体现了RAG开发范式的骨架,也即三段论Indexing-Retrieval-Generation。
Native RAG的不足是,在LLM这种高度不确定的场景下,还是太粗糙了,最终的表现就是效果不够好。
具体表现:
- 准确性低:Retrieval阶段查询到的块,和query本身的相关性低。可能导致LLM出现幻觉或空中掉物等问题。
- 召回低:Retrieval阶段查询的块,并没有返回足够多的相关块,进一步降低了LLM构建全面回应的可能性。
- 组装prompt的问题:这个阶段会将检索到的块和query融合,构建一个prompt给到LLM。若检索到的多个块中包含了相似或重复的内容,可能导致最终LLM生成内容的冗余和重复,也就是表现的婆婆妈妈。
- 灵活性问题:若检索阶段拿到了足够丰富的信息,和query一起构建扔给LLM后,LLM的生成完全基于检索出的内容,并没有增加新生成的内容,变成了复读机。
Advanced RAG的目标是对Native RAG的效果做了进一步优化。
Advanced RAG
Advanced RAG重点聚焦在检索增强,也即优化Retrieval阶段。
增加了Pre-Retrieval预检索和Post-Retrieval后检索阶段。
Pre-Retrieval预检索
本阶段关注的重点是:优化索引结构和原始查询。
优化索引
目标是提高被索引内容的质量。这涉及五种主要策略:增强数据粒度、优化索引结构、添加元数据、对齐优化和混合检索。
增强数据粒度
粗粒度
例如文档分块chunk较大。
理论上粗粒度,能包含更多的相关信息。
但这是一把双刃剑,粗粒度也可能包含了很多无关的内容,而这些无关内容可能会给LLM的generation阶段带来额外的困扰。
细粒度
例如文档分块chunk较小。
细粒度会导致分块很多,给检索阶段增加了压力。
同时细粒度也不能保证能提供完整的语义信息。
旁白:
- 反正一刀切预制一个chunk大小肯定不行
- 能不能动态优化?不同doc有不同的chunk?
展开说说
【针对文本数据】数据粒度从细到粗包括:
- Token
- Phrase 短语
- Sentence 句子
- Proposition 命题
- Chunk 分块
- Doc 整个文档
以Proposition命题为检索单元。命题被定义为文本中的原子表达式,每个命题都封装了一个独特的事实片段,并以简洁、自包含的自然语言格式呈现。
这种方法目的是提高检索精度和相关性。
【针对知识图谱Knowledge Graph】,数据粒度从细到粗包括:
- Entity 实体
- Triplet 三元组
- sub-Graph 子图
优化索引
Chunk策略
和数据粒度有一定关联性。
chunk可能导致句子截断,这会损坏语义完整性。
优化:
- 递归拆分split
- 滑动窗口
- 分层检索:在多检索基础上合并全局关联信息
(具体怎么做下回分解)
一个关键点:如何在语义完整性和上下文长度之间取得平衡。
Small2Big方法
使用句子做检索单元(这个是small)
使用前句和后句做上下文(这个是big)
元数据
例如chunk的元数据:
- 页码
- 文件名
- 作者
- 时间
- 类别
检索时可通过meta data先过滤,例如检索time range内的chunk,确保是新鲜的信息。
除了从原始文档中自动抽取meta data,也可以人工构建meta data,例如:
- 添加段落摘要
- 引入假设性问题
引入假设性问题
例如把doc喂给LLM,让LLM生成这个doc可以回答哪些问题。
在Retrieval时,对比原始query和LLM生成的这些假设性问题,可以用于过滤掉不相关的doc。
对齐优化
例如垂直领域,调优embedding模型,可以将领域内的相似知识嵌入到相近的空间(相比于通用embedding模型)。
混合检索
- 向量相似性检索
- 文本相似性检索
- 知识图谱检索
查询优化
查询优化就是让用户的原始问题更清晰,更适合于检索任务。
常见的方法包括查询改写、查询转换、查询扩展等。
查询扩展
将单个查询扩展为多个查询,丰富查询内容,可提供更丰富的上下文信息。
- 让LLM针对原始query生成多个查询
- 将复杂问题拆分成多个子问题
查询转换
改写用户的原始query
- 让LLM优化原始query
- 使用专门的较小的语言模型进行改写
- 让LLM先生成原始query的答案,然后将答案作为query,去根据相似性检索(而不是直接用原始query去检索)
Post-Retrieval后检索
重点是有效的融合检索到的相关内容和query。
主要方法包括:
- 分块chunk重排序
- 将检索到的块里,最相关的块优先级提高
- 上下文压缩
- 一个是避免prompt超长,超过LLM的窗口限制
- 另一个是找到基础信息,强调关键信息,将不相关的内容压缩、精简、淡化
参考
- RAG概述(一):RAG架构的演进-****博客
- https://arxiv.org/pdf/2312.10997