使用AI Function和Blob处理非结构化数据

更新时间:
复制 MD 格式

本文最佳实践演示如何使用 MaxCompute 的 AI_GENERATE 函数,通过 SQL AI Function直接调用部署在 PAI EAS 上的多模态模型,读取 MaxCompute BLOB 列中的非结构化数据,进行图片数据处理,从而实现SQL处理非结构化数据。基本流程是SQL引擎基于Object Table,读取OSS上图片数据,写入MaxCompute表 BLOB 列,以便重复计算时获得更大的数据读写带宽,然后继续使用SQL引擎和 AI Function调用多模态模型进行非结构化数据处理。

前提条件

  1. 开通MaxCompute创建MaxCompute项目。如已完成可忽略。

  2. 已开通人工智能平台PAI模型在线服务(EAS)。如已完成可忽略。

  3. 已开通OSS服务。如已完成可忽略。

步骤一:创建OSS Bucket并上传数据

  1. 登录对象存储OSS控制台

    在 OSS 上创建名称为ot-demoBucket,操作详情可参考OSS控制台快速入门

  2. 在新建的Bucket下新建目录/object_table/image_demo/并上传图片数据image_demo.zip

步骤二:创建并部署PAI EAS模型服务

  1. 登录PAI 控制台,左上角选择地域,创建工作空间。

  2. 进入工作空间详情页,点击左侧Model Gallery,选择Qwen2.5-Omni-3B,点击部署。

  3. 选择机型,选择一台L20 48G显存的机器,点击部署。可在任务管理中查看部署状态,部署完成后会显示运行中

  4. 在左侧导航栏,单击模型部署模块,进入EAS查看已经部署的服务,点击查看调用信息,获取endpointtoken信息。

    -- 后续步骤三创建远程模型时会用到如下信息。
    模型名称(以实际EAS服务显示为主):quickstart_deploy_*****_apdf
    endpoint(VPC调用地址):http://*****.cn-beijing.pai-eas.aliyuncs.com(只取aliyuncs.com之前地址即可)
    apikey(Token):****************************************==

步骤三:创建Object Table

创建Object Table并查看元数据。

SET odps.namespace.schema=true; -- 开启租户级Schema语法开关

CREATE OBJECT TABLE IF NOT EXISTS image_demo
WITH SERDEPROPERTIES ('odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole')
LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/object_table/image_demo/';

-- 刷新元数据
ALTER TABLE image_demo REFRESH METADATA;

-- 读取图片数
SET odps.namespace.schema=true;
SELECT COUNT(*) AS ROW_COUNT FROM image_demo; 

-- 返回结果如下:
+------------+
| row_count  |
+------------+
| 10         |
+------------+

步骤四:创建包含Blob列的表并写入数据

-- 创建包含Blob列的表
CREATE TABLE IF NOT EXISTS speech_segments_table (
    image_name STRING COMMENT '图片唯一标识',
    image_desc blob COMMENT '图片信息'
)
COMMENT ' SQL图片信息表'
TBLPROPERTIES (
  "table.format.version"="2" 
);

-- 写入数据
SET odps.namespace.schema=true;  
INSERT INTO speech_segments_table
SELECT 
    t.key AS image_name,
    to_blob(image_binary) AS image_desc
FROM (
    SELECT key, GET_DATA_FROM_OSS('<project_name>.<schema>.image_demo', key) AS image_binary
    FROM <project_name>.<schema>.image_demo
) t;

SELECT * FROM speech_segments_table;
-- 返回结果如下(示例):
+------------+------------+
| image_name | image_desc |
+------------+------------+
| test01.png | CAEQ**Mg== |
| test02.png | CAEQ**Mg== |
| test03.png | CAEQ**Mg== |
| test04.png | CAEQ**Mg== |
| test05.png | CAEQ**Mg== |
| test06.png | CAEQ**Mg== |
| test07.png | CAEQ**Mg== |
| test08.png | CAEQ**Mg== |
| test09.png | CAEQ**Mg== |
| test10.png | CAEQ**Mg== |
+------------+------------+

步骤五:创建VPC网络连接

  1. 登录MaxCompute控制台,在左上角选择地域。

  2. 在左侧导航栏,选择管理配置 > 网络连接 。

  3. 创建MaxCompute与目标VPC网络间的网络连接。VPC ID可以是任意VPC,交换机可以是任意可用区。

步骤六:注册Omni多模态远程模型

SET odps.namespace.schema=true;
SET odps.session.networklink=<your vpc name>;

CREATE MODEL PAI_EAS_Qwen25_Omni_3B_blob_image WITH VERSION v1 
INPUT(data BINARY, promt STRING) 
OPTIONS(
    MODEL_SOURCE_TYPE = 'REMOTE',
    MODEL_TYPE = 'MLLM',
    TASKS = 'text-generation',
    PAI_EAS_MODEL_NAME = 'Qwen2.5-Omni-3B',
    PAI_EAS_SERVICE_NAME = 'quickstart_deploy_*****', 
    ENDPOINT = 'http://*****.vpc.cn-<region>.pai-eas.aliyuncs.com',
    APIKEY = '*****',
    PAI_EAS_SYNC_MODE = 'true'
)
COMMENT "PAI EAS remote model";

单击展开查看远程模型信息

-- 查看远程模型。
SET odps.namespace.schema=true;
SET odps.session.networklink=<your vpc name>;
DESC model PAI_EAS_Qwen25_Omni_3B_blob_image;

