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