由 Kristin Olesova、Selimcan Sakar、Zdenko Estok、Shikhar Kwatra 和 Marcelo Silva 于 2024 年 8 月 21 日发布,内容涉及 Amazon Bedrock、Amazon 机器学习、Amazon OpenSearch 服务、Amazon Textract、人工智能、AWS Lambda、专家级、合作伙伴解决方案 以及 技术指南。
永久链接评论区
在当今数据驱动的世界中,各组织经常面临从非结构化 PDF 文档中提取结构化信息的挑战。这些 PDF 可能包含多种元素,如图像、表格、标题和格式各异的文本,导致数据的解析和分析变得困难。
此外,聊天机器人和其他自然语言处理NLP应用的性能在很大程度上依赖于所采用的分块策略。错误的分块可能导致上下文信息的丢失,从而造成误解和不准确的响应。而且,语言模型的性能还受到分块大小的影响,较小的分块提供更细致的信息,但通常在概括方面表现不佳,而较大的分块可能会遗漏重要细节。
本篇文章将探讨 Accenture 如何利用 Amazon Bedrock 知识库 的定制能力,将其数据处理工作流程和自定义逻辑相结合,创建出一种自定义分块机制,以提升检索增强生成RAG的性能,并充分发挥 PDF 数据的潜力。
Accenture 团队创建了一个知识库,其中包含2020年至2024年每个季度的财务结果。这些文档包含图像、表格、以不同格式存储的文本及其他噪声元素。
在此用例中,我们希望提取表格中包含的细节信息,并保持基础模型FMs的良好概括能力,以回应有关财务结果的普遍问题。
经过测试,我们发现搜索机制无法正确检索指定年份和季度的信息。以下截图显示了一个示例,其中查询是针对2023年第一季度的信息,但搜索机制返回了2020年第一季度的信息。
我们无法通过不同的搜索策略或更改检索块的数量来提取正确的数据块。在经过更严格的测试后,我们发现解析表格信息和检索正确数据方面存在困难。由于这些问题与搜索算法无法选择正确偏移量相关,因此我们决定改变分块策略,并尝试 Amazon Bedrock 中的新特性。
更新解决方案的架构流程如下所示:
工作流程中的步骤通过 AWS Lambda 进行编排,如下图所示:
该分块机制使用 Amazon Textract 检测段落、表格、图像、章节标题和其他 PDF 布局元素,以改善分块避免在句子或段落中间拆分文本、消除噪声,并为元数据生成提供更多上下文。我们可以直接在过滤过程中或作为提示模板中的提示使用这些元数据,以提高生成响应的准确性。借助每个 PDF 元素的指定逻辑,我们可以根据元素的类别采取正确的行动。
主要 PDF 元素如下:
在本节中,我们展示如何使用所提出的自定义分块解决方案。
注意: 提供的内容和代码仅供参考。在运行以下信息之前,请进行独立评估。
此过程包括以下步骤:
为每一个财务文档指定自定义元数据,以支持分析。对于本篇文章,我们指定了季度、财政年度、公司及其他字段的信息:
pythonmetadata = { metadataAttributes { documentname documentnamesplit(pdf)[0] fiscalyear fiscalyear quarter quarter maintopic secondarytopic format Text }}
pythondef textractdata(self output) image = Imageopen(output)
document = selfextractoranalyzedocument( filesource=image features=[TextractFeaturesLAYOUT TextractFeaturesTABLES] saveimage=True)newlayout = selfsavetable(document)selfsavetext(newlayout)
pythondef savetable(self document) tablecount = 0 if documenttables for layout in documentlayouts if layoutlayouttype in LAYOUTTITLE selfmetadata[metadataAttributes][maintopic] = layouttext elif layoutlayouttype == LAYOUTSECTIONHEADER selfmetadata[metadataAttributes][secondarytopic] = layouttext elif layoutlayouttype == LAYOUTTABLE table = documenttables[tablecount] dftable = tabletopandas() selfmetadata[metadataAttributes][format] = Table
tfile = selftablesdirectory f/{selfdocumentname}tablep{selfpagenumber}t{tablecount}csv with open(tfile w) as csvfile csvfilewrite(dftabletocsv(index=False header=False)) with open(tfile metadatajson w) as jsonfile jsondump(selfmetadata jsonfile) tablecount = 1
pythonfor layout in document if layoutlayouttype in LAYOUTTITLE selfmetadata[metadataAttributes][maintopic] = layouttext elif layoutlayouttype == LAYOUTSECTIONHEADER # 在每个子章节开始时拆分文本 selfcreatechunk() # 保存前一个块到 chunkdic for chunk in selfchunkdic # 保存所给章节的所有块 selfmetadata[metadataAttributes][format] = Text with open(chunk[outputpath] w) as textfile # 创建指定文本的 txt 文件 textfilewrite(chunk[text] str(chunk[metadata])) with open(chunk[outputpath] metadatajson w) as jsonfile # 为给定块创建元数据文件 jsondump(chunk[metadata] jsonfile) selfsubtitle = [] selfchunkdic = []
selfmetadata[metadataAttributes][secondarytopic] = layouttextelif layoutlayouttype in [LAYOUTLIST LAYOUTTEXT] if (len(selfnewchunk layouttext) gt chunkmax) and (len(selfnewchunk) gt chunkmin) # 如果章节中的文本过大,就在段落结束时拆分 selfcreatechunk() selfnewchunk = selfnewchunk layouttext
这种方法的好处在于,即使文本在下一页继续,该机制也能够将其分配到正确的块中如果文本在有限的向量空间内。这有助于防止在句子中间拆分文本,这通常会导致误解。
一个 metadatajson 文件,可与知识库元数据和过滤器一起使用。
完成拆分后,将文件上传到 Amazon S3,并继续使用无分块选项创建知识库。
使用自定义分块选项时,请记住可能块的最大大小。如果文本块过大,文件的向量化将会失败,文件将无法用于知识库。
自定义分块提供了如下优势:
元数据过滤是一种强大功能,可以显著增强搜索算法的性能。通过利用元数据过滤指定财政年度和季度,我们在响应准确性上实现了显著提升。目前,Amazon Bedrock 控制台要求用户对元数据信息的名称及其对应值有先前了解。截至文章撰写时,无法直接通过提示来指定这些过滤器。因此,在实际应用中,用户需要指导或提示来帮助他们选择合适的过滤值。
下图展示了在相同模型和分块逻辑下启用元数据过滤的示例。在第一个问题中,仅使用提示时,搜索算法未能提供正确文档中的块。而在第二个问题中,我们通过财政年度2023和季度Q3进行了过滤。搜索算法的输出仅为一个块,但确实是正确的。
我们比较了固定分块、自定义分块和带提示的自定义分块。我们使用 Amazon Titan Embeddings Text v1 模型进行自定义分块、基准和元数据过滤。我们使用 Claude Sonnet 3 模型和混合搜索执行了额外的知识库测试,最大获取结果为 20 条。
我们在以下几个任务上测试了模型的性能:
我们手动通过检查模型生成的信息与源数据的事实进行性能评估。以下截图展示了在两个不同知识库中的一些示例问题及其生成的答案,适用于 yearsensitive 一类问题。
第一个示例使用了 Amazon Titan Embeddings 模型的自定义分块。
下一个示例使用了 Cohere 的固定分块。
我们在2024年4月发布的提示模板功能上应用了该模型,使其关注于关于财政年度和季度的详细信息。这些信息与元数据 JSON 文件中的内容相同,并为模型提供了一些提取有效块的重要信息。以下是系统提示的示例:
plaintext用户:
您是一位专注于公司财务报表和审查的问答代理。我将向您提供一组搜索结果和用户问题;您的任务是仅使用搜索结果中的信息来回答用户的问题。在回答问题之前,请逐步思考并根据提供的 {} 括号中的 metadataAttributes 验证您的响应。如果在用户问题中提供,请始终确保