全部產品
Search
文件中心

MaxCompute:基礎向量檢索

更新時間:Mar 28, 2025

Proxima CE支援使用基礎向量檢索和百萬TopK檢索的方式檢索任務,本文為您介紹Proxima CE中使用基礎向量檢索離線任務的方法及樣本。

前提條件

已安裝Proxima CE包並準備輸入表,詳情請參見安裝Proxima CE包

使用限制

不支援在已開啟租戶層級Schema文法開關的專案中執行向量檢索任務,否則會出現類似於Schema xxx does not exist的報錯。請在未開啟租戶層級Schema文法開關的專案中執行本文的程式碼範例。

注意事項

  • 如果您已經開通Volume許可權,並且成功建立了External Volume,可以在DataWorks或odpscmd中使用Volume方式運行,否則需要輸入AKrole_arn作為必要的啟動參數,由Proxima CE任務程式化地建立使用。

  • 在DataWorks中執行Proxima CE任務時,您需要採用公用調度資源群組進行煙霧測試 (Smoke Test),詳情請參見執行煙霧測試 (Smoke Test)

匯入資料至輸入表

如果您想先測試整個流程,可以在DataWorks的SQL節點運行以下命令,產生簡單的小資料表來運行簡單的檢索樣本。

說明

您需要自行將相關的向量資料匯入已經建立好的doc表和query表中。

ALTER TABLE doc_table_float_smoke ADD PARTITION(pt='20221111');
INSERT OVERWRITE TABLE doc_table_float_smoke PARTITION (pt='20221111') VALUES
('1.nid','1~1~1~1~1~1~1~1'),
('2.nid','2~2~2~2~2~2~2~2'),
('3.nid','3~3~3~3~3~3~3~3'),
('4.nid','4~4~4~4~4~4~4~4'),
('5.nid','5~5~5~5~5~5~5~5'),
('6.nid','6~6~6~6~6~6~6~6'),
('7.nid','7~7~7~7~7~7~7~7'),
('8.nid','8~8~8~8~8~8~8~8'),
('9.nid','9~9~9~9~9~9~9~9'),
('10.nid','10~10~10~10~10~10~10~10');

ALTER TABLE query_table_float_smoke ADD PARTITION(pt='20221111');
INSERT OVERWRITE TABLE query_table_float_smoke PARTITION (pt='20221111') VALUES
('q1.nid','1~1~1~1~2~2~2~2'),
('q2.nid','4~4~4~4~3~3~3~3'),
('q3.nid','9~9~9~9~5~5~5~5');

運行

您可以在DataWorks或者odpscmd中運行,請根據實際情況選擇合適的運行工具。

重要

下述範例程式碼中所使用的參數配置,詳情請參見參考:Proxima CE全量參數說明

使用DataWorks運行

您可以在DataWorks上建立MaxCompute ODPS MR節點,通過ODPS SQL指令碼來運行Proxima CE。

