AI Function实现视频检索分析最佳实践

更新时间:
复制为 MD 格式

本文介绍基于 Hologres AI Function 与多模态能力,实现海量监控视频的快速检索与混合分析的最佳实践,适用于安防、城市治理、加油站/商超等场景。

方案概述

场景介绍

在安防、城市治理、加油站/商超等场景中,通常会部署大量监控摄像头,每天都在产生持续增长的海量多模数据,以视频为主,围绕这些数据典型的业务诉求包括:

  • 案件追溯:快速在海量监控中定位“抢劫、盗窃、斗殴、肇事逃逸”等异常事件相关视频;

  • 治安巡查:针对重点区域(如加油站、便利店、ATM 旁)进行事后抽查和风险梳理;

  • 交通治理:根据描述(如“十字路口逆行”“行人闯红灯造成事故”)快速定位相关视频片段;

  • 事故分析与研判:按“场景+行为”检索视频,用于事后复盘、安全培训和风险评估。

传统的视频检索方式主要依赖:人工回看监控视频,效率极低;或者简单的时间段/摄像头维度检索,难以按“语义”快速定位目标片段,导致检索效率慢、无法支撑多模数据的综合分析等。

在这样的多模数据混合分析的需求驱动下,基于 Hologres AI Function 调用大模型,实现海量监控视频的快速检索与混合分析。

产品核心能力介绍

本次最佳实践主要实现对音频、视频加工与多模检索分析,包含的主要能力如下:

  • 百炼:阿里云百炼是一站式大模型开发与应用平台,集成了千问及主流第三方模型。它为开发者提供了兼容 OpenAI 的 API 及全链路模型服务;本次最佳实践中提供模型能力,由 Hologres 直接调用。

  • Object Table:支持通过表的形式读取 OSS 中非结构化数据。

  • AI Function:在 Hologres 中可以用标准 SQL 的方式调用 Function,通过调用百炼大模型,完成 AI 服务建设场景。

    • 数据加工:提供 Embed 算子,可以对非结构化数据加工成结构化数据存储,无需使用外部算法就能自动 embed。

    • 数据检索和分析:提供 ai_gen、ai_summarize 等算子,使用 SQL 就能对数据进行推理、问题总结、翻译等能力。

  • Dynamic Table:支持增量刷新模式对非结构化数据自动加工,每次只计算增量数据,有效减少重复计算,降低资源利用率。

  • 向量检索:支持标准 SQL 的向量检索,用于非结构化数据的相似度搜索、场景识别等,在同一个查询中可以自由实现向量+标量的检索。

  • 全文检索:通过倒排索引、分词等机制实现对非结构化数据的高效检索,支持关键词匹配、短语检索等丰富的检索方式。

方案优势

通过如上核心能力,在 Hologres 中对音频、视频检索的核心优势如下:

  • 把视频“变成可检索的数据资产:通过多模态大模型将视频转换成向量(embedding),把原本“只能看不能算”的视频数据,变成可计算、可检索、可分析的结构化/半结构化数据,并支持自然语言检索。

  • 统一存储与计算平台:视频可以与其他结构化数据统一接入同一个 Hologres 大数据平台,多模数据混合分析。

  • 显著提升检索效率与准确性:不需要通过人工方式检索,通过自然语言等多模形式实现对视频的检索与分析,大幅降低人力消耗,提高案件处理、事故研判的效率。

  • 数据不出库,更安全:不需要将数据导出到外部系统,与 Hologres 的多种安全能力无缝集成,高效保护数据安全。

方案流程介绍

本次方案的流程如下:

  1. 数据集准备:将视频数据上传至 OSS 存储。

  2. 视频加工:使用 Object Table 读取视频的元数据信息,然后创建 Dynamic Table 对数据进行 embed,并设置刷新模式为增量刷新;同时对 Dynamic Table 构建向量索引,以便后续检索使用索引能力。

  3. 使用 ai_embed 算子将自然语言问题进行 embedding,然后使用向量检索输出 Top N 的结果。

