如何在 Elasticsearch 中選擇精確 kNN 搜索和近似 kNN 搜索

作者:來自 Elastic?Carlos Delgado

kNN 是什么?

語義搜索(semantic search)是相關性排名的強大工具。 它使你不僅可以使用關鍵字,還可以考慮文檔和查詢的實際含義。

語義搜索基于向量搜索(vector search)。 在向量搜索中,我們要搜索的文檔具有為其計算的向量嵌入。 這些嵌入是使用機器學習模型計算的,并作為向量返回,與我們的文檔數據一起存儲。

執行查詢時,將使用相同的機器學習模型來計算查詢文本的嵌入。 語義搜索包括通過將查詢嵌入與文檔嵌入進行比較來查找最接近查詢的結果。

kNN(或 k nearest neighbors - k 最近鄰)是一種用于獲取與特定嵌入最接近的前 k 個結果的技術。

使用嵌入計算查詢的 kNN 有兩種主要方法:精確和近似。 這篇文章將幫助你:

  • 了解什么是精確和近似 kNN 搜索
  • 如何為這些方法準備索引
  • 如何確定哪種方法最適合你的用例

精確 kNN:搜索所有內容

計算更接近結果的一種方法是將所有現有文檔嵌入與查詢的文檔嵌入進行比較。 這將確保我們獲得盡可能最接近的匹配,因為我們將比較所有匹配。 我們的搜索結果將盡可能準確,因為我們正在考慮整個文檔語料庫并將所有文檔嵌入與查詢嵌入進行比較。

當然,與所有文檔進行比較有一個缺點:需要時間。 我們將使用相似度函數對所有文檔逐一計算嵌入相似度。 這也意味著我們將線性擴展 —— 文檔數量增加一倍可能需要兩倍的時間。

可以使用 script_score 和用于計算向量之間相似度的向量函數在向量場上進行精確搜索。

近似 kNN:一個很好的估計

另一種方法是使用近似值而不是考慮所有文檔。 為了提供 kNN 的有效近似,Elasticsearch 和 Lucene 使用分層導航小世界 HNSW (Hierachical Navigation Small Worlds)。

HNSW 是一種圖數據結構,它維護不同層中靠近的元素之間的鏈接。 每層都包含相互連接的元素,并且還與其下方層的元素相連接。 每層包含更多元素,底層包含所有元素。

圖 1 - HNSW 圖示例。 頂層包含開始搜索的初始節點。 這些初始節點充當較低層的入口點,每個層包含更多節點。 下層包含所有節點。

可以把它想象成開車:有高速公路、道路和街道。在高速公路上行駛時,你會看到一些描述高層次區域(如城鎮或社區)的出口標志。然后你會到達一條有具體街道指示的道路。一旦你到達某條街道,你就可以找到具體的地址,以及同一社區內的其他地址。

HNSW(Hierarchical Navigable Small World)結構類似于此,它創建了不同層次的向量嵌入。它計算離初始查詢較近的 “高速公路”,選擇看起來更有希望的出口,繼續尋找更接近目標地址的地方。這在性能方面非常優秀,因為它不必考慮所有文檔,而是使用這種多層次的方法快速找到接近目標的近似結果。

但是,這只是一個近似值。并不是所有節點都是互聯的,這意味著可能會忽略某些更接近特定節點的結果,因為它們可能沒有連接。節點的互聯程度取決于 HNSW 結構的創建方式。

HNSW 的效果取決于多個因素:

  • 它是如何構建的。HNSW 的構建過程會考慮一定數量的候選節點,作為某一特定節點的近鄰。增加考慮的候選節點數量會使結構更精確,但會在索引時花費更多時間。dense vector index_options 中的 ef_construction 參數用于此目的。

  • 搜索時考慮的候選節點數量。在尋找更近結果時,過程會跟蹤一定數量的候選節點。這個數量越大,結果越精確,但搜索速度會變慢。kNN 參數中的 num_candidates 控制這種行為。

  • 我們搜索的分段數量。每個分段都有一個需要搜索的 HNSW 圖,其結果需要與其他分段圖的結果結合。分段越少,搜索的圖就越少(因此速度更快),但結果集的多樣性會減少(因此精度較低)。

總的來說,HNSW 在性能和召回率之間提供了良好的權衡,并允許在索引和查詢兩方面進行微調。

使用 HNSW 進行搜索可以在大多數情況下通過 kNN 搜索部分完成。對于更高級的用例,也可以使用 kNN 查詢,例如:

  • 將 kNN 與其他查詢結合(作為布爾查詢或固定查詢的一部分)
  • 使用 function_score 微調評分
  • 提高聚合和字段折疊(field collapse)的多樣性