image

  • Volume方式。

    --@resource_reference{"<proxima_ce_jar>"} -- 引用上傳的proxima-ce jar包,在“資料開發”頁面,按右鍵已上傳的JAR包,並選擇“引用資源”即可產生該行注釋
    jar -resources <proxima_ce_jar>  -- 上傳的proxima-ce jar包
    -classpath <proxima_ce_jar> com.alibaba.proxima2.ce.ProximaCERunner  -- classpath指定main函數入口類
    -doc_table doc_table_float_smoke  -- 輸入doc表
    -doc_table_partition 20221111  -- 輸入doc表的partition
    -query_table query_table_float_smoke  -- 輸入query表
    -query_table_partition 20221111  -- 輸入query表的partition
    -output_table output_table_float_smoke  -- 輸出表
    -output_table_partition 20221111  -- 輸出表partition
    -data_type float  -- 向量資料類型
    -dimension 8  -- 向量維度
    -topk 1  -- 向量檢索的topk
    -job_mode train:build:seek:recall  -- 指定檢索任務模式,預設為train:build:seek,加上recall能夠計算本次檢索的召回率
    -external_volume_name <ext_volume> -- 使用者提供的建立好的volume on oss,需要底層oss目錄也建立好,否則會運行失敗
    -owner_id <oid>  -- 使用者提供的用於標識自己的唯一id
    ; -- 注意不要丟掉分號,這是odps sql結束的標誌

    您在執行上述代碼時,需要根據實際情況替換以下參數:

    參數名

    描述

    proxima_ce_jar

    已上傳的Proxima CE安裝包名稱,例如proxima-ce-aliyun-1.0.2.jar。詳情請參見安裝Proxima CE包

    ext_volume

    已建立的External Volume名稱。External Volume的建立方式請參見External Volume操作

    oid

    由數字組成的使用者唯一性標識,建議長度不超過32位,例如123456。推薦您使用阿里雲帳號ID。

  • role_arn方式。

    --@resource_reference{"<proxima_ce_jar>"}  -- 引用上傳的proxima-ce jar包,在“資料開發”頁面,按右鍵已上傳的JAR包,並選擇“引用資源”即可產生該行注釋
    jar -resources <proxima_ce_jar>  -- 上傳的proxima-ce jar包
    -classpath <proxima_ce_jar> com.alibaba.proxima2.ce.ProximaCERunner  -- classpath指定main函數入口類
    -doc_table doc_table_float_smoke  -- 輸入doc表
    -doc_table_partition 20221111  -- 輸入doc表的partition
    -query_table query_table_float_smoke  -- 輸入query表
    -query_table_partition 20221111  -- 輸入query表的partition
    -output_table output_table_float_smoke  -- 輸出表
    -output_table_partition 20221111  -- 輸出表partition
    -data_type float  -- 向量資料類型
    -dimension 8  -- 向量維度
    -topk 1  -- 向量檢索的topk
    -job_mode train:build:seek:recall  -- 指定檢索任務模式,預設為train:build:seek,加上recall能夠計算本次檢索的召回率
    -oss_role_arn <rolearn> -- 使用者提供的雲帳號下可以訪問oss的role_arn,形如acs:ram::1234xxx5678:role/xxx-role
    -oss_endpoint <endpoint> -- 目標地區的endpoint
    -oss_bucket <bucket> -- 已建立的oss bucket
    -owner_id <oid>  -- 使用者提供的用於標識自己的唯一id
    ; -- 注意不要丟掉分號,這是odps sql結束的標誌

    您在執行上述代碼時,需要根據實際情況替換以下參數:

    參數名

    描述

    proxima_ce_jar

    已上傳的Proxima CE安裝包名稱,例如proxima-ce-aliyun-1.0.1.jar。詳情請參見安裝Proxima CE包

    rolearn

    RAM角色的ARN資訊,例如acs:ram::1234xxx5678:role/xxx-role

    您可以登入RAM存取控制台,在左側導覽列身份管理下拉式清單下的角色頁面擷取。

    endpoint

    MaxCompute專案所在地區的OSS內網Endpoint。詳情請參見OSS地區和訪問網域名稱

    bucket

    與MaxCompute專案位於同一地區的OSS儲存空間名稱,即Bucket名稱。查看儲存空間名稱操作,請參見列舉儲存空間

    oid

    由數字組成的使用者唯一性標識,建議長度不超過32位,例如123456。推薦您使用阿里雲帳號ID。

使用odpscmd運行

