關鍵詞感知檢索
本文主要介紹帶關鍵詞感知能力的向量檢索服務的優(yōu)勢、應用示例以及Sparse Vector生成工具。
背景介紹
關鍵詞檢索及其局限
在信息檢索領域,“傳統(tǒng)”方式是通過關鍵詞進行信息檢索,其大致過程為:
對原始語料(如網(wǎng)頁)進行關鍵詞抽取。
建立關鍵詞和原始語料的映射關系,常見的方法有倒排索引、TF-IDF、BM25等方法,其中TF-IDF、BM25通常用稀疏向量(Sparse Vector)來表示詞頻。
檢索時,對檢索語句進行關鍵詞抽取,并通過步驟2中建立的映射關系召回關聯(lián)度最高的TopK原始語料。
但關鍵詞檢索無法對語義進行理解。例如,檢索語句為“浙一醫(yī)院”,經(jīng)過分詞后成為“浙一”和“醫(yī)院”,這兩個關鍵詞都無法有效的命中用戶預期中的“浙江大學醫(yī)學院附屬第一醫(yī)院”這個目標。
基于語義的向量檢索
隨著人工智能技術日新月異的發(fā)展,語義理解Embedding模型能力的不斷增強,基于語義Embedding的向量檢索召回關聯(lián)信息的方式逐漸成為主流。其大致過程如下:
原始語料(如網(wǎng)頁)通過Embedding模型產(chǎn)生向量(Vector),又稱為稠密向量(Dense Vector)。
向量入庫向量檢索系統(tǒng)。
檢索時,檢索語句同樣通過Embedding模型產(chǎn)生向量,并用該向量在向量檢索系統(tǒng)中召回距離最近的TopK原始語料。
但不可否認的是,基于語義的向量檢索來召回信息也存在局限——必須不斷的優(yōu)化Embedding模型對語義的理解能力,才能取得更好的效果。例如,若模型無法理解“水稻灌溉”和“灌溉水稻”在語義上比較接近,就會導致無法通過“水稻灌溉”召回“灌溉水稻”相關的語料。而關鍵字檢索在這個例子上,恰好可以發(fā)揮其優(yōu)勢,通過“水稻”、“灌溉”關鍵字有效的召回相關語料。
關鍵詞檢索+語義檢索
針對上述問題,逐漸有業(yè)務和系統(tǒng)演化出來“兩路召回、綜合排序”的方法來解決,并且在效果上也超過了單純的關鍵字檢索或語義檢索,如下圖所示:
但這種方式的弊端也很明顯:
系統(tǒng)復雜度增加。
硬件資源(內存、CPU、磁盤等)開銷增加。
可維護性降低。
......
具有關鍵詞感知能力的語義檢索
向量檢索服務DashVector同時支持Dense Vector(稠密向量)和Sparse Vector(稀疏向量),前者用于模型的高維特征(Embedding)表達,后者用于關鍵詞和詞頻信息表達。DashVector可以進行關鍵詞感知的向量檢索,即Dense Vector和Sparse Vector結合的混合檢索。
DashVector帶關鍵詞感知能力的向量檢索能力,既有“兩路召回、綜合排序”方案的優(yōu)點,又沒有其缺點。使得系統(tǒng)復雜度、資源開銷大幅度降低的同時,還具備關鍵詞檢索、向量檢索、關鍵詞+向量混合檢索的優(yōu)勢,可滿足絕大多數(shù)業(yè)務場景的需求。
Sparse Vector(稀疏向量),稀疏向量是指大部分元素為0,僅少量元素非0的向量。在DashVector中,稀疏向量可用來表示詞頻等信息。例如,{1:0.4, 10000:0.6, 222222:0.8}
就是一個稀疏向量,其第1、10000、222222位元素(分別代表三個關鍵字)有非0值(代表關鍵字的權重),其他元素全部為0。
使用示例
前提條件
已創(chuàng)建Cluster:創(chuàng)建Cluster。
已獲得API-KEY:API-KEY管理。
已安裝最新版SDK:安裝DashVector SDK。
Step1. 創(chuàng)建支持Sparse Vector的Collection
需要使用您的api-key替換以下示例中的 YOUR_API_KEY、您的Cluster Endpoint替換示例中的YOUR_CLUSTER_ENDPOINT,代碼才能正常運行。單擊Cluster詳情了解如何查看Cluster Endpoint。
本示例僅對Sparse Vector進行功能演示,簡化起見,向量(Dense Vector)維度設置為4。
import dashvector
client = dashvector.Client(
api_key='YOUR_API_KEY',
endpoint='YOUR_CLUSTER_ENDPOINT'
)
ret = client.create('hybrid_collection', dimension=4, metric='dotproduct')
collection = client.get('hybrid_collection')
assert collection
僅內積度量(metric='dotproduct'
)支持Sparse Vector功能。
Step2. 插入帶有Sparse Vector的Doc
from dashvector import Doc
collection.insert(Doc(
id='A',
vector=[0.1, 0.2, 0.3, 0.4],
sparse_vector={1: 0.3, 10:0.4, 100:0.3}
))
向量檢索服務DashVector推薦使用DashText生成Sparse Vector。
Step3. 帶有Sparse Vector的向量檢索
docs = collection.query(
vector=[0.1, 0.1, 0.1, 0.1],
sparse_vector={1: 0.3, 20:0.7}
)
Sparse Vector生成工具
DashText,向量檢索服務DashVector推薦使用的SparseVectorEncoder,DashText。