本文会先介绍几篇关于RAG优化的论文,再记录一些常见的RAG工程实践经验。
在大模型实际落地的时候,存在一些问题,主要集中在以下方面:
-
缺少垂直领域知识:
虽然大模型压缩了大量的人类知识,但在垂直场景上明显存在短板,需要专业化的服务去解决特定问题。
-
存在幻觉、应用有一定门槛:
在大模型使用上有一些幻觉、合规问题,没有办法很好地落地,配套工作不足,缺乏现成的方案来管理非结构化文本、进行测试、运营和管理等。
-
存在重复建设:
各业务孤立摸索,资产无法沉淀,存在低水平重复建设,对公司来说ROI低,不够高效。
站在应用的角度,需要一种能够有效解决大模型在垂直领域知识短板、降低应用门槛、提高效率并发挥规模优势的技术方案。
当前业内RAG是一种相对有效的解决上面问题的方案(平台化能力、开箱即用垂直私域数据)。
实现一个基本的不难,但要真正优化RAG的效果,还需要投入大量的精力。这里根据个人的理解,梳理总结一些常见的RAG优化方法,以便日后在实践RAG时提供参考。
-
首先,介绍几篇关于RAG优化的论文;
-
然后,记录一些常见的RAG工程实践经验;
希望能给大家带来一些参考,后续个人也会重点投入在RAG这块,希望和大家多多交流。
RAG 是 “Retrieval-Augmented Generation”(检索增强生成)的缩写,它通过结合检索系统和生成模型来提高语言生成的准确性和相关性。
RAG 的优势在于它能够在生成响应时引入外部知识,这使得生成的内容更加准确和信息丰富,对于处理需要专业知识或大量背景信息的问题尤其有效。随着大型语言模型(LLMs)的发展,RAG 技术也在不断进化,以适应更长的上下文和更复杂的查询。
论文地址:https://arxiv.org/pdf/2401.18059
传统的RAG方法通常仅检索较短的连续文本块,这限制了对整体文档上下文的全面理解。RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval)通过递归嵌入、聚类和总结文本块,构建一个自底向上的树形结构,在推理时从这棵树中检索信息,从而在不同抽象层次上整合来自长文档的信息。
3.
实验结果:
RAPTOR在多个任务上显著优于传统的检索增强方法,特别是在涉及复杂多步推理的问答任务中。
RAPTOR与GPT-4结合后,在QuALITY基准上的准确率提高了20%。
参考视频:https://www.youtube.com/watch?v=jbGchdTL7d0
论文地址:https://arxiv.org/pdf/2310.11511
SELF-RAG(自反思检索增强生成)是一种新框架,通过让语言模型在生成过程中进行自我反思,来提高生成质量和事实正确性,同时不损失语言模型的多样性。
输入:
接收输入提示 ( x ) 和之前生成的文本 (y
检索预测:
模型 ( M ) 预测是否需要检索(Retrieve),基于 ( (x, y
1.
检索相关文本段落:
使用 ( R ) 基于 ( (x, y
2.
相关性预测:
模型 ( M ) 预测相关性 ( ISREL ),基于 ( x ),段落 ( d ) 和 ( y
3.
支持性和有用性预测:
模型 ( M ) 预测支持性 ( ISSUP ) 和有用性 ( ISUSE ),基于 ( x, y
4.
排序:
基于 ( ISREL ), ( ISSUP ), 和 ( ISUSE ) 对 ( y
1.
生成下一个段落
:
模型 ( M ) 基于 ( x ) 生成 ( y_t )。
2.
有用性预测:
模型 ( M ) 预测有用性 ( ISUSE ),基于 ( x, y_t ) 进行评估。
论文地址:https://arxiv.org/pdf/2401.15884
纠错检索增强生成(Corrective RetrievalAugmented Generation, CRAG)
,旨在解决现有大语言模型(LLMs)在生成过程中可能出现的虚假信息(hallucinations)问题。
-
问题背景:
大语言模型(LLMs)在生成过程中难免会出现虚假信息,因为单靠模型内部的参数知识无法保证生成文本的准确性。
尽管检索增强生成(RAG)是LLMs的有效补充,但它严重依赖于检索到的文档的相关性和准确性。
-
解决方案:
为此,提出了纠错检索增强生成(CRAG)框架,旨在提高生成过程的鲁棒性。
具体来说,设计了一个轻量级的检索评估器来评估检索到的文档的整体质量,并基于评估结果触发不同的知识检索操作。
在四个数据集(PopQA、Biography、PubHealth和Arc-Challenge)上的实验表明,CRAG可以显著提高RAG方法的性能,验证了其在短文本生成和长文本生成任务中的通用性和适应性。
论文地址:https://arxiv.org/pdf/2312.06648
探讨在密集检索任务中,选择适当的检索单元粒度(如文档、段落或句子)的重要性,作者提出了一种新的检索单元“命题”(proposition),并通过实验证明,在密集检索和下游任务(如开放域问答)中,基于命题的检索显著优于传统的段落或句子检索方法。
命题定义:
命题被定义为文本中的原子表达,每个命题包含一个独立的事实,并以简洁、自包含的自然语言形式呈现。命题代表文本中的原子意义表达,定义如下:
a.
独立意义:
每个命题应对应文本中的一个独立意义,所有命题的组合应能表示整个文本的语义。
b.
最小化:
命题应是最小的,即不能进一步分割成更小的命题。
c.
上下文自包含:
命题应是上下文化且自包含的。
即命题应包含所有必要的上下文信息,以便独立理解其意义。
-
-
创建FactoidWiki
(B部分)(命题化处理器将段落分割成独立的命题,从而创建了一个新的检索语料库FactoidWiki。
)
-
-
在开放域问答任务中使用
(D部分)
不同粒度的检索单元(段落、句子、命题)进行了实证比较
|
|
-
(Recall@5),即在前5个检索结果中找到正确答案的比例
-
(EM@100),即在前100个字中找到正确答案的比例
-
图表明了命题检索在提高密集检索的精确性和问答任务的准确性方面的优势。
通过直接提取相关信息,命题检索能更有效地回答问题并提供更准确的检索结果。
-
将段落和句子分解为更小的、上下文自包含的命题会产生更多的独立单元,每个单元都需要存储在索引中,会导致存储增加。
|
Decompose the "Content" into clear and simple propositions, ensuring they are interpretable out of context.
1. Split compound sentences into simple sentences. Maintain the original phrasing from the input whenever possible.
2. For any named entity that is accompanied by additional descriptive information, separate this information into its own distinct proposition.
3. Decontextualize the proposition by adding necessary modifiers to nouns or entire sentences and replacing pronouns (e.g., "it", "he", "she", "they", "this", "that") with the full name of the entities they refer to.
4. Present the results as a list of strings, formatted in JSON.
**Input:**
Title: Ìostre. Section: Theories and interpretations, Connection to Easter Hares.
Content:
The earliest evidence for the Easter Hare (Osterhase) was recorded in south-west Germany in 1678 by the professor of medicine Georg Franck von Franckenau, but it remained unknown in other parts of Germany until the 18th century. Scholar Richard Sermon writes that "hares were frequently seen in gardens in spring, and thus may have served as a convenient explanation for the origin of the colored eggs hidden there for children. Alternatively, there is a European tradition that hares laid eggs, since a hare’s scratch or form and a lapwing’s nest look very similar, and both occur on grassland and are first seen in the spring. In the nineteenth century the influence of Easter cards, toys, and books was to make the Easter Hare/Rabbit popular throughout Europe. German immigrants then exported the custom to Britain and America where it evolved into the Easter Bunny."
**Output:**
[
"The earliest evidence for the Easter Hare was recorded in south-west Germany in 1678 by Georg Franck von Franckenau.",
"Georg Franck von Franckenau was a professor of medicine.",
"The evidence for the Easter Hare remained unknown in other parts of Germany until the 18th century.",
"Richard Sermon was a scholar.",
"Richard Sermon writes a hypothesis about the possible explanation for the connection between hares and the tradition during Easter.",
"Hares were frequently seen in gardens in spring.",
"Hares may have served as a convenient explanation for the origin of the colored eggs hidden in gardens for children.",
"There is a European tradition that hares laid eggs.",
"A hare’s scratch or form and a lapwing’s nest look very similar.",
"Both hares and lapwing’s nests occur on grassland and are first seen in the spring.",
"In the nineteenth century the influence of Easter cards, toys, and books was to make the Easter Hare/Rabbit popular throughout Europe.",
"German immigrants exported the custom of the Easter Hare/Rabbit to Britain and America.",
"The custom of the Easter Hare/Rabbit evolved into the Easter Bunny in Britain and America."
]
---
**Input:**
**Output:**
从段落到命题的提示词:(中文版)
将“内容”分解成清晰简洁的命题,确保它们在上下文之外也能理解。
1. 将复合句拆分为简单句。尽可能保持输入的原始措辞。
2. 对于任何伴随有额外描述信息的命名实体,将这些信息分离成独立的命题。
3. 通过为名词或整句添加必要的修饰词,并用完整的实体名称替换代词(例如“它”、“他”、“她”、“他们”、“这个”、“那个”)来使命题脱离上下文。
4. 以JSON格式将结果呈现为字符串列表。
**输入:**
标题: Ìostre. 部分: 理论和解释,与复活节兔子的联系。
内容:
关于复活节兔子(Osterhase)的最早证据是在1678年由医学教授Georg Franck von Franckenau在德国西南部记录的,但在18世纪之前在德国其他地区仍然不为人知。学者Richard Sermon写道:“兔子经常在春天的花园中出现,因此可能是对为孩子们藏在那里的彩蛋起源的一个方便解释。或者,有一种欧洲传统认为兔子下蛋,因为兔子的抓痕或形态和大鸻的巢非常相似,而且两者都出现在草地上,并在春天首次出现。19世纪,复活节卡片、玩具和书籍的影响使复活节兔子在整个欧洲流行起来。然后,德国移民将这种习俗传播到英国和美国,并在英国和美国演变成复活节兔子。”
**输出:**
[
"关于复活节兔子的最早证据是在1678年由Georg Franck von Franckenau在德国西南部记录的。",
"Georg Franck von Franckenau是一位医学教授。",
"在18世纪之前,复活节兔子的证据在德国其他地区仍然不为人知。",
"Richard Sermon是一位学者。",
"Richard Sermon写了一个关于兔子与复活节传统之间可能联系的假设。",
"兔子经常在春天的花园中出现。",
"兔子可能是对为孩子们藏在花园里的彩蛋起源的一个方便解释。",
"有一种欧洲传统认为兔子下蛋。",
"兔子的抓痕或形态和大鸻的巢非常相似。",
"兔子和大鸻的巢都出现在草地上,并在春天首次出现。",
"19世纪,复活节卡片、玩具和书籍的影响使复活节兔子在整个欧洲流行起来。",
"德国移民将复活节兔子的习俗传播到英国和美国。",
"复活节兔子的习俗在英国和美国演变成复活节兔子。"
]
---
**输入:**
\
**输出:**
视频地址:https://www.youtube.com/watch?v=8OJC21T2SL4&t=1933s
-
文本切割是优化语言模型应用性能的关键步骤。
-
切割策略应根据数据类型和语言模型任务的性质来定制。
-
传统的基于物理位置的切割方法(如字符级切割和递归字符切割)虽简单,但可能无法有效地组织语义相关的信息。
-
语义切割和基因性切割是更高级的方法,它们通过分析文本内容的语义来提高切割的精确度。
-
使用多向量索引可以提供更丰富的文本表示,从而在检索过程中提供更相关的信息。
-
工具和技术的选择应基于对数据的深入理解以及最终任务的具体需求。
1.
字符级切割:
简单粗暴地按字符数量固定切割文本。
2.
递归字符切割:
考虑文本的物理结构,如换行符、段落等,逐步递归切割。
3.
文档特定切割:
针对不同类型的文档(如Markdown、Python代码、JavaScript代码和PDF),使用特定的分隔符进行切割。
4.
语义切割:
利用语言模型的嵌入向量来分析文本的意义和上下文,以确定切割点。
5.
基因性切割:
创建一个Agent,使用Agent来决定如何切割文本,以更智能地组织信息。
参考文章:https://raghunaathan.medium.com/query-translation-for-rag-retrieval-augmented-generation-applications-46d74bff8f07
2、生成子查询:
输入问题被分解成多个子查询(Query 1, Query 2, Query n)。
3、文档检索:
每个子查询分别检索相关的文档,得到对应的检索结果(Query 1 documents, Query 2 documents, Query n documents)。
4、文档合并和重新排序:
将所有子查询的检索结果文档合并并重新排序(Combined Reranked Documents)。
你是一名乐于助人的助手,负责生成与输入问题相关的多个子问题。
目标是将输入问题分解为一组可以单独回答的子问题。
生成与以下问题相关的多个搜索查询:{question}
输出(3个查询):
You are a helpful assistant that generates multiple sub-questions related to an input question.
The goal is to break down the input into a set of sub-problems / sub-questions that can be answers in isolation.
Generate multiple search queries related to: {question}
Output (3 queries):
上面是分解为多个子查询之后,把多个子查询召回的文档重排序后交给大模型来回答,接下来的策略对子查询生成的问题进行迭代得到新的答案。
1、递归回答方法:我们将问题以及先前的问答响应和为当前问题获取的上下文继续传递。保留了旧的视角,并将解决方案与新的视角同步,这种方法对于非常复杂的查询是有效的。
2、并行回答方法:将用户提示分解为细致入微的部分,不同之处在于我们试图并行解决它们。单独回答每个问题,然后将它们组合在一起以获得更细致的上下文,然后用于回答用户查询。对大部分场景来说是有效的方案