從基礎到實踐,回顧Elasticsearch 向量檢索發展史

2023-10-23 12:01:01

本文分享自華為雲社群《Elasticsearch向量檢索的演進與變革:從基礎到應用》,作者: 汀丶。

1.引言

向量檢索已經成為現代搜尋和推薦系統的核心元件。

通過將複雜的物件(例如文字、影象或聲音)轉換為數值向量,並在多維空間中進行相似性搜尋,它能夠實現高效的查詢匹配和推薦。

Elasticsearch 作為一款流行的開源搜尋引擎,其在向量檢索方面的發展也一直備受關注。本文將回顧 Elasticsearch 向量檢索的發展歷史,重點介紹各個階段的特點和進展。以史為鑑,方便大家建立起 Elasticsearch 向量檢索的全量認知。

2. 初步嘗試:簡單向量檢索的引入

Elasticsearch 最初並未專門針對向量檢索進行設計。然而,隨著機器學習和人工智慧的興起,對於高維向量空間的查詢需求逐漸增長。

在 Elasticsearch 的 5.x 版本中,Elastic 愛好者們開始嘗試通過外掛和基本的數學運算實現簡單的向量檢索功能。如:一些早期的外掛如 elasticsearch-vector-scoring、fast-elasticsearch-vector-scoring 就是為了滿足這樣的需求。

https://github.com/MLnick/elasticsearch-vector-scoring

https://github.com/lior-k/fast-elasticsearch-vector-scoring

這一階段的向量檢索主要用於基本的相似度查詢,例如文字相似度計算。雖然功能相對有限,但為後續的發展奠定了基礎。

擴充套件說明:關於機器學習功能,如果大家對 Elasticsearch 版本更迭感興趣,印象中當時 6.X 版本推出,非常振奮人心。不過受限於非開源功能,國內的真實受眾還相對較少。

3. 官方支援:進一步發展

到 Elasticsearch 7.0 版本,正式開始增加對向量欄位的支援,例如通過 dense_vector 型別。這標誌著 Elasticsearch 正式進入向量檢索領域,不再只依賴於外掛。

dense_vector 最早的發起時間:2018 年 12 月 13 日,7.6 版本標記為 GA。

https://github.com/elastic/elasticsearch/pull/33022

https://github.com/elastic/elasticsearch-net/issues/3836

關於 dense_vector 型別的使用,推薦閱讀:高維向量搜尋:在 Elasticsearch 8.X 中利用 dense_vector 的實戰探索

這一階段的主要挑戰是如何有效地在傳統的倒排索引結構中支援向量檢索。通過與現有的全文搜尋功能相結合,Elasticsearch 能夠提供一種靈活而強大的解決方案。

從最初的外掛和基本運算,到後來的官方支援和整合,這一階段為 Elasticsearch 在向量檢索方面的進一步創新和優化奠定了堅實的基礎。

4.專門優化:增強的相似度計算

隨著需求的增長,Elasticsearch 團隊開始深入研究並優化向量檢索效能。這涉及了引入更復雜的相似度計算方法,例如餘弦相似度、歐幾里得距離等,以及對查詢執行的優化。

從 Elasticsearch 7.3 版本開始,官方引入了更復雜的相似度計算方法。特別是 script_score 查詢的增強,使使用者可以通過 Painless 指令碼自定義更豐富的相似度計算。

/guide/en/elasticsearch/reference/7.3/query-dsl-script-score-query.html#vector-functions

核心功能在於允許通過向量之間的夾角計算相似度,用 k 最近鄰 (k-NN) 的餘弦相似度距離指標,從而為相似度搜尋引擎提供支援。廣泛用於文字分析和推薦系統。

主要用於解決:複雜相似度需求,提供了更靈活和強大的相似度計算選項,能夠滿足更多的業務需求。

應用場景體現在:

  • (1)個性化推薦:通過餘弦相似度分析使用者的行為和興趣,提供更個性化的推薦內容;

  • (2)影象識別和搜尋:使用歐幾里得距離快速檢索與給定影象相似的影象;

  • (3)聲音分析:在聲音檔案之間尋找相似模式,用於語音識別和分析。

值得一提的是:初始的時候,向量檢索支援的維度為:1024,直到 Elasticsearch 8.8 版本,支援維度變更為:2048(這是呼聲很高的一個需求)。

https://github.com/elastic/elasticsearch/pull/95257

/t/vector-knn-search-with-more-than-1024-dimensions/332819

Elasticsearch 7.x 版本的增強相似度計算功能標誌著向量檢索能力的顯著進展。通過引入更復雜的相似度計算方法和查詢優化,Elasticsearch 不僅增強了其在傳統搜尋場景中的功能,還為新興的機器學習和 AI 應用開啟了新的可能性。

但,這個時候你會發現,如果要實現複雜的向量搜尋功能,自己實現的還很多。如果把後面馬上提到的深度學習的整合和大模型的出現比作:飛行的汽車,當前的階段還是 「拉驢車」,功能是有的,但用起來很費勁。

