使用 Amazon Textract 为复杂文档自定义 Amazon Bedrock 知识库
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
检索增强生成(RAG, Retrieval-Augmented Generation)系统在处理现实世界中的企业级复杂文档时经常遇到瓶颈。传统的文档处理管道大多依赖简单的文本切分工具和基础的 Optical Character Recognition(OCR)引擎,在面对复杂版面布局时表现不佳。扫描件形式的公用事业账单(如电费、水费账单)、多列排版的财务报告以及嵌套数据表,在经过普通解析后往往沦为毫无结构的乱码字符串。当这些文本被输入给大语言模型(LLM)时,极易引发幻觉或信息缺失。
为了解决这一痛点,AWS 支持开发者结合 AWS Lambda 与 Amazon Textract 来自定义 Amazon Bedrock Knowledge Bases 的数据导入流程。通过引入具备版面感知能力的深度结构化提取技术,可以在文本块划分(Chunking)与向量化(Embedding)之前,将复杂的表格数据精准转换为标准 Markdown 或 HTML 格式。此外,在进行多大模型效果评估与低延迟 API 调用时,结合 AWS 原生服务与像 n1n.ai 这样的统一 API 聚合平台,能够帮助工程团队在 Claude 3.5 Sonnet 与 DeepSeek-V3 等多个主流模型间快速验证向量检索与生成效果。
本文将深入剖析该架构的技术细节,通过 Python 与 Boto3 源码示范自定义数据解析管道的实现路径,并给出企业级 RAG 生产环境的最佳实践。
传统 RAG 文档导入流程的局限性
托管式向量数据库的默认导入引擎通常使用基础的文件解析工具(例如 PyPDF 或纯文本提取器)。这些解析器习惯于按行自上而下逐行读取。对于简单的纯文本段落,这种方式完全够用;但在面对企业级复杂文档时,往往会出现严重失真:
- 多列排版错位:第一列的末尾文本经常与第二列的开头文本被直接拼接在同一行,导致语义被彻底撕裂。
- 嵌套表格结构丢失:财务报表和账单中的数据通常分布在二维矩阵中。一旦被拍平成一维文本,行标题与列标题之间的映射关联将彻底丢失。
- 键值对(Key-Value)断裂:例如 "应付总金额" 标签与具体的数值
$1,245.50在版面上可能存在较长的物理距离,基础解析器极易将二者割裂开来。 - 扫描噪声与低分辨率:普通解析器对不可检索的扫描版 PDF 无能为力,或在面对低清晰度图像时产生大量错别字。
如果文本在切片阶段就已经失去了结构完整性,向量生成的语义特征就会充满噪声。即便底层模型再强大,由于检索到的 Context 本身缺少关键标题或数值,模型也无法输出准确答案。
进阶架构设计:自定义 Textract 解析管道
为彻底解决上述问题,我们需要设计一套解耦的文档处理管道,利用 Amazon Textract 进行结构化解析,并配合 Amazon Bedrock 实现向量存储与检索生成。
[ Raw S3 Bucket ] (PDF、图片、公用事业账单)
│
▼
[ AWS Lambda / 自定义解析器 ]
│───> 调用 Amazon Textract (AnalyzeDocument API: TABLES + FORMS)
│───> 将版面结构转化为标准的 Markdown 表格
│───> 生成语义清晰的高质量 Chunk
▼
[ Bedrock 知识库导入层 ]
│───> 生成向量 (Amazon Titan Text Embeddings V2)
▼
[ 向量数据库 ] (Amazon OpenSearch Serverless)
│
▼
[ 推理层 ] ───> 路由网关 / [n1n.ai](https://n1n.ai) API ───> 模型调用 (Claude 3.5 / DeepSeek-V3)
数据流转流程:
- 触发导入:新的 PDF 或图片格式文档上传至 Amazon S3 原始存储桶。
- 自定义解析调用:Amazon Bedrock 知识库触发注册好的 AWS Lambda 自定义解析函数。
- Textract 版面分析:Lambda 调用 Textract 的
AnalyzeDocument接口,启用FEATURE_TYPES=['TABLES', 'FORMS']模式提取结构化数据。 - Markdown 结构重构:代码解析 Textract 返回的 JSON 块(Blocks)及其关联关系(Relationships),将单元格重构为标准的 Markdown 表格。
- 语义切分与标签注入:保持表格块的整体性,避免跨表格任意断句,并将处理好的文本存入 Bedrock 中间存储桶。
- 向量化与存储:Bedrock 知识库通过 Amazon Titan Text Embeddings V2 生成向量索引,并写入 Amazon OpenSearch Serverless。
代码实现:构建自定义 Textract 解析器
下面展示如何使用 Python 3.11 与 boto3 编写核心解析逻辑,将 Textract 的提取结果转化为结构良好的文本块。
步骤 1:将 Textract 表格解析为 Markdown
下述模块提取 Textract 返回的 TABLE 和 CELL 块,重构成直观的 Markdown 表格语法:
import boto3
import json
def textract_tables_to_markdown(textract_response):