不同的领域和类型的查询需要不同的分块策略。灵活的分块方法使RAG系统能够适应各种领域和信息需求,从而最大限度地提高其在不同应用程序中的有效性。和你一样,我不是来构建另一个通用聊天机器人,但我希望我们能够为细分领域创建工具。这就是RAG系统对大多数企业的价值所在。这就是挑战所在。那么,让我们深入了解一下。
检索增强生成(RAG)是人工智能系统的一种类型实现,其中通过向其提供特定的信息前体来增强人工智能输出。这个过程称为检索,简称检索相关信息。对于生成模型,检索之后通常是生成。RAG背后的核心思想是通过在生成阶段动态检索相关文档或数据,用外部知识来增强语言生成过程。这种方法允许模型产生更准确、信息丰富且与上下文相关的响应,特别是在需要特定、详细信息的领域。
在本文中,我们将仅从生成模型上下文中实现的角度来考虑检索。因此,回到基础,RAG模型由两个主要组件组成:检索器和生成器。检索器负责根据所提供的查询或上下文从大型文档语料库中获取相关信息。然后,检索到的信息被传递到生成器,生成器通常是GPT或BERT等大型语言模型,它将检索到的内容合并到其响应生成过程中。
有人问我在细分领域的正确策略(在我的例子中主要是医疗保健,但有人问我关于法律文本、记事本、音频、营销材料、新闻等)本文背后的动机是创建一个简单的技术指南 包含RAG决策的原因和方式的基础知识,可以帮助来自不同行业的客户做出一些初步决策。
在我们讨论分块之前,让我们先看看一个通用的简单RAG是什么样子。
它始于你的文档,这些文档被转换为嵌入(文档的数值表示)。RAG的开发旨在能够回答特定的问题。在这种情况下,问题每次使用管道时都可能会发生变化,但是,首先向管道提出问题会找到与问题相关的文档(粉色文档)。然后,可以使用仅来自这些文档的信息生成相同问题或类似问题的答案。响应是信息、问题、大型语言模型和提示中的修饰语的结合。
在我们继续了解RAG的基础知识之前,流程中的多个战略决策点最终可能决定你的项目成功或失败。下面的每个红色箭头都允许你针对你的域、用例等做出RAG变体的决定。即使我们认为每个箭头有四个选项 — 也有 4⁷ - 16,384 个选项可供选择。
但别担心,每个决策通常都很重要,但遵循帕累托(Pareto)原则,有些决策是可以跳过的(仅仅20%的工作就可以让你获得80%的成功)。在生产中,你没有时间修复最后20%的准确度 - 我所描述的内容通常是正确的,但可能不适用于你的实现,但它将能够将你推向80%。
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
文档是一大块信息。这并不意味着它是整个文本文件、PDF、Word 文档、演示文稿、书籍、图像等。它只是意味着它具有一些信息。该文档通常是根据你公司拥有的大量文件和信息生成的。从公司一直在处理的任何输入文件生成文档/块的过程在技术上通常称为分块。分块允许你将信息转换为“正确”大小的片段,以便管道可以最高效、最高效、最准确等。
用技术术语来说,“分块”是指将大型文档语料库分割成更小、更易于管理的片段,以便模型可以有效地检索和处理这些片段。分块策略至关重要,原因如下:
1. 相关性和精度:正确分块的文档可确保检索到的信息与查询高度相关。如果块太大,它们可能包含大量不相关的信息,从而稀释了有用的内容。相反,如果它们太小,它们可能会错过更广泛的背景,从而导致准确的响应但不够全面。
2. 效率和性能:块的大小和结构影响检索过程的效率。较小的块可以更快地检索和处理,从而减少系统的整体延迟。然而,需要达到一个平衡,因为太多的小块可能会压垮检索系统并对性能产生负面影响。
3. 生成质量:生成输出的质量在很大程度上取决于检索到的输入。分块良好的文档可确保生成器能够访问连贯且上下文丰富的信息,从而产生信息更丰富、连贯且上下文适当的响应。
4. 可扩展性:随着语料库规模的增长,分块变得更加重要。 经过深思熟虑的分块策略可确保系统能够有效扩展,管理更多文档,而不会显着降低检索速度或质量。
不同的域和类型的查询可能需要不同的分块策略。灵活的分块方法使RAG 系统能够适应各种领域和信息需求,从而最大限度地提高其在不同应用程序中的有效性。我不是来构建另一个通用聊天机器人的,但我正在寻找专门针对细分领域的构建工具。这就RAG统对大多数企业的挑战和价值所在。那么,让我们深入探讨一下。
我假设你在本练习中使用Google colab,因为复制代码会容易得多。
请运行以下两行代码,以确保你的环境可以复制到我所演示的环境。
在此示例中,我们将使用FDA发布的人工智能医疗产品最终文件,该文件描述了在医疗保健行业开发人工智能产品时必须遵循的事项。
让我们从PDF中提取文本。这是从PDF中获取真实文本的最低限度方法。在以后的文章中,我将介绍处理PDF的所有各种方法,我们现在只需要现实生活中的文本,因此我们使用最简单的方法来获取它。
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
输出类似如下:
这只是意味着在文本长度的常规间隔处,我们将文本分割开来。以下是操作示例及其输出。我们将文本每200个字符分割一次,不考虑是否在单词或句子的中间进行分割等。显然,这是一种简单粗暴的方法,并不是很有用,但为了快速入门,这就是它的实现方式。
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
当我们关心句子结构作为一个构造,并且只在句子被视为独立时进行分割时,这被称为语义分块。像NLTK和Spacy这样的库足够强大,能够理解复杂的句子并将它们分解成适当的部分。
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
使用Spacy库(我更喜欢Spacy而不是NLTK)。
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
查看语义策略的另一种方法是不断寻找连续句子或分割之间的语义距离,然后将连续的语义相关句子放在一起。这样可以两全其美。
实现可能如下所示:
如图所示,如果我们根据0.15的距离来分割块,那么我们很可能会在距离超过0.15并且保持超过0.15的地方将文档分割成13个以上的部分。这意味着现在作为领域专家,我们应该与学科专家(在医疗保健领域我是专家,我经常做这项工作)一起工作,以获取团队感兴趣的各种文件的各种分割方式,然后建议一个良好的分割点以实现平衡。
请记住,这更像是一门艺术而不是一门科学(没有秘密公式),但对于你有兴趣引入到RAG管道中的每种类型的文件,确保提前与你的团队合作,并经常与他们讨论这些特定的A-B测试问题。他们不必知道目的是什么或与你深入讨论。但是,他们必须纯粹地表达自己的偏好,以回答诸如“如果我给你以下文本,你会在心中将这段文字分割成一个独立的思想吗?”或“这是一个机器生成的建议分割的主题或概念,哪一个与你的思维方式相匹配?你更喜欢哪种分割?等”这样的问题。这就是纯技术人员开发的解决方案,来自AWS、Azure、Google和其他公司和初创公司通常失败的地方,因为他们不了解领域和用户偏好。他们只是试图推出一个通用实现的产品,在生产中必然会失败。
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
当每个句子都太小时。有些文档需要具有更长的长度,但又不能太长,可以使用语义分块的修改。通过将句子连接起来,直到达到适当的大小阈值为止,这样块就会增长。在达到该阈值时,块被创建,并且下一个句子开始了新的块。这种策略可以避免产生不必要的过小的块,这些块通常太小,无法从中提取出任何合理的信息。
在这里,我们不断增大块,直到满足chunk_size限制(此处为50个token)。在此代码中,第一个块始终为空白:
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
输出如下:
当处理使用某些换行符或句子分隔线索(例如多个空格或多个换行符甚至多个HTML 标签)的文档时,通过此类指示符分割文本通常很有用。这种策略有助于细分领域,因为这是用户开发的语言的特征作为标准实践。如果我们想以不同文本块的形式复制用户的思维方式,那么我们必须以同样的方式跟踪他们思维的输出。
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
![碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions 碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions]()
这种情况下的问题是每次使用换行符时都会创建块。此方法适用于段落,但不适用于由换行符分隔的小文本,如上所示。
让我们看看它在文档中间是如何工作的,其中新行代表实际文本。
似乎换行符并不是处理从PDF生成的文本的最佳方式,因为每个提取的句子末尾都有一个隐式的换行符。
目前,我不会描述代理(Agentic)策略,因为它非常特定于用例且成本高昂。它需要有自己单独的会话。我将把它归入高级策略中。
现在让我们打破常规思维,看看有哪些高级策略与分块间接或直接相关。我不会将它们归为一个单独的类别,因为这些是复合函数,一次完成从分块和存储到检索的工作。这些可能使用嵌入,也可能不使用,它们可能完全不依赖于大型语言模型。这一切取决于你试图解决的问题是什么,以及系统的速度和成本。
1. 简单的基于Elasticsearch的检索(分块是隐式的,检索通常是匹配之前和之后的文本的预定义函数)
2. 知识图检索器(分块通常是隐式的,并以节点和边的形式表示检索)
3. 分层节点解析器(与上面类似,分块通常是隐式的,检索是以节点和边的形式表示,有时包括周围文本)
4. 代理策略(Agentic Strategy)
分块需要表示至少2个概念才能产生预期结果:
首先,文本是如何生成的(这包括人为因素、机器因素、文档格式等等)。其次,人们在阅读/解释某个主题时如何思考该主题。
其余因素对于准确性并不那么重要,但对于生产至关重要。这包括与用户体验相关的原因(延迟、人员参与、质量保证、信任);成本(嵌入、向量数据库、存储的冗余);隐私和安全(第三方工具、云服务、平台、法规和行业特定合规性等);业务连续性(专有模型/数据库、第三方服务、隐含安全性、漏洞、大多数中小型初创企业的可用赛道等)
决策从来都不是纯粹的技术问题,而是准确性与其他关键问题的综合。
原文始发于微信公众号(碳泽信息):碳泽解读 | 生产环境中的RAG——分块决策(Chunking Decisions
评论