5.深度學習整合與未來展望

大模型時代,向量檢索和多模態搜尋成為 「兵家」 必爭之地。

多模態檢索是一種綜合各種資料模態(如文字、影象、音訊、視訊等)的檢索技術。換句話說,它不僅僅是根據文字進行搜尋,還可以根據影象、聲音或其他模態的輸入來搜尋相關內容。

為了更通俗地理解多模態檢索,我們可以通過以下比喻和範例來加深認識:想象你走進一個巨大的圖書館,這裡不僅有書籍,還有各種圖片、錄音和視訊。你可以向圖書館員展示一張照片,她會為你找到與這張照片相關的所有書籍、音訊和視訊。或者,你可以哼一段旋律,圖書館員能找到相關的資料,或者提供類似的歌曲或視訊。這就是多模態檢索的魔力!

隨著深度學習技術的不斷髮展和應用,Elasticsearch 已開始探索將深度學習模型直接整合到向量檢索過程中。這不僅允許更復雜、更準確的相似度計算,還開闢了新的應用領域,例如基於影象或聲音的搜尋。尤其在 Elasticsearch 的 8.x 版本,這一方向得到了顯著的推進。

5.1 向量化是前提

如下圖所示,先從左往右看是寫入,影象、檔案、音訊轉化為向量特徵表示,在 Elasticsearch 中通過 dense_vector 型別儲存。

從右往左看是檢索,先將檢索語句轉化為向量特徵表示,然後藉助 K 近鄰檢索演演算法(在 Elasticsearch 中藉助 Knn search 實現),獲取相似的結果。

看中間,Results 部分就是向量檢索的結果。

綜上,向量檢索打破了傳統倒排索引僅支援文字檢索的缺陷,可以擴充套件支援文字、語音、影象、視訊多種模態。

圖片來自:Elasticsearch 官方檔案

相信你到這裡,應該理解了向量檢索和多模態。沒有向量化的這個過程,多模態檢索無從談起。

5.2 模型是核心

深度學習模型整合總共可分為三步:

  • 第一步:模型匯入和管理:Elasticsearch 8.x 支援匯入預訓練的深度學習模型,並提供相應的模型管理工具,方便模型的部署和更新。

  • 第二步:向量表示與轉換:通過深度學習模型,可以將非結構化資料如影象和聲音轉換為向量表示,從而進行有效的檢索。

  • 第三步:自定義相似度計算:8.x 版本提供了基於深度學習模型的自定義相似度計算介面,允許使用者根據實際需求開發和部署專門的相似度計算方法。

關於深度學習,可以是自訓練模型,也可以是第三方模型庫中的模型,舉例:咱們圖搜圖案例中就是用的 HuggingFace 裡的:clip-ViT-B-32-multilingual-v1 模型。

Elasticsearch 支援的第三方模型列表:

名稱模型釋義
BERT 雙向 Transformer 模型
BART 序列到序列模型
DPR bi-encoders 雙向編碼器檢索模型
DistilBERT 輕量化 BERT
ELECTRA 對抗性預訓練模型
MobileBERT 針對移動裝置的 BERT
RoBERTa 優化版 BERT
RetriBERT 檢索 - focused BERT
MPNet 混合並行網路
SentenceTransformers bi-encoders 句子轉換雙向編碼器
XLM-RoBERTa 多語言版 RoBERTa

包括如下的 Hugging Face 模型庫也都是支援的。

模型是 Elasticsearch 與深度學習整合的核心,它能將複雜的資料轉化為 「指紋」 向量,使搜尋更高效和智慧。藉助模型,Elasticsearch 可以理解和匹配各種非結構化資料,如影象和聲音,提供更為準確和個性化的搜尋結果,同時適應不斷變化的資料和需求。「沒有了模型,我們還需要黑暗中摸索很久」。

第三方模型官網介紹:/guide/en/machine-learning/8.9/ml-nlp-model-ref.html#ml-nlp-model-ref-text-embedding

值得一提的是:Elasticsearch 匯入大模型需要專屬 Python 使用者端工具 Eland。

Eland 是一個 Python Elasticsearch 使用者端,讓使用者能用類似 Pandas 的 API 來探索和分析 Elasticsearch 中的資料,還支援從常見機器學習庫上傳訓練好的模型到 Elasticsearch。

Eland 是為了與 Elasticsearch 協同工作而開發的庫。它不是 Elasticsearch 的一個特定版本產物,而是作為一個獨立的專案來幫助 Python 開發者更方便地在 Elasticsearch 中進行資料探索和機器學習任務。

Eland 更多參見:

/guide/en/elasticsearch/client/eland/current/index.html

https://github.com/elastic/eland

5.3 ESRE 是 Elastic 的未來

前一段時間在分別給兩位阿里雲、騰訊雲大佬聊天的時候,都提到了 Elasticsearch Relevance Engine (ESRE) 才是 Elastic 未來。

