使用 AI_EXTRACT 从文档中提取信息

AI_EXTRACT 是一个 Cortex AI 函数,允许您从文本或文档文件中提取结构化信息(如实体、列表和表),方法是用自然语言提出问题或描述要提取的信息。它可以与其他函数结合使用,为各种用例创建自定义文档处理管道(请参阅 Cortex AI 函数:文档)。

AI_EXTRACT 可以处理多种语言、多种格式的文档,并从文本密集型段落以及图形形式的内容中提取信息,例如徽标、手写文本(如签名)、表格或复选框标记。AI_EXTRACT 可以提取以下结构化格式的信息:

  • 实体:用自然语言提问或描述要提取的信息(如城市、街道或 ZIP 代码)。

  • 列表(或数组):您可以提供用于提取文档中信息数组或列表的 JSON 架构,例如银行对账单中所有账户持有人的姓名或文档中所有地址的列表。

  • 表:提供 JSON 架构,以通过指定表标题和应提取的列的列表,来提取文档中的表数据。

AI_EXTRACT 通过同时处理多个文档,自动根据您的工作负载进行扩展。可以直接从对象存储中处理文档,以避免不必要的数据移动。

备注

AI_EXTRACT 目前与自定义 网络策略 不兼容。

小技巧

有关 AI_EXTRACT 的更多信息,包括支持的语言、区域可用性和费用,请参阅 AI_EXTRACT

提取质量

AI_EXTRACT 使用 arctic-extract,一种基于视觉的专有大型语言模型 (LLM),来实现高精度提取。下表列出了该模型在各种标准基准测试中的得分,并与其他热门模型的得分进行了比较:

视觉问答 (VQA)

产品或服务

DocVQA 得分

人工评估

0.9811

Snowflake Arctic-Extract

0.9433

Azure OpenAI GPT-o3

0.9339

Google Gemini 2.5-Pro

0.9316

Google Anthropic Claude 4 Sonnet

0.9119

Azure Document Intelligence + GPT-o3

0.8853

Google Document AI + Gemini

0.8497

Azure OpenAI GPT-o3

0.9339

AWS Textract

0.8313

纯文本问答 (SQuAD v2)

产品或服务

ANLS

完全匹配

Snowflake Arctic-Extract

81.18

78.74

Anthropic Claude 4 Sonnet

80.54

77.10

Meta LLaMA 3.1 405B

80.37

76.56

Meta LLaMA 4 Scout

74.30

70.70

OpenAI GPT 4.1

70.71

66.81

Meta LLaMA 3.1 8B

59.13

54.48

提取信息的问题优化

使用 AI_EXTRACT 时,请使用自然语言询问有关文档的问题。要提出能返回准确答案的问题,请遵循以下准则:

  • 使用简单的英语。

  • 针对每一个问题,了解您期望获得怎样的答案。

  • 请具体说明;例如,如果文档中包括几个日期(如发布日期和签名日期),不要在未提供更多细节的情况下询问“日期是什么?”。

  • 在每个问题中只询问一个值。

  • 不要指望 AI_EXTRACT 猜测您的意图,或指望它在特定领域有广泛的知识。

以下面的文档为例。此购买和销售协议包括诸如要约到期日期、买卖双方名称以及所含项目等信息。

示例文档(公寓购买和销售协议)。

下表提供了您可以向 AI_EXTRACT 提出的问题的示例以及预期答案。

示例问题

答案

这份协议的日期是什么时候?

'October 6, 2023'

公寓套件的买家是谁?

'John Davis', 'Jane Davis'

该住宅单元中有哪些家用电器?

'stove/range', 'refrigerator', 'washer', 'dishwasher', 'attached television(s)', 'microwave'

公寓内没有哪些物品?

'dryer', 'security system', 'satellite dish', 'wood stove', 'fireplace insert', 'hot tub', 'attached speaker(s)', 'generator'

公寓里有烘干机吗?

'No'

这份购买和销售协议有哪些附录?

'22A (Financing)', '2AA (Appraisal)', '22FSBO (Owner Sale)'

卖方的传真号码是多少?

表格上有买家的签名吗?

'No'

MLS 号码是多少?

'59844680'

