Extraindo informações de documentos com AI_EXTRACT

AI_EXTRACT é uma função de AI do Cortex que permite extrair informações estruturadas, como entidades, listas e tabelas, de arquivos de texto ou de documento, fazendo perguntas em linguagem natural ou descrevendo as informações a serem extraídas. Ela pode ser usada com outras funções para criar pipelines de processamento de documentos personalizados para uma variedade de casos de uso (consulte Cortex AI Functions: documentos).

A AI_EXTRACT pode processar documentos de vários formatos em muitos idiomas e extrair informações tanto de parágrafos com muito texto quanto de conteúdo em formato gráfico, como logotipos, texto manuscrito (por exemplo, assinaturas), tabelas ou marcas de seleção. A AI_EXTRACT pode extrair informações nos seguintes formatos estruturados:

  • Entidade: faça perguntas em linguagem natural ou descreva as informações a serem extraídas (como cidade, rua ou código ZIP).

  • Lista (ou matriz): você pode fornecer um esquema JSON para extrair uma matriz ou lista de informações presentes no documento, como o nome de todos os titulares de contas em um extrato bancário ou uma lista de todos os endereços em um de documento.

  • Tabela: forneça um esquema JSON para extrair dados tabulares presentes no documento especificando o título da tabela e uma lista de colunas que devem ser extraídas.

A AI_EXTRACT é dimensionada automaticamente conforme sua carga de trabalho, processando vários documentos ao mesmo tempo. Os documentos podem ser processados diretamente do armazenamento de objetos para evitar movimentação desnecessária de dados.

Nota

AI_EXTRACT é atualmente incompatível com políticas de rede personalizadas.

Dica

Para obter mais informações sobre AI_EXTRACT, incluindo idiomas compatíveis, disponibilidade regional e custo, consulte AI_EXTRACT.

Qualidade da extração

A AI_EXTRACT usa arctic-extract, um modelo de linguagem grande (Large Language Model, LLM) baseado em visão proprietária que entrega extração de alta precisão. A tabela a seguir apresenta as pontuações do modelo com base em vários parâmetros de comparação padrão, com as pontuações de outros modelos populares para comparação:

Resposta visual a perguntas (VQA)

Oferta

Pontuação DocVQA

Avaliação humana

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

Resposta somente texto a perguntas (SQuAD v2)

Oferta

ANLS

Correspondência exata

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

Otimização de perguntas para extração de informações

Ao trabalhar com AI_EXTRACT, use linguagem natural para fazer perguntas sobre seus documentos. Para fazer uma pergunta que retorne uma resposta precisa, siga estas diretrizes:

  • Use uma linguagem simples.

  • Para cada pergunta, saiba quais respostas esperar.

  • Seja específico; por exemplo, se o documento incluir várias datas (como data de emissão e data de assinatura), não pergunte “Qual é a data?” sem incluir mais detalhes.

  • Peça um único valor por pergunta.

  • Não espere que a AI_EXTRACT adivinhe suas intenções ou tenha amplo conhecimento em um domínio específico.

Considere o seguinte documento como exemplo. Este contrato de compra e venda inclui informações como a data de expiração da oferta, os nomes dos compradores e do vendedor e os itens inclusos.

Exemplo de documento (contrato de compra e venda de condomínio).

A tabela a seguir fornece exemplos de perguntas que você pode fazer para AI_EXTRACT e as respostas esperadas.

Exemplo de pergunta

Resposta

Qual é a data deste contrato?

'October 6, 2023'

Quem é o comprador do condomínio?

'John Davis', 'Jane Davis'

Quais eletrodomésticos estão incluídos na unidade?

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

Quais itens não estão inclusos no apartamento?

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

Há uma secadora no apartamento?

'No'

Quais adendos foram anexados a este contrato de compra e venda?

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

Qual é o número de fax do vendedor?

Nenhum

A assinatura do comprador está presente no formulário?

'No'

Qual é o número MLS?

'59844680'

Qual é o endereço do imóvel?

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

Práticas recomendadas para extração de tabelas

Esta seção fornece as práticas recomendadas para trabalhar com extração de tabelas em AI_EXTRACT.

Usar um esquema para um tipo específico de documento

Cada carga de trabalho de extração deve conter documentos do mesmo tipo, e os dados que você deseja extrair devem ser semelhantes para a maioria das tabelas. Se o número de colunas no documento de origem for diferente entre um documento e outro, mas todos os documentos incluírem um subconjunto definido de colunas a serem extraídas e as colunas comuns tiverem nome e localização iguais ou semelhantes, essas colunas comuns poderão ser extraídas.

Por exemplo, as faturas podem ter números diferentes de colunas com vários dados, mas se todas as tabelas tiverem as mesmas três primeiras colunas, Item Description, Quantity e Price, os dados poderão ser extraídos.

Uso de linguagem natural para definir nomes de colunas

Você pode copiar os nomes das colunas do documento para que sejam exatamente iguais. Por exemplo, não insira nomes de colunas como product_code ou REPORT_DATE; em vez disso, insira Product Code ou Report Date.

Ignorar as linhas vazias

Ao criar um conjunto de dados de ajuste fino, ignore as linhas sem resposta (em que a resposta retornada seria None).

Definição de colunas na mesma ordem em que aparecem no documento

Para melhorar a precisão, defina as colunas na mesma ordem em que aparecem no documento, que geralmente é da esquerda para a direita ou de cima para baixo para tabelas transpostas. Se você definir a ordem de forma diferente, poderá ser necessário treinamento.

No entanto, para colunas em que os valores são os mesmos para várias linhas, como Invoice Number e Invoice Date, adicione essas colunas no início. Por exemplo:

  • Invoice Number

  • Invoice Date

  • Item Code

  • Item Name

  • Quantity