ESRE 官方介紹如下:——Elasticsearch Relevance Engine 將 AI 的最佳實踐與 Elastic 的文字搜尋進行了結合。ESRE 為開發人員提供了一整套成熟的檢索演演算法,並能夠與大型語言模型 (LLM) 整合。藉助 ESRE,我們可以應用具有卓越相關性的開箱即用型語意搜尋,與外部大型語言模型整合,實現混合搜尋,並使用第三方或我們自己的模型。

ESRE 整合了高階相關性排序如 BM25f、強大的向量資料庫、自然語言處理技術、與第三方模型如 GPT-3 和 GPT-4 的整合,並支援開發者自定義模型與應用。其特點在於提供深度的語意搜尋,與專業領域的資料整合,以及無縫的生成式 AI 整合,讓開發者能夠構建更吸引人、更準確的搜尋體驗。

在 Elasticsearch 8.9 版本上新了:Semantic search 語意檢索功能,對官方檔案熟悉的同學,你會發現如下截圖內容,早期版本是沒有的。

語意搜尋不是根據搜尋詞進行字面匹配,而是根據搜尋查詢的意圖和上下文含義來檢索結果。

更進一步講:語意搜尋不僅僅是匹配你輸入的關鍵字,而是試圖理解你的真正意圖,給你帶來更準確、更有上下文的搜尋結果。簡單來說,如果你在英國搜尋 「football」,系統知道你可能想要搜橄欖球,而不是足球(在美國 football 是足球)。

這種智慧搜尋方式,得益於強大的文字向量化等技術背景,使我們的線上搜尋體驗更加直觀、方便和滿意。

  • 在文字裡檢索 connection speed requirement, 這點屬於早期的倒排索引檢索方式,或者叫全文檢索中的短語 match_phrase 檢索匹配 或者分詞 match 檢索匹配。這種可以得到結果。

  • 但是,中後半段視訊顯示,要是咱們要檢索:「How fast should my internet be」 怎麼辦?

其實這裡轉換為向量檢索,fast 和 speed 語意相近,should be 和 required、needs 語意相近,internet 和 connection、wifi 語意相近。所以依然能召回結果。

這突破了傳統同義詞的限制,體現了語意檢索的妙處!

更進一步,我們給出語意檢索和傳統分詞檢索的區別,以期望大家更好的理解語意搜尋。

專案語意搜尋傳統分詞搜尋
核心技術 基於向量搜尋,機器學習和人工智慧 基於文字匹配和查詢擴充套件
搜尋目的 理解查詢的深層意義和上下文 直接匹配關鍵詞或擴充套件的詞彙
處理上下文 能夠根據搜尋者的地理位置、搜尋歷史等資訊調整結果 通常不考慮這些額外的上下文資訊
搜尋結果的相關性 根據查詢的意圖和上下文排名結果 主要基於關鍵詞的頻率和位置匹配
處理同義詞和多義詞 能夠理解詞語在不同上下文中的意義,並據此返回結果 通常使用同義詞表或詞彙擴充套件工具,可能不總是理解上下文中的真正意義
對查詢的理解 能夠區分如 「chocolate milk」 和「milk chocolate」這樣的查詢,即使關鍵詞順序或形式相同 可能只是簡單地匹配關鍵詞,而不理解它們的真正意思
學習和適應能力 通過機器學習不斷改進,根據使用者的反饋和行為適應 通常基於固定的演演算法和規則,沒有持續學習和適應的能力
使用者體驗 提供更準確和有上下文的結果,從而提高使用者滿意度 依賴於使用者精確輸入,可能返回與使用者實際意圖不匹配的結果

總體而言,深度學習整合已經成為 Elasticsearch 向量檢索能力的有力補充,促使它在搜尋和分析領域的地位更加牢固,同時也為未來的發展提供了廣闊的空間。

6.小結

Elasticsearch 的向量檢索從最初的簡單實現發展到現在的高效、多功能解決方案,反映了現代搜尋和推薦系統的需求和挑戰。隨著技術的不斷演進,我們可以期待 Elasticsearch 在向量檢索方面將繼續推動創新和卓越。

說一下最近的感觸,向量檢索、大模型等新技術的出現有種感覺 「學不完,根本學不完」,並且很容易限於 「皮毛論」(我自創的詞)——所有技術都瞭解一點點,但經不起提問;淺了說,貌似啥都懂,深了說,一問三不知。

這種情況怎麼辦?我目前的方法是:以實踐為目的去深入理解理論,必要時理解演演算法,然後不定期將所看、所思、所想梳理成文,以備忘和知識體系化。這個過程很慢、很累,但我相信時間越長、價值越大。

歡迎大家就向量檢索等問題進行留言討論交流,你的問題很可能就是下一次文章的主題哦!

7.參考

1、/cn/blog/text-similarity-search-with-vectors-in-elasticsearch

2、/guide/en/elasticsearch/reference/7.3/query-dsl-script-score-query.html#vector-functions-cosine

3、https://zhuanlan.zhihu.com/p/552249981

點選關注,第一時間瞭解華為雲新鮮技術~