引言
在生成式人工智能(GenAI)的世界里,您经常会遇到 RAG(Retrieval Augmented Generation)这个术语。基本上,RAG 是关于为大语言模型(LLM)提供额外的相关信息(上下文)以帮助它们生成更好和更相关的响应。
设置一个基本的 RAG 系统并不复杂,但它通常在提供高度准确的响应方面表现欠佳。主要原因之一是这种设置并不总是为 LLM 提供最精确的上下文。
在下面的架构图中,只有来自向量搜索的 top_k 响应被作为上下文传递给 LLM。但是,如果有其他返回的向量(如琥珀色)包含了更多与查询相关的信息呢?在这种情况下,我们没有将这些额外的相关信息传递给 LLM,这可能会导致 LLM 生成的响应不够准确。
这里的问题是,仅考虑 top_k 响应可能会错过那些可以提高 LLM 响应准确性的有价值的上下文。这一限制突显了需要一种更稳健的方法来选择和提供上下文,以确保 LLM 能够访问到最相关的信息,从而生成准确的响应。
基于向量搜索的 RAG 实现
问题是什么?
在 RAG 中,主要关注点是对庞大的数据集进行语义搜索,这些数据集可能包含成千上万的文档。为了进行语义搜索,这些文档被转换成向量,使其能够通过相似度度量(如余弦相似度)与查询向量进行比较。
然而,在将文档转换为向量的过程中,信息可能会丢失,因为向量以压缩的数值格式表示内容。此外,较大的文档通常需要分割成较小的块以嵌入到向量格式中,这使得在所有较小部分中保持上下文变得具有挑战性。
在 RAG 中实施向量搜索时,上下文丢失的问题变得显而易见。这是因为我们通常只考虑向量搜索的 top_k 结果,可能会忽略落在这个截止线以下的相关信息。因此,当 LLM 接收到的 top_k 结果作为上下文可能与查询不完全相关时,可能会导致 LLM 的响应质量较差。
我们不能简单地将向量搜索的所有搜索结果发送给 LLM,原因有两个:
-
LLM 上下文限制:LLM 在传递给它们的文本数量上有约束,称为“上下文窗口”。虽然最近的进展带来了更大的上下文窗口,如 Anthropic 的 Claude 的 100K tokens 或 GPT-4 的 32K tokens,但更大的上下文窗口并不能保证更准确的结果。即使有更大的窗口,LLM 能有效处理的信息量仍然有限。
-
LLM 的召回性能:LLM 召回是指模型从给定上下文中检索信息的能力。研究表明,如果在上下文窗口中包含了过多的 tokens,LLM 的召回性能可能会下降。因此,简单地将更多信息塞入上下文窗口并不是一个可行的解决方案,因为这可能会对 LLM 的相关信息召回能力产生负面影响。
这些观点在这里引用的论文中有更详细的讨论Hugging Face dataset库在此示例中利用任何现有的数据集。
我们还将使用 Hugging Face 上包含机器学习论文的现有数据集。ArXiv 的论文似乎是一个很好的来源,因此我们将使用下面返回的第一个数据源。
使用 Hugging Face 的数据集库加载数据集。提到的数据集似乎有超过 10 万个项目。
初始化 OpenAI 和 Pinecone 对象
创建 Pinecone 索引以存储嵌入。我们将创建与嵌入模式相匹配的向量维度的索引。例如,ada-002 有 1536 个向量维度。
为了有效地存储和管理来自 Hugging Face 的数据,其中包括“title”和“abstract”等字段,我们将存储“abstract”字段的嵌入在向量数据库中。此外,我们将包括“title”和“metadata”字段,以维护嵌入数据的纯文本表示。这种方法允许在从向量数据库中检索搜索结果时更容易解释与每个向量相关的数据。
为了在向量存储中存储或更新(upsert)记录,同时保留每个记录的元数据,我们需要定义一个对象映射。此映射将使我们能够将每个向量与其对应的元数据(如标题和其他相关信息)相关联。通过建立此映射,我们可以高效地管理和查询数据,同时保留每个记录的重要上下文细节。有关如何执行带有元数据的 upsert 操作的更多参考资料,您可以查阅rerank。
结论
总之,本文展示了在 RAG 框架内重新排序的巨大好处。通过实施重新排序过程,我们观察到检索信息的相关性显著提高。这种改进转化为 RAG 性能的显著提升,因为我们在最大限度地包含相关信息的同时,减少了输入到 LLM 中的噪音。
通过我们的探索,我们强调了两阶段检索系统在规模和质量性能方面的优势。使用向量搜索实现了大规模的高效搜索,而引入重新排序确保了只有最相关的文档被优先处理,从而提高了 RAG 框架内结果的整体质量。
关于我们
OpenIM 是领先的开源即时通讯(IM)平台,目前在 GitHub 上的星标已超过 13k。随着数据和隐私安全的重视以及信息技术的快速发展,政府和企业对于私有部署的 IM 需求急剧增长。OpenIM 凭借“安全可控”的特点,在协同办公软件市场中占据了一席之地。在后 AIGC 时代,IM 作为人机交互的首要接口,其价值愈发重要,OpenIM 期待在此时代扮演更关键的角色。
基于这样的视角,我们最近开源了 RAG-GPT 项目,已被部分企业采用并持续完善中。RAG-GPT 的主要特点包括:
内置 LLM 支持:支持云端 LLM 和本地 LLM。快速设置:只需五分钟即可部署生产级对话服务机器人。多样化知识库集成:支持多种类型的知识库,包括网站、独立 URL 和本地文件。灵活配置:提供用户友好的后台,配备可定制的设置以简化管理。美观的用户界面:具有可定制且视觉上吸引人的用户界面。
GitHub 地址: https://blog.csdn.net/zhuyingxiao/article/details/138796932
在线 Demo: # 强大的开源项目RAG-GPT:5分钟实现LLM大模型应用到你的网站!
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
引言
在生成式人工智能(GenAI)的世界里,您经常会遇到 RAG(Retrieval Augmented Generation)这个术语。基本上,RAG 是关于为大语言模型(LLM)提供额外的相关信息(上下文)以帮助它们生成更好和更相关的响应。
设置一个基本的 RAG 系统并不复杂,但它通常在提供高度准确的响应方面表现欠佳。主要原因之一是这种设置并不总是为 LLM 提供最精确的上下文。
在下面的架构图中,只有来自向量搜索的 top_k 响应被作为上下文传递给 LLM。但是,如果有其他返回的向量(如琥珀色)包含了更多与查询相关的信息呢?在这种情况下,我们没有将这些额外的相关信息传递给 LLM,这可能会导致 LLM 生成的响应不够准确。
这里的问题是,仅考虑 top_k 响应可能会错过那些可以提高 LLM 响应准确性的有价值的上下文。这一限制突显了需要一种更稳健的方法来选择和提供上下文,以确保 LLM 能够访问到最相关的信息,从而生成准确的响应。
基于向量搜索的 RAG 实现
问题是什么?
在 RAG 中,主要关注点是对庞大的数据集进行语义搜索,这些数据集可能包含成千上万的文档。为了进行语义搜索,这些文档被转换成向量,使其能够通过相似度度量(如余弦相似度)与查询向量进行比较。
然而,在将文档转换为向量的过程中,信息可能会丢失,因为向量以压缩的数值格式表示内容。此外,较大的文档通常需要分割成较小的块以嵌入到向量格式中,这使得在所有较小部分中保持上下文变得具有挑战性。
在 RAG 中实施向量搜索时,上下文丢失的问题变得显而易见。这是因为我们通常只考虑向量搜索的 top_k 结果,可能会忽略落在这个截止线以下的相关信息。因此,当 LLM 接收到的 top_k 结果作为上下文可能与查询不完全相关时,可能会导致 LLM 的响应质量较差。
我们不能简单地将向量搜索的所有搜索结果发送给 LLM,原因有两个:
-
LLM 上下文限制:LLM 在传递给它们的文本数量上有约束,称为“上下文窗口”。虽然最近的进展带来了更大的上下文窗口,如 Anthropic 的 Claude 的 100K tokens 或 GPT-4 的 32K tokens,但更大的上下文窗口并不能保证更准确的结果。即使有更大的窗口,LLM 能有效处理的信息量仍然有限。
-
LLM 的召回性能:LLM 召回是指模型从给定上下文中检索信息的能力。研究表明,如果在上下文窗口中包含了过多的 tokens,LLM 的召回性能可能会下降。因此,简单地将更多信息塞入上下文窗口并不是一个可行的解决方案,因为这可能会对 LLM 的相关信息召回能力产生负面影响。
这些观点在这里引用的论文中有更详细的讨论Hugging Face dataset库在此示例中利用任何现有的数据集。
我们还将使用 Hugging Face 上包含机器学习论文的现有数据集。ArXiv 的论文似乎是一个很好的来源,因此我们将使用下面返回的第一个数据源。
使用 Hugging Face 的数据集库加载数据集。提到的数据集似乎有超过 10 万个项目。
初始化 OpenAI 和 Pinecone 对象
创建 Pinecone 索引以存储嵌入。我们将创建与嵌入模式相匹配的向量维度的索引。例如,ada-002 有 1536 个向量维度。
为了有效地存储和管理来自 Hugging Face 的数据,其中包括“title”和“abstract”等字段,我们将存储“abstract”字段的嵌入在向量数据库中。此外,我们将包括“title”和“metadata”字段,以维护嵌入数据的纯文本表示。这种方法允许在从向量数据库中检索搜索结果时更容易解释与每个向量相关的数据。
为了在向量存储中存储或更新(upsert)记录,同时保留每个记录的元数据,我们需要定义一个对象映射。此映射将使我们能够将每个向量与其对应的元数据(如标题和其他相关信息)相关联。通过建立此映射,我们可以高效地管理和查询数据,同时保留每个记录的重要上下文细节。有关如何执行带有元数据的 upsert 操作的更多参考资料,您可以查阅rerank。
结论
总之,本文展示了在 RAG 框架内重新排序的巨大好处。通过实施重新排序过程,我们观察到检索信息的相关性显著提高。这种改进转化为 RAG 性能的显著提升,因为我们在最大限度地包含相关信息的同时,减少了输入到 LLM 中的噪音。
通过我们的探索,我们强调了两阶段检索系统在规模和质量性能方面的优势。使用向量搜索实现了大规模的高效搜索,而引入重新排序确保了只有最相关的文档被优先处理,从而提高了 RAG 框架内结果的整体质量。
关于我们
OpenIM 是领先的开源即时通讯(IM)平台,目前在 GitHub 上的星标已超过 13k。随着数据和隐私安全的重视以及信息技术的快速发展,政府和企业对于私有部署的 IM 需求急剧增长。OpenIM 凭借“安全可控”的特点,在协同办公软件市场中占据了一席之地。在后 AIGC 时代,IM 作为人机交互的首要接口,其价值愈发重要,OpenIM 期待在此时代扮演更关键的角色。
基于这样的视角,我们最近开源了 RAG-GPT 项目,已被部分企业采用并持续完善中。RAG-GPT 的主要特点包括:
内置 LLM 支持:支持云端 LLM 和本地 LLM。快速设置:只需五分钟即可部署生产级对话服务机器人。多样化知识库集成:支持多种类型的知识库,包括网站、独立 URL 和本地文件。灵活配置:提供用户友好的后台,配备可定制的设置以简化管理。美观的用户界面:具有可定制且视觉上吸引人的用户界面。
GitHub 地址: https://blog.csdn.net/zhuyingxiao/article/details/138796932
在线 Demo:
关于 • FAQ • 贡献者 • 晨读 • Github • 新浪微博 • Play • 免责声明 • 联系我们 • 捐赠 • 酷站 • Feed订阅 • 24337 人在线 最高记录 5390 ©2013-2026 studygolang.com Go语言中文网,中国 Golang 社区,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。 Powered by StudyGolang(Golang + MySQL) • · CDN 采用 七牛云 VERSION: V4.0.0 · 9.205038ms · 为了更好的体验,本站推荐使用 Chrome 或 Firefox 浏览器 京ICP备14030343号-1X登录和大家一起探讨吧