这处房产的地址在哪里?

'604 Bishop Crossing Land, Fort Lauderdale, Broward County, FL, 33338'

表提取:最佳实践

本部分提供了在 AI_EXTRACT 中进行表格提取时的最佳实践。

为特定类型的文档使用一个架构

每个提取工作负载必须包含相同类型的文档,并且大多数表格中要提取的数据应具有相似性。如果源文档中的列数因文档而异,但所有文档都包含要提取的定义子集列,且这些公共列的名称和位置相同或相似,则可以提取这些公共列。

例如,发票可能包含不同数量的列和各种数据,但如果所有表格的前三列相同(Item DescriptionQuantityPrice)则这些数据可以被提取。

使用自然语言定义列名

您可以从文档中复制列名,以确保它们完全一致。例如,不要将列命名为 product_codeREPORT_DATE;应将它们命名为 Product CodeReport Date

跳过空行

创建微调数据集时,跳过没有答案的行(其中返回的答案将是 None)。

按照文档中出现的顺序定义列

为提高准确性,请按照文档中列的出现顺序定义列,通常是从左到右,或者对于 转置表格,则从上到下。如果您选择以不同的方式定义顺序,则可能需要训练。

但是,对于有多行的值相同的列,例如 Invoice NumberInvoice Date,应将这些列放在开头。例如:

  • Invoice Number

  • Invoice Date

  • Item Code

  • Item Name

  • Quantity

使用文档中的大小写定义数值

在可能的情况下,请使用文档中的大小写(大写和小写)来定义数值。如果文档中的大小写不一致,请使用首字母大写。

使用描述字段

AI_EXTRACT 响应格式中的 description 字段是可选的;在大多数情况下不必填写。但是,如果文档中有多个相似的表格,则模型的回答可能不准确。如果答案来自与预期不同的源表格,或是模型找不到表,请尝试使用 description 字段。添加有助于模型识别正确表格的信息,例如表格标题或数字。

添加章节列来描述表格的布局

如果表分为多个命名部分,请添加一个分区列。这有助于模型更好地理解布局,从而提高准确性。例如,您可以将列命名为 SectionItem sectionItem category。如果章节中有第二层嵌套,则可以添加两列:SectionSubsection

要对值进行分组,请另外创建一列

您可以向现有表添加一列,以对值进行分组。通过这种方式,您可以将整个文档集的结果联接到一个表中。例如:

发票编号

物品详情

物品价格

数量

A

物品 A1

10.00

1

A

物品 A2

20.00

1

A

物品 A3

30.00

1

B

物品 B1

15.00

1

B

物品 B2

25.00

1

B

物品 B3

35.00

1

请注意,第一列的值会在对应的物品中重复出现。

使各文档之间的列名可区分

尝试从语义上区分一列。不要使用诸如 col1val1item1 之类的名称。

在某些情况下,转置可能效果更好,尤其是当行名在各文档之间相同或仅略有差异且属于有限的取值范围时。

请注意,对指定列集进行训练可能会提高结果的准确性。

在处理层级标头时,将父级名称用作前缀

要从具有层级标头的表格中提取信息,请将标头路径连接起来,每个父级名称作为前缀。例如,对于下表,将列定义为:

  • Category A Type X Column 1

  • Category A Type Y Column 2

  • Category A Type Y Column 3

  • Category B Column 4

  • Category B Column 5

一个表格,其标头命名为 Category A 和 Category B,其中 Category A 包含子标头:类型 X 和类型 Y。

如有需要,对表格进行转置

您可以通过使用文档中表格第一列的值作为输出表格的列名,从转置表格中提取信息。

例如,对于下列表格,将列命名为:

  • Type A: Item 1

  • Type A: Item 2

  • Type B: Item 3

  • Type B: Item 4

可以转置的表的示例。

请注意,此示例包含 分层标头

对于大型表格,拆分文档

表格提取模型返回的答案最长可达 4096 个词元。这意味着模型在达到该限制时会停止提取。您可以通过以下方式来实现:

  • 如果表格跨越多页,请将文档拆分为多个单页文档,并在后处理阶段合并结果。

  • 如果表格过于密集,以至于即使在单页上也无法提取数据,请按列拆分表格。

    例如,如果表格包含 10 列,可以尝试定义两个独立的值:一个取表格左半部分的 5 列,另一个取右半部分的 5 列。您可能需要对列的选择进行试验,以获得最佳效果。