方案步骤

步骤1:导入视频数据至 OSS

本次最佳实践准备了多个监控视频,视频内容为各个场景(如商店、加油站等)下的抢劫行为。请将视频上传至 OSS,用于后续的视频检索分析。

步骤2:为账号准备 RAM 角色并授权

需要为账号准备一个 RAM 角色,并授予相关权限,才能读取 OSS 中的文件。

  • 为 RAM 角色授予 OSS 的 AliyunOSSReadOnlyAccess 权限。

  • 为 RAM 角色授予 Hologres 的相关权限,信任策略示例代码如下。

说明

如果是子账号,请前往 Object Table 文档查看授权操作。

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": [
          "acs:ram::1866xxxx:root"
        ],
        "Service": [
          "hologres.aliyuncs.com"
        ]
      }
    }
  ],
  "Version": "1"
}

步骤3:部署百炼模型

前往 Hologres管理控制台,在实例详情 > AI模型 中部署百炼模型。本次最佳实践部署的模型为 qwen3-vl-embeddingqwen3-vl-plus

步骤4:对视频进行 embedding

需要创建 Object Table 和 Dynamic Table 读取视频元数据,并对视频进行 embedding。示例代码如下。

-- 创建 Object Table
CREATE OBJECT TABLE public.obj_snatching_video
WITH (
  path = 'oss://xxx/SNACHING/',                         -- 必填
  oss_endpoint = 'oss-cn-beijing-internal.aliyuncs.com', -- 必填
  role_arn = 'acs:ram::1055323xxxx:role/xxx'            -- 必填
);

-- 刷新 Object Table
SET hg_computing_resource = 'serverless';
REFRESH OBJECT TABLE public.obj_snatching_video;

-- 创建 Dynamic Table
CREATE DYNAMIC TABLE dt_snatching_video
 (
  CHECK(array_ndims(embedding_vector) = 1 AND array_length(embedding_vector, 1) = 2560)
)
WITH (
    vectors = '{
                "embedding_vector": {
                    "algorithm": "HGraph",
                    "distance_method": "Cosine",
                    "builder_params": {
                    "base_quantization_type": "sq8_uniform",
                    "max_degree": 64,
                    "ef_construction": 400,
                    "precise_quantization_type": "fp32",
                    "use_reorder": true
                    }
                }
            }',
    auto_refresh_mode = 'incremental',
    freshness = '5 minutes',
    auto_refresh_enable = 'false'
) AS
SELECT
    object_uri,
    etag,
    ai_embed('qwen3_vl_embedding', file) AS embedding_vector,
    ai_gen('qwen3_vl_plus','请以安防分析的角度,简要描述这段监控视频的内容,并重点说明是否存在明显的抢劫行为、参与人数和大致过程,包含事件发生的时间、地点', file) AS vedio_desc
FROM public.obj_snatching_video;

-- 刷新 Dynamic Table
SET hg_computing_resource = 'serverless';
REFRESH DYNAMIC TABLE public.dt_snatching_video;

步骤5:视频检索与分析

视频处理完成后,可以在 Hologres 中使用 AI Function 对视频进行检索与多模分析。

以文搜视频示例 SQL:

-- 以文搜视频
SELECT
    object_uri,
    approx_cosine_distance (
      embedding_vector,
    ai_embed ('qwen3_vl_embedding', '加油站发生了抢劫')) AS score
FROM
    public.dt_snatching_video
ORDER BY
    score DESC
LIMIT 2;

示例返回:

                         object_uri                         |  score
---------------------------------------------------------------+--------
 oss://xxxx/SNACHING/Snatching  (20).mp4                        | 0.412422508

视频总结示例 SQL:

SELECT ai_gen('qwen3_vl_plus', prompt('请根据每个视频的描述,汇总相关内容生成一个安防报告,同时给出治理建议,控制在200字左右:{0}', array_agg(vedio_desc))) FROM dt_snatching_video;

可得到安防报告汇总与治理建议(200字内)等结构化输出,用于事后复盘与风险治理。