你可以在這篇文章中查看關于 kNN 查詢及其與 kNN 搜索部分的區別。我們將在下面深入討論何時使用這種方法與其他方法。

為精確和近似搜索建立索引

dense_vector 字段類型

對于存儲嵌入,dense_vector 字段有兩種主要的索引類型可供選擇:

  1. flat 類型(包括 flat 和 int8_flat):存儲原始向量,不添加 HNSW 數據結構。使用 flat 索引類型的 dense_vector 將始終使用精確的 kNN,kNN 查詢將執行精確查詢而不是近似查詢。

  2. HNSW 類型(包括 hnsw 和 int8_hnsw):創建 HNSW 數據結構,允許使用近似 kNN 搜索。

這是否意味著你不能對 HNSW 字段類型使用精確的 kNN?并非如此!你可以通過 script_score 查詢使用精確 kNN,也可以通過 kNN 部分和 kNN 查詢使用近似 kNN。這樣可以根據你的搜索用例提供更多的靈活性。

使用 HNSW 字段類型意味著需要構建 HNSW 圖結構,這需要時間、內存和磁盤空間。如果你只會使用精確搜索,可以使用 flat 向量字段類型。這確保了你的嵌入索引是最佳的,并且占用更少的空間。

請記住,在任何情況下都應避免將嵌入存儲在 _source 中,以減少存儲需求。

量化

使用量化技術,無論是 flat(int8_flat)還是 HNSW(int8_hnsw)類型的索引,都可以幫助你減少嵌入的大小,從而使用更少的內存和磁盤存儲來保存嵌入信息。

由于搜索性能依賴于盡可能多地將嵌入存儲在內存中,因此你應該始終尋找減少數據的方法。使用量化是在內存和召回率之間進行權衡。

如何在精確搜索和近似搜索之間做出選擇?

沒有一種適用于所有情況的答案。你需要考慮多個因素,并進行實驗,以找到性能和準確性之間的最佳平衡:

數據規模

不應該不惜一切代價避免搜索所有內容。根據你的數據規模(文檔數量和嵌入維度),進行精確的 kNN 搜索可能是合理的。

作為一個經驗法則,如果需要搜索的文檔少于一萬,可能表明應該使用精確搜索。請記住,可以提前過濾需要搜索的文檔數量,因此通過應用過濾條件可以限制實際需要搜索的文檔數量。

近似搜索在文檔數量方面具有更好的擴展性,因此如果你有大量文檔需要搜索,或者預計文檔數量會顯著增加,應該選擇近似搜索。

圖 2 - 使用 so_vector rally track 中 768 維向量進行精確和近似 kNN 的示例運行。該示例展示了精確 kNN 的線性運行時間與 HNSW 搜索的對數運行時間。

過濾 - filtering

過濾非常重要,因為它減少了需要考慮搜索的文檔數量。在決定使用精確搜索還是近似搜索時,需要考慮這一點。可以使用 query filters 來減少需要考慮的文檔數量,無論是精確搜索還是近似搜索。

然而,近似搜索在過濾時采用了不同的方法。在使用 HNSW 進行近似搜索時,查詢過濾器將在檢索到前 k 個結果后應用。這就是為什么與 kNN 查詢一起使用查詢過濾器被稱為 kNN 的后過濾。

圖 3 - kNN 搜索中的后過濾。

這種特定的 kNN 查詢過濾器被稱為 kNN 預過濾器,因為它在檢索結果之前應用,而不是之后。因此,在使用 kNN 查詢的上下文中,常規查詢過濾器被稱為后過濾器。

幸運的是,還有另一種與 kNN 一起使用的方法,即在 kNN 查詢本身中指定過濾器。 當遍歷 HNSW 圖收集結果時,此過濾器適用于圖元素,而不是事后應用。 這確保返回前 k 個元素,因為將遍歷圖 - 跳過未通過過濾器的元素 - 直到我們獲得前 k 個元素。

即將推出的功能

即將推出的一些改進將有助于精確和近似 kNN。

Elasticsearch 將增加將 dense_vector 類型從 flat 升級到 HNSW 的功能。這意味著你可以先使用 flat 向量類型進行精確 kNN,當需要擴展時可以開始使用 HNSW。使用近似 kNN 時,你的段將透明地被搜索,并在合并時自動轉換為 HNSW。

一個新的精確 kNN 查詢將被添加,以便使用簡單的查詢來對 flat 和 HNSW 字段進行精確 kNN,而不是依賴于 script score 查詢。這將使精確 kNN 更加簡便。

結論

