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