當儲存在Object Storage Service中積累了海量的圖片、視頻等非結構化資料後,傳統的基於檔案名稱或手動標籤的檢索方式變得效率低下,且無法理解檔案內容的深層語義。OSS 利用多模態 AI 模型,自動為儲存在 Bucket 中的檔案提取語義描述與精簡摘要,並構建為可檢索的索引。可通過自然語言直接搜尋檔案內容,實現“以文搜圖”、“以文搜視頻”等進階檢索功能,從而顯著提升資料檢索的準確性與效率,並為構建智能問答(RAG)等上層應用提供堅實基礎。
應用情境
IP Camera (IPC) 情境的智能搜尋:面向智能安防情境,支援回放視頻的語義檢索、監控事件推送、App 熱詞推薦等。例如終端使用者查看回放時,自動產生“今日熱詞推薦”。
RAG 檢索增強知識庫:基於 OSS 海量資料和內容感知能力構建 RAG 外掛知識庫,當使用者提問時,可以利用OSS的內容感知能力進行RAG檢索增強,為大模型提供更精準、更相關的上下文資訊,從而產生更高品質的回答。
知識儲存與管理平台:基於 OSS 資料索引和內容感知的知識內容,構建知識管理平台、媒資管理平台、企業智能辦公平台等。OSS 資料索引和內容感知可以擷取多媒體檔案的近 70 項中繼資料,客戶可以基於這些中繼資料進行雲端知識管理平台的構建。
工作原理
AI 內容感知功能的核心是語義檢索,通過理解使用者的自然語言,將查詢與檔案的多媒體內容匹配,而非依賴傳統的關鍵詞匹配。整體流程如下:
開啟功能與首次索引:當為 Bucket 開啟該功能後,系統會觸發一次性存量掃描,對 Bucket 內所有受支援的檔案進行非同步處理。
特徵提取與描述產生:系統使用大模型為每個檔案提取核心語義特徵,並產生兩類內容感知描述文本:內容詳細描述(約 100 字)與精簡摘要(20 字內)。
向量化與索引構建:將檔案的語義特徵與感知描述向量化,構建向量索引庫,支撐大規模高效能檢索。
語義檢索與精排:使用者發起查詢時,系統將查詢語句向量化,在向量索引中召回最相似的檔案;隨後結合向量表示與內容感知描述進行聯合精排,提升準確率與召回率,精準識別海量資料中的關鍵資訊,實現增強型語義檢索。
結果返回與應用:檢索結果會返回通過內容感知能力產生的內容詳細描述和精簡摘要,使用者可直接擷取要點資訊,並據此構建上層應用,如“檢索熱詞”、“每日總結”等功能。
首次索引是非同步執行的,根據 Bucket 內檔案數量和大小,可能需要數分鐘到數小時不等。在此期間,存量檔案無法被搜到。對於新上傳或更新的檔案,系統會自動觸發增量式的索引更新。
使用限制
在開始之前,請確保您的Bucket位於以下支援AI內容感知的地區:華北2(北京)、華北3(張家口)、華東1(杭州)、華東2(上海)、華南1(深圳)、西南1(成都)、新加坡、美國(維吉尼亞)。
使用新加坡和美國(維吉尼亞)地區的AI內容感知功能前,需先提交工單申請開通。
1. 建立Bucket並上傳檔案
2. 開啟 AI 內容感知
您需要為Bucket在 OSS 資料索引-向量檢索功能中開啟 OSS AI 內容感知,開啟後,使用資料索引的查詢介面進行語義檢索和查詢即可。
在左側導覽列, 選擇。
在資料索引頁面,首次使用資料索引功能時,需要按指引完成對 AliyunMetaQueryDefaultRole 角色的授權,以便 OSS 服務能管理 Bucket 中的資料。授權後,單擊開啟資料索引。
選擇向量檢索,在 AI內容感知 選項中,可根據需要勾選 圖片內容感知 或 視頻內容感知。
(可選)檔案過濾規則:配置此項僅對符合特定規則的檔案進行 AI 分析。最多可設定 5 條檔案過濾規則。支援根據首碼、檔案大小、LastModifiedTime、ObjectTag過濾。樣本:添加一條首碼規則,值為
videos/,表示僅處理videos目錄下的檔案。說明如果開啟檔案過濾,那麼只根據過濾後的檔案數量收取資料索引-向量檢索費用和內容感知費用。
單擊確認開啟。
說明構建中繼資料索引需要等待一定的時間,具體等待時間長度取決於Bucket中Object的數量。若開啟時間過久可通過重新整理來查看開啟狀態。
3. 執行查詢
索引構建完成後,您可以通過控制台、SDK或命令列工具執行語義檢索。只需輸入一段描述性文字,例如停著車的院子,系統便會返回與描述相符的關鍵檔案及其內容摘要。且直接基於該介面或 SDK 進行開發即可,無需關心底層資源的彈性、無需關心向量化過程、無需關心索引構建和索引儲存,完全 serverless 化使用。
控制台
在Bucket 列表頁面,點擊您的 Bucket名稱。
在檔案清單頁面,確認視頻已上傳。
在左側導覽列, 選擇。
在資料索引頁面,檢索內容中輸入
停著車的院子,在多媒體類型中勾選視頻,點擊立即查詢,檢索到符合描述的視頻且返回內容摘要。
SDK
Java
僅Java SDK 3.18.2及以上版本支援使用向量檢索功能,更多用法見向量檢索(Java SDK V1)。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.util.ArrayList;
import java.util.List;
public class DoMetaQuery {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 建立OSSClient執行個體。
// 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
int maxResults = 20;
List<String> mediaTypes = new ArrayList<String>();
mediaTypes.add("image");
String query = "Snow";
String simpleQuery = "{\"Operation\":\"gt\", \"Field\": \"Size\", \"Value\": \"30\"}";
String sort = "Size";
DoMetaQueryRequest doMetaQueryRequest = new DoMetaQueryRequest(bucketName, maxResults, query, sort, MetaQueryMode.SEMANTIC, mediaTypes, simpleQuery);
DoMetaQueryResult doMetaQueryResult = ossClient.doMetaQuery(doMetaQueryRequest);
} catch (OSSException oe) {
System.out.println("Error Message: " + oe.getErrorMessage());
System.out.println("Error Code: " + oe.getErrorCode());
System.out.println("Request ID: " + oe.getRequestId());
System.out.println("Host ID: " + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Error Message: " + ce.getMessage());
} finally {
if(ossClient != null){
ossClient.shutdown();
}
}
}
}
Python
更多用法見向量檢索。
import argparse
import alibabacloud_oss_v2 as oss
# 建立命令列參數解析器,用於處理命令列輸入
parser = argparse.ArgumentParser(description="do meta query semantic sample")
# 添加必要的命令列參數
parser.add_argument('--region', help='The region in which the bucket is located.', required=True) # 儲存空間所在地區
parser.add_argument('--bucket', help='The name of the bucket.', required=True) # 儲存空間名稱
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS') # OSS訪問網域名稱,可選
def main():
# 解析命令列參數
args = parser.parse_args()
# 從環境變數中載入訪問憑證
# 運行前需要設定環境變數:OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 載入SDK預設配置
cfg = oss.config.load_default()
# 設定憑證提供者
cfg.credentials_provider = credentials_provider
# 設定地區
cfg.region = args.region
# 如果提供了endpoint,則更新配置中的endpoint
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 建立OSS用戶端執行個體
client = oss.Client(cfg)
# 發起中繼資料查詢請求 - 向量檢索模式
result = client.do_meta_query(oss.DoMetaQueryRequest(
bucket=args.bucket,
mode='semantic',
meta_query=oss.MetaQuery(
max_results=1000,
query='俯瞰白雪覆蓋的森林',
order='desc',
media_types=oss.MetaQueryMediaTypes(
media_type=['image']
),
simple_query='{"Operation":"gt", "Field": "Size", "Value": "30"}',
),
))
# 列印檢索結果
print(vars(result))
if __name__ == "__main__":
main()
Go
更多用法見向量檢索(Go SDK V2)。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string
bucketName string
)
func init() {
// 設定命令列參數來指定region,預設為空白字串
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
// 設定命令列參數來指定bucket名稱,預設為空白字串
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
flag.Parse() // 解析命令列參數
// 檢查是否提供了儲存空間名稱,如果沒有提供,則輸出預設參數並退出程式
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查是否提供了地區資訊,如果沒有提供,則輸出預設參數並退出程式
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 建立用戶端配置,並使用環境變數作為憑證提供者和指定的地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg) // 使用配置建立一個新的OSS用戶端執行個體
// 執行向量檢索操作
request := &oss.DoMetaQueryRequest{
Bucket: oss.Ptr(bucketName),
Mode: oss.Ptr("semantic"),
MetaQuery: &oss.MetaQuery{
MaxResults: oss.Ptr(int64(99)),
Query: oss.Ptr("Overlook the snow-covered forest"), // 輸入語義內容檢索,此處為樣本文本
MediaType: oss.Ptr("image"), // 指定檢索的媒體類型,此處為映像類型
SimpleQuery: oss.Ptr(`{"Operation":"gt", "Field": "Size", "Value": "30"}`),
},
}
result, err := client.DoMetaQuery(context.TODO(), request)
if err != nil {
log.Fatalf("failed to do meta query %v", err)
}
log.Printf("do meta query result:%#v\n", result)
}
PHP
更多用法見向量檢索(PHP SDK V2)。
<?php
// 引入自動負載檔案,確保依賴庫能夠正確載入
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// 定義命令列參數的描述資訊
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // Bucket所在的地區(必填)
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // 訪問網域名稱(可選)
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // Bucket名稱(必填)
];
// 將參數描述轉換為getopt所需的長選項格式
// 每個參數後面加上":"表示該參數需要值
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// 解析命令列參數
$options = getopt("", $longopts);
// 驗證必填參數是否存在
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help']; // 擷取參數的協助資訊
echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
exit(1); // 如果必填參數缺失,則退出程式
}
}
// 從解析的參數中提取值
$region = $options["region"]; // Bucket所在的地區
$bucket = $options["bucket"]; // Bucket名稱
// 載入環境變數中的憑證資訊
// 使用EnvironmentVariableCredentialsProvider從環境變數中讀取Access Key ID和Access Key Secret
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// 使用SDK的預設配置
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 設定憑證提供者
$cfg->setRegion($region); // 設定Bucket所在的地區
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // 如果提供了訪問網域名稱,則設定endpoint
}
// 建立OSS用戶端執行個體
$client = new Oss\Client($cfg);
// 執行向量檢索查詢滿足指定條件的對象
$request = new Oss\Models\DoMetaQueryRequest($bucket, new Oss\Models\MetaQuery(
maxResults: 99,
query: "Overlook the snow-covered forest",
mediaTypes: new Oss\Models\MetaQueryMediaTypes('image'),
simpleQuery: '{"Operation":"gt", "Field": "Size", "Value": "30"}',
), 'semantic');
$result = $client->doMetaQuery($request);
printf(
'status code:' . $result->statusCode . PHP_EOL .
'request id:' . $result->requestId . PHP_EOL .
'result:' . var_export($result, true)
);ossutil
以下樣本展示了如何查詢儲存空間examplebucket中滿足指定條件的檔案。
ossutil api do-meta-query --bucket examplebucket --meta-query "{\"Query\":\"Overlooking the snow covered forest\",\"MediaTypes\":{\"MediaType\":\"video\"},\"SimpleQuery\":\"{\\\"Operation\\\":\\\"gt\\\", \\\"Field\\\": \\\"Size\\\", \\\"Value\\\": \\\"1\\\"}\"}" --meta-query-mode semantic關於該命令的更多資訊,請參見do-meta-query。
計費說明
使用 AI 內容感知功能會產生以下費用:
資料索引費用:需要在資料索引-向量檢索模式中開啟 AI 內容感知,因此會產生資料索引-向量檢索相關的費用。
AI內容感知費用:包括圖片內容感知和視頻內容感知費用,根據處理的檔案類型和用量計費。開啟 AI 內容感知後,OSS 會自動掃描該 Bucket 中的存量圖片/視頻檔案。同時,一旦有新的圖片/視頻檔案上傳,OSS 會自動觸發 AI 內容感知,新上傳的圖片/視頻檔案也會產生 AI 內容感知費用,請您及時關注賬單變化。
API請求費用:在存量檔案索引構建期間和增量檔案索引更新期間會產生API請求費用,按API調用次數收費。涉及的API請求如下:
操作
API
掃描Bucket中的檔案
ListObjects
為Bucket中的檔案構建索引
HeadObject和GetObject
Bucket中檔案存在Tag
GetObjectTag
Bucket中檔案攜帶自訂Meta
GetObjectMeta
Bucket中存在軟連結檔案
GetSymlink
如需停止相關計費,請及時關閉向量檢索。
相關API
AI內容感知功能基於以下RESTful API實現。如果您的應用有較高的定製化需求,可以直接調用這些API進行開發(需要手動實現簽名計算)。
關於開啟中繼資料管理功能的更多資訊,請參見OpenMetaQuery。
關於查詢當前中繼資料管理的更多資訊,請參見GetMetaQueryStatus。
關於查詢滿足指定條件的檔案,請參見DoMetaQuery。
關於關閉中繼資料管理功能的更多資訊,請參見CloseMetaQuery。