-- 返回结果如下。
+------------------------------------------------------------------------------------+
|                  Model Information                                                 |
+------------------------------------------------------------------------------------+
| Owner:                    ***********                                              |
| Project:                  ***********                                              |
| Schema:                   default                                                  |
| Model Name:               pai_eas_qwen25_omni_3b_blob_image                        |
| Model Type:               MLLM                                                     |
| Source Type:              REMOTE                                                   |
| Default Version:          v1                                                       |
| CreateTime:               2026-04-16 17:25:54                                      |
| LastModifiedTime:         2026-04-16 17:25:54                                      |
| Model ID:                 8e6203294ba24c73bfe1a8ac0********                        |
| Comment:                  PAI EAS remote model                                     |
+------------------------------------------------------------------------------------+
|                Version Information                                                 |
+------------------------------------------------------------------------------------+
| Owner:                    ***********                                              |
| Project:                  ***********                                              |
| Schema:                   default                                                  |
| Model Name:               pai_eas_qwen25_omni_3b_blob_image                        |
| Model Type:               MLLM                                                     |
| Source Type:              REMOTE                                                   |
| Version Name:             v1                                                       |
| Version ID:               08fae3f0a4674f9f9b03b82e2***********                     |
| Path:                                                                              |
| CreateTime:               2026-04-16 17:25:54                                      |
| LastModifiedTime:         2026-04-16 17:25:54                                      |
| apikey:                   ***************************                              |
| endpoint:                 http://*****.vpc.cn-beijing.pai-eas.aliyuncs.com         |
| pai_eas_model_name:       Qwen2.5-Omni-3B                                          |
| pai_eas_service_name:     quickstart_deploy_*****                                  |
| pai_eas_sync_mode:        true                                                     |
| remote_service_type:      PAI-EAS                                                  |
+------------------------------------------------------------------------------------+
| Input           | Type       | Comment                                             |
+------------------------------------------------------------------------------------+
| data            | binary     |                                                     |
| promt           | string     |                                                     |
+------------------------------------------------------------------------------------+

步骤七:使用AI_GENERATE函数进行图片数据处理

SET odps.namespace.schema=true; 
SET odps.mcqa.disable=true; -- 关闭查询加速模式,AI Function 暂不支持在查询加速模式下运行
SET odps.session.networklink=<your vpc name>;
SELECT
  image_name,
  AI_GENERATE(
    PAI_EAS_Qwen25_Omni_3B_blob_image, DEFAULT_VERSION, speech_data,
    "提取图片中的所有文字。严格只输出文字内容,不要包含任何开场白、解释、Markdown 格式或额外评论。"
  ) AS sql_dml
  FROM (
    SELECT image_name, read_blob(image_desc) AS speech_data
    FROM <project name>.<schema>.speech_segments_table 
) ;

返回结果如下

SET odps.mcqa.disable=true;为关闭查询加速模式,AI Function 暂不支持在查询加速模式下运行。

-- 返回结果如下:

+------------+---------+
| image_name | sql_dml |
+------------+---------+
| test01.png | -- 创建包含blob列的表(Delta Table)CREATE TABLE IF NOT EXISTS `speech_segments_table` (`video_name` STRING COMMENT '视频唯一标识',`segment_index` BIGINT COMMENT '片段序号',`speech_data` BLOB COMMENT '语音片段WAV数据',`start_time` DOUBLE COMMENT '开始时间(秒)',`end_time` DOUBLE COMMENT '结束时间(秒)',`duration` DOUBLE COMMENT '时长(秒)')COMMENT '语音片段表'TBLPROPERTIES ("table.format.version"="2");|
| test02.png | -- 读取视频元信息SET odps.namespace.schema=true;SELECT * FROM video_demo;SELECT COUNT(*) AS ROW_COUNT FROM video_demo; |
| test03.png | -- 创建视频提取语音的udtf CREATE_FUNCTION `mp4_extract_speech`AS 'mp4_extract_speech.Mp4ExtractSpeech USING 'mp4_extract_speech.py, moviepy_deps_py3.zip, ffmpeg_linux.zip' ;|
| test04.png | -- 查看远程模型。SET odps.namespace.schema=true;SET odps.session.networklink=ot_demo; desc model PAI_EAS_Qwen25_Omni_3B_blob; |
| test05.png | -- 周期性刷新历史 show refresh task history for object table ot_demo_day03;ALTER TABLE ot_demo_day03 REFRESH Metadata; |
| test06.png | -- 刷新表缓存 alter table test_ot1 refresh metadata;set odps.mcqa.disable=true;set odps.namespace.schema=true;select * from testOt1; |
| test07.png | -- 通过data列查询文件内容 set odps.mcqa.disable=true;set odps.namespace.schema=true;select data from test_ot_data; |
| test08.png | -- 通过函数查文件内容 set odps.mcqa.disable=TRUE;set odps.namespace.schema=true;select * from test_ot_data_catalog; |
| test09.png | -- 查询0T表中的元信息数据,但不会下载数据 set odps.namespace.schema=true;select * from test_get_signed_url_from_oss2; 未读条目个数 |
| test10.png | add py binary_pdf2png.py -f;  add py binary_pdf2text.py -f;  add archive pdf_tools_cp37.tar.gz -f; |
+------------+---------+