先说结论,Anthropic提出了一种显著改进RAG中检索步骤的方法。这种方法被称为“上下文检索(Contextual Retrieval)”:
它使用两种子技术:上下文嵌入(Contextual Embeddings)和上下文BM25
这种方法可以将检索失败的次数减少49%
并且当结合重排时,减少67%。
上下文检索(Contextual Retrieval)的出发点:RAG是一种从知识库检索相关信息并将其附加到用户提示上的方法,显著提升了模型的响应。但是传统的RAG解决方案在编码信息时会移除上下文,这常常导致系统无法从知识库中检索到相关信息。
RAG简介:扩展到更大的知识库
将知识库(文档的“语料库”)分解成较小的文本块,通常不超过几百个token; 使用嵌入模型将这些块转换为编码意义的向量嵌入; 将这些嵌入存储在允许按语义相似性搜索的向量数据库中。
将知识库(文档的“语料库”)分解成较小的文本块,通常不超过几百个token; 为这些块创建TF-IDF编码和语义嵌入; 使用BM25基于精确匹配找到顶部块; 使用嵌入基于语义相似性找到顶部块; 使用排名融合技术结合并去重(3)和(4)的结果; 将顶部K块添加到提示中以生成响应。
original_chunk = "The company's revenue grew by 3% over the previous quarter."
contextualized_chunk = "This chunk is from an SEC filing on ACME corp's performance in Q2 2023; the previous quarter's revenue was $314 million. The company's revenue grew by 3% over the previous quarter."
原始块 = "公司的收入比上个季度增长了3%。"
上下文化块 = "这个块来自关于ACME公司2023年第二季度表现的SEC文件;上个季度的收入为3.14亿美元。公司的收入比上个季度增长了3%。"
<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.
上下文嵌入将Top20个块的检索失败率降低了35%(5.7% → 3.7%)。 结合上下文嵌入和上下文BM25将Top20个块的检索失败率降低了49%(5.7% → 2.9%)。
使用表现最佳的嵌入配置(Gemini Text 004)检索前20个块时所有知识领域的平均性能
执行初始检索以获取Top潜在相关的块(使用了Top150个); 将TopN块和用户的查询一起通过重新排名模型; 使用重新排名模型,根据其与提示的相关性和重要性给每个块打分,然后选择TopK块(使用了Top20个); 将TopK块作为上下文传递到模型以生成最终结果。
嵌入+BM25比单独使用嵌入更好; Voyage和Gemini具有最好的嵌入; 将Top20块传递给模型比仅Top10或5更有效; 向块添加上下文大大提高了检索准确性; 重新排名比不重新排名更好; 所有这些好处都是叠加的:为了最大化性能改进,可以结合上下文嵌入(来自Voyage或Gemini)、上下文BM25,加上重新排名步骤,并添加20个块到提示中。
向块中添加通用文档摘要:https://aclanthology.org/W02-0405.pdf
HyDE:https://arxiv.org/abs/2212.10496
Summary-based indexing:https://www.llamaindex.ai/blog/a-new-document-summary-index-for-llm-powered-qa-systems-9a32ece2f9ec
备注:进群,进入大模型技术群
id:baobaogpt,记得备注呦