从非结构化文档中提取文本是开发过程中的一个典型难题。数十年来,传统的光学字符识别(OCR)系统在处理复杂布局时常常力不从心,导致多栏 PDF、嵌入式图片和嵌套表格最终变成一堆难以辨识的纯文本。如今,大型语言模型(LLM)的多模态能力终于让可靠的文档理解成为可能。
LlamaParse 旨在弥合传统 OCR 与基于视觉语言的智能体解析之间的鸿沟,它能够为 PDF、演示文稿和图像提供顶尖的文本提取能力。本文将指导你如何利用 Gemini 来驱动 LlamaParse,从非结构化文档中提取高质量的文本和表格,并构建一个智能个人财务助手。
请注意:Gemini 模型生成的内容可能存在错误,不应作为专业的财务建议。
为什么选择 LlamaParse?
在许多场景下,LLM 本身已经能够有效执行文档解析任务。然而,当处理大量文档或格式多变的文档时,保证解析的一致性和可靠性变得极具挑战性。
像 LlamaParse 这样的专用工具通过引入预处理步骤和可定制的解析指令来补充 LLM 的能力,这有助于结构化处理大型表格或密集文本等复杂元素。在通用的解析基准测试中,与直接处理原始文档相比,这种方法的效果提升了约 13%–15%。
应用场景:解析券商对账单
券商对账单是文档解析领域的一大终极挑战。它们包含了密集的金融术语、复杂的嵌套表格以及动态变化的布局。为了帮助用户理解其财务状况,我们需要一个工作流,它不仅能解析文件,还能显式地提取表格,并通过 LLM 对数据进行解释。
鉴于这些高级的推理和多模态需求,Gemini 3.1 Pro 成为了底层模型的理想选择。它在拥有巨大上下文窗口的同时,还具备原生的空间布局理解能力。
整个工作流分为四个阶段:
- 接收 (Ingest):将 PDF 文件提交给 LlamaParse 引擎。
- 路由 (Route):引擎解析文档并发出一个
ParsingDoneEvent事件。 - 提取 (Extract):该事件触发两个并行任务——文本提取和表格提取,以最大限度地减少延迟。
- 合成 (Synthesize):一旦两个提取任务完成,Gemini 会生成一份易于理解的摘要。
这种双模型架构是一个经过深思熟虑的设计:
- Gemini 3.1 Pro:在解析阶段处理复杂的布局理解任务,保证准确性。
- Gemini 3 Flash:负责最后的摘要生成,优化延迟和成本。
本教程的完整代码可以在 LlamaParse x Gemini 的 GitHub 演示仓库中找到。
环境设置
首先,安装 LlamaCloud、LlamaIndex workflows 和 Google GenAI SDK 所需的 Python 包。
# 使用 pip
pip install llama-cloud-services llama-index-workflows pandas google-genai
# 使用 uv
uv add llama-cloud-services llama-index-workflows pandas google-genai
接下来,将你的 API 密钥导出为环境变量。你可以从 Google AI Studio 获取 Gemini API 密钥,并从 LlamaCloud 控制台获取 LlamaCloud API 密钥。
安全提示:切勿将 API 密钥硬编码到应用程序的源代码中。
export LLAMA_CLOUD_API_KEY="your_llama_cloud_key"
export GEMINI_API_KEY="your_google_api_key"
步骤 1:创建并使用解析器
工作流的第一步是解析。我们创建一个由 Gemini 3.1 Pro 支持的 LlamaParse 客户端,并在 resources.py 中定义它,以便将其作为资源注入到工作流中。
# resources.py
def get_llama_parse() -> LlamaParse:
return LlamaParse(
api_key=os.getenv("LLAMA_CLOUD_API_KEY"),
parse_mode="parse_page_with_agent", # 启用智能体模式
model="gemini-3.1-pro",
result_type=ResultType.MD, # 以 Markdown 格式输出
)
这里的 parse_page_with_agent 模式会利用 Gemini 的能力进行智能迭代,根据视觉上下文来校正和格式化 OCR 结果。
接着,在 workflow.py 中定义事件、状态和解析步骤。
# workflow.py
class BrokerageStatementWorkflow(Workflow):
@step
async def parse_file(
self,
ev: FileEvent,
ctx: Context[WorkflowState],
parser: Annotated[LlamaParse, Resource(get_llama_parse)]
) -> ParsingDoneEvent | OutputEvent:
# 异步解析文件
result = cast(ParsingJobResult, (await parser.aparse(file_path=ev.input_file)))
# 将解析结果存入全局状态
async with ctx.store.edit_state() as state:
state.parsing_job_result = result
return ParsingDoneEvent()
注意,我们没有立即处理解析结果,而是将其存储在全局的 WorkflowState 中,供后续的提取步骤使用。
步骤 2:提取文本与表格
为了给 LLM 提供解释财务报表所需的上下文,我们需要提取完整的 Markdown 文本和表格数据。将提取步骤添加到 BrokerageStatementWorkflow 类中。
# workflow.py (续)
@step
async def extract_text(self, ev: ParsingDoneEvent, ctx: Context[WorkflowState]) -> TextExtractionDoneEvent:
# 文本提取逻辑(此处省略,详见仓库代码)
...
@step
async def extract_tables(self, ev: ParsingDoneEvent, ctx: Context[WorkflowState], ...) -> TablesExtractionDoneEvent:
# 表格提取逻辑(此处省略,详见仓库代码)
...
由于 extract_text 和 extract_tables 这两个步骤都监听同一个 ParsingDoneEvent 事件,LlamaIndex Workflows 会自动并行执行它们。这意味着文本和表格的提取是同时进行的,从而缩短了整个流程的延迟,并使架构在未来添加更多提取任务时具备天然的可扩展性。
步骤 3:生成摘要
数据提取完成后,我们可以调用 Gemini 来生成一份通俗易懂的摘要。在 resources.py 中配置 LLM 客户端和提示词模板。在这里,我们使用 Gemini 3 Flash 进行最终的摘要生成,因为它在处理文本聚合任务时具有低延迟和高性价比的优势。
最后的合成步骤使用 ctx.collect_events 来等待两个提取任务都完成后再调用 Gemini API。
# workflow.py (续)
@step
async def ask_llm(
self,
ev: TablesExtractionDoneEvent | TextExtractionDoneEvent,
ctx: Context[WorkflowState],
llm: Annotated[GenAIClient, Resource(get_llm)],
template: Annotated[Template, Resource(get_prompt_template)]
) -> OutputEvent:
# 等待文本和表格提取事件都到达
if ctx.collect_events(ev, [TablesExtractionDoneEvent, TextExtractionDoneEvent]) is None:
return None
# 完整的提示词和 LLM 调用逻辑(详见仓库代码)
...
运行工作流
为了将所有部分整合起来,main.py 入口文件负责创建并运行工作流。
# main.py
wf = BrokerageStatementWorkflow(timeout=600)
result = await wf.run(start_event=FileEvent(input_file=input_file))
你可以从 LlamaIndex 的数据集中下载一份示例对账单进行测试。
curl -L https://raw.githubusercontent.com/run-llama/llama-datasets/main/llama_agents/bank_statements/brokerage_statement.pdf > brokerage_statement.pdf
然后运行工作流:
# 使用 pip
python3 main.py brokerage_statement.pdf
# 使用 uv
uv run run-workflow brokerage_statement.pdf
现在,你就在终端中拥有了一个功能齐全的个人财务助手,能够分析复杂的金融 PDF 文件。
后续步骤
AI 流水线的质量取决于你输入的数据质量。通过将 Gemini 3.1 Pro 的多模态推理能力与 LlamaParse 的智能体解析相结合,你可以确保应用程序获得完整、结构化的上下文,而不仅仅是扁平化的文本。
当你将架构建立在事件驱动和状态化的基础上时(如此处演示的并行提取),你构建的系统将是快速、可扩展且具有弹性的。
准备好在生产环境中实施了吗?你可以进一步探索 LlamaParse 和 Gemini API 文档,尝试多模态生成功能,并深入研究 GitHub 仓库中的完整代码。
👉 如果你需要 ChatGPT 代充 / Claude / Claude Code / 镜像 / 中转 API:
- 购买 / 了解更多:ai4.plus
- 备用入口:kk4099.com