一文梳理有效提升RAG效果的方法
阿里妹导读
缺少垂直领域知识:虽然大模型压缩了大量的人类知识,但在垂直场景上明显存在短板,需要专业化的服务去解决特定问题。
存在幻觉、应用有一定门槛:在大模型使用上有一些幻觉、合规问题,没有办法很好地落地,配套工作不足,缺乏现成的方案来管理非结构化文本、进行测试、运营和管理等。
存在重复建设:各业务孤立摸索,资产无法沉淀,存在低水平重复建设,对公司来说ROI低,不够高效。
首先,介绍几篇关于RAG优化的论文;
然后,记录一些常见的RAG工程实践经验;
RAG介绍
目前,大部分公司倾向于使用 RAG方法进行信息检索,因为相比长文本的使用成本,使用向量数据库的成本更低。
而在 RAG 应用过程中,一些公司会使用微调的 Embedding Model,以增强RAG 的检索能力;另一些些公司会选择使用知识图谱或者ES 等非向量数据库的 RAG 方法。
大多数第三方个人和企业开发者会使用集成好的 RAG 框架(例如llamaindex、langchain、etcs),或者直接使用LLMOps 里内建的RAG 工具。
相关优化论文
RAPTOR
文本分块:首先将检索语料库分割成短的、连续的文本块。
嵌入和聚类:使用SBERT(基于BERT的编码器)将这些文本块嵌入,然后使用高斯混合模型(GMM)进行聚类。
摘要生成:对聚类后的文本块使用语言模型生成摘要,这些摘要文本再重新嵌入,并继续聚类和生成摘要,直到无法进一步聚类,最终构建出多层次的树形结构。
树遍历:从树的根层开始,逐层选择与查询向量余弦相似度最高的节点,直到到达叶节点,将所有选中的节点文本拼接形成检索上下文。
平铺遍历:将整个树结构平铺成一个单层,将所有节点同时进行比较,选出与查询向量余弦相似度最高的节点,直到达到预定义的最大token数。
代码:RAPTOR的源代码将在GitHub上公开。
数据集:实验中使用了NarrativeQA、QASPER和QuALITY等问答数据集。
Self-RAG
生成器语言模型 M 检索器 R 段落集合 {d1,d2,...,dN}
1.生成下一个段落:模型 ( M ) 基于 ( x ) 生成 ( y_t )。
传统RAG:先检索固定数量的文档,然后将这些文档结合生成回答,容易引入无关信息或虚假信息。
SELF-RAG:通过自反思机制,按需检索相关文档,并评估每个生成段落的质量,选择最佳段落生成最终回答,提高生成的准确性和可靠性。
CRAG
问题背景:大语言模型(LLMs)在生成过程中难免会出现虚假信息,因为单靠模型内部的参数知识无法保证生成文本的准确性。尽管检索增强生成(RAG)是LLMs的有效补充,但它严重依赖于检索到的文档的相关性和准确性。
解决方案:为此,提出了纠错检索增强生成(CRAG)框架,旨在提高生成过程的鲁棒性。具体来说,设计了一个轻量级的检索评估器来评估检索到的文档的整体质量,并基于评估结果触发不同的知识检索操作。
x 是输入的问题。 D 是检索到的文档集合。 y 是生成的响应。
scorei 是每个问题-文档对的相关性得分,由检索评估器 E 计算。
Confidence 是基于所有相关性得分计算出的最终置信度判断。
如果置信度为 CORRECT,则提取内部知识并进行细化。 如果置信度为 INCORRECT,则进行网络搜索获取外部知识。 如果置信度为 AMBIGUOUS,则结合内部和外部知识。
使用生成器 G 基于输入问题 x 和处理后的知识 k 生成响应 y。
基于置信度分数,触发不同的知识检索操作:Correct(正确)、Incorrect(错误)和Ambiguous(模糊)。
对于相关性高的检索结果,设计了一个先分解再重组的知识重组方法。首先,通过启发式规则将每个检索到的文档分解成细粒度的知识片段。 然后,使用检索评估器计算每个知识片段的相关性得分。基于这些得分,过滤掉不相关的知识片段,仅保留相关的知识片段,并将其按顺序重组。
由于从静态和有限的语料库中检索只能返回次优的文档,因此引入了大规模网络搜索作为补充,以扩展和增强检索结果。
当所有检索到的文档都被认为是错误的时,引入网络搜索作为补充知识源。通过网络搜索来扩展和丰富最初获取的文档。
输入查询被重写为由关键词组成的查询,然后使用搜索API(如Google Search API)生成一系列URL链接。通过URL链接导航网页,转录其内容,并采用与内部知识相同的知识重组方法,提取相关的网络知识。
Dense X Retrivel
分割段落为命题(A部分) 创建FactoidWiki(B部分)(命题化处理器将段落分割成独立的命题,从而创建了一个新的检索语料库FactoidWiki。) 比较不同粒度的检索单元(C部分) 在开放域问答任务中使用(D部分)
|
从段落到命题的提示词:(英文版)
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:**
<an new passage>
**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世纪,复活节卡片、玩具和书籍的影响使复活节兔子在整个欧洲流行起来。",
"德国移民将复活节兔子的习俗传播到英国和美国。",
"复活节兔子的习俗在英国和美国演变成复活节兔子。"
]
---
**输入:**
\<新段落\>
**输出:**
其它优化方法
Chunking优化
文本切割是优化语言模型应用性能的关键步骤。
切割策略应根据数据类型和语言模型任务的性质来定制。
传统的基于物理位置的切割方法(如字符级切割和递归字符切割)虽简单,但可能无法有效地组织语义相关的信息。
语义切割和基因性切割是更高级的方法,它们通过分析文本内容的语义来提高切割的精确度。
使用多向量索引可以提供更丰富的文本表示,从而在检索过程中提供更相关的信息。
工具和技术的选择应基于对数据的深入理解以及最终任务的具体需求。
Query重写
你是一名乐于助人的助手,负责生成与输入问题相关的多个子问题。
目标是将输入问题分解为一组可以单独回答的子问题。
生成与以下问题相关的多个搜索查询:{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):
上面是分解为多个子查询之后,把多个子查询召回的文档重排序后交给大模型来回答,接下来的策略对子查询生成的问题进行迭代得到新的答案。
分词:将查询分解成单独的词语或词组,便于进一步处理。
NER(命名实体识别):识别查询中的命名实体,如人名、地名、组织等,有助于理解查询的具体内容。
对查询中的拼写错误或语法错误进行自动纠正,以提高检索的准确性。
对查询进行语义改写,使其更具表达力和检索效果。
HyDE:一种基于上下文的联想查询改写方法,利用现有信息生成更有效的查询。
RAG-Fusion:结合检索和生成的技术,进一步增强查询的表达能力。
对查询进行上下文扩展,补全省略的内容或解析指代关系,使查询更完整和明确。
Hybrid Retrieval(混合检索)
Small to Big
Embeding&Rerank模型优化
效果评估
最后
RAPTOR:https://arxiv.org/pdf/2401.18059 Self-RAG:https://arxiv.org/pdf/2310.11511 CRAG:https://arxiv.org/pdf/2401.15884 Dense X Retrivel:https://arxiv.org/pdf/2312.06648 The 5 Levels Of Text Splitting For Retrieval:https://www.youtube.com/watch?v=8OJC21T2SL4&t=1933s RAG for long context LLMs: https://www.youtube.com/watch?v=SsHUNfhF32s LLamaIndex构建生产级别RAG:https://docs.llamaindex.ai/en/stable/optimizing/production_rag/
一站式快速开发多平台小程序
微信扫码关注该文公众号作者