Definição de valores usando as letras maiúsculas e minúsculas do documento

Quando possível, defina valores usando as letras maiúsculas e minúsculas do documento. Se o uso de letras maiúsculas e minúsculas no documento for variado, use maiúsculas.

Usar o campo de descrição

O campo description no formato de resposta AI_EXTRACT é opcional; na maioria dos casos, não é necessário preenchê-lo. No entanto, se houver várias tabelas semelhantes em um documento, o modelo poderá responder de forma imprecisa. Se as respostas vierem de uma tabela de origem diferente da esperada ou se o modelo não conseguir encontrar a tabela, tente usar o campo description. Adicione informações que ajudem o modelo a identificar a tabela correta, como título ou número da tabela.

Adição da coluna de seção para descrever o layout da tabela

Se a tabela for dividida em várias seções nomeadas, adicione uma coluna de seção. Isso ajuda o modelo a entender melhor o layout e melhorar a precisão. Por exemplo, você pode inserir um nome de coluna Section, Item section``ou ``Item category. Se houver um segundo nível de aninhamento nas seções, você poderá adicionar duas colunas: Section e Subsection.

Criação de uma coluna adicional para agrupar valores

Você pode adicionar uma coluna à tabela existente para agrupar valores. Dessa forma, você pode unir os resultados de todo o conjunto de documentos em uma única tabela. Por exemplo:

Número da fatura

Detalhes do item

Preço do item

Quantidade

A

Item A1

10,00

1

A

Item A2

20,00

1

A

Item A3

30,00

1

B

Item B1

15,00

1

B

Item B2

25,00

1

B

Item B3

35,00

1

Observe que o valor na primeira coluna é repetido para os itens correspondentes.

Distinção dos nomes das colunas entre documentos

Tente distinguir semanticamente uma coluna. Não use nomes como col1, val1 ou item1.

Em alguns casos, a transposição pode funcionar melhor, especialmente quando os nomes das linhas são iguais entre os documentos ou são ligeiramente diferentes e estão dentro de um conjunto fechado de valores.

Observe que o treinamento no conjunto de colunas especificado pode melhorar os resultados.

Uso do nome pai como prefixo ao trabalhar com cabeçalhos hierárquicos

Para extrair informações de tabelas com cabeçalhos hierárquicos, una o caminho do cabeçalho usando cada nome pai como prefixo. Por exemplo, para a tabela a seguir, defina as colunas como:

  • 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

Uma tabela com cabeçalhos chamados Categoria A e Categoria B, em que a Categoria A inclui subcabeçalhos: Tipo X e Tipo Y.

Transposição das tabelas, se necessário

Você pode extrair informações de tabelas transpostas usando os valores da primeira coluna da tabela no documento como nomes de colunas na tabela de saída.

Por exemplo, para a tabela a seguir, insira estes nomes de colunas:

  • Type A: Item 1

  • Type A: Item 2

  • Type B: Item 3

  • Type B: Item 4

Um exemplo de tabela que pode ser transposta.

Observe que este exemplo inclui cabeçalhos hierárquicos.

Divisão do documento para tabelas grandes

O modelo para extração de tabela retorna respostas com até 4096 tokens. Isso significa que o modelo para de extrair quando atinge esse limite. Você pode trabalhar com isso das seguintes maneiras:

  • Se a tabela ocupar várias páginas, divida o documento em vários documentos de uma página e una os resultados no pós-processamento.

  • Se a tabela for muito densa a ponto de inviabilizar a extração dos dados até mesmo de uma única página, divida a tabela por colunas.

    Por exemplo, se a tabela tiver 10 colunas, tente definir dois valores separados: um com 5 colunas da metade esquerda da tabela e outro com 5 colunas da metade direita da tabela. Talvez você tenha que testar a opção da coluna para obter melhores resultados.

Criação de nomes para colunas sem nome no documento

Se a primeira coluna no documento não tiver um nome, você mesmo deverá criar esse nome ao definir o valor. Você pode trabalhar com isso das seguintes maneiras:

  • Use o título ou uma parte significativa do título da tabela.

  • Crie um nome descritivo que represente os dados na coluna; por exemplo, description, type of asset, year, category.

Comparação de dados de dois períodos de tempo diferentes

Se quiser comparar os dados de dois períodos de tempo diferentes, por exemplo, dos anos 2023 e 2024 em documentos financeiros, como relatórios anuais, você poderá inserir os prefixos «atual» e «anterior» nas colunas. Observe que pode ser necessário treinamento para melhorar os resultados.

Exemplos: extração de informações de um contrato de compra e venda

Os exemplos a seguir extraem informações do contrato de compra e venda de um imóvel, que você pode visualizar na seção Otimização de perguntas para extração de informações.

Extrair uma entidade

Extraia o nome do vendedor e a data de vencimento da oferta:

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?']]
);
Copy

Resultado:

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

Extrair informações de caixas de seleção

Extraia informações sobre itens que não estão incluídos, com base nas caixas de seleção marcadas no documento:

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?']]
);
Copy

Resultado:

{
    "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"
    }
}
Copy

Extrair o status da assinatura

Extraia informações sobre se o contrato foi assinado:

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

Resultado:

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

Extrair uma lista de entidades

Extraia uma lista de nomes de compradores:

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'
            }
        }
        }
    }
);
Copy

Resultado:

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

Exemplo: Extrair informações de uma tabela

Este exemplo extrai informações do seguinte documento:

Tabela: Testes de causalidade de Granger – Valores p
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'
                    }
                }
            }
        }
    }
);
Copy

Resultado:

{
    "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"
            ]
        }
    }
}
Copy