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;
您可以使用 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'}
);
将提取的图像存储在暂存区中¶
您可以将从文档中提取的图像存储在 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
$$;
在创建 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
));
此查询的输出是存储在指定暂存区中的镜像的文件路径列表,例如:
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')
);
响应:
The image shows central bank policy rates for various countries from 2000 to 2025.
成本注意事项¶
AI_PARSE_DOCUMENT 按处理的文档页数计费。在计费时,单个图像文件被视为一页。提取图像不会产生额外费用。
当前限制¶
单份文档中提取的图像不得超过 50 张。超出部分的图像将被忽略。
不会提取小于 4x4 像素的图像。
如果响应大小超过账户参数 EXTERNAL_FUNCTION_MAx_RESPONSE_SIZE,函数将返回错误。如有必要,请增加该参数的值。