生成指定语言的内容描述

更新时间:
复制 MD 格式

OSS 数据索引会用 AI 为图片、视频自动生成内容描述(Insights),但默认生成的描述语言可能与您的业务语言不一致,跨语言检索和展示不方便。本功能让您为 Dataset 指定 Insights 的输出语言(如英语、日语),使 AI 生成的内容描述与业务语言保持一致,便于跨语言检索与展示。

重要

本功能基于新版 MetaQuery,当前处于邀测阶段,仅支持华东1(杭州)、新加坡地域。使用前请确保目标 Bucket 位于上述地域,并联系技术支持申请开通新版 MetaQuery 邀测能力。

应用场景

  • 出海业务:为图片、视频生成英语、日语等目标语言的内容描述,直接用于多语言站点的展示与检索。

  • 多语言素材库:在同一素材库中按业务需要分别生成不同语言的 Insights,统一检索口径。

工作原理

  1. 开启内容感知并指定语言:在目标 Dataset 的 DatasetConfig 中开启图片或视频的 Insights(Caption),并设置 Insights.Language 为目标语言。

  2. 入库生成描述:文件上传并路由到该 Dataset 后,OSS 异步生成内容描述,并按指定语言输出。

  3. 写入元数据:生成的内容描述写入该文件在 Dataset 中的元数据(Insights)。

  4. 查询读取:通过 SimpleQuery 配合 WithFields 返回并读取 Insights 字段。

说明

内容描述为异步生成,上传后需要等待一段时间 Insights 才会就绪;在此之前可能读取不到。

使用限制

  • 调用方需具备 oss:MetaQueryoss:PutObject 等权限。

  • 如需接收文件索引完成通知,请提前创建 MNS 队列,并确保 OpenMetaQuery 使用的 RAM 角色拥有向该队列发送消息的权限。

  • 如需将不同对象路由到不同 Dataset,需要在开启 MetaQuery 时配置 RouteRule

1. 开启 MetaQuery

semantic 模式为 Bucket 开启元数据管理功能。以下示例基于 OSS Java SDK V2(com.aliyun:alibabacloud-oss-v2)与 OSS Go SDK V2(github.com/aliyun/alibabacloud-oss-go-sdk-v2),并从环境变量 OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET 读取访问凭证。

Java SDK

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.dataprocess.OSSDataProcessClient;
import com.aliyun.sdk.service.oss2.dataprocess.models.*;
import java.util.Arrays;
import java.util.Collections;

public class OpenMetaQuerySample {
    public static void main(String[] args) throws Exception {
        try (OSSDataProcessClient client = OSSDataProcessClient.newBuilder()
                .region("cn-hangzhou")
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .build()) {
            MetaQueryOpenBody body = MetaQueryOpenBody.newBuilder()
                    .routeRule(RouteRule.newBuilder()
                            .type("OSSTag")
                            .autoCreateDataset("True")
                            .ossTagKey("routing-dataset")
                            .build())
                    .notificationAttributes(NotificationAttributes.newBuilder()
                            .notifications(MetaQueryNotifications.newBuilder()
                                    .notifications(Collections.singletonList(
                                            MetaQueryNotification.newBuilder()
                                                    .mns("metaquery-index-notification")
                                                    .build()))
                                    .build())
                            .withFields(Arrays.asList("Insights"))
                            .build())
                    .build();

            client.openMetaQuery(OpenMetaQueryRequest.newBuilder()
                    .bucket("examplebucket")
                    .mode("semantic")
                    .role("AliyunMetaQueryDefaultRole")
                    .metaQueryBody(body)
                    .build());
            System.out.println("open meta query success");
        }
    }
}
说明

多 Dataset 路由(RouteRule)、索引完成 MNS 通知(NotificationAttributes)以及 Bucket 级默认 DatasetConfig,需在 OpenMetaQuery 请求体中一并配置,字段说明请参见 OpenMetaQuery;如需在通知消息中返回内容描述,请在 WithFields 中加入 Insights

2. 创建 Dataset 并配置 Insights 语言

调用 CreateDataset 创建 Dataset,并通过 DatasetConfig 配置 Insights。

说明

仅配置 Insights.Language 不会自动开启 Insights 生成能力,还需要在 Insights.Image.Caption.EnableInsights.Video.Caption.Enable 中开启对应媒体类型的内容感知。

以下示例创建一个输出英文 Insights 的 Dataset,并同时开启图片和视频的 caption。

Java SDK

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.dataprocess.OSSDataProcessClient;
import com.aliyun.sdk.service.oss2.dataprocess.models.*;

