本文介紹向量檢索服務DashVector動態量化功能和作用。
背景介紹
量化(Quantization)是向量檢索技術中一種常用的最佳化方法,透過一定程度的精度(召回率)損失,來換取效能的大幅度提升,以及記憶體佔用(索引檔案大小)大幅度降低。
向量檢索服務DashVector支援向量的動態量化,使用者僅需在新建Collection時選擇對應的量化策略,即可無感的使用量化功能。
重要
量化功能 侷限性 說明:現階段,開啟量化功能的Collection無法使用Sparse Vector功能。若您有量化+SparseVector結合使用的需求,可加群(官方釘釘群:25130022704)聯絡我們。
開啟動態量化
前提條件
- 已建立Cluster
- 已獲得API-KEY
- 已安裝最新版SDK
程式碼示例
說明
-
需要使用您的api-key替換示例中的YOUR_API_KEY、您的Cluster Endpoint替換示例中的YOUR_CLUSTER_ENDPOINT,程式碼才能正常執行。
-
Cluster Endpoint,可在控制檯"Cluster詳情"中檢視。
import dashvector
import numpy as np
from dashvector import VectorParam
client = dashvector.Client(
api_key='YOUR_API_KEY',
endpoint='YOUR_CLUSTER_ENDPOINT'
)
assert client
# 建立帶有量化策略的collection
ret = client.create('quantize_demo',
vectors=VectorParam(768, quantize_type='DT_VECTOR_INT8'))
print(ret)
collection = client.get('quantize_demo')
# 正常寫入向量資料,該向量資料會按照建立collection時定義的量化策略自動進行量化
collection.insert(('1', np.random.rand(768).astype('float32')))
# 透過id獲取對應的doc,需注意,這裡獲取到的向量資料是經過反量化後的近似值,非插入時的原值
doc = collection.fetch('1')
# 若檢索時設定返回向量資料,返回的向量資料同樣是經過反量化後的近似值,非插入時的原值
docs = collection.query(
vector=np.random.rand(768).astype('float32'),
include_vector=True
)
說明
透過獲取Doc獲取到的向量資料,是經過反量化後的近似值,非插入時的原值。
引數描述
建立Collection時可透過VectorParam
類的quantize_type
欄位來定義量化策略。quantize_type
當前可選值如下:
DT_VECTOR_INT8
:將Float32向量量化為INT8型別
效能和召回率參考
基於1百萬768維資料集
-
DashVector規格 :P.large
-
度量方式 :cosine
-
topk :100
說明
-
可以看到這個示例中,以4.38%的召回率下降為代價,將索引大小縮減為原來的1/3,同時QPS提升了48%。
-
以上資料為基於Cohere資料集實測結果,但不同資料集的資料分佈對QPS、召回以及壓縮比有影響,上述資料僅供參考。
更多參考
重要
可以看到,DashVector量化策略並非適用於所有資料集。在實際生產環境中,請謹慎使用量化策略。
建議建立不帶量化策略、帶量化策略的兩個Collection,經過實際對比、測試、驗證後再確定是否可將量化策略用於生產環境。