從基礎(chǔ)到實(shí)踐,回顧 Elasticsearch 向量檢索發(fā)展史
1.引言
向量檢索已經(jīng)成為現(xiàn)代搜索和推薦系統(tǒng)的核心組件。
通過(guò)將復(fù)雜的對(duì)象(例如文本、圖像或聲音)轉(zhuǎn)換為數(shù)值向量,并在多維空間中進(jìn)行相似性搜索,它能夠?qū)崿F(xiàn)高效的查詢匹配和推薦。
Elasticsearch 作為一款流行的開源搜索引擎,其在向量檢索方面的發(fā)展也一直備受關(guān)注。本文將回顧 Elasticsearch 向量檢索的發(fā)展歷史,重點(diǎn)介紹各個(gè)階段的特點(diǎn)和進(jìn)展。以史為鑒,方便大家建立起 Elasticsearch 向量檢索的全量認(rèn)知。
2. 初步嘗試:簡(jiǎn)單向量檢索的引入
Elasticsearch 最初并未專門針對(duì)向量檢索進(jìn)行設(shè)計(jì)。然而,隨著機(jī)器學(xué)習(xí)和人工智能的興起,對(duì)于高維向量空間的查詢需求逐漸增長(zhǎng)。
在 Elasticsearch 的 5.x 版本中,Elastic 愛好者們開始嘗試通過(guò)插件和基本的數(shù)學(xué)運(yùn)算實(shí)現(xiàn)簡(jiǎn)單的向量檢索功能。如:一些早期的插件如 elasticsearch-vector-scoring、fast-elasticsearch-vector-scoring 就是為了滿足這樣的需求。
https://github.com/MLnick/elasticsearch-vector-scoring
https://github.com/lior-k/fast-elasticsearch-vector-scoring
這一階段的向量檢索主要用于基本的相似度查詢,例如文本相似度計(jì)算。雖然功能相對(duì)有限,但為后續(xù)的發(fā)展奠定了基礎(chǔ)。
擴(kuò)展說(shuō)明:關(guān)于機(jī)器學(xué)習(xí)功能,如果大家對(duì) Elasticsearch 版本更迭感興趣,印象中當(dāng)時(shí) 6.X 版本推出,非常振奮人心。不過(guò)受限于非開源功能,國(guó)內(nèi)的真實(shí)受眾還相對(duì)較少。
3. 官方支持:進(jìn)一步發(fā)展
到 Elasticsearch 7.0 版本,正式開始增加對(duì)向量字段的支持,例如通過(guò) dense_vector 類型。這標(biāo)志著 Elasticsearch 正式進(jìn)入向量檢索領(lǐng)域,不再只依賴于插件。
dense_vector 最早的發(fā)起時(shí)間:2018 年 12 月 13 日,7.6 版本標(biāo)記為 GA。
https://github.com/elastic/elasticsearch/pull/33022
https://github.com/elastic/elasticsearch-net/issues/3836
關(guān)于 dense_vector 類型的使用,推薦閱讀:高維向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的實(shí)戰(zhàn)探索。
這一階段的主要挑戰(zhàn)是如何有效地在傳統(tǒng)的倒排索引結(jié)構(gòu)中支持向量檢索。通過(guò)與現(xiàn)有的全文搜索功能相結(jié)合,Elasticsearch 能夠提供一種靈活而強(qiáng)大的解決方案。
從最初的插件和基本運(yùn)算,到后來(lái)的官方支持和集成,這一階段為 Elasticsearch 在向量檢索方面的進(jìn)一步創(chuàng)新和優(yōu)化奠定了堅(jiān)實(shí)的基礎(chǔ)。
4.專門優(yōu)化:增強(qiáng)的相似度計(jì)算
隨著需求的增長(zhǎng),Elasticsearch 團(tuán)隊(duì)開始深入研究并優(yōu)化向量檢索性能。這涉及了引入更復(fù)雜的相似度計(jì)算方法,例如余弦相似度、歐幾里得距離等,以及對(duì)查詢執(zhí)行的優(yōu)化。
從 Elasticsearch 7.3 版本開始,官方引入了更復(fù)雜的相似度計(jì)算方法。特別是 script_score 查詢的增強(qiáng),使用戶可以通過(guò) Painless 腳本自定義更豐富的相似度計(jì)算。
/guide/en/elasticsearch/reference/7.3/query-dsl-script-score-query.html#vector-functions
核心功能在于允許通過(guò)向量之間的夾角計(jì)算相似度,用 k 最近鄰 (k-NN) 的余弦相似度距離指標(biāo),從而為相似度搜索引擎提供支持。廣泛用于文本分析和推薦系統(tǒng)。
主要用于解決:復(fù)雜相似度需求,提供了更靈活和強(qiáng)大的相似度計(jì)算選項(xiàng),能夠滿足更多的業(yè)務(wù)需求。
應(yīng)用場(chǎng)景體現(xiàn)在:
個(gè)性化推薦:通過(guò)余弦相似度分析用戶的行為和興趣,提供更個(gè)性化的推薦內(nèi)容;
圖像識(shí)別和搜索:使用歐幾里得距離快速檢索與給定圖像相似的圖像;
聲音分析:在聲音文件之間尋找相似模式,用于語(yǔ)音識(shí)別和分析。
值得一提的是:初始的時(shí)候,向量檢索支持的維度為:1024,直到 Elasticsearch 8.8 版本,支持維度變更為:2048(這是呼聲很高的一個(gè)需求)。
https://github.com/elastic/elasticsearch/pull/95257
/t/vector-knn-search-with-more-than-1024-dimensions/332819
Elasticsearch 7.x 版本的增強(qiáng)相似度計(jì)算功能標(biāo)志著向量檢索能力的顯著進(jìn)展。通過(guò)引入更復(fù)雜的相似度計(jì)算方法和查詢優(yōu)化,Elasticsearch 不僅增強(qiáng)了其在傳統(tǒng)搜索場(chǎng)景中的功能,還為新興的機(jī)器學(xué)習(xí)和 AI 應(yīng)用打開了新的可能性。
但,這個(gè)時(shí)候你會(huì)發(fā)現(xiàn),如果要實(shí)現(xiàn)復(fù)雜的向量搜索功能,自己實(shí)現(xiàn)的還很多。如果把后面馬上提到的深度學(xué)習(xí)的集成和大模型的出現(xiàn)比作:飛行的汽車,當(dāng)前的階段還是 “拉驢車”,功能是有的,但用起來(lái)很費(fèi)勁。
5.深度學(xué)習(xí)集成與未來(lái)展望
大模型時(shí)代,向量檢索和多模態(tài)搜索成為 “兵家” 必爭(zhēng)之地。
多模態(tài)檢索是一種綜合各種數(shù)據(jù)模態(tài)(如文本、圖像、音頻、視頻等)的檢索技術(shù)。換句話說(shuō),它不僅僅是根據(jù)文字進(jìn)行搜索,還可以根據(jù)圖像、聲音或其他模態(tài)的輸入來(lái)搜索相關(guān)內(nèi)容。
為了更通俗地理解多模態(tài)檢索,我們可以通過(guò)以下比喻和示例來(lái)加深認(rèn)識(shí):想象你走進(jìn)一個(gè)巨大的圖書館,這里不僅有書籍,還有各種圖片、錄音和視頻。你可以向圖書館員展示一張照片,她會(huì)為你找到與這張照片相關(guān)的所有書籍、音頻和視頻。或者,你可以哼一段旋律,圖書館員能找到相關(guān)的資料,或者提供類似的歌曲或視頻。這就是多模態(tài)檢索的魔力!
隨著深度學(xué)習(xí)技術(shù)的不斷發(fā)展和應(yīng)用,Elasticsearch 已開始探索將深度學(xué)習(xí)模型直接集成到向量檢索過(guò)程中。這不僅允許更復(fù)雜、更準(zhǔn)確的相似度計(jì)算,還開辟了新的應(yīng)用領(lǐng)域,例如基于圖像或聲音的搜索。尤其在 Elasticsearch 的 8.x 版本,這一方向得到了顯著的推進(jìn)。
5.1 向量化是前提
如下圖所示,先從左往右看是寫入,圖像、文檔、音頻轉(zhuǎn)化為向量特征表示,在 Elasticsearch 中通過(guò) dense_vector 類型存儲(chǔ)。
從右往左看是檢索,先將檢索語(yǔ)句轉(zhuǎn)化為向量特征表示,然后借助 K 近鄰檢索算法(在 Elasticsearch 中借助 Knn search 實(shí)現(xiàn)),獲取相似的結(jié)果。
看中間,Results 部分就是向量檢索的結(jié)果。
綜上,向量檢索打破了傳統(tǒng)倒排索引僅支持文本檢索的缺陷,可以擴(kuò)展支持文本、語(yǔ)音、圖像、視頻多種模態(tài)。
圖片來(lái)自:Elasticsearch 官方文檔
相信你到這里,應(yīng)該理解了向量檢索和多模態(tài)。沒(méi)有向量化的這個(gè)過(guò)程,多模態(tài)檢索無(wú)從談起。
5.2 模型是核心
深度學(xué)習(xí)模型集成總共可分為三步:
第一步:模型導(dǎo)入和管理:Elasticsearch 8.x 支持導(dǎo)入預(yù)訓(xùn)練的深度學(xué)習(xí)模型,并提供相應(yīng)的模型管理工具,方便模型的部署和更新。
第二步:向量表示與轉(zhuǎn)換:通過(guò)深度學(xué)習(xí)模型,可以將非結(jié)構(gòu)化數(shù)據(jù)如圖像和聲音轉(zhuǎn)換為向量表示,從而進(jìn)行有效的檢索。
第三步:自定義相似度計(jì)算:8.x 版本提供了基于深度學(xué)習(xí)模型的自定義相似度計(jì)算接口,允許用戶根據(jù)實(shí)際需求開發(fā)和部署專門的相似度計(jì)算方法。
關(guān)于深度學(xué)習(xí),可以是自訓(xùn)練模型,也可以是第三方模型庫(kù)中的模型,舉例:咱們圖搜圖案例中就是用的 HuggingFace 里的:clip-ViT-B-32-multilingual-v1 模型。
從基礎(chǔ)到實(shí)踐,回顧Elasticsearch 向量檢索發(fā)展史_Elastic_04
Elasticsearch 支持的第三方模型列表:
包括如下的 Hugging Face 模型庫(kù)也都是支持的。
從基礎(chǔ)到實(shí)踐,回顧Elasticsearch 向量檢索發(fā)展史_elasticsearch_05
模型是 Elasticsearch 與深度學(xué)習(xí)集成的核心,它能將復(fù)雜的數(shù)據(jù)轉(zhuǎn)化為 “指紋” 向量,使搜索更高效和智能。借助模型,Elasticsearch 可以理解和匹配各種非結(jié)構(gòu)化數(shù)據(jù),如圖像和聲音,提供更為準(zhǔn)確和個(gè)性化的搜索結(jié)果,同時(shí)適應(yīng)不斷變化的數(shù)據(jù)和需求?!皼](méi)有了模型,我們還需要黑暗中摸索很久”。
第三方模型官網(wǎng)介紹:/guide/en/machine-learning/8.9/ml-nlp-model-ref.html#ml-nlp-model-ref-text-embedding
值得一提的是:Elasticsearch 導(dǎo)入大模型需要專屬 Python 客戶端工具 Eland。
Eland 是一個(gè) Python Elasticsearch 客戶端,讓用戶能用類似 Pandas 的 API 來(lái)探索和分析 Elasticsearch 中的數(shù)據(jù),還支持從常見機(jī)器學(xué)習(xí)庫(kù)上傳訓(xùn)練好的模型到 Elasticsearch。
Eland 是為了與 Elasticsearch 協(xié)同工作而開發(fā)的庫(kù)。它不是 Elasticsearch 的一個(gè)特定版本產(chǎn)物,而是作為一個(gè)獨(dú)立的項(xiàng)目來(lái)幫助 Python 開發(fā)者更方便地在 Elasticsearch 中進(jìn)行數(shù)據(jù)探索和機(jī)器學(xué)習(xí)任務(wù)。
Eland 更多參見:
/guide/en/elasticsearch/client/eland/current/index.html
https://github.com/elastic/eland
5.3 ESRE 是 Elastic 的未來(lái)
前一段時(shí)間在分別給兩位阿里云、騰訊云大佬聊天的時(shí)候,都提到了 Elasticsearch Relevance Engine (ESRE) 才是 Elastic 未來(lái)。
ESRE 官方介紹如下:——Elasticsearch Relevance Engine 將 AI 的最佳實(shí)踐與 Elastic 的文本搜索進(jìn)行了結(jié)合。ESRE 為開發(fā)人員提供了一整套成熟的檢索算法,并能夠與大型語(yǔ)言模型 (LLM) 集成。借助 ESRE,我們可以應(yīng)用具有卓越相關(guān)性的開箱即用型語(yǔ)義搜索,與外部大型語(yǔ)言模型集成,實(shí)現(xiàn)混合搜索,并使用第三方或我們自己的模型。
ESRE 集成了高級(jí)相關(guān)性排序如 BM25f、強(qiáng)大的矢量數(shù)據(jù)庫(kù)、自然語(yǔ)言處理技術(shù)、與第三方模型如 GPT-3 和 GPT-4 的集成,并支持開發(fā)者自定義模型與應(yīng)用。其特點(diǎn)在于提供深度的語(yǔ)義搜索,與專業(yè)領(lǐng)域的數(shù)據(jù)整合,以及無(wú)縫的生成式 AI 整合,讓開發(fā)者能夠構(gòu)建更吸引人、更準(zhǔn)確的搜索體驗(yàn)。
在 Elasticsearch 8.9 版本上新了:Semantic search 語(yǔ)義檢索功能,對(duì)官方文檔熟悉的同學(xué),你會(huì)發(fā)現(xiàn)如下截圖內(nèi)容,早期版本是沒(méi)有的。
語(yǔ)義搜索不是根據(jù)搜索詞進(jìn)行字面匹配,而是根據(jù)搜索查詢的意圖和上下文含義來(lái)檢索結(jié)果。
更進(jìn)一步講:語(yǔ)義搜索不僅僅是匹配你輸入的關(guān)鍵字,而是試圖理解你的真正意圖,給你帶來(lái)更準(zhǔn)確、更有上下文的搜索結(jié)果。簡(jiǎn)單來(lái)說(shuō),如果你在英國(guó)搜索 “football”,系統(tǒng)知道你可能想要搜橄欖球,而不是足球(在美國(guó) football 是足球)。
這種智能搜索方式,得益于強(qiáng)大的文本向量化等技術(shù)背景,使我們的在線搜索體驗(yàn)更加直觀、方便和滿意。
在文本里檢索 connection speed requirement, 這點(diǎn)屬于早期的倒排索引檢索方式,或者叫全文檢索中的短語(yǔ) match_phrase 檢索匹配 或者分詞 match 檢索匹配。這種可以得到結(jié)果。
但是,中后半段視頻顯示,要是咱們要檢索:“How fast should my internet be” 怎么辦?
其實(shí)這里轉(zhuǎn)換為向量檢索,fast 和 speed 語(yǔ)義相近,should be 和 required、needs 語(yǔ)義相近,internet 和 connection、wifi 語(yǔ)義相近。所以依然能召回結(jié)果。
這突破了傳統(tǒng)同義詞的限制,體現(xiàn)了語(yǔ)義檢索的妙處!
更進(jìn)一步,我們給出語(yǔ)義檢索和傳統(tǒng)分詞檢索的區(qū)別,以期望大家更好的理解語(yǔ)義搜索。
總體而言,深度學(xué)習(xí)集成已經(jīng)成為 Elasticsearch 向量檢索能力的有力補(bǔ)充,促使它在搜索和分析領(lǐng)域的地位更加牢固,同時(shí)也為未來(lái)的發(fā)展提供了廣闊的空間。
6.小結(jié)
Elasticsearch 的向量檢索從最初的簡(jiǎn)單實(shí)現(xiàn)發(fā)展到現(xiàn)在的高效、多功能解決方案,反映了現(xiàn)代搜索和推薦系統(tǒng)的需求和挑戰(zhàn)。隨著技術(shù)的不斷演進(jìn),我們可以期待 Elasticsearch 在向量檢索方面將繼續(xù)推動(dòng)創(chuàng)新和卓越。
說(shuō)一下最近的感觸,向量檢索、大模型等新技術(shù)的出現(xiàn)有種感覺 “學(xué)不完,根本學(xué)不完”,并且很容易限于 “皮毛論”(我自創(chuàng)的詞)——所有技術(shù)都了解一點(diǎn)點(diǎn),但經(jīng)不起提問(wèn);淺了說(shuō),貌似啥都懂,深了說(shuō),一問(wèn)三不知。
這種情況怎么辦?我目前的方法是:以實(shí)踐為目的去深入理解理論,必要時(shí)理解算法,然后不定期將所看、所思、所想梳理成文,以備忘和知識(shí)體系化。這個(gè)過(guò)程很慢、很累,但我相信時(shí)間越長(zhǎng)、價(jià)值越大。
歡迎大家就向量檢索等問(wèn)題進(jìn)行留言討論交流,你的問(wèn)題很可能就是下一次文章的主題哦!
7.參考
/cn/blog/text-similarity-search-with-vectors-in-elasticsearch
/guide/en/elasticsearch/reference/7.3/query-dsl-script-score-query.html#vector-functions-cosine