随着LLM 广泛应用,许多开发者开始通过定制化的调优,进一步提升模型性能。
传统模型微调面临许多挑战,尤其是在处理特定领域的任务时。RAG 应运而生。
微调能够提高模型的专门性,但也面临问题:数据需求大、计算资源要求高、隐私与安全问题,RAG 通过将 LLM 与外部知识库结合,在生成答案时检索相关信息,避免微调的高成本和复杂性。
RAG 包括两个主要部分:知识库创建和生成部分。
知识库创建包括文档分割、嵌入计算和向量存储三个步骤:
将大文档拆分为小片段,便于处理;为每个文档片段计算嵌入,转换为向量表示;将计算得到的嵌入存储在数据库中,便于后续检索。
生成部分包括查询处理、检索和生成回答三个环节:
当用户发出查询时,系统会首先计算查询的嵌入向量,根据查询嵌入检索相关的文档片段;系统将检索到的片段与查询一起输入到LLM,生成最终答案。
如此这般,使得模型能够在不进行微调的情况下,获得高质量的领域特定回答。
------ 以上这些是我们熟知的。
结构图、一图胜过千言:
但为进一步提高检索精度,很多RAG系统采用了混合检索方法,结合传统的关键词检索和语义检索。
BM25 就是基于关键词的检索算法之一!
(根据Anthropic的报告,使用混合检索方法能够将检索结果的准确性提高约1%)
BM25 特别适合检索包含精确关键词的文档,语义检索有助于找到语义相似的内容。
对于包含精确关键词的查询,BM25能迅速定位到相关文档,避免纯粹依赖嵌入模型的不足之处。
dart
<document>
{{WHOLE_DOCUMENT}}
</document>
Here is the chunk we want to situate within the whole document
<chunk>
{{CHUNK_CONTENT}}
</chunk>
Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk. Answer only with the succinct context and nothing else
这里,为每个文档片段生成上下文信息。将给定的片段与相关的上下文信息结合,通过嵌入模型处理片段。生成的嵌入将被存储在标准的向量数据库中。
同时更新BM25索引,这种情况下,使用基于关键词的搜索机制TF-IDF(词频-文档逆向),在每个片段中,添加50到100个标记。但是它会增加大量的开销,因为每个片段都要经过LLM处理,产生大量的标记。
所以,除了关键词算法,RAG 系统中,由于检索时主要依赖欧几里得距离或余弦相似度等基础方法,这种做法可能导致提取结果不够精确。为了进一步提高结果的质量,重新排序模型应运而生。
重新排序模型通过跨注意力机制对查询与文档片段进行比对,能够发现查询与文档之间的重要关系,弥补简单相似度计算模型的不足。
它的场景通常用于在提取到一些潜在相关的文档片段后,对它们进行重新排序,确保生成的回答更准确。
检索模型设计用于提取信息片段,通常紧凑高效,但依赖于基本的提取技术,如欧几里得距离或向量间的余弦相似度,优先考虑提取的速度和数量,可能导致结果不够准确。
相比之下,重新排序模型更复杂且较慢,不适合直接处理大量提取结果,通过重新排序检索模型提取的较小片段集合来优化结果。
其核心优势在于能够在用户查询与每个片段之间进行交叉-cross-attention,发现查询与片段之间的重要关系。
小结
从经验来看,RAG 不是万能的,它仍然依赖于高质量的文档片段和高效检索机制。
实战中,可以根据需求来制定优化策略,灵活使用这里介绍的BM25算法或者重排技术。