隨著 LLM (Large Language Model)& RAG (Retrieval-Augmented Generation)應用興起,vector db 成為了兵家必爭之地,ES 原本就以文本貯存作為主要核心,文本轉成的 vector 順理成章的成為了 ES 的拓展區域。
vector db 中的 vector 雖然沒有特別指定是哪一種 vector,但大部分的使用場景應該是 word to vector 的 vector,word to vector 是將文字序列從非結構化轉成結構化數值的一個過程,轉換出來的數值最常見是一串數字。
這串數值是怎麼被轉換出來的恕我沒有辦法在這邊講清楚,為了後續理解,可以把 word to vector 想像成一個黑盒子,一串文字進去會被翻譯成長度為 N 的一串數字,這串數字可以表徵語句在一個 N 維空間中的位置,這個空間中距離比較近的,語意也會比較靠近。
恩,所以把文字變成 vector 存進 vector db 首先需要一個翻譯器,這個翻譯器就是現在很紅的各種 LLM,LLM 為了讓電腦可以『懂』自然語言,所以丟了很多文本給它建構一個超大的語言空間,建構好之後除了可以讓你問他各種問題之外,也可以告訴你某一串文字組合在這個空間維度的 vector 是什麼。
我們取得 vector 之後,把 vector 存進 vector db,就可以透過距離計算,找出相似的語句,這就是 vector db 和其他 db 之間最大的差異點,vector db 特化了高維空間 vector 的存貯和距離計算功能。
ES 拿來存 Vector 這個類別的 field type 是 Dense Vector
,vector 之間距離的計算則是計算則是透過 KNN(k-nearest neighbor)Search。
To Store: Dense Vector
Dense Vector field type 相比於其他的 field type 有一些特殊的限制:
Dense Vector field 有幾個可以調整的設定,都是 optional:
float
, byte
或 bit
l2_norm
, dot_product
, cosine
或 max_inner_product
default:
{
type: int8_hnsw,
m: 16,
ef_construction: 100,
confience_interval: 1/(dims + 1)
}
allowed Value: 見官網
筆者註:如果你跟我一樣跟高維度的空間數學不是很熟,可以無腦使用預設:)
先到這,我要去研究怎麼產生 vector 寫入 ES,下一篇文章見。