通過(guò)工作示例了解什么是向量數(shù)據(jù)庫(kù)、它們?nèi)绾螌?shí)現(xiàn) “相似性” 搜索以及它們可以在明顯的 LLM 空間之外的哪些地方使用。除非你一直生活在巖石下,否則你可能聽(tīng)說(shuō)過(guò)諸如生成式人工智能和大型語(yǔ)言模型(LLM)之類的術(shù)語(yǔ)。 除此之外,你很有可能聽(tīng)說(shuō)過(guò)向量數(shù)據(jù)庫(kù),它為 LLMs 的查詢提供上下文。 有沒(méi)有想過(guò)它們是什么以及它們?cè)诿黠@的 LLM 領(lǐng)域之外有何用處? 好吧,請(qǐng)繼續(xù)閱讀以了解這項(xiàng)令人興奮的新技術(shù),構(gòu)建您自己的向量數(shù)據(jù)庫(kù)并思考如何在你的項(xiàng)目中利用它,包括但不限于 LLMs。
以值匹配為中心的搜索的局限性
首先,讓我們看看到底缺少什么而引發(fā)了對(duì)不同類型數(shù)據(jù)庫(kù)技術(shù)的需求。 這是與搜索數(shù)據(jù)有關(guān)。 當(dāng)你在數(shù)據(jù)庫(kù)中聽(tīng)到 “搜索” 這個(gè)詞時(shí),你可能會(huì)立即想到正常的以數(shù)值或關(guān)鍵字為中心的搜索,例如:
- 相等:其中 customer_id = 123
- 比較:年齡大于 25 歲
- 通配符:客戶名稱以 “Mc” 開(kāi)頭,例如 “McDonald”
有時(shí),這些以價(jià)值為中心的搜索也相互依存,例如
其中年齡 (age)?> 25 且郵政編碼 (zipcode) = ‘12345’
現(xiàn)代數(shù)據(jù)庫(kù)技術(shù)在過(guò)去幾十年中不斷發(fā)展,提高了此類搜索的效率,我將其稱為 “以值為中心的搜索”,其中評(píng)估特定值以在查詢中進(jìn)行過(guò)濾。 雖然它們?cè)谠S多情況下都可以工作,可以說(shuō)在幾乎所有與業(yè)務(wù)相關(guān)的應(yīng)用程序中,但請(qǐng)考慮如下:
給我找一個(gè)像麗莎 (Lisa) 一樣的客戶
請(qǐng)注意所使用的過(guò)濾器:它并沒(méi)有詢問(wèn)姓名為 “Lisa” 的客戶; 只是像她這樣的人,即與 Lisa 相似的人。 相似是什么意思? 這是一個(gè)很難回答的問(wèn)題。 這不是名字,因?yàn)轭愃频目蛻艨赡鼙幻麨?Alice、Bob 或 Charlie。 難道是他們的年齡? 可能吧。 假設(shè)麗莎的年齡是 40 歲。40 歲的顧客最相似。 25 歲的客戶相似度會(huì)降低,55 歲的客戶也同樣不相似。
讓我們思考一下。 考慮這三位顧客各自的年齡。

如果我們畫一個(gè)圖表,將 Lisa 的余額放在中間,然后繪制其他的圖表,它將如下圖所示。 他們的年齡與 40 歲(麗莎的年齡)的距離顯示了他們距離該目標(biāo)有多遠(yuǎn)。 在本例中,我們表明 Bob 最相似,Charlie 最不相似,而 Alice 更相似一些。
年齡只是客戶的一方面。 在尋找 “像麗莎” 這樣的人時(shí),我們可能會(huì)想到更多的屬性; 不只是一個(gè)。 其中一個(gè)屬性可以是客戶的凈資產(chǎn),如下所示,添加到原始表中:

如果 Lisa 的凈資產(chǎn)是10萬(wàn),這些客戶之間會(huì)有什么新的相似之處? 我們可以創(chuàng)建一個(gè)以年齡和凈資產(chǎn)為兩個(gè)軸的二維圖表,如下圖所示。

然而,由于后者以千為單位,而前者以兩位數(shù)為單位,因此圖表將不成比例。 為了獲得相同的比例,我們需要將這些絕對(duì)值轉(zhuǎn)換為一些相對(duì)值以進(jìn)行比較。 年齡從 20 歲到 80 歲不等,即相差 60 歲。因此,Alice 與 Lisa 的年齡距離為 (40–20)/60 = 0.33。 同樣,凈資產(chǎn)的分布范圍為 50 到 200,即 150。同樣,Bob 的凈資產(chǎn)距離為 (200–100)/150 = 0.67。

我們發(fā)現(xiàn) Bob?的檔案不再與麗莎 “相似”。 為了找到復(fù)合距離,我們可以在二維圖上計(jì)算它們之間的距離,例如:
Composite Distance = Square Root of (Square of (Age Distance) + Square of (Net Worth Distance))
使用該公式,我們計(jì)算與 Lisa 的復(fù)合距離。