如果您使用odpscmd運行,可以在MaxCompute用戶端(odpscmd)中執行如下指令碼:

  • Volume方式。

    jar -resources <proxima_ce_jar> 
    -classpath <proxima_ce_jar_path> com.alibaba.proxima2.ce.ProximaCERunner 
    -doc_table doc_table_float_smoke 
    -doc_table_partition 20221111 
    -query_table query_table_float_smoke 
    -query_table_partition 20221111 
    -output_table output_table_float_smoke 
    -output_table_partition 20221111 
    -data_type float 
    -dimension 8 
    -topk 1 
    -job_mode train:build:seek:recall 
    -external_volume_name <ext_volume> 
    -owner_id <oid> 
    ;

    您在執行上述代碼時,需要根據實際情況替換以下參數:

    參數名

    描述

    proxima_ce_jar

    已上傳的Proxima CE安裝包名稱,例如proxima-ce-aliyun-1.0.1.jar。詳情請參見安裝Proxima CE包

    proxima_ce_jar_path

    Proxima CE的JAR包所在的本地路徑,此處直接使用JAR包名稱,表示該JAR與執行指令碼位於同一目錄下。

    ext_volume

    已建立的External Volume名稱。External Volume的建立方式請參見External Volume操作

    oid

    由數字組成的使用者唯一性標識,建議長度不超過32位,例如123456。推薦您使用阿里雲帳號ID。

  • role_arn方式。

    jar -resources <proxima_ce_jar> 
    -classpath <proxima_ce_jar_path> com.alibaba.proxima2.ce.ProximaCERunner 
    -doc_table doc_table_float_smoke 
    -doc_table_partition 20221111 
    -query_table query_table_float_smoke 
    -query_table_partition 20221111 
    -output_table output_table_float_smoke 
    -output_table_partition 20221111 
    -data_type float 
    -dimension 8 
    -topk 1 
    -job_mode train:build:seek:recall 
    -oss_role_arn <rolearn> 
    -oss_endpoint <endpoint> 
    -oss_bucket <bucket> 
    -owner_id <oid> 
    ;

    您在執行上述代碼時,需要根據實際情況替換以下參數:

    參數名

    描述

    proxima_ce_jar

    已上傳的Proxima CE安裝包名稱,例如proxima-ce-aliyun-1.0.1.jar。詳情請參見安裝Proxima CE包

    proxima_ce_jar_path

    Proxima CE的JAR包所在的本地路徑,此處直接使用JAR包名稱,表示該JAR與執行指令碼位於同一目錄下。

    rolearn

    RAM角色的ARN資訊,例如acs:ram::1234xxx5678:role/xxx-role

    您可以登入RAM存取控制台,在左側導覽列身份管理下拉式清單下的角色頁面擷取。

    endpoint

    MaxCompute專案所在地區的OSS內網Endpoint。詳情請參見OSS地區和訪問網域名稱

    bucket

    與MaxCompute專案位於同一地區的OSS儲存空間名稱,即Bucket名稱。查看儲存空間名稱操作,請參見列舉儲存空間

    oid

    由數字組成的使用者唯一性標識,建議長度不超過32位,例如123456。推薦您使用阿里雲帳號ID。

運行結果

  • 標準輸出結果範例。

    向量檢索  資料類型:4 , 向量維度:8 , 檢索方式:HNSW , 計算方法:SquaredEuclidean , 構建模式:train:build:seek:recall
    doc表資訊 表名: doc_table_float_smoke , 分區:20221111 , doc數量:10 , 向量分隔字元:~
    query表資訊 表名: query_table_float_smoke , 分區:20221111 , query數量:3 , 向量分隔字元:~
    輸出表資訊 表名: output_table_float_smoke , 分區:20221111
    行列資訊  行數: 1 , 列數:1 , 每列索引doc數量:1000000
    是否清除Volume索引:false
    
    各個worker的耗時(單位:秒):
       SegmentationWorker:      1
       TmpTableWorker:      0
       KmeansGraphWorker:       0
       BuildJobWorker:      120
       SeekJobWorker:       60
       TmpResultJoinWorker:     0
       RecallWorker:        60
       CleanUpWorker:       1
    總耗時(單位:分鐘):
    
    實際召回率
        Recall@1:   1.0
    
  • output table結果範例。

    +------------+------------+------------+------------+
    | pk         | knn_result | score      | pt         |
    +------------+------------+------------+------------+
    | q1.nid     | 1.nid      | 4.0        | 20221111   |
    | q2.nid     | 3.nid      | 4.0        | 20221111   |
    | q3.nid     | 7.nid      | 32.0       | 20221111   |

百萬TopK檢索

得益於Proxima2.x核心的效能提升,Proxima CE能支援百萬量級的TopK檢索召回(即支援在百萬級向量中,快速檢索與查詢向量最相似的前K個結果),直接設定啟動參數-topk即可。