
LlamaIndex • 2025-03-17
使用 LlamaExtract 从 SEC 文件中挖掘财务数据
从冗长文档中提取结构化信息是客户经常向我们提出的需求。无论您是在分析 SEC 文件、法律合同、研究论文还是技术文档,LlamaExtract 都可以帮助您将复杂的长篇文档转化为结构化、可操作的数据,以便在后续自动化流程中使用。
为何要从 10-K 文件中提取结构化数据
在与我们的金融服务客户合作过程中,我们遇到了几个从 10-K 文件中提取结构化数据非常有价值的用例。例如:
- 财务分析和基准测试:结构化数据提取使分析师和投资者能够通过组织关键指标(如收入、营业收入和净收入)来系统地评估公司的财务健康状况。
- 风险评估和管理:通过从 10-K 报告中提取和结构化披露的风险因素信息,组织可以更有效地识别和监控潜在风险。
- 投资决策:投资者依赖来自 10-K 报告的结构化数据来评估投资机会的可行性和潜在回报。将财务报表、管理层讨论和市场分析组织成结构化格式,可以实现更准确的评估和比较,从而辅助做出明智的投资决策。
从 10-K/Q 文件中提取的挑战
虽然从 SEC 10-K/Q 文件中提取结构化数据价值很高,但它也体现了长篇文档提取的挑战。
- 这些报告通常超过 100 页,并且在多个结构各异的部分中包含密集的信息。传统提取方法通常会失败,因为它们无法在文档相距较远的部分之间保持上下文,或者难以从表格数据中提取信息。
- 这些文档的结构定义比较松散,报告的指标和部分可能因公司的运营情况而异。理想情况下,我们希望捕获不同公司通用的字段,同时仍然允许报告指标和字段存在个体差异。
作为参考,这里是英伟达 (Nvidia) 2024 年向 SEC 提交的 10-K 文件。我们将在这篇博文中以此为例。要跟着操作,您可以从我们的示例文件夹中克隆此 notebook。让我们看看 LlamaExtract 如何解决将这些文档转换为结构化、良好类型格式的挑战。
构建有效的提取模式
成功提取的基础是精心设计的模式。精心设计的模式能够捕获您感兴趣的信息,并适用于您的目标文档,即文档包含填充模式字段的相关信息,同样,模式也包含足够的信息来指定“如何”从目标文档中提取这些数据。
对于 SEC 文件,我们创建了一个全面的模式,捕获文件信息、公司概况、财务重点、业务部门、地理数据、风险因素和管理层讨论。
1. 使用 Python SDK 结合 Pydantic 进行模式规范
我们可以使用我们的 Python SDK 来构建模式,模式如下所示。请参阅 notebook 以获取用于提取财务重点、不同财务报表信息、管理层讨论等的附加类。
from typing import Literal, Optional, List
from pydantic import BaseModel, Field
class FilingInfo(BaseModel):
"""Basic information about the SEC filing"""
filing_type: Literal["10-K", "10-Q", "10-K/A", "10-Q/A"] = Field(
description="Type of SEC filing"
)
filing_date: str = Field(description="Date when filing was submitted to SEC")
reporting_period_end: str = Field(description="End date of reporting period")
fiscal_year: int = Field(description="Fiscal year")
fiscal_quarter: int = Field(description="Fiscal quarter (if 10-Q)", ge=1, le=4)
# Additional model classes for company profile, financial data, etc.
2. 使用 Web UI
Notebook 可能会给人一种模式设计是一次性过程的印象,但这远非事实。通常,您会从小处着手,在样本文档上测试模式,在提取不准确时添加描述和示例,然后缓慢迭代地构建您的模式。使用我们的 Web UI 可能更容易完成这部分工作。我们提供了一个预定义的 10-K/Q 提取模式,您可以试用和修改。

长篇文档提取模式设计的技巧
在处理 SEC 文件等大量文档时,请考虑以下专门的模式设计原则
1. 战略性字段可选性
对于在不同公司或文档实例之间内容各异的长文档,要战略性地确定哪些字段是必填的,哪些是可选的。
# Making fields optional when they might not be present in all filings
ebitda: Optional[float] = Field(
None,
description="EBITDA (Earnings Before Interest, Taxes, Depreciation, Amortization)"
)
必填字段过多可能会导致幻觉(hallucination),而可选字段过多可能会导致信息遗漏。根据您的文档集找到适当的平衡。
2. 清晰的字段描述
在冗长文档中,相似概念可能出现在不同的上下文中,因此精确的字段描述至关重要。您的描述越具体,提取结果就越准确。当您发现提取不准确时,这是一个很好的地方来通过给出做什么和不做什么的示例来指定期望的行为。
gross_margin: float = Field(description="Gross margin percentage")
revenue_percentage: Optional[float] = Field(
None, description="Percentage of total company revenue (not growth rate)"
)
3. 分层组织
构建您的模式以反映文档的自然组织结构。这种分层方法有助于提取模型在文档的逻辑部分之间保持上下文。
class SECFiling(BaseModel):
filing_info: FilingInfo = Field(description="Basic information about the filing")
company_profile: CompanyProfile = Field(description="Essential company information")
financial_highlights: FinancialHighlights = Field(
description="Key financial metrics from this reporting period"
)
# Additional sections...
4. 包含页码追踪
对于长文档,追踪信息的来源位置对于验证非常重要。我们在模式中包含了 page_numbers
,以便能够验证使用了文档的哪个部分作为某些数据的来源。 由于页码的相对位置以及提取信息的周围上下文,页码可能会有偏差,但这是一个快速导航到文档相关部分并对某些字段进行基本测试的方法。提供更简单、更准确的引用源文档的方法是我们的重要发展路线图。
page_numbers: List[int] = Field(
description="Page numbers where the financial metrics were extracted from"
)
评估提取结果
这是提取的关于财务重点的相关部分。请查看 notebook 以查看详细的提取结果。
{
'financial_highlights': {
'period_end': '2025-01-26',
'comparison_period_end': '2024-01-28',
'currency': 'USD',
'unit': 'thousands',
'revenue': 130497.0,
'revenue_prior_period': 60922.0,
'revenue_growth': 114.23,
'gross_profit': 97858.0,
'gross_margin': 75.0,
'operating_income': 81453.0,
'operating_margin': None,
'net_income': 72880.0,
'net_margin': 55.8,
'eps': None,
'diluted_eps': None,
'ebitda': None,
'free_cash_flow': None,
'page_numbers': [40, 41, 55, 56, 68]
},
}
毛利率 75% 是从下面的第 40 页提取的,收入数字来自文档的第 41 页。您可以验证收入的地域细分是否已从第 79 页正确提取。

LlamaExtract 公测版现已可用!
LlamaExtract 现已可供您试用。它为结构化数据提取工作流程提供了全面的解决方案。
- 使用 Web UI 进行模式迭代:我们提供了一个带有模式构建器的 Web UI,可以帮助您定义模式并在不同文档上进行迭代。如果您有兴趣试用,我们提供了 10-K/Q 模式供您入门。从小处着手,然后在此基础上构建!请参阅上面的技巧。在不同文档上尝试您的模式,看看它是否适用于目标文档。
- 引用:对于长篇文档提取,您可以要求提取代理提供关键提取数字的页码。这将帮助您快速导航到文档的相关部分并验证提取信息的准确性。我们正在努力开发更强大、更便捷的引用功能!
- 运行可扩展的批量作业:一旦您确信提取代理运行良好,您就可以通过我们的 Python SDK 使用您的代理运行可扩展的批量作业。
立即开始使用!注册 LlamaCloud 并使用 LlamaExtract。