關鍵詞感知檢索

DashVector發表於2024-11-14

本文主要介紹帶關鍵詞感知能力的向量檢索服務的優勢、應用示例以及Sparse Vector生成工具。

背景介紹

關鍵詞檢索及其侷限

在資訊檢索領域,"傳統"方式是透過關鍵詞進行資訊檢索,其大致過程為:

  1. 對原始語料(如網頁)進行關鍵詞抽取。

  2. 建立關鍵詞和原始語料的對映關係,常見的方法有倒排索引、TF-IDF、BM25等方法,其中TF-IDF、BM25通常用 稀疏向量(Sparse Vector) 來表示詞頻。

  3. 檢索時,對檢索語句進行關鍵詞抽取,並透過步驟2中建立的對映關係召回關聯度最高的TopK原始語料。

但關鍵詞檢索無法對語義進行理解。例如,檢索語句為"浙一醫院",經過分詞後成為"浙一"和"醫院",這兩個關鍵詞都無法有效的命中使用者預期中的"浙江大學醫學院附屬第一醫院"這個目標。

基於語義的向量檢索

隨著人工智慧技術日新月異的發展,語義理解Embedding模型能力的不斷增強,基於語義Embedding的向量檢索召回關聯資訊的方式逐漸成為主流。其大致過程如下:

  1. 原始語料(如網頁)透過Embedding模型產生 向量(Vector) ,又稱為 稠密向量(Dense Vector)。

  2. 向量入庫向量檢索系統。

  3. 檢索時,檢索語句同樣透過Embedding模型產生向量,並用該向量在向量檢索系統中召回距離最近的TopK原始語料。

但不可否認的是,基於語義的向量檢索來召回資訊也存在侷限------必須不斷的最佳化Embedding模型對語義的理解能力,才能取得更好的效果。例如,若模型無法理解"水稻灌溉"和"灌溉水稻"在語義上比較接近,就會導致無法透過"水稻灌溉"召回"灌溉水稻"相關的語料。而關鍵字檢索在這個例子上,恰好可以發揮其優勢,透過"水稻"、"灌溉"關鍵字有效的召回相關語料。

關鍵詞檢索+語義檢索

針對上述問題,逐漸有業務和系統演化出來"兩路召回、綜合排序"的方法來解決,並且在效果上也超過了單純的關鍵字檢索或語義檢索,如下圖所示:

但這種方式的弊端也很明顯:

  1. 系統複雜度增加。

  2. 硬體資源(記憶體、CPU、磁碟等)開銷增加。

  3. 可維護性降低。

  4. ......

具有關鍵詞感知能力的語義檢索

向量檢索服務DashVector同時支援Dense Vector(稠密向量)和Sparse Vector(稀疏向量),前者用於模型的高維特徵(Embedding)表達,後者用於關鍵詞和詞頻資訊表達。DashVector可以進行關鍵詞感知的向量檢索,即Dense Vector和Sparse Vector結合的混合檢索。

DashVector帶關鍵詞感知能力的向量檢索能力,既有"兩路召回、綜合排序"方案的優點,又沒有其缺點。使得系統複雜度、資源開銷大幅度降低的同時,還具備關鍵詞檢索、向量檢索、關鍵詞+向量混合檢索的優勢,可滿足絕大多數業務場景的需求。

說明

Sparse Vector(稀疏向量),稀疏向量是指大部分元素為0,僅少量元素非0的向量。在DashVector中,稀疏向量可用來表示詞頻等資訊。例如,{1:0.4, 10000:0.6, 222222:0.8}就是一個稀疏向量,其第1、10000、222222位元素(分別代表三個關鍵字)有非0值(代表關鍵字的權重),其他元素全部為0。

使用示例

前提條件

  • 已建立Cluste
  • 已獲得API-KEY
  • 已安裝最新版SDK

Step1. 建立支援Sparse Vector的Collection

說明

  1. 需要使用您的api-key替換以下示例中的 YOUR_API_KEY、您的Cluster Endpoint替換示例中的YOUR_CLUSTER_ENDPOINT,程式碼才能正常執行。
  2. 本示例僅對Sparse Vector進行功能演示,簡化起見,向量(Dense Vector)維度設定為4。

Python示例:

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

Python示例:

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推薦使用快速開始生成Sparse Vector。

Step3. 帶有Sparse Vector的 向量檢索

Python示例:

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

相關文章