✌️5款真正有效的AI文档解析工具🚀🔥
处理真实世界的文档仍然很麻烦。PDF、发票、从旧工具导出的各种文件。一半的工作量都花在把它们转换成模型可以使用的清晰、结构化的格式上了。😕
这篇文章主要讲的是第一步,也就是演示和教程中经常被忽略的一步:解析和构建文档。
这里的工具可以处理 OCR、布局、表格、表单和文件格式,因此您可以专注于围绕它们的逻辑。
我将介绍一些我实际喜欢使用的工具,并提供一些简短的代码片段,您可以直接将其添加到自己的项目中。
那么,我们开始吧。🚀
1. Tensorlake
💡 文档导入 API 以及用于代理数据工作流的无服务器运行时
Tensorlake 能同时为你提供两大功能:
- 一个文档导入 API,可以将杂乱的文件转换为清晰的 Markdown 或结构化的 JSON。
- 一个用于在该数据之上运行代理工作流的无服务器平台
您可以发送 PDF、Office 文件、图像或纯文本,并获得结构良好、布局完整的文档。简而言之,您可以将其视为一个文档导入 API,它可以处理 PDF、Office 文件、扫描件和图像,然后利用其无服务器运行时在其上添加代理类应用程序。
因此,您无需使用重试逻辑来处理 OCR 和后台作业,而是可以使用一个单一的平台来解析、分块、分类,然后将结果提供给代理或工具。
🤔 这适合你吗?
如果您正在构建发票提取器、合同分析器或任何需要实际读取文档的复杂数据摄取或代理,Tensorlake 将作为摄取和工作流层,位于您的堆栈的中间位置。
特征
- 多格式解析:将 PDF、Office 文档、电子表格、演示文稿、图像和原始文本解析为 markdown 或 JSON。
- 布局感知输出:保留表格、章节和阅读顺序,使您的 RAG 或搜索与原始文档保持一致,这是许多其他工具所忽略的。
- 基于模式的提取:使用 JSON Schema 或 Pydantic 模型,仅提取您关心的字段。
- 代理运行时:装饰 Python 函数,在沙箱中运行它们,并让 Tensorlake 处理扩展、重试和状态。
还有更多……
现在,让我们来看一个常见用例的简单代码示例。
代码示例:从 PDF 到 Markdown
首先,安装 SDK,然后使用 DocumentAI 客户端上传 PDF,启动解析作业,并在解析完成后流式传输 markdown 块。
pip install tensorlake
现在,要从 PDF 文件中提取文本,您可以这样做:
from tensorlake.documentai import DocumentAI, ParseStatus
doc_ai = DocumentAI(api_key="your-api-key")
# Upload and parse document
file_id = doc_ai.upload("/path/to/document.pdf")
# Start parsing
parse_id = doc_ai.parse(file_id)
# Wait until parsing is complete
result = doc_ai.wait_for_completion(parse_id)
if result.status == ParseStatus.SUCCESSFUL:
# Each chunk is a piece of clean markdown
for chunk in result.chunks:
print(chunk.content)
这是后端作业中常用的基本流程,该作业会将上传的 PDF 文件转换为 LLM 友好的文本,以便进行 RAG 或搜索等操作。
一旦你有了数据块,就可以直接将它们推送到矢量存储或数据库中。
您可以对解析过程进行更多控制,例如使用结构化解析,您可以在这里找到相关信息:结构化提取。我建议您自行探索更多相关内容。
代码示例:基于 Tensorlake 运行时的微型智能体应用程序
在 Tensorlake 上运行小型智能体应用程序非常简单:
import os
from agents import Agent, Runner
from agents.tool import WebSearchTool, function_tool
from tensorlake.applications import application, function, run_local_application, Image
# Container image with the dependencies the function needs
FUNCTION_CONTAINER_IMAGE = Image(
base_image="python:3.11-slim",
name="city_guide_image",
).run("pip install openai openai-agents")
@function_tool
@function(
description="Gets the weather for a city",
secrets=["OPENAI_API_KEY"],
image=FUNCTION_CONTAINER_IMAGE,
)
def get_weather_tool(city: str) -> str:
agent = Agent(
name="Weather Reporter",
instructions="Use web search to find current weather in the city",
tools=[WebSearchTool()],
)
result = Runner.run_sync(agent, f"City: {city}")
return result.final_output.strip()
@application(tags={"type": "example", "use_case": "city_guide"})
@function(
description="Creates a simple city guide",
secrets=["OPENAI_API_KEY"],
image=FUNCTION_CONTAINER_IMAGE,
)
def city_guide_app(city: str) -> str:
agent = Agent(
name="Guide Creator",
instructions="Make a friendly city guide that includes the current temperature",
tools=[get_weather_tool],
)
result = Runner.run_sync(agent, f"City: {city}")
return result.final_output.strip()
if __name__ == "__main__":
city = "Paris"
if not os.environ.get("OPENAI_API_KEY"):
print("Error: OPENAI_API_KEY is not set")
raise SystemExit(1)
request = run_local_application("city_guide_app", city)
response = request.output()
print(response)
上面的代码使用 OpenAI Agent 和工具调用创建了一个城市指南应用程序。我不会在这里解释代码,因为那样博客篇幅会变得过长。
你可以在他们的GitHub README 文件中找到这段代码的解释。
在 TensorLake 云上部署和运行
要在 Tensorlake Cloud 上运行应用程序,首先需要对其进行部署。
TENSORLAKE_API_KEY在 shell 会话中设置:
export TENSORLAKE_API_KEY="Paste your API key here"
- 设置
OPENAI_API_KEYTensorlake Secrets,以便您的应用程序可以调用 OpenAI:
tensorlake secrets set OPENAI_API_KEY "Paste your API key here"
- 将应用程序部署到 TensorLake 云:
tensorlake deploy examples/readme_example/city_guide.py
- 运行位于以下位置的远程测试脚本
examples/readme_example/test_remote_app.py:
from tensorlake.applications import run_remote_application
city = "San Francisco"
# Run the application remotely
request = run_remote_application("city_guide_app", city)
print(f"Request ID: {request.id}")
# Get the output
response = request.output()
print(response)
- 该应用程序将在 Tensorlake 云平台上运行,每个函数都在其自身隔离的沙箱中运行。
简而言之,Tensorlake 负责启动容器、注入密钥并保持函数持久性,以便它可以重试工具调用,而无需您构建自己的队列系统。
这里有一个快速的 TensorLake 文档导入演示,展示了它如何处理复杂文档。👇
2. 驯服
Docling 由 IBM 研究团队开发,采用 MIT 许可(免费且开放商业用途),可将 PDF、Office 文档、图像、音频等转换为统一的 DoclingDocument 格式。之后,您可以将其导出为 Markdown、HTML、DocTags 或无损 JSON 格式,并直接导入 RAG、代理或搜索引擎。
它可在本地运行,并具有强大的布局和表格理解能力,以及用于扫描或复杂文档的 OCR 和视觉模型。
特征
-
支持多种格式解析——PDF、DOCX、PPTX、XLSX、HTML、图像、音频等,并将它们整合到一个结构化的表示中。
-
高级 PDF 理解- 页面布局、阅读顺序、表格、代码、公式和图像均可开箱即用。
-
多种导出目标- 将单个 DoclingDocument 导出为 markdown、HTML、DocTags 或结构化 JSON。
-
本地化且注重隐私——设计为完全在本地运行。
-
Gen AI 集成- 开箱即用,可与 LangChain、LlamaIndex、Haystack 等集成。
还有更多……
代码示例 - 转换和打印 Markdown
基本流程有意设计得很简单:创建一个转换器,给它一个源,然后决定如何导出结果。
from docling.document_converter import DocumentConverter
source = "https://arxiv.org/pdf/2408.09869" # can also be a local Path(...)
converter = DocumentConverter()
result = converter.convert(source)
markdown = result.document.export_to_markdown()
print(markdown)
此示例显示了“一个文档输入,一个 Markdown 文档输出”的路径,您通常会将其添加到索引步骤中。
这样,您就可以将一个 Markdown 文档拆分成多个部分,并将其导入矢量数据库。
代码示例:与 CLI 的思路相同。
Docling 还自带命令行界面 (CLI)。您可以使用以下命令安装它:
pip install docling
现在,您可以使用以下命令运行它:
# Convert a PDF at a URL to markdown on stdout
docling https://arxiv.org/pdf/2206.01062
# Use the GraniteDocling vision language model in the pipeline
docling --pipeline vlm --vlm-model granite_docling https://arxiv.org/pdf/2206.01062
显然,还有一些更复杂的用例,需要添加更多标志。为此,请参阅他们的文档。
以下是 Red Hat 制作的一段简短视频,展示了它的实际应用。👇
3. 非结构化
Unstructured 提供了一个开源库和一个托管平台,可以将非结构化内容转换为 LLM 应用所需的结构化数据。它将 PDF、幻灯片、HTML、Office 文件和图像分割成一组标准元素,方便下游工具轻松使用。
除此之外,摄取层还添加了连接器、分块和嵌入功能,以便您可以围绕文档源构建完整的 ETL 风格的管道。
特征
- 一个分区 API可以自动检测文件类型,并为您路由到正确的解析器。
- LLM 友好型输出结构化元素,必要时包含文本、元数据和坐标。
- 通过 Ingest CLI 和 Python 库连接 GitHub、S3 等源和目标。
- 当您需要更好的模型或扩展时,托管分区端点会将计算任务卸载到其 API。
代码示例:快速入门partition
这是你在大多数示例中会看到的核心模式,足以将其插入 RAG 管道。
from unstructured.partition.auto import partition
# Read and partition a document
elements = partition("example-docs/layout-parser-paper.pdf")
# Inspect a few elements
for el in elements[:5]:
print(repr(el.category), "->", str(el)[:80], "...")
最终你会得到一个元素列表,其中包含了它们的类别信息,这使得在进一步使用之前,可以轻松地筛选标题、段落或表格。
代码示例:使用 Ingest CLI 进行批量处理
在实际项目中,通常需要一次性处理多个文件并将输出结果保存到某个位置。它自带一个文件导入命令行界面 (CLI),正是为此而设计的。
# Chunk and partition an entire folder of files
unstructured-ingest \
local \
--input-path $LOCAL_FILE_INPUT_DIR \
--output-dir $LOCAL_FILE_OUTPUT_DIR \
--chunking-strategy by_title \
--chunk-max-characters 1024 \
--partition-by-api \
--api-key $UNSTRUCTURED_API_KEY \
--partition-endpoint $UNSTRUCTURED_API_URL \
--strategy hi_res
该流程会运行一个完整的流水线,从指定位置读取文档LOCAL_FILE_INPUT_DIR,使用指定策略对文档进行分区hi_res,按标题进行分块,并将结构化输出写入输出目录。之后,您可以根据需要对文档进行索引或分析。
这里有一个快速入门指南,帮助你了解 API 的基本用法。👇
4. Amazon Textract
Amazon Textract 是 AWS 的托管 OCR 和文档分析服务,可从扫描文档和 PDF 中提取文本、手写内容、布局和结构化数据。
它运行在您的 AWS 账户内,可接入 S3、Lambda、SNS 和 SQS 等服务,并被 PayTM 等公司大规模用于文档工作流程。
特征
- 结构化数据提取可以从表格、表单和键值对中提取数据,而不仅仅是纯文本。
- 布局和手写支持功能可检测扫描件中的段落、标题、布局元素和手写文本。
- 可与 S3、Lambda、SNS、SQS 和其他 AWS 服务无缝集成。
- 同步和异步 API可实现单页低延迟调用,并支持大型多页文档的批量作业。
- 安全和合规加密、身份和访问管理以及受监管工作负载的区域控制。
代码示例:检测本地文件中的文本
如果你只想从文档中提取文本,这是基本模式。你以字节形式读取文件,调用detect_document_textTextract 函数并打印它找到的行。
import boto3
textract = boto3.client("textract") # uses your AWS credentials
file_path = "sample-doc.png" # can be any image format
with open(file_path, "rb") as f:
image_bytes = f.read()
response = textract.detect_document_text(
Document={"Bytes": image_bytes}
)
for block in response["Blocks"]:
if block["BlockType"] == "LINE":
print(block["Text"])
这里发生了什么:
- Textract 分析图像或 PDF,并返回一个代表单词、线条和其他元素的块列表。
- 您可以筛选类型为 LINE 的块并打印其文本,这足以满足许多基本的 OCR 用例,或者作为将文本发送到 LLM 之前的第一步。
代码示例:从 S3 中提取表格和表单
要从表单和表格中提取结构化数据,您可以使用analyze_document`and`FORMS和 ` TABLESfeature` 类型,并将 Textract 指向 S3 中的文档。
import boto3
textract = boto3.client("textract")
bucket_name = "my-doc-bucket"
object_key = "invoices/invoice-001.png"
response = textract.analyze_document(
Document={
"S3Object": {
"Bucket": bucket_name,
"Name": object_key,
}
},
FeatureTypes=["FORMS", "TABLES"],
)
print(f"Found {len(response['Blocks'])} blocks")
# Quick peek at found tables
for block in response["Blocks"]:
if block["BlockType"] == "TABLE":
print("Detected a table with Id:", block["Id"])
Textract还有很多其他复杂的功能。更多详情,请查阅Textract文档。
在生产环境中,通常会将其与 S3 触发器和 Lambda 函数连接起来,以便自动获取和处理新文档。
以下是亚马逊 Textract 的简要介绍。👇
5. Google Cloud Document AI
Document AI 是 Google Cloud 的文档堆栈,它提供现成的处理器,用于处理发票、收据、表单、ID 和通用 OCR 数据。您只需选择一个处理器,发送文件,即可获得Document包含文本、结构、实体和布局信息的对象,而不仅仅是原始字符串。
它最棒的地方在于它与 GCP(Google Cloud Platform)其他组件的集成。您可以将文件上传到 Cloud Storage,使用 Pub/Sub、Cloud Functions 或 Cloud Run 触发处理,然后将清理后的数据推送到 BigQuery 或您的应用中。
想用的时候就用:
- 预置处理器- 发票、收据、表格、身份证和通用 OCR 处理器,开箱即用。
- 表格和表单- 直接从扫描的 PDF 和图像中提取键值对和表格。
- 自定义模型- 当您的文档与预构建的模型不匹配时,可以使用自定义提取器、分类器和分割器。
- Cloud pipelines - 与 Cloud Storage、Cloud Run 和 Vertex AI 紧密集成,因此很容易连接到现有的 GCP 设置中。
代码示例:发送 PDF 文件并读取其内容
这是常见的 Python 工作流程。你在控制台中创建一个处理器,获取它的 ID,然后在你的代码中调用它。
from google.cloud import documentai
project_id = "your-project-id"
location = "us"
processor_id = "your-processor-id"
file_path = "path/to/document.pdf"
client = documentai.DocumentProcessorServiceClient()
name = client.processor_path(project_id, location, processor_id)
with open(file_path, "rb") as f:
file_bytes = f.read()
raw_document = documentai.RawDocument(
content=file_bytes,
mime_type="application/pdf",
)
request = documentai.ProcessRequest(
name=name,
raw_document=raw_document,
)
result = client.process_document(request=request)
doc = result.document
print(doc.text[:1000])
你发送原始字节和 MIME 类型,Document AI 运行选定的处理器,然后返回一个Document对象。对于快速使用场景,抓取数据doc.text就足够了。
代码示例:将解析后的表单转换为字段
如果您使用表单样式处理器,Document AI 已将字段标记为键值对,您可以遍历这些键值对并将其映射到您自己的架构中。
def clean(text: str) -> str:
return text.replace("\n", " ").strip()
form_doc = doc # from the previous example. see above
fields = []
for page in form_doc.pages:
for field in page.form_fields:
name = clean(field.field_name.text_anchor.content)
value = clean(field.field_value.text_anchor.content)
conf = field.field_value.confidence
fields.append((name, value, conf))
for name, value, conf in fields:
print(f"{name}: {value} (conf {conf:.2f})")
此时,扫描的表单数据基本上会变成一个 Python 字典。之后,您可以将数据推送到 BigQuery、Firestore 或您在 GCP 上使用的任何服务中。
这仅仅是个开始,还有很多内容需要了解。请访问文档了解更多信息。
以下是 Google Cloud Document AI 的简要介绍。👇
结论
如果你想到任何其他我在本文中没有提到的实用人工智能工具,请在下方评论区分享。✌️
这篇文章就到这里啦!非常感谢您的阅读!🎉🫡
文章来源:https://dev.to/shricodev/5-ai-document-parsing-tools-that-actually-work-db6








