Cortex AI関数:AI_PARSE_DOCUMENTによるイメージ抽出

AI_PARSE_DOCUMENTは、PDFs、Wordドキュメント、画像からテキスト、データ、レイアウト要素、画像を抽出するCortex AI関数です。この高忠実度の画像抽出機能を使用して、次のような高度なマルチモーダルドキュメント処理ワークフローを強化します。

  • データを強化:ドキュメントから画像を抽出し、より詳細なインサイトのために視覚的なコンテキストを追加します。

  • マルチモーダルRAG:検索拡張生成(RAG)のために画像とテキストを組み合わせ、モデルの応答を改善します。

  • 画像分類:自動タグ付けと分析のためにAI_EXTRACTまたはAI_COMPLETEで抽出された画像を使用します。

  • ナレッジベース:より良い検索と推論のために、テキストと画像の両方を含めることで豊富なリポジトリを構築します。

  • コンプライアンス:規制および監査のワークフローのために、イメージ(例: チャート、署名)を抽出および分析します。

AI_PARSE_DOCUMENTの概要については、 AI_PARSE_DOCUMENT を使用したドキュメントの解析 をご参照ください。

AI_PARSE_DOCUMENTを使用した画像の抽出

AI_PARSE_DOCUMENTを使用してドキュメントから画像を抽出するには:

  • 'mode' オプションを 'LAYOUT' に設定します。イメージ抽出では、LAYOUTモードが必要です。

  • 'extract_images' オプションを TRUE に設定します。

AI_PARSE_DOCUMENT画像抽出は、配列 images をJSON出力で返します。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は処理されたページ数に基づく課金を使用します。単一の画像ファイルは、請求目的のためのページと見なされます。画像を抽出しても、追加コストは発生しません。

現在の制限

  • 1つのドキュメントから50個以上の画像を抽出することはできません。追加の画像は無視されます。

  • 4x4ピクセルより小さい画像は抽出されません。

  • 応答のサイズがアカウントパラメーターEXTERNAL_FUNCTION_MAx_RESPONSE_SIZEを超える場合、関数はエラーを返します。必要に応じて、このパラメーターの値を増やします。