Cortex AI 函数:使用 AI_PARSE_DOCUMENT 进行图像提取

AI_PARSE_DOCUMENT 是一项 Cortex AI 函数,可从 PDFs、Word 文档和图像中提取文本、数据、布局元素及图像。利用这种高保真图像提取能力,可以为高级多模态文档处理工作流提供支持,例如:

  • 丰富数据:从文档中提取图像以增加视觉上下文,从而获得更深入的见解。

  • 多模态 RAG:将图像与文本结合进行检索增强生成 (RAG),以改进模型响应。

  • 图像分类:将提取的图像与 AI_EXTRACT 或 AI_COMPLETE 结合使用,进行自动标记和分析。

  • 知识库:通过包含文本和图像来构建更丰富的知识库,实现更好的搜索和推理。

  • 合规性:提取并分析图像(例如图表、签名)以用于监管和审计工作流。

有关 AI_PARSE_DOCUMENT 的简介,请参阅 Parsing documents with AI_PARSE_DOCUMENT

使用 AI_PARSE_DOCUMENT 提取图像

要使用 AI_PARSE_DOCUMENT 从文档中提取图像,请执行以下步骤:

  • 'mode' 选项设置为 'LAYOUT'。图像提取需要使用 LAYOUT 模式。

  • 'extract_images' 选项设置为 TRUE。

AI_PARSE_DOCUMENT 图像提取会在 JSON 输出中返回一个名为 images 的数组。images 的每个元素都包含一个 image_base64 字段,其中包含以 base64 字符串编码的提取图像数据。图像的 OBJECT_CONSTRUCT 还包含唯一 ID 和图像边界框字段。

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

您可以使用 BASE64_DECODE_BINARY 对图像进行解码,然后将其直接传递给 AI_EXTRACT 以处理或描述图像内容。或者,您可以将其存储在暂存区中,以便使用多模态 AI_COMPLETE 进行处理。(AI_COMPLETE 目前不支持直接输入图像。)

示例

提取和描述图像

提取图像数据后,您可以使用 AI_EXTRACT 处理或描述图像内容。以下示例在将首个提取出的图像从 base64 转换为二进制格式后,为其生成描述。(AI_EXTRACT 需要二进制输入。)该查询使用正则表达式从 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

将提取的图像存储在暂存区中

您可以将从文档中提取的图像存储在 Snowflake 暂存区中,以便重复使用、审计或利用其他 Cortex AI 函数进行额外处理。本示例创建并使用了一个 Python 存储过程,用于对来自 AI_PARSE_DOCUMENT 的 base64 图像数据进行解码,并将生成的图像文件上传到指定的暂存区。

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

在创建 SAVE_EXTRACTED_IMAGES 储过程之后,您可以调用它从文档中提取图像并将其存储在暂存区中,如下方代码片段所示:

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

此查询的输出是存储在指定暂存区中的镜像的文件路径列表,例如:

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

现在,您可以使用其他 Cortex AI 函数处理存储的图像,例如使用 AI_COMPLETE 进行多模态分析或生成。

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

响应:

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

成本注意事项

AI_PARSE_DOCUMENT 按处理的文档页数计费。在计费时,单个图像文件被视为一页。提取图像不会产生额外费用。

当前限制

  • 单份文档中提取的图像不得超过 50 张。超出部分的图像将被忽略。

  • 不会提取小于 4x4 像素的图像。

  • 如果响应大小超过账户参数 EXTERNAL_FUNCTION_MAx_RESPONSE_SIZE,函数将返回错误。如有必要,请增加该参数的值。

语言: 中文