那么,你應該在文檔上使用近似 kNN 還是精確 kNN 呢?請檢查以下幾點:

  • 文檔數量:如果少于一萬(應用過濾器后),可能適合使用精確搜索。
  • 你的搜索是否使用了過濾器:這會影響要搜索的文檔數量。如果需要使用近似 kNN,請記住使用 kNN 預過濾器以獲取更多結果,代價是性能下降。

你可以通過使用 HNSW dense_vector 進行索引,并將 kNN 搜索與 script_score 進行精確 kNN 的對比,來比較兩種方法的性能。這允許在使用相同字段類型的情況下比較兩種方法(如果決定使用精確搜索,請記住將 dense_vector 字段類型更改為 flat)。

祝你搜索愉快!

準備將 RAG 集成到你的應用中嗎?想嘗試在向量數據庫中使用不同的 LLMs 嗎? 查看我們在 Github 上的 LangChain、Cohere 等示例筆記本,并參加即將開始的 Elasticsearch 工程師培訓吧!

原文:kNN in Elasticsearch: How to choose between exact and approximate kNN search — Elastic Search Labs

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

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

相關文章

Angular Ivy:新渲染引擎的性能提升與優化

Angular Ivy是Angular 9及更高版本中引入的默認渲染引擎,它取代了以前的View Engine。Ivy的目標是提高Angular的性能、減少包大小和提高開發者的生產力。 1. AOT編譯的改進: 在Ivy中,Angular使用了更早的AOT(Ahead-of-Time&…

在AnolisOS8.9系統安裝docker-compose

在AnolisOS8.9系統安裝docker-compose 下載docker-compose之前請先確保docker已經安裝完,教程可以參考 在阿里Anolis OS 8.9龍蜥操作系統安裝docker 下載最新版的docker-compose文件 sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0…

大數據工具之HIVE-參數調優,調度亂碼(二)

一、調度亂碼 在利用HUE工具,搭建WORKFLOW流程的過程中,如果直接執行hivesql數據正常,不會出現亂碼現象,如果利用WORKFLOW搭建的流程,進行數據的拉取,會出現數據中文亂碼現象,這些亂碼主要是由于select 中的硬編碼中文導致出現的現象 具體現象如下: select case when …

百度 提前批 國際化廣告部 (深圳-機器學習/數據挖掘/自然語言處理工程師) 一面+二面面經

文章目錄 0、面試情況1、一面1.1、簡歷上的項目介紹了個遍1.2、dbscan原理1.3、為什么梯度的負方向就是損失函數下降最快的方向?1.4、bn原理,為什么bn能解決過擬合,1.5、auc原理,為什么ctr或你的廣告推薦里用auc指標?1…

TG5032CGN TCXO 超高穩定10pin端子型適用于汽車動力轉向控制器

TG5032CGN TCXO / VC-TCXO是一款應用廣泛的晶振,具有超高穩定性,CMOS輸出和使用晶體基振的削波正弦波輸出形式。且有低相位噪聲優勢,是溫補晶體振蕩器(TCXO)和壓控晶體振蕩器(VCXO)結合的產物,具有TCXO和VCXO的共同優點&#xff0…

后臺接口返回void但是response有設置合適的相關信息,前端調用接口解析Blob數據下載excel文件

1、pom.xml文件增加依賴&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency> 2、接口代碼如下&#xff1a; /*** 企業列表--導出*/GetMapping(value "/downloadTenantL…

微信小程序上線必備:SSL證書申請以及安裝

一、認識ssl證書 1、ssl證書是什么&#xff1f; SSL證書&#xff0c;全稱Secure Socket Layer Certificate&#xff0c;是一種數字證書&#xff0c;它遵循SSL&#xff08;現在通常指TLS&#xff0c;Transport Layer Security&#xff09;協議標準&#xff0c;用于在客戶端&…

SpringCloud系列(26)--OpenFeign超時控制

前言&#xff1a;在上一章節中我們簡單的介紹了如何使用OprnFeign去調用微服務&#xff0c;因為消費側和服務側是兩個不同的微服務&#xff0c;這樣可能會出現超時的現象&#xff0c;例如服務側需要3秒處理任何才能返回結果&#xff0c;但消費側可能2秒就斷開連接了&#xff0c…

【深度學習】2.單層感知機

目標&#xff1a; 實現一個簡單的二分類模型的訓練過程&#xff0c;通過模擬數據集進行訓練和優化&#xff0c;訓練目標是使模型能夠根據輸入特征正確分類數據。 演示: 1.通過PyTorch生成了一個模擬的二分類數據集&#xff0c;包括特征矩陣data_x和對應的標簽數據data_y。標簽…

加密與安全_AES RSA 密鑰對生成及PEM格式的代碼實現

文章目錄 RSA&#xff08;非對稱&#xff09;和AES&#xff08;對稱&#xff09;加密算法一、RSA&#xff08;Rivest-Shamir-Adleman&#xff09;二、AES&#xff08;Advanced Encryption Standard&#xff09; RSA加密三種填充模式一、RSA填充模式二、常見的RSA填充模式組合三…

新業務 新市場 | 靈途科技新品亮相馬來西亞亞洲防務展

5月6日&#xff0c;靈途科技攜新品模組與武漢長盈通光電&#xff08;股票代碼&#xff1a;688143&#xff09;攜手參加第18屆馬來西亞亞洲防務展。首次亮相海外&#xff0c;靈途科技便收獲全球客戶的廣泛關注&#xff0c;為公司海外市場開拓打下堅實基礎。 靈途科技與長盈通共同…

Dbs封裝_連接池

1.Dbs封裝 每一個數據庫都對應著一個dao 每個dao勢必存在公共部分 我們需要將公共部分抽取出來 封裝成一個工具類 保留個性化代碼即可 我們的工具類一般命名為xxxs 比如Strings 就是字符串相關的工具類 而工具類 我們將其放置于util包中我們以是否有<T>區分泛型方法和非泛…

Python并發編程學習記錄

1、初識并發編程 1.1、串行&#xff0c;并行&#xff0c;并發 串行(serial)&#xff1a;一個cpu上按順序完成多個任務&#xff1b; 并行(parallelism)&#xff1a;任務數小于或等于cup核數&#xff0c;多個任務是同時執行的&#xff1b; 并發(concurrency)&#xff1a;一個…

計算機SCI期刊,IF=8+,專業性強,潛力新刊!

一、期刊名稱 Journal of Big data 二、期刊簡介概況 期刊類型&#xff1a;SCI 學科領域&#xff1a;計算機科學 影響因子&#xff1a;8.1 中科院分區&#xff1a;2區 出版方式&#xff1a;開放出版 版面費&#xff1a;$1990 三、期刊征稿范圍 《大數據雜志》發表了關于…

2024年【T電梯修理】考試內容及T電梯修理新版試題

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年【T電梯修理】考試內容及T電梯修理新版試題&#xff0c;包含T電梯修理考試內容答案和解析及T電梯修理新版試題練習。安全生產模擬考試一點通結合國家T電梯修理考試最新大綱及T電梯修理考試真題匯總&#xff0c;…

線性dp合集,藍橋杯

貿易航線 0貿易航線 - 藍橋云課 (lanqiao.cn) n,m,kmap(int ,input().split()) #貪心的想&#xff0c;如果買某個東西利潤最大&#xff0c;那我肯定直接拉滿啊&#xff0c;所以買k個和買一個沒區別 p[0] for i in range(n):p.append([-1]list(map(int,input().split())))dp[[…

(2024,SDE,對抗薛定諤橋匹配,離散時間迭代馬爾可夫擬合,去噪擴散 GAN)

Adversarial Schrdinger Bridge Matching 公眾號&#xff1a;EDPJ&#xff08;進 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 進 V 交流群&#xff09; 目錄 0. 摘要 1. 簡介 4. 實驗 0. 摘要 薛定諤橋&#xff08;Schrdinger Bridge&#xff0c;SB&…

el-autocomplete后臺遠程搜索

el-complete可以實現后臺遠程搜索功能&#xff0c;但有時傳入數據為空時&#xff0c;接口可能會報錯。此時可在querySearchAsync方法中&#xff0c;根據queryString判斷&#xff0c;若為空&#xff0c;則不掉用接口&#xff0c;直接callback([])&#xff0c;反之則調用接口&…

浮點型比較大小

浮點數的存儲形式 浮點數按照在內存中所占字節數和數值范圍&#xff0c;可以分為浮點型&#xff0c;雙精度浮點型和長雙浮點型數。 代碼&#xff1a; printf("lgn:%e \n", pow(exp(1), 100));printf("lgn:%f ", pow(exp(1), 100));輸出結果&#xff1a; …

Stanford斯坦福 CS 224R: 深度強化學習 (5)

離線強化學習:第一部分 強化學習(RL)旨在讓智能體通過與環境交互來學習最優策略,從而最大化累積獎勵。傳統的RL訓練都是在線(online)進行的,即智能體在訓練過程中不斷與環境交互,實時生成新的狀態-動作數據,并基于新數據來更新策略。這種在線學習雖然簡單直觀,但也存在一些局限…