你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
收集测试文档和查询并在 准备阶段执行文档分析后,下一阶段是分块。 将文档分解为大小适当的区块,每个区块都包含语义相关的内容对于 Retrieval-Augmented 生成(RAG)实现的成功至关重要。 传递整个文档或超大区块的成本高昂,可能会使模型的令牌限制不堪重负,并且不会产生最佳结果。 将信息传递给与查询无关的语言模型可能会导致不准确或不相关的响应。 你需要使用有效的分块和搜索策略来优化传递相关信息和删除不相关的信息的过程。 此方法最大程度地减少误报和漏报,并最大化真阳性和真阴性。
太小且不包含足够的上下文来处理查询的区块可能会导致结果不佳。 可能无法捕获到存在于多个区块中的相关上下文。 关键是实现特定文档类型及其特定结构和内容的有效分块方法。 需要考虑各种分块方法,每个方法都有自己的成本影响和有效性,具体取决于它们应用于的文档的类型和结构。
本文介绍各种分块方法,并检查文档的结构如何影响所选的分块方法。
本文是一系列文章的其中一篇。 继续作之前,请先阅读 简介 。
分块经济效益
确定总体分块策略时,必须考虑文档集合的预算和质量和吞吐量要求。 每个独特的分块实现的设计和实施有着工程成本,而每个文档的处理成本则因所使用的方法不同而有所变化。 如果文档已嵌入或链接媒体,则必须考虑处理这些元素的经济性。 对于分块,此处理通常使用语言模型来生成媒体的说明。 然后,这些说明会进行分块处理。 适用于一些媒体的替代方法是在推理时按原样将其传递给多模式模型。 但是,这种方法不会影响分块经济学。
以下部分介绍分块图像和整体解决方案的经济性。
图像分块经济效益
使用语言模型生成所分块的图像的描述会产生成本。 例如,基于云的服务(例如 Azure OpenAI 服务)要么按事务收费,要么按预付预配收费。 较大的图像会产生更大的成本。 通过文档分析,你应确定哪些图像值得分块处理,以及哪些图像应被忽略。 在此处,需要了解解决方案中图像的数量和大小。 然后,你应该权衡将图像描述分块处理的价值与生成这些描述的成本。
确定要处理哪些图像的一种方法是使用 Azure AI 视觉 等服务对图像、标记图像或执行徽标检测进行分类。 然后,可以使用结果和置信度指示器来确定图像是否添加了有意义的上下文值,并应进行处理。 对视觉的调用可能比对语言模型的调用成本更低,因此这种方法可能会节省成本。 试验以确定哪些置信度以及哪些分类或标记为数据提供最佳结果。 另一种选择是生成自己的分类器模型。 如果采用此方法,请确保考虑生成、托管和维护自己的模型的成本。
另一种成本优化策略是使用 Cache-Aside 模式进行缓存。 可以生成基于图像哈希的键。 第一步,检查是否有先前运行或以前处理的文档的缓存结果。 如果执行此操作,可以使用该结果。 此方法消除了调用分类器或语言模型的成本。 如果没有缓存,则调用分类器或语言模型时,将缓存结果。 此映像的未来调用使用缓存。
以下简单工作流集成了所有这些成本优化过程:
检查图像处理是否已缓存。 如果已缓存,请使用缓存的结果。
运行分类器以确定是否应处理映像。 缓存分类结果。 如果分类逻辑确定图像增加值,请转到下一步。
生成映像的说明。 缓存结果。
整体解决方案的经济性
评估整体解决方案的成本时,请考虑以下因素:
唯一分块实现的数目: 每个独特的实现都有工程和维护成本。 请务必考虑到您的集合中独特文档类型的数量,以及为每个文档类型采取独特实现时的成本和质量之间的权衡。
每个实现的按文档成本: 某些分块技术可能会生成更高质量的区块,但生成这些区块会带来更高的财务和时间成本。 例如,在 Azure AI 文档智能中使用预生成模型可能比纯文本分析实现更高的每文档成本,但可能会导致更好的区块。
初始文档数: 启动解决方案时需要处理的初始文档数。
增量文档数: 必须处理的新文档的数量和速率,以便持续维护系统。
加载和分块
在分块期间,必须先以某种格式将文档加载到内存中。 然后,分块代码针对文档的内存中表示形式进行操作。 可以将加载代码与分块合并,或者将加载单独作为一个阶段。 你选择的方法主要应基于体系结构约束和偏好。 以下部分简要探讨这两个选项并提供一般建议。
单独加载和分块
有多种原因可能会导致你选择分离加载和分块阶段。 你可能需要在加载代码中封装逻辑。 你可能希望在分块之前保留加载代码的结果,尤其是在尝试各种分块排列以节省处理时间或成本时。 最后,出于体系结构原因(例如进程批量处理或涉及删除个人数据的安全分段),你可能希望在单独的进程中运行加载和分块代码。
在加载代码中封装逻辑
你可以选择在加载阶段封装预处理逻辑。 此方法简化了分块代码,因为它不需要任何预处理。 预处理可以像删除或批注要在文档分析中忽略的文档部分(如水印、页眉和页脚)一样简单,以执行更复杂的任务,例如重新格式化文档。 例如,可以在加载阶段包括以下预处理任务:
删除或批注要忽略的项。
将图像引用替换为图像说明。 在此阶段,你将使用大型语言模型为图像生成说明,并使用该说明更新文档。 如果在文档分析阶段确定周围文本为图像提供有价值的上下文,请将该文本以及图像一起传递到大型语言模型。
将映像下载或复制到文件存储(如 Azure Data Lake Storage)以独立于文档文本进行处理。 如果在文档分析中确定周围文本为图像提供有价值的上下文,请将此文本与图像一起存储在文件存储中。
重新格式化表,使其更易于处理。
保留加载代码的结果
选择将加载代码的结果保存下来的原因有很多。 其中一个原因是,你希望能够在文档加载和预处理后检查文档,但在运行分块逻辑之前。 另一个原因是,你可能希望在开发或生产过程中针对同一预处理代码运行不同的分块逻辑。 持久化加载的代码可以加速这一过程。
在单独的进程中运行加载和分块代码
将加载和分块代码分成单独的进程,以帮助针对同一预处理代码运行多个分块实现。 这种分离还允许你在不同的计算环境和不同的硬件上运行加载和分块代码。 可以使用此设计来独立扩展用于加载和分块的计算能力。
合并加载和分块
在大多数情况下,合并加载和分块代码是更简单的实现。 你可能考虑在单独的加载阶段的预处理中执行的许多操作都可以在分块阶段完成。 例如,分块逻辑可以调用大型语言模型来获取文本描述并将其分块,而不是在加载阶段将图像 URL 替换为文本说明。
如果文档格式(如 HTML)具有对图像的引用,请确保读者或分析器使用的分块代码不会去除标记。 分块代码需要能够识别图像引用。
建议
确定是应合并还是分离分块逻辑时,请考虑以下建议。
首先合并加载和分块逻辑。 解决方案需要时将它们分开。
如果选择分隔进程,请避免将文档转换为中间格式。 这种类型的作可能会导致数据丢失。
分块方法
本部分概述了常见的分块方法。 可以在实现中使用多种方法,例如结合使用语言模型来获取图像的文本表示形式和列出的许多方法。
每种方法都附有一个汇总的决策矩阵,其中突出显示了工具、相关成本等。 工程工作量和处理成本较为主观,列入其中是为了进行相对比较。
基于句子的解析
这种简单的方法将文本文档分解成由完整句子组成的区块。 此方法的优点包括其实现成本低、处理成本低,以及适用于任何以散文或完整句子编写的基于文本的文档。 此方法的一个缺点是,每个区块可能不会捕获想法或含义的完整上下文。 通常必须将多个句子结合起来才能捕获语义含义。
工具:spaCy 句子标记器、 LangChain 递归文本拆分器、 NLTK 句子标记器
工程投入: 低
处理成本: 低
用例: 以散文或完整句子编写的非结构化文档,文档集合包含大量需要单个分块策略的不同文档类型
例子: 用户生成的内容,如来自调查、论坛帖子、评论、电子邮件、小说或文章的开放式反馈
固定大小分析,采用重叠
此方法根据固定数量的字符或令牌将文档分解为区块,并允许区块之间的某些字符重叠。 这种方法与基于句子的解析有许多相同的优缺点。 此方法比基于句子分析的优势之一是,能够获取具有跨多个句子的语义含义的区块。
必须选择区块的固定大小和重叠量。 由于结果因不同文档类型而异,因此最好使用像拥抱人脸区块可视化工具之类的工具来执行探索性分析。 可以使用此类工具可视化文档的分块方式,具体取决于你的决策。 使用固定大小的分析时,应使用 BERT 令牌而不是字符计数。 BERT 标记基于有意义的语言单位,因此比字符数保留了更多语义信息。
工具:LangChain 递归文本拆分器、 Hugging Face 分段可视化工具
工程投入: 低
处理成本: 低
用例: 以散文或非散文编写的非结构化文档,句子完整或不完整。 文档集合包含大量需要单个分块策略的不同文档类型
例: 用户生成的内容,如调查中的开放式反馈、论坛帖子、评论、电子邮件、个人笔记、研究笔记、列表等
自定义代码
此方法使用自定义代码创建区块来分析文档。 对于已知或可以推断结构的基于文本的文档,此方法最成功,并且需要高度控制区块创建。 可以使用正则表达式等文本解析技术,根据文档结构中的模式来创建区块。 目标是创建长度相似的区块,以及具有不同内容的区块。 许多编程语言都支持正则表达式,有些编程语言提供更优雅的字符串作功能的库或包。
工具:Python (re, regex, BeautifulSoup, lxml, html5lib, marko), R (stringr, xml2), Julia (Gumbo.jl)
工程工作: 中等
处理成本:低
用例: 可以推断结构的半结构化文档
例子: 专利申请、研究论文、保险单、脚本和剧本
语言模型扩充
可以使用语言模型创建区块。 例如,可以使用大型语言模型(如 GPT-4)生成图像的文本表示形式或可用作区块的表摘要。 语言模型扩充与其他分块方法(如自定义代码)一起使用。
如果文档分析确定图像前后的文本有助于 回答一些要求问题,请将此额外的上下文传递给语言模型。 请务必进行试验,以确定此额外上下文是否提高了解决方案的性能。
如果分块逻辑将映像说明拆分为多个区块,请确保在每个区块中包含图像 URL。 在每个区块中包含图像 URL,以确保为图像所服务的所有查询返回元数据。 此步骤对于最终用户需要通过该 URL 访问源图像或在推理时间使用原始图像的情况至关重要。
工具:Azure OpenAI、 OpenAI
工程工作: 中等
处理成本: 高
用例: 图像、表
示例:生成表格和图像的文本表示形式,汇总会议、演讲、采访或播客的脚本
文档布局分析
文档布局分析库和服务将光学字符识别功能与深度学习模型相结合,以提取文档的结构和文本。 结构元素包括页眉、页脚、标题、章节标题、表格和图片。 目标是为文档中包含的内容提供更好的语义意义。
文档布局分析库和服务公开表示文档的结构和文本内容的模型。 仍然需要编写与模型交互的代码。
注释
文档智能是一项基于云的服务,需要上传文档。 需要确保安全性和符合性法规允许将文档上传到此类服务。
工具:文档智能文档分析模型、 圆环图、 布局分析器
工程工作: 中等
处理成本: 中等
用例: 半结构化文档
例子: 新闻文章、网页、简历
预生成模型
文档智能等服务提供预生成模型,你可以将其用于各种文档类型。 某些模型针对特定文档类型(如美国 W-2 税表)进行了训练,而另一些模型则针对更广泛的文档类型(如发票)类型。
工具:文档智能预生成模型、 Power Automate 智能文档处理、 LayoutLMv3
工程投入: 低
处理成本: 中/高
用例: 存在预生成模型的结构化文档
特定示例: 发票、收据、医疗保险卡、W-2 表单
自定义模型
对于不存在预生成模型的高度结构化文档,可能需要生成一个自定义模型。 此方法对于高度结构化的图像或文档有效,这使得使用文本分析技术变得困难。
工具:文档智能自定义模型, Tesseract
工程投入: 高
处理成本: 中/高
用例: 预生成模型不存在的结构化文档
例子: 汽车维修和维护计划、学术成绩单、记录、技术手册、作过程、维护指南
文档结构
文档的结构复杂程度各不相同。 一些文件,如政府表格,有一个复杂的和众所周知的结构,如美国W-2税表。 另一类是非结构化文档,如自由形式的笔记。 文档类型的结构程度是确定有效分块方法的良好起点。 虽然没有特定规则,但本部分提供了一些要遵循的准则。
结构化文档
结构化文档(有时也被称为固定格式文档)具有确定的布局。 这些文档中的数据位于固定位置。 例如,日期或客户姓氏在格式固定的每份文档中都位于相同的位置。 固定格式文档的示例是美国 W-2 税务文档。
固定格式的文档可能是手工填写的原始文档的扫描图像,或者是具有复杂布局结构的原始文档的扫描图像。 这种格式使得使用基本文本分析方法难以处理。 处理复杂文档结构的典型方法是使用机器学习模型来提取数据,并尽可能向该数据应用语义含义。
例子: W-2 表单,保险卡
典型方法: 预生成模型、自定义模型
半结构化文档
半结构化文档没有固定格式或架构,如 W-2 窗体,但它们确实提供格式或架构的一致性。 例如,所有发票的布局并不相同。 但是,它们通常具有一致的架构。 可以预期发票会有一个 发票号 及某种形式的 收款方 和 收货方 的姓名和地址,以及其他数据。 网页可能没有架构一致性,但它们具有类似的结构元素或布局元素,例如 正文、 标题、 H1 和 p ,可以向周围的文本添加语义含义。
与结构化文档一样,具有复杂布局结构的半结构化文档使用文本分析很难处理。 对于这些文档类型,机器学习模型是一种很好的方法。 某些领域(如发票、合同或医疗保险文档)有一致架构的预建模型。 对于没有预生成模型的复杂结构,可考虑建立自定义模型。
例子: 发票、收据、网页、Markdown 文件
典型方法: 文档分析模型
推断的结构
某些文档具有结构,但并非是用标记编写的。 对于这些文档,必须推断其结构。 以下欧盟法规文件就是一个很好的例子。
由于可以清楚地了解文档的结构,而且没有已知的模型,因此可以确定允许编写自定义代码。 此类文档格式可能不需要创建自定义模型,具体取决于你正在使用的此类型的不同文档的数量。 例如,如果你的集合包含所有欧盟法规或美国州法律,则自定义模型可能是一个很好的方法。 如果要处理的是单一文件,如示例中的欧盟法规,则自定义代码可能更经济高效。
例子: 法律文档、脚本、制造规范
典型方法: 自定义代码、自定义模型
非结构化文档
对于几乎没有结构或完全不包含结构的文档,一种良好的方法是基于句子或带重叠的固定大小方法。
例子: 用户生成的内容,例如来自调查的开放式反馈、论坛帖子、评论、电子邮件、个人笔记、研究笔记等
典型方法:基于句子或基于边界(带重叠)
实验
本文介绍每种文档类型最合适的分块方法,但在实践中,任何方法都可能适用于任何文档类型。 例如,基于句子的解析可能适合高度结构化的文档,而自定义模型可能适合非结构化文档。 优化 RAG 解决方案的一部分是试验各种分块方法。 请考虑你拥有的资源数、资源的技术技能以及必须处理的文档量。 若要实现最佳分块策略,请观察测试的每个方法的优点和权衡,以确保为用例选择合适的方法。