public class CreateDatasetSample {
    public static void main(String[] args) throws Exception {
        try (OSSDataProcessClient client = OSSDataProcessClient.newBuilder()
                .region("cn-hangzhou")
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .build()) {
            DatasetConfig config = DatasetConfig.newBuilder()
                    .insights(InsightsConfig.newBuilder()
                            .language("en")
                            .image(InsightsImageConfig.newBuilder()
                                    .caption(InsightsCaptionConfig.newBuilder()
                                            .enable("true")
                                            .build())
                                    .build())
                            .video(InsightsVideoConfig.newBuilder()
                                    .caption(InsightsVideoCaptionConfig.newBuilder()
                                            .enable("true")
                                            .build())
                                    .build())
                            .build())
                    .build();

            client.createDataset(CreateDatasetRequest.newBuilder()
                    .bucket("examplebucket")
                    .datasetName("photos-en")
                    .datasetConfig(config)
                    .build());
            System.out.println("create dataset success");
        }
    }
}

支持的语言取值如下:

语言代码

对应语言

zh-Hans

简体中文(默认)

zh-Hant

繁体中文

en

英语

ja

日语

ko

韩语

ar

阿拉伯语

cs

捷克语

da

丹麦语

nl

荷兰语

fr

法语

de

德语

id

印尼语

it

意大利语

ms

马来语

no

挪威语

pl

波兰语

pt

葡萄牙语

ro

罗马尼亚语

ru

俄语

es

西班牙语

sv

瑞典语

th

泰语

tr

土耳其语

3. 上传文件并路由到 Dataset

上传文件时,通过 OSS Object Tag 设置 routing-dataset=photos-en,将文件路由到目标 Dataset。文件索引完成后,会按照 Dataset 中的 Insights.Language 生成 Insights。如需对单个文件覆盖 Dataset 的默认语言,可在同一次上传中增加 x-oss-metaquery-insights-language Tag。优先级为:文件级 Tag > DatasetConfig > 系统默认语言。

Java SDK

import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.PutObjectRequest;
import com.aliyun.sdk.service.oss2.transport.BinaryData;
import java.nio.file.Files;
import java.nio.file.Paths;

public class PutObjectSample {
    public static void main(String[] args) throws Exception {
        try (OSSClient client = OSSClient.newBuilder()
                .region("cn-hangzhou")
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .build()) {
            client.putObject(PutObjectRequest.newBuilder()
                    .bucket("examplebucket")
                    .key("photos/snow.jpg")
                    .tagging("routing-dataset=photos-en&x-oss-metaquery-insights-language=zh-Hans")
                    .body(BinaryData.fromStream(Files.newInputStream(Paths.get("/local/path/snow.jpg"))))
                    .build());
            System.out.println("put object success");
        }
    }
}

4. 查询文件并读取 Insights

文件索引完成后,调用 SimpleQuery 在指定 Dataset 内查询文件,并通过 WithFields 返回 Insights 字段。如果在开启 MetaQuery 时配置了 MNS 通知,您也可以通过消费 MNS 消息判断文件是否索引完成,并从通知消息中读取 Insights

Java SDK

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.dataprocess.OSSDataProcessClient;
import com.aliyun.sdk.service.oss2.dataprocess.models.File;
import com.aliyun.sdk.service.oss2.dataprocess.models.SimpleQuery;
import com.aliyun.sdk.service.oss2.dataprocess.models.SimpleQueryRequest;
import com.aliyun.sdk.service.oss2.dataprocess.models.SimpleQueryResult;
import java.util.Arrays;

public class SimpleQueryInsightsSample {
    public static void main(String[] args) throws Exception {
        try (OSSDataProcessClient client = OSSDataProcessClient.newBuilder()
                .region("cn-hangzhou")
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .build()) {
            SimpleQueryResult result = client.simpleQuery(SimpleQueryRequest.newBuilder()
                    .bucket("examplebucket")
                    .datasetName("photos-en")
                    .query(SimpleQuery.newBuilder()
                            .field("Filename")
                            .value("snow")
                            .operation("match")
                            .build())
                    .withFields(Arrays.asList("Filename", "URI", "Insights"))
                    .maxResults(10)
                    .build());
            for (File file : result.files()) {
                System.out.println(file.filename() + " => " + file.insights());
            }
        }
    }
}

响应中的 Insights 字段即为按配置语言生成的内容描述。例如:

<File>
  <Filename>photos/snow.jpg</Filename>
  <Insights>
    <Image>
      <Caption>Snow-covered mountains with sunlight breaking through clouds.</Caption>
    </Image>
  </Insights>
</File>

相关 API