Elasticsearch:向量數據庫的真相

通過工作示例了解什么是向量數據庫、它們如何實現 “相似性” 搜索以及它們可以在明顯的 LLM 空間之外的哪些地方使用。除非你一直生活在巖石下,否則你可能聽說過諸如生成式人工智能和大型語言模型(LLM)之類的術語。 除此之外,你很有可能聽說過向量數據庫,它為 LLMs 的查詢提供上下文。 有沒有想過它們是什么以及它們在明顯的 LLM 領域之外有何用處? 好吧,請繼續閱讀以了解這項令人興奮的新技術,構建您自己的向量數據庫并思考如何在你的項目中利用它,包括但不限于 LLMs。

以值匹配為中心的搜索的局限性

首先,讓我們看看到底缺少什么而引發了對不同類型數據庫技術的需求。 這是與搜索數據有關。 當你在數據庫中聽到 “搜索” 這個詞時,你可能會立即想到正常的以數值或關鍵字為中心的搜索,例如:

  • 相等:其中 customer_id = 123
  • 比較:年齡大于 25 歲
  • 通配符:客戶名稱以 “Mc” 開頭,例如 “McDonald”

有時,這些以價值為中心的搜索也相互依存,例如

其中年齡 (age)?> 25 且郵政編碼 (zipcode) = ‘12345’

現代數據庫技術在過去幾十年中不斷發展,提高了此類搜索的效率,我將其稱為 “以值為中心的搜索”,其中評估特定值以在查詢中進行過濾。 雖然它們在許多情況下都可以工作,可以說在幾乎所有與業務相關的應用程序中,但請考慮如下:

給我找一個像麗莎 (Lisa) 一樣的客戶

請注意所使用的過濾器:它并沒有詢問姓名為 “Lisa” 的客戶; 只是像她這樣的人,即與麗莎相似的人。 相似是什么意思? 這是一個很難回答的問題。 這不是名字,因為類似的客戶可能被命名為 Alice、Bob 或 Chris。 難道是他們的年齡? 可能吧。 假設麗莎的年齡是 40 歲。40 歲的顧客最相似。 25 歲的客戶相似度會降低,55 歲的客戶也同樣不相似。

讓我們思考一下。 考慮這三位顧客各自的年齡。

顧客及其年齡

如果我們畫一個圖表,將 Lisa 的余額放在中間,然后繪制其他的圖表,它將如下圖所示。 他們的年齡與 40 歲(麗莎的年齡)的距離顯示了他們距離該目標有多遠。 在本例中,我們表明 Bob 最相似,Charlie 最不相似,而 Alice 更相似一些。

年齡只是客戶的一方面。 在尋找 “像麗莎” 這樣的人時,我們可能會想到更多的屬性; 不只是一個。 其中一個屬性可以是客戶的凈資產,如下所示,添加到原始表中:

具有兩個屬性的客戶:年齡和凈資產

如果 Lisa 的凈資產是10萬,這些客戶之間會有什么新的相似之處? 我們可以創建一個以年齡和凈資產為兩個軸的二維圖表,如下圖所示。

二維客戶年齡和凈資產 (注意上面 Y 軸的單位是 “千”)

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

顧客與 Lisa 的相對距離

我們發現 Bon 的檔案不再與麗莎 “相似”。 為了找到復合距離,我們可以在二維圖上計算它們之間的距離,例如:

Composite Distance = Square Root of (Square of (Age Distance) + Square of (Net Worth Distance))

使用該公式,我們計算與 Lisa 的復合距離。

客戶與 Lisa 的復合距離

我們可能會發現 Alice?距離 Lisa 的距離可能比 Bob 要近,而且和 Charlie 距離是最遠。 只需添加一個維度即可顯著改變相似性。 考慮添加另一個維度,例如 “孩子的數量”,使其成為 3 維圖,這可能會進一步改變物體與麗莎的距離。 實際上,對象有數百個屬性可供比較。 將所有這些都寫在紙上是不可能的。 但希望你能了解多維空間中兩點之間的距離。 距離越小,點越相似,0 表示在所有維度上完全相同。

點的屬性被捕獲為向量。 在上面的例子中,向量的維度將是 [Age,Net Worth]; 所以我們將按如下方式表示這些值。

代表 Lisa 的向量是 [40,100000]。 點之間的距離通常表示為歐幾里德距離,如下面二維空間的函數 d() 所示。 資料來源:維基百科。

運用 Elasticsearch 作為向量數據并計算距離

在上面,我們通過一個詳細的例子描述了如何把數據轉換為向量,并計算向量直接的距離。事實上,如果我們通過手動的方式來計算,就顯得非常麻煩。Elasticsearch 作為全球下載量最多的向量數據庫,我們可以很方便地利用它來幫我們進行計算向量之間的相似性。下面,我們來通過 Elasticsearch 來實現向量之間的相似性。

首先,我們為向量的索引定義一個 mapping:

PUT my-index
{"mappings": {"properties": {"my_vector": {"type": "dense_vector","dims": 2,"similarity": "l2_norm"},"name" : {"type" : "keyword"}}}
}

請注意,在上面,我們定義了一個叫做 dense_vector 的數據類型。這個就是我們的向量數據類型。它的維度為 2。我們可以詳細參考 Elastic 官方文檔來了解這個數據類型。my_vector 的相似性,我們使用 l2_norm 來定義 similarity,它表明是歐幾里得距離。請詳細參閱文檔。

我們通過如下的命令來寫入數據到 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] }

我們可以通過如下的命令來查看寫入的數據:

GET my_index/_search?filter_path=**.hits

上面的命令返回的響應為:

  "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]}}]}
}

我們可以通過 Elasticsearch 來計算我們搜索對象 Lisa 的距離。搜索的結果將返回在我們的向量數據庫中最近的向量。它們是按照距離的大小進行排序的。在上面的向量中,我們想找到一個最相近的 Lisa,而它的向量為 [40, 100000]。我們可以通過如下的方法來搜索我們的向量:

接下來,我們使用 Elasticsearch 的 knn search 端點來進行搜索:

POST my-index/_search?filter_path=**.hits
{"knn": {"field": "my_vector","query_vector": [40, 100000],"k": 10,"num_candidates": 100}
}

上面的搜索結果是:

{"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]}}]}

如上所示,我們看到的結果是 Alice 排名是第一的,而緊隨其后的是 Charlie。而我們之前認為的 Bob 是排在最后的一個。Bob 的距離是最遠的,這個和之前的推送方法有一定的誤差,比如相對計算的方法不同。

更多有關 Elasticsearch 向量搜索的內容,請詳細閱讀文章 “AI”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211061.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何利用Axure制作移動端產品原型

Axure是一款專業的快速原型設計工具,作為專業的原型設計工具,Axure 能夠快速、高效地創建原型,同時支持多人協作設計和版本控制管理。它已經得到了許多大公司的采用,如IBM、微軟、思科、eBay等,這些公司都利用Axure 進…

android 13.0 Settings去掉二級三級菜單搜索功能

1.概述 在13.0的系統rom定制化開發中,由于客戶定制開發需求,需要去掉Settings里面的搜索功能,主頁面的搜索功能,在前面的章節已經講了 這里需要去掉二級三級菜單的搜索功能,需要從搜索功能流程分析去掉搜索功能 2.Settings去掉二級三級菜單搜索功能核心代碼 packages/ap…

stl模板庫成員函數重載類型混肴編譯不通過解決方法

stl模板庫成員函數重載類型混肴編譯不通過解決方法 這種方式編譯不通過IsArithmetic和HasMemberList編譯器存在混肴 template <typename T, typename Enable std::enable_if<IsArithmetic<T>::value>::type >static void DumpWrapper(T* filed, std::strin…

SAP UI5 walkthrough step7 JSON Model

這個章節&#xff0c;幫助我們理解MVC架構中的M 我們將會在APP中新增一個輸入框&#xff0c;并將輸入的值綁定到model&#xff0c;然后將其作為描述&#xff0c;直接顯示在輸入框的右邊 首先修改App.controllers.js webapp/controller/App.controller.js sap.ui.define([&…

python變量的命名和使用

變量名只能包含字母、數字和下劃線 變量名只能包含字母、數字和下劃線。變量名可以字母或下劃線打頭&#xff0c;但不能以數字打頭。例如&#xff0c;可將變量命名為message_1&#xff0c;但不能將其命名為1_message。 Python 語言中&#xff0c;以下劃線開頭的標識符有特殊含…

Redis server啟動源碼

入口main函數 src/redis.c文件main函數 int main(int argc, char **argv) {struct timeval tv;/* We need to initialize our libraries, and the server configuration. */// 初始化庫 #ifdef INIT_SETPROCTITLE_REPLACEMENTspt_init(argc, argv); #endif//設置本地時間setl…

翻譯: 生成式人工智能的經濟潛力 第3部分工作和生產力的影響 The economic potential of generative AI

麥肯錫報告 翻譯: 生成式人工智能的經濟潛力 第一部分商業價值 The economic potential of generative AI翻譯: 生成式人工智能的經濟潛力 第2部分行業影響 The economic potential of generative AI 1. 工作和生產力的影響 技術幾十年來一直在改變工作的解剖學。多年來&…

vue全屏事件與關閉全屏事件

首先&#xff0c;在 Vue 組件中&#xff0c;可以使用 click 或者 v-on 來監聽點擊事件&#xff0c;然后通過調用相應的方法來觸發全屏或關閉全屏。 執行requestFullscreen事件 <template><div><button click"enterFullScreen">進入全屏</butt…

前端知識(十二)———ES6迭代器

ES6中的迭代器是一種新的對象&#xff0c;它具有一個next()方法。next()方法返回一個對象&#xff0c;這個對象包含兩個屬性&#xff1a;value和done。value屬性是迭代器中的下一個值&#xff0c;done屬性是一個布爾值&#xff0c;表示迭代器是否已經遍歷完所有的值。迭代器是一…

js實現在線預覽(PC)圖片(jpg、png)、pdf、excel(xlsx)、docx

js實現圖片預覽 參考&#xff1a;添加鏈接描述 圖片預覽 本來用的是element-plus自帶的組件el-image&#xff0c;但是去不掉縮略圖&#xff0c;所以換成了el-imag-viewer組件&#xff08;圖片可拖拽&#xff09;&#xff0c;由于用的vite沒有require方法&#xff0c;需要自己處…

c++新經典模板與泛型編程:const修飾符的移除與增加

const修飾符的移除 讓你來寫移除const修飾符&#xff0c;你會怎么樣來寫&#xff1f; &#x1f602;&#x1f602;trait類模板&#xff0c;如下 #include <iostream>// 泛化版本 template<typename T> struct RemoveConst {using type T; };// 特化版本 template…

docker-compose 常用命令和指令

目錄 1. 概要 2. 常用的docker-compose命令 2.1、image 2.2、build 2.3、command 2.4、links 2.5、external_links 2.6、ports 1.7、expose 1.8、volumes 1.9、volumes_from 1.10、environment 1.11、networks 1. 概要 默認的模板文件是 docker-compose.yml&…

阿里云(云服務器)上搭建項目部署環境

目錄 安裝docker docker安裝MySQL5.7.37 安裝MySQL 方式一&#xff1a;docker中MySQL時區調整 方式二&#xff1a;docker中MySQL時區調整 docker安裝MySQL8.0.27 docker安裝redis5.0.14 云服務器上安裝jdk1.8 安裝docker 1、先卸載docker&#xff0c;因為有一些服務器…

西南科技大學C++程序設計實驗十(函數模板與類模板)

一、實驗目的 1. 掌握函數模板與類模板; 2. 掌握數組類、鏈表類等線性群體數據類型定義與使用; 二、實驗任務 1. 分析完善以下程序,理解模板類的使用: (1)補充類模板聲明語句。 (2)創建不同類型的類對象,使用時明確其數據類型? _template<typename T>__…

c-語言->數據在內存的存儲

系列文章目錄 文章目錄 系列文章目錄前言 前言 目的&#xff1a;學習整數在內存的儲存&#xff0c;什么是大小端&#xff0c;浮點數的儲存。 1. 整數在內存中的存儲 在講解操作符的時候&#xff0c;我們就講過了下?的內容&#xff1a; 整數的2進制表??法有三種&#xff0…

設計模式之觀察者模式(主題對象發生變化,通知各個觀察者)

當涉及到電商場景時&#xff0c;觀察者模式可以用于處理多種情況&#xff0c;比如訂單狀態更新、庫存變化、用戶積分變化等。下面是一個簡化的訂單狀態更新的觀察者模式案例。 1.首先&#xff0c;定義一個主題接口 OrderSubject /*** Description:主題&#xff0c;用于管理觀察…

基于Java會員管理系統

基于Java會員管理系統 功能需求 1、會員信息管理&#xff1a;該系統需要提供會員信息管理功能&#xff0c;包括會員的姓名、性別、年齡、聯系方式等基本信息。同時&#xff0c;還需要提供會員的消費記錄、積分、優惠券等信息的管理。 2、會員注冊和登錄&#xff1a;系統需要…

動手學習深度學習-跟李沐學AI-自學筆記(3)

一、深度學習硬件-CPU和GPU 芯片&#xff1a;Intel or AMD 內存&#xff1a;DDR4 顯卡&#xff1a;nVidia 芯片可以和GPU與內存通信 GPU不能和內存通信 1. CPU 能算出每一秒能運算的浮點運算數&#xff08;大概0.15左右&#xff09; 1.1 提升CPU利用率 1.1.1 提升緩存…

自動駕駛學習筆記(十六)——目標跟蹤

#Apollo開發者# 學習課程的傳送門如下&#xff0c;當您也準備學習自動駕駛時&#xff0c;可以和我一同前往&#xff1a; 《自動駕駛新人之旅》免費課程—> 傳送門 《Apollo 社區開發者圓桌會》免費報名—>傳送門 文章目錄 前言 匹配關聯 軌跡記錄 狀態預測 總結 前…

【文件上傳系列】No.2 秒傳(原生前端 + Node 后端)

上一篇文章 【文件上傳系列】No.1 大文件分片、進度圖展示&#xff08;原生前端 Node 后端 & Koa&#xff09; 秒傳效果展示 秒傳思路 整理的思路是&#xff1a;根據文件的二進制內容生成 Hash 值&#xff0c;然后去服務器里找&#xff0c;如果找到了&#xff0c;說明已經…