我們可能會(huì)發(fā)現(xiàn) Alice?距離 Lisa 的距離可能比 Bob 要近,而且和 Charlie 距離是最遠(yuǎn)。 只需添加一個(gè)維度即可顯著改變相似性。 考慮添加另一個(gè)維度,例如 “孩子的數(shù)量”,使其成為 3 維圖,這可能會(huì)進(jìn)一步改變物體與麗莎的距離。 實(shí)際上,對(duì)象有數(shù)百個(gè)屬性可供比較。 將所有這些都寫在紙上是不可能的。 但希望你能了解多維空間中兩點(diǎn)之間的距離。 距離越小,點(diǎn)越相似,0 表示在所有維度上完全相同。
點(diǎn)的屬性被捕獲為向量。 在上面的例子中,向量的維度將是 [Age,Net Worth]; 所以我們將按如下方式表示這些值。
代表 Lisa 的向量是 [40,100000]。 點(diǎn)之間的距離通常表示為歐幾里德距離,如下面二維空間的函數(shù) d() 所示。 資料來(lái)源:維基百科。
運(yùn)用 Elasticsearch 作為向量數(shù)據(jù)并計(jì)算距離
在上面,我們通過(guò)一個(gè)詳細(xì)的例子描述了如何把數(shù)據(jù)轉(zhuǎn)換為向量,并計(jì)算向量直接的距離。事實(shí)上,如果我們通過(guò)手動(dòng)的方式來(lái)計(jì)算,就顯得非常麻煩。Elasticsearch 作為全球下載量最多的向量數(shù)據(jù)庫(kù),我們可以很方便地利用它來(lái)幫我們進(jìn)行計(jì)算向量之間的相似性。下面,我們來(lái)通過(guò) Elasticsearch 來(lái)實(shí)現(xiàn)向量之間的相似性。
首先,我們?yōu)橄蛄康乃饕x一個(gè) mapping:
PUT my-index
{
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 2,
"similarity": "l2_norm"
},
"name" : {
"type" : "keyword"
}
}
}
}
請(qǐng)注意,在上面,我們定義了一個(gè)叫做 dense_vector 的數(shù)據(jù)類型。這個(gè)就是我們的向量數(shù)據(jù)類型。它的維度為 2。我們可以詳細(xì)參考 Elastic 官方文檔來(lái)了解這個(gè)數(shù)據(jù)類型。my_vector 的相似性,我們使用 l2_norm 來(lái)定義 similarity,它表明是歐幾里得距離。請(qǐng)?jiān)敿?xì)參閱文檔。
我們通過(guò)如下的命令來(lái)寫入數(shù)據(jù)到 Elasticsearch:
POST my-index/_bulk?refresh=true
{ "index" : { "_id" : "1" } }
{ "name" : "Alice", "my_vector": [20,100000] }
{ "index" : { "_id" : "2" } }
{ "name" : "Bob", "my_vector": [40,200000] }
{ "index" : {"_id" : "3" } }
{ "name" : "Charlie", "my_vector": [80,50000] }
我們可以通過(guò)如下的命令來(lái)查看寫入的數(shù)據(jù):
GET my_index/_search?filter_path=**.hits
上面的命令返回的響應(yīng)為:
"hits": {
"hits": [
{
"_index": "my_index",
"_id": "1",
"_score": 1,
"_source": {
"name": "Alice",
"my_vector": [
20,
100000
]
}
},
{
"_index": "my_index",
"_id": "2",
"_score": 1,
"_source": {
"name": "Bob",
"my_vector": [
40,
200000
]
}
},
{
"_index": "my_index",
"_id": "3",
"_score": 1,
"_source": {
"name": "Charlie",
"my_vector": [
80,
50000
]
}
}
]
}
}
我們可以通過(guò) Elasticsearch 來(lái)計(jì)算我們搜索對(duì)象 Lisa 的距離。搜索的結(jié)果將返回在我們的向量數(shù)據(jù)庫(kù)中最近的向量。它們是按照距離的大小進(jìn)行排序的。在上面的向量中,我們想找到一個(gè)最相近的 Lisa,而它的向量為 [40, 100000]。我們可以通過(guò)如下的方法來(lái)搜索我們的向量:
接下來(lái),我們使用 Elasticsearch 的 knn search 端點(diǎn)來(lái)進(jìn)行搜索:
POST my-index/_search?filter_path=**.hits
{
"knn": {
"field": "my_vector",
"query_vector": [40, 100000],
"k": 10,
"num_candidates": 100
}
}
上面的搜索結(jié)果是:
{
"hits": {
"hits": [
{
"_index": "my-index",
"_id": "1",
"_score": 0.0024937657,
"_source": {
"name": "Alice",
"my_vector": [
20,
100000
]
}
},
{
"_index": "my-index",
"_id": "3",
"_score": 3.9999976e-10,
"_source": {
"name": "Charlie",
"my_vector": [
80,
50000
]
}
},
{
"_index": "my-index",
"_id": "2",
"_score": 1e-10,
"_source": {
"name": "Bob",
"my_vector": [
40,
200000
]
}
}
]
}
如上所示,我們看到的結(jié)果是 Alice 排名是第一的,而緊隨其后的是 Charlie。而我們之前認(rèn)為的 Bob 是排在最后的一個(gè)。Bob 的距離是最遠(yuǎn)的,這個(gè)和之前的推送方法有一定的誤差,比如相對(duì)計(jì)算的方法不同。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-759531.html
更多有關(guān) Elasticsearch 向量搜索的內(nèi)容,請(qǐng)?jiān)敿?xì)閱讀文章 “AI”。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-759531.html
到了這里,關(guān)于Elasticsearch:向量數(shù)據(jù)庫(kù)的真相的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!