在常识库问答等场景中,RAG曾经成为当下最盛行的LLM运行范式,为LLM提供又全又准的高低文消息是泛滥RAG技术致力的方向。在传统的 RAG 处置打算中,编码消息时往往会失落高低文,这造成系统不可从常识库中检索到关系消息,如何能够更好地保管高低文消息成为了疑问关键。
Anthropic 钻研团队提出了“Contextual Retrieval(高低文检索)”的翻新方法在此畛域取得了清楚停顿。近日,他们宣布文章可披露了这一技术的细节,他们经过高低文嵌入(Contextual Embeddings)和高低文 BM25(Contextual BM25)(文本检索)可以将检索失败率缩小 49%,联结重排序(reranking),失败率可缩小 67%。
咱们一同来了解这一方法的**内容。
高低文检索的翻新点
传统的 RAG 系统在宰割文档时会破坏高低文,造成检索到的消息分块不足足够的背景消息。
例如,假定你有一个蕴含财务消息的常识库,并收到以下疑问:“ACME 公司在 2023 年第二季度的支出增长是多少?”一个关系的分块或者蕴含这样的文本:“公司的支出比上一季度增长了 3%。”但是,这个分块自身并没有指定是哪家公司或关系的期间段,造成难以检索到正确的消息或有效地经常使用这些消息。
钻研团队尝试过一些业内盛行的改良措施,诸如:分块中参与文档摘要(adding generic document summaries to chunks),假定文档嵌入(hypothetical document embedding),以及索引摘要(summary-based indexing),但都效果不佳。
他们经过少量试验探索,驳回高低文检索时经过在嵌入前为每个分块参与特定的解释性高低文(Contextual Embeddings)和创立 BM25 索引(Contextual BM25)来处置这个疑问。例如:
原始分块 "公司的支出比上一季度增长了3%。"高低文明分块 "这个分块来自ACME公司在2023年第二季度的SEC文件;上一季度的支出为3.14亿美元。公司的支出比上一季度增长了3%。"
这种方法清楚提高了检索的准确性,特意是在处置蕴含特定标识符或技术术语的查问时。
如何成功高低文检索
手动为常识库中的不可胜数个分块参与高低文显然是不事实的。为此,钻研团队经常使用了 Claude 模型,经过一个特定的揭示生成每个分块的繁复高低文,生成的高低文通常为 50-100 个 token,而后在嵌入和创立 BM25 索引之前将其参与到分块中。
这是官网 prompt 示例:
<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.
以下是详细的成功步骤:
首先,钻研团队经常使用 Claude 为每个分块生成高低文。经过设计一个特定的揭示,Claude 可认为每个分块生成繁复而无心义的高低文。
例如,假定咱们有一个分块:
“公司的支出比上一季度增长了3%。”
咱们可以设计一个揭示,让 Claude 生成高低文:
“请为以下分块生成一个繁复的高低文:‘公司的支出比上一季度增长了3%。’”
Claude 或者会生成以下高低文:
“这个分块来自ACME公司在2023年第二季度的SEC文件;上一季度的支出为3.14亿美元。公司的支出比上一季度增长了3%。”
生成高低文后,将其参与到原始分块中。这样,每个分块都蕴含了足够的背景消息,便于后续的检索和经常使用。
高低文明分块 = "这个分块来自ACME公司在2023年第二季度的SEC文件;上一季度的支出为3.14亿美元。公司的支出比上一季度增长了3%。"
接上去,经常使用嵌入模型将高低文明分块转换为向量嵌入。向量嵌入是高维空间中的点,示意文本的语义含意。罕用的嵌入模型包括 Voyage 和 Gemini,它们在试验中体现杰出。
嵌入向量 = 嵌入模型(高低文明分块)
除了生成嵌入,还须要为高低文明分块创立 BM25 索引。BM25 是一种基于词频和逆文档频率的检索算法,能够有效地权衡文本分块与查问之间的关系性。
BM25索引 = BM25模型(高低文明分块)
将生成的嵌入向量和 BM25 索引存储在向量数据库和 BM25 索引库中。这样,当用户输入查问时,系统可以同时经常使用嵌入向量和 BM25 索引启动检索,从而找到最关系的高低文明分块。
向量数据库.存储(嵌入向量)BM25索引库.存储(BM25索引)
在检索到关系分块后,经常使用重排序技术对分块启动过滤和排序,确保只要最关系的分块被传递给生成模型。重排序可以清楚提高检索的准确性和关系性。
关系分块 = 向量数据库.检索(查问)重排序分块 = 重排序模型(关系分块)
在成功高低文检索时,钻研团队特意指出须要思考以下几点:
效果如何
钻研团队的试验结果显示:
同时,应用揭示缓存技术降落了经常使用老本。经过揭示缓存,您不须要为每一块都传递参考文档。您只要将文档加载到缓存中一次性,而后援用之前缓存的内容即可。假定每块有 800 个 token,8k 个 token 的文档,50 个 token 的高低文指令,以及每块 100 个 token 的高低文,生成高低文明块的一次性性老本为每百万文档 token1.02 美元。
联结重排序进一步优化功能
在传统 RAG 中,AI 系统会从常识库中检索到少量潜在关系的消息分块。关于大型常识库,这一初始检索往往会前往少量分块,有时多达数百个,且关系性和关键性各不相反。重排序是一种罕用的过滤技术,确保只要最关系的分块被传递给模型。试验结果显示,重排序后的高低文嵌入和高低文 BM25 将前 20 个分块的检索失败率缩小了 67%(从 5.7%降至 1.9%)。
同时留意,因为重排序在运转时参与了额外的步骤,即使一切分块都是并行评分,也肯定会参与一小局部提前,在重排序少量分块时体现愈加清楚。重排序在经常使用更多分块以取得更好功能与更少分块以降落提前和老本之间存在取舍,这须要在详细的场景下尝试不同的设置,以找到适合的平衡点。
总结
钻研团队经过少量的试验,为大家指出了一个新的优化 RAG 功能的方法,为开发者指出了通常新方向。
同时,钻研团队基于少量试验的结果,给出了一些关键的阅历总结:
关于该方法感兴味的读者,可以在cookbook指点下上手体验。
参考资料
[1]文章:
[2]分块中参与文档摘要(adding generic document summaries to chunks):
[3]假定文档嵌入(hypothetical document embedding):
[4]索引摘要(summary-based indexing):
[5]Gemini:
[6]Voyage:
[7]cookbook:
本文转载自,作者: