🔗 RAG 检索增强生成
这是一篇 RAG 检索增强生成的基础介绍,RAG 链路的深入说明,请移步:🔗 RAG-R4 链路详述
什么是 RAG(检索增强生成)
想象一下,如果你要写一篇关于“火星探测”的报告,但你对这个主题并不熟悉。你可能会先去网上搜索相关信息,然后根据找到的资料写报告。RAG(检索增强生成)就是这样一个过程,但是是机器来执行。
简单来说,RAG 做的事情分为两步:
-
找资料:就像你在网上搜索关于“火星探测”的信息一样,RAG 先在一个巨大的知识库中寻找跟提出的问题相关的信息。确保它有足够的材料来回答问题。
-
写答案:有了这些资料后,RAG 再使用大模型来总结出回答或者生成相关的文本。模型会尝试用一种通顺、合理的方式来表达找到的信息。
简而言之,RAG 是一个自动化的过程,帮助机器通过查找资料来更好地回答问题或生成文本。这使得机器生成的内容不仅仅凭空想象,而是基于实实在在的信息,因此更加准确和丰富。
RAG 如今已在相当多的应用场景中落地实践,如:AI 智能客服、企业智能知识库、AI 搜索引擎等。
为什么需要 RAG
RAG(检索增强生成)之所以重要,是因为它很好地解决了使用大语言模型时所遇到的种种问题,并大大提高了生成内容的质量和准确性:
-
使生成的内容更具时效性:大语言模型的数据时效性取决于其训练数据,完成训练后便不再更新,这使得大语言模型本身的所掌握的信息常常是过时的。通过加入 RAG 链路,模型可以获取最新信息并生成反映当前知识状态的内容。这一点对于那些需要最新数据支持的应用场景特别重要。
-
处理知识密集型任务:多数场景下,仅凭大语言模型已有的知识和数据,不足以处理那些需要广泛背景知识的任务,如撰写关于特定主题的详细报告。RAG 可通过快速整合不同知识库,检索相关信息来丰富其回答,使得生成的内容更加准确和信息丰富。
-
提高生成文本的相关性和质量:生成模型(如GPT系列)在没有直接访问到具体数据的情况下,可能会产生与问题不相关或者部分错误的回答(产生幻觉)。RAG 可通过先检索相关信息,然后基于这些信息生成文本,从而确保输出的质量和相关性。
-
缓解数据稀缺问题:对于一些特定领域或细分主题,可能缺乏足够的训练数据来训练一个高效的生成模型。RAG通过利用外部知识库来弥补这一点,即使是在数据稀缺的情况下也能提供高质量的输出。
综上,RAG 为解决复杂任务提供了一种有效的途径,通过结合检索和生成的方法,提升了机器理解和文本生成的能力,使得生成的内容不仅更加精确,也更加丰富和多样化。
举个例子:RAG 如何运作
RAG 的实现需要经过一连串的步骤,总体可分为数据准备
和实际应用
两个部分
数据准备部分,大体可分为 2 个环节:
- 数据获取:从互联网或其他数据源中准备用于检索的数据集,通常是一篇篇文档
- 数据拆条:也叫数据分块,将第一步获取的数据,按语意进行段落拆分,或针对某些特定提问摘出对应的知识块
- 数据加工:将第二部拆分出来的知识块,进一步做实体词抽取和时效性识别,便于在召回时筛选更匹配的内容
实际应用部分,大体可分为 4 个环节:
- 提问改写(Rewriter):将用户输入的问题进行发散并回答,以获得针对原始问题的更多关键词
- 关键词召回(Retriever):根据 Rewriter 提供的问答对,利用向量匹配、关键词匹配、搜索引擎等技术,从数据库中召回内容
- 数据精排(Reranker):根据用户输入的原始问题,从 Retriever 提供的文本内容中,找到 n 条最相关的数据
- 总结回答(Reader):理解用户输入的原始问题,阅读找到的 n 条最相关数据,总结并给出回答,回答时附上出处
下面我将分享一个实践案例,来说明RAG 链路是如何工作的:
假设我们正在构建一个「旅游助手」,它能给用户提供目的地周边的景点推荐。
数据获取
- 目标:从互联网获取用旅游攻略,景点推荐等信息,存储为原始的数据集
- 依赖能力:爬虫技术、OpenAPI 或从自有数据清洗
- 输出:一个包含旅游攻略,景点推荐等信息的原始数据集
案例
原始数据集可能由多篇以下的内容组成:
"标题": "杭州周边景点介绍"
"发布时间": "2023/12/23 12:00"
"作者": "驴友"
"原文链接": "https://xxxx.xxx"
"正文": "杭州,这座历史与现代交融的城市,不仅自身拥有极富魅力的景观,其周边更是散布着无数引人入胜的旅游目的地。西湖是最为人们所熟知的,被誉为“人间天堂”的象征,湖光山色和历史遗迹交相辉映,让每一个踏足此地的游客都流连忘返。雷峰塔和断桥不仅是西湖的标志性建筑,也是许多古典爱情故事的发生地,吸引了无数文学和历史爱好者。而孤山和苏堤春晓则以其更加清新、自然的景色而著称,是散步和赏景的绝佳场所。
周边的古镇也是不可错过的。乌镇和西塘,作为江南六大古镇之二,以其完好的古水乡格局和丰富的文化遗产而闻名。乌镇的水巷与古桥,保留着几百年的历史,是探寻传统江南文化的理想之地。夜幕下的西塘,灯光与水面相映成趣,别有一番风味。游客不仅可以游览古迹,品尝地道的江南小吃,还能体验制作传统手工艺品的乐趣。这些古镇不只是观光地,更是活生生的文化遗产。
对于爱好自然和冒险的旅者,杭州周边的自然景观同样丰富多彩。天目山是探险和徒步旅行的理想场所,它不仅有茂密的森林覆盖,还有壮观的瀑布和丰富的生物多样性。秋天的天目山层林尽染,色彩斑斓,是摄影爱好者的天堂。此外,富春江和安吉的竹海也值得一游。富春江以其历史上的文人墨客和壮丽的山水画而著名,而安吉的竹海则以一望无际的竹林和清新的空气令人心旷神怡。这些地方不仅提供了远离城市喧嚣的隐居之地,也是体验自然美和平静生活的绝佳选择。
总的来说,杭州及其周边地区以其独特的文化和自然景观成为了国内外游客的热门目的地。无论是沉浸在古典文化的氛围中,还是在大自然的怀抱中寻找心灵的慰藉,这里总有一处风景能满足你的需求。"
数据拆条
- 目标:把抓去回来的数据内容,按语义进行段落拆分,或按提问进行答案内容抽取,形成知识块。
- 依赖能力:Longformer、大模型(分段 or 抽取)
- 输出:一系列内容片段或一系列问答对
案例
将上述原文按段落进行知识拆条后,原始数据可能会被分为以下知识块:
"标题": "杭州周边景点介绍"
"发布时间": "2023/12/23 12:00"
"作者": "驴友"
"原文链接": "https://xxxx.xxx"
"拆段 1": "杭州,这座历史与现代交融的城市,不仅自身拥有极富魅力的景观,其周边更是散布着无数引人入胜的旅游目的地。西湖是最为人们所熟知的,被誉为“人间天堂”的象征,湖光山色和历史遗迹交相辉映,让每一个踏足此地的游客都流连忘返。雷峰塔和断桥不仅是西湖的标志性建筑,也是许多古典爱情故事的发生地,吸引了无数文学和历史爱好者。而孤山和苏堤春晓则以其更加清新、自然的景色而著称,是散步和赏景的绝佳场所。"
"标题": "杭州周边景点介绍"
"发布时间": "2023/12/23 12:00"
"作者": "驴友"
"原文链接": "https://xxxx.xxx"
"拆段 2": "周边的古镇也是不可错过的。乌镇和西塘,作为江南六大古镇之二,以其完好的古水乡格局和丰富的文化遗产而闻名。乌镇的水巷与古桥,保留着几百年的历史,是探寻传统江南文化的理想之地。夜幕下的西塘,灯光与水面相映成趣,别有一番风味。游客不仅可以游览古迹,品尝地道的江南小吃,还能体验制作传统手工艺品的乐趣。这些古镇不只是观光地,更是活生生的文化遗产。"
将上述原文按问答对进行知识拆条后,原始数据可能会被分为以下知识块:
"标题": "杭州周边景点介绍"
"发布时间": "2023/12/23 12:00"
"作者": "驴友"
"原文链接": "https://xxxx.xxx"
"问题 1": "杭州的自然景观有哪些?"
"答案 1": "杭州,这座历史与现代交融的城市,不仅自身拥有极富魅力的景观,其周边更是散布着无数引人入胜的旅游目的地。西湖是最为人们所熟知的,被誉为“人间天堂”的象征,湖光山色和历史遗迹交相辉映,让每一个踏足此地的游客都流连忘返。雷峰塔和断桥不仅是西湖的标志性建筑,也是许多古典爱情故事的发生地,吸引了无数文学和历史爱好者。而孤山和苏堤春晓则以其更加清新、自然的景色而著称,是散步和赏景的绝佳场所。天目山是探险和徒步旅行的理想场所,它不仅有茂密的森林覆盖,还有壮观的瀑布和丰富的生物多样性。秋天的天目山层林尽染,色彩斑斓,是摄影爱好者的天堂。此外,富春江和安吉的竹海也值得一游。富春江以其历史上的文人墨客和壮丽的山水画而著名,而安吉的竹海则以一望无际的竹林和清新的空气令人心旷神怡。这些地方不仅提供了远离城市喧嚣的隐居之地,也是体验自然美和平静生活的绝佳选择。"
"标题": "杭州周边景点介绍"
"发布时间": "2023/12/23 12:00"
"作者": "驴友"
"原文链接": "https://xxxx.xxx"
"问题 2": "杭州周边有哪些古镇?"
"答案 2": "周边的古镇也是不可错过的。乌镇和西塘,作为江南六大古镇之二,以其完好的古水乡格局和丰富的文化遗产而闻名。乌镇的水巷与古桥,保留着几百年的历史,是探寻传统江南文化的理想之地。夜幕下的西塘,灯光与水面相映成趣,别有一番风味。游客不仅可以游览古迹,品尝地道的江南小吃,还能体验制作传统手工艺品的乐趣。这些古镇不只是观光地,更是活生生的文化遗产。"
数据加工
- 目标:对知识块的元数据进行抽取,以便后续召回环节进行内容筛选,提高准确率
- 依赖能力:模式匹配、大模型、知识图谱等
- 输出:包含拆条内容以及各种元数据信息的宽表,或图谱
案例
编号 | 知识块内容 | 相关实体 | 时间 |
---|---|---|---|
1 | 杭州,这座历史与现代交融的城市,不仅自身拥有极富魅力的景观,其周边更是散布着无数引人入胜的旅游目的地。西湖是最为人们所熟知的,被誉为“人间天堂”的象征,湖光山色和历史遗迹交相辉映,让每一个踏足此地的游客都流连忘返。雷峰塔和断桥不仅是西湖的标志性建筑,也是许多古典爱情故事的发生地,吸引了无数文学和历史爱好者。而孤山和苏堤春晓则以其更加清新、自然的景色而著称,是散步和赏景的绝佳场所 | 浙江省、杭州市、西湖、苏堤、雷峰塔、断桥 | 2023/12/23 12:00 |
... | ... | ... | ... |
经过以上步骤,「旅游助手」的数据准备工作已经完成,接下来将给大家展示实际在用户使用时,助手是如何获取内容并给用户答复的。
我们假设用户向「旅游助手」提问:「杭州周边有什么好玩的地方?」
提问改写(Rewriter)
- 目标:将用户输入的问题进行发散并回答,以获得针对原始问题的更多关键词
- 依赖能力:提示词工程 + 大模型
- 输入:用户原始问题
- 输出:根据原始问题改写的多个问答对
案例
- 假设用户原始输入的问题为:「杭州周边有什么好玩的地方?」
- 经过提问改写后,会生成以下问答对:
1. 杭州周边有哪些历史文化名胜?杭州周边拥有丰富的历史文化资源。西湖是最著名的景点之一,以其“山水园林”被列为世界文化遗产。宋城也是一个不可错过的历史文化体验地,它是一个大型的历史文化主题公园。还有灵隐寺,是一座历史悠久的佛教寺院,闻名于世。
2. 杭州周边适合亲子游的地方有哪些?杭州周边有很多适合亲子游的地方。例如,杭州野生动物世界是一个大型的野生动物园,家庭游客可以近距离接触和了解各种动物。另外,杭州乐园和宋城的宋城千古情景区也是亲子游的好选择,提供了多样的娱乐设施和表演。
3. 杭州周边的自然风景区有哪些?杭州周边拥有多样的自然风景,其中黄山是最为人所知的自然风景区之一,以其奇松、怪石、云海、温泉四绝闻名。天目山也是值得一游的地方,有着丰富的生物多样性和清新的空气。此外,千岛湖以其清澈的水质和岛屿众多而成为热门的旅游目的地。
- 如此一来,在下一步 Retriever 召回相关内容时,能使用的关键词就可以从原先的:
杭州
、周边
、好玩地方
,扩展成:杭州
、周边
、历史文化名胜
、西湖
、山水园林
、宋城
、历史文化主题公园
等,大大增加可召回的内容量
关键词召回(Retriever)
- 目标:将 Rewriter 提供的问答对,利用向量匹配、关键词匹配、搜索引擎等技术,从数据库中召回内容
- 依赖能力:向量搜索、数据图谱、搜索引擎
- 输入:Rewriter 提供的问答对
- 输出:为每个问答对各召回Top 50 文本内容
案例
根据第 1 步 Rewriter 提供的问答对和里头包含的关键词(杭州
、周边
、历史文化名胜
、西湖
、山水园林
、宋城等
),从数据库中为每个问答对召回 50 条相关内容
数据精排(Reranker)
- 目标:根据用户输入的原始问题,从 Retriever 提供的文本内容中,找到 n 条最相关的数据
- 依赖能力:bg_rank 小模型
- 输入:用户原始问题、Retriever 提供的文本内容
- 输出:n 条最相关的文本内容
案例
根据用户的原始问题「杭州周边欧什么好玩的地方?」,从第 2 步 Retriever 提供的一大堆文本内容中找到 Top n
总结回答(Reader)
- 目标:理解用户输入的原始问题,阅读 Reranker 输出的 n 条最相关数据,总结并给出回答,回答时附上出处
- 依赖能力:提示词工程+大模型
- 输入:用户原始问题、Reranker 输出的 n 条最相关数据
- 输出:带溯源的回答
案例
根据用户的原始问题「杭州周边欧什么好玩的地方?」,以及第 3 步 Reranker 提供的 n 条最相关数据(包含它们的链接),作出回答输出:
杭州周边有许多值得探索的好玩地方,适合不同类型的游客:
1. 西湖:作为杭州的象征,西湖不仅是杭州必游的景点,也是周边游的起点。可以乘船游湖,漫步苏堤春晓,或在断桥残雪中体会古人的诗情画意。
2. 灵隐寺:位于杭州西湖区的灵隐飞来峰下,是一座历史悠久的佛教名寺。这里山水林木幽静,寺院古朴庄严,适合寻求心灵宁静的游客。
3. 宋城:位于杭州西湖区,是一个融合了宋代文化、历史、娱乐、演艺于一体的大型主题公园。特别推荐观看“宋城千古情”演出,感受震撼的视听盛宴。
来源:[1]、[2]、[3]
总结
RAG(检索增强生成)是一种结合了检索(Retrieval)和生成(Generation)能力的内容生成方案。
从用户提问出发,发散出若干与之关联的问答对(发散时包含答案会更有利于发散出不同的关键词),拿问答对中包含的关键词从一个大型的知识库中检索相关信息,经过筛选、排序后,基于这些信息生成回答或文本,从而提高模型的生成质量和相关性。
RAG 方法结合了检索系统的高效性和生成模型的灵活性,能够在处理复杂的查询或任务时提供更加准确和丰富的输出。
延伸阅读:有关 RAG 链路的深入说明,请移步:🔗 RAG-R4 链路详述