Cortex AI Functions: extração de imagens com AI_PARSE_DOCUMENT

AI_PARSE_DOCUMENT é uma função do Cortex AI que extrai texto, dados, elementos de layout e imagens de PDFs, documentos do Word e imagens. Use esse recurso de extração de imagens de alta fidelidade para operar fluxos de trabalho de processamento de documentos avançados e multimodais, como:

  • Enriquecer dados: extrair imagens de documentos para adicionar contexto visual e obter insights mais detalhados.

  • RAG multimodal: combinar imagens e texto para geração aumentada de recuperação (Retrieval-Augmented Generation, RAG) para melhorar as respostas do modelo.

  • Classificação de imagens: usar as imagens extraídas com AI_EXTRACT ou AI_COMPLETE para marcação e análise automáticas.

  • Bases de conhecimento: criar repositórios mais enriquecidos incluindo texto e imagens para pesquisa e raciocínio melhores.

  • Conformidade: extrair e analisar imagens (por exemplo, gráficos e assinaturas) para fluxos de trabalho regulatórios e de auditoria.

Para conferir uma apresentação do AI_PARSE_DOCUMENT, consulte Parsing documents with AI_PARSE_DOCUMENT.

Usando o AI_PARSE_DOCUMENT para extrair imagens

Para extrair imagens de um documento usando AI_PARSE_DOCUMENT:

  • Defina a opção 'mode' como 'LAYOUT'. A extração de imagens requer o modo LAYOUT.

  • Defina a opção 'extract_images' como TRUE.

A extração de imagens com AI_PARSE_DOCUMENT retorna uma matriz, images, na saída JSON. Cada elemento de images contém um campo, image_base64, com os dados da imagem extraída codificados como uma cadeia de caracteres base64. O OBJECT_CONSTRUCT da imagem também contém campos para ID exclusivo e caixas delimitadoras da imagem.

SELECT AI_PARSE_DOCUMENT(
    TO_FILE('@my_stage', 'my_document.pdf'),
    {'mode': 'LAYOUT', 'extract_images': true})
AS layout_wƒith_images;
Copy

Você pode decodificar as imagens usando BASE64_DECODE_BINARY, depois passá-las diretamente para AI_EXTRACT para processar ou descrever o conteúdo das imagens. Se preferir, armazene-as em uma área de preparação para processamento usando o AI_COMPLETE multimodal. Atualmente, o AI_COMPLETE não oferece suporte à entrada direta de imagens.

Exemplos

Extrair e descrever imagens

Depois de extrair os dados da imagem, você poderá usar o AI_EXTRACT para processar ou descrever o conteúdo da imagem. O exemplo a seguir gera uma descrição para a primeira imagem extraída depois de convertê-la de base64 em binária. O AI_EXTRACT requer uma entrada binária. A consulta usa uma expressão regular para remover os metadados (esquema e formato) da cadeia de caracteres base64.

SELECT AI_EXTRACT(
file_data => BASE64_DECODE_BINARY(
    REGEXP_REPLACE(
    (
        SELECT (
            AI_PARSE_DOCUMENT(
                TO_FILE('@image_docs', 'my_document.pdf'),
                {'mode': 'LAYOUT', 'extract_images': true}
            ):images[0]['image_base64']
            )::STRING
        ),
    '^data:image/[^;]+;base64,', '')
    ),
responseFormat => {'Image Name': 'Describe the image'}
);
Copy

Armazenar as imagens extraídas em uma área de preparação

É possível armazenar as imagens extraídas de documentos em uma área de preparação do Snowflake para reutilização, auditoria ou processamento adicional com outras funções do Cortex AI. Este exemplo cria e usa um procedimento armazenado em Python para decodificar dados de imagem base64 de AI_PARSE_DOCUMENT e carregar os arquivos de imagem resultantes em uma área de preparação especificada.

CREATE OR REPLACE PROCEDURE SAVE_EXTRACTED_IMAGES(r VARIANT)
RETURNS ARRAY
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('pillow', 'snowflake-snowpark-python')
HANDLER = 'run'
AS
$$
import base64
import io
import os
import tempfile
from PIL import Image

def process_parse_document_result(data: dict) -> tuple[str, str, str]:
    images = data["images"]
    for image in images:
        id = image["id"]
        data, image_base64 = image["image_base64"].split(";", 1)
        extension = data.split("/")[1]
        base64 = image_base64.split(",")[1]
        yield id, extension, base64

def decode_base64(encoded_image: str) -> bytes:
    return base64.b64decode(encoded_image)

def run(session, r):
    destination_path = r["DESTINATION_PATH"]
    parse_document_result = r["PARSE_DOCUMENT_RESULT"]

    if not destination_path:
        return ["Error: destination_path parameter is required"]
    if not destination_path.startswith("@"):
        return ["Error: destination_path must start with @ (e.g. @output_stage/path"]
    if destination_path == "@":
        return ["Error: destination_path must include a stage name after @"]

    # Clean the result directory
    session.sql(f"RM destination_path")

    uploaded_files = []
    with tempfile.TemporaryDirectory() as temp_dir:
        for image_id, extension, encoded_image in process_parse_document_result(parse_document_result):
            image_bytes = decode_base64(encoded_image)
            image: Image = Image.open(io.BytesIO(image_bytes))

            image_path = os.path.join(temp_dir, image_id)
            image.save(image_path)

            # Use session.file.put with source file path and auto_compress=False
            session.file.put(
                image_path, destination_path, auto_compress=False, overwrite=True
            )
            uploaded_files.append(f"{destination_path}/{image_id}")

            # Cleanup
            os.remove(image_path)
    return uploaded_files
$$;
Copy

Depois de criar o procedimento SAVE_EXTRACTED_IMAGES, você poderá chamá-lo para extrair imagens de um documento e armazená-las em uma área de preparação, conforme mostrado no trecho de código a seguir:

CALL SAVE_EXTRACTED_IMAGES(
(
SELECT OBJECT_CONSTRUCT(*)
FROM ( SELECT
    '@image_docs/output' as destination_path,
    AI_PARSE_DOCUMENT(
    TO_FILE('@image_docs/my_document.pdf'),
    {'mode': 'LAYOUT', 'extract_images': true}
    ) as parse_document_result
) LIMIT 1
));
Copy

A saída dessa consulta é uma lista de caminhos de arquivos para as imagens armazenadas na área de preparação especificada, como:

image_docs/output/img-0.jpeg
image_docs/output/img-1.jpeg
image_docs/output/img-10.jpeg
image_docs/output/img-11.jpeg
image_docs/output/img-12.jpeg
image_docs/output/img-13.jpeg

Agora você pode processar as imagens armazenadas usando outras funções do Cortex AI, como AI_COMPLETE, para análise ou geração multimodal.

SELECT AI_COMPLETE(
    'pixtral-large',
    'Describe the image in 10 words.',
    TO_FILE('@image_docs/output/img-0.jpeg')
);
Copy

Resposta:

The image shows central bank policy rates for various countries from 2000 to 2025.

Considerações sobre custo

O AI_PARSE_DOCUMENT aplica um faturamento com base no número de páginas processadas. Um único arquivo de imagem é considerado uma página para fins de faturamento. A extração de imagens não gera custos adicionais.

Limitações atuais

  • Não é possível extrair mais de cinquenta imagens de um único documento. Imagens adicionais são ignoradas.

  • Imagens menores que 4x4 pixels não são extraídas.

  • Se o tamanho de uma resposta exceder o parâmetro de conta EXTERNAL_FUNCTION_MAx_RESPONSE_SIZE, a função retornará um erro. Aumente o valor desse parâmetro se necessário.