为文档中没有名称的列创建列名

如果文档中的第一列没有名称,则在定义该值时必须自行创建列名。您可以通过以下方式处理:

  • 使用表格标题或标题中的重要部分。

  • 创建一个能代表列中数据的名称,例如 descriptiontype of assetyearcategory

比较两个不同时期的数据

如果您想比较两个不同时期的数据,例如在年度报告等财务文档中比较 2023 年和 2024 年的数据,可以在列名前添加“current”和“previous”前缀。请注意,可能需要进行训练以提高结果的准确性。

示例:从购买和销售协议中提取信息

以下示例从共管购买和销售协议中提取信息,您可以在 提取信息的问题优化 部分中查看这些内容。

提取实体

提取卖家名称和优惠到期日期:

SELECT AI_EXTRACT(
  file => TO_FILE('@db.schema.stage','document.pdf'),
  responseFormat => [['seller_name', 'What is the seller name?'], ['address', 'What is the offer expiration date?']]
);

结果:

{
    "error": null,
    "response": {
        "address": "12/12/2023",
        "seller_name": "Paul Doyle"
    }
}

提取复选框信息

根据文档中标记的复选框,提取有关未包含项的信息:

SELECT AI_EXTRACT(
  file => TO_FILE('@db.schema.stage','document.pdf'),
  responseFormat => [['flat_items', 'What items are not included with the flat?'], ['default', 'What Default is selected?']]
);

结果:

{
    "error": null,
    "response": {
        "default": "Forfeiture of Earnest Money",
        "flat_items": "dryer, security system, satellite dish, wood stove, fireplace insert, hot tub, attached speaker(s), generator, other"
    }
}

提取签名状态

提取有关协议是否已签署的信息:

SELECT AI_EXTRACT(
    file => TO_FILE('@db.schema.stage','document.pdf'),
    responseFormat => [['signature', 'Is this document signed?']]
);

结果:

{
  "error": null,
    "response": {
        "signature": "no"
    }
}

提取实体列表

提取买家姓名列表:

SELECT AI_EXTRACT(
    file => TO_FILE('@db.schema.files', 'report.pdf'),
    responseFormat => {
        'schema': {
        'type': 'object',
        'properties': {
            'buyer_list': {
            'description': 'What are the buyer names?',
            'type': 'array'
            }
        }
        }
    }
);

结果:

{
    "error": null,
    "response": {
        "buyer_list": [
        "John Davis",
        "Jane Davis"
        ]
    }
}

示例:从表中提取信息

此示例从以下文件中提取信息:

表:Granger Causality Tests - P-values
SELECT AI_EXTRACT(
    file => TO_FILE('@db.schema.files', 'report.pdf'),
    responseFormat => {
        'schema': {
            'type': 'object',
            'properties': {
                'income_table': {
                'description': 'Table 2: Granger Causality Tests - P-values',
                'type': 'object',
                'column_ordering': ['description', 'countries','lags','z','z_approx'],
                'properties': {
                    'description': {
                        'description': 'Description',
                        'type': 'array'
                        },
                    'countries': {
                        'description': 'Countries',
                        'type': 'array'
                        },
                    'lags': {
                        'description': 'Lags',
                        'type': 'array'
                        },
                    'z': {
                        'description': 'Z',
                        'type': 'array'
                    },
                    'z_approx': {
                        'description': 'Z approx.',
                        'type': 'array'
                    }
                }
            }
        }
    }
);

结果:

{
    "error": null,
    "response": {
        "income_table": {
            "countries": [
                "33","80","29","84","34"
            ],
            "description": [
                "Commodity exporters",
                "Non-commodity exporters",
                "AE",
                "EMDE",
                "Large or market-dominant countries"
            ],
            "lags": [
                "2","1","1","1","1"
            ],
            "z": [
                "0.11","0.08","0.89","0.12","0.07"
            ],
            "z_approx": [
                "0.25","0.19","0.95","0.25","0.14"
            ]
        }
    }
}