Cortex AI 함수: AI_PARSE_DOCUMENT를 사용하여 이미지 추출

AI_PARSE_DOCUMENT는 PDFs, Word 문서, 이미지에서 텍스트, 데이터, 레이아웃 요소, 이미지를 추출하는 Cortex AI 함수입니다. 이 고화질 이미지 추출 기능을 사용하여 다음과 같은 고급 멀티모달 문서 처리 워크플로를 지원합니다.

  • 데이터 보강: 문서에서 이미지를 추출하여 보다 심층적인 인사이트를 위한 시각적 컨텍스트를 추가합니다.

  • 멀티모달 RAG: 검색 증강 생성(RAG)을 위해 이미지와 텍스트를 결합하여 모델 응답을 개선합니다.

  • 이미지 분류: 자동 태그 지정 및 분석을 위해 AI_EXTRACT 또는 AI_COMPLETE로 추출된 이미지를 사용합니다.

  • 지식 기반: 더 나은 검색과 추론을 위해 텍스트와 이미지를 모두 포함하여 더 풍부한 리포지토리를 구축합니다.

  • 규정 준수: 규제 및 감사 워크플로를 위한 이미지(예: 차트, 서명)를 추출하고 분석합니다.

AI_PARSE_DOCUMENT에 대한 소개는 :doc:`/user-guide/snowflake-cortex/parse-document`를 참조하세요.

AI_PARSE_DOCUMENT를 사용하여 이미지 추출

AI_PARSE_DOCUMENT를 사용하여 문서에서 이미지를 추출하려면 다음을 수행합니다.

  • 'mode' 옵션을 'LAYOUT' 로 설정합니다. 이미지 추출에는 LAYOUT 모드가 필요합니다.

  • 'extract_images' 옵션을 TRUE 로 설정합니다.

AI_PARSE_DOCUMENT 이미지 추출은 JSON 출력에서 배열 images``를 반환합니다. ``images``의 요소는 추출된 이미지 데이터가 base64 문자열로 인코딩된 ``image_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를 초과하는 경우 이 함수는 오류를 반환합니다. 필요한 경우 이 매개 변수의 값을 늘리세요.