Sease[1] 與 Alessandro Benedetti(Apache Lucene/Solr PMC 成員和提交者)和 Elia Porciani(Sease 研發(fā)軟件工程師)共同為開(kāi)源社區(qū)貢獻(xiàn)了 Apache Solr 中神經(jīng)搜索的第一個(gè)里程碑。
它依賴于 Apache Lucene 實(shí)現(xiàn) [2] 進(jìn)行 K-最近鄰搜索。
特別感謝 Christine Poerschke、Cassandra Targett、Michael Gibney 和所有其他在貢獻(xiàn)的最后階段提供了很大幫助的審稿人。即使是一條評(píng)論也受到了高度贊賞,如果我們?nèi)〉眠M(jìn)展,總是要感謝社區(qū)。
讓我們從簡(jiǎn)短的介紹開(kāi)始,介紹神經(jīng)方法如何改進(jìn)搜索。
我們可以將搜索概括為四個(gè)主要領(lǐng)域:
-
生成指定信息需求的查詢表示
-
生成捕獲包含的信息的文檔的表示
-
匹配來(lái)自信息語(yǔ)料庫(kù)的查詢和文檔表示
-
為每個(gè)匹配的文檔分配一個(gè)分?jǐn)?shù),以便根據(jù)結(jié)果中的相關(guān)性建立一個(gè)有意義的文檔排名
神經(jīng)搜索是神經(jīng)信息檢索[3] 學(xué)術(shù)領(lǐng)域的行業(yè)衍生產(chǎn)品,它專注于使用基于神經(jīng)網(wǎng)絡(luò)的技術(shù)改進(jìn)這些領(lǐng)域中的任何一個(gè)。
人工智能、深度學(xué)習(xí)和向量表示
我們?cè)絹?lái)越頻繁地聽(tīng)到人工智能(從現(xiàn)在開(kāi)始是人工智能)如何滲透到我們生活的許多方面。
當(dāng)我們談?wù)撊斯ぶ悄軙r(shí),我們指的是一組使機(jī)器能夠?qū)W習(xí)和顯示與人類相似的智能的技術(shù)。
隨著最近計(jì)算機(jī)能力的強(qiáng)勁和穩(wěn)定發(fā)展,人工智能已經(jīng)復(fù)蘇,現(xiàn)在它被用于許多領(lǐng)域,包括軟件工程和信息檢索(管理搜索引擎和類似系統(tǒng)的科學(xué))。
特別是,深度學(xué)習(xí) [4] 的出現(xiàn)引入了使用深度神經(jīng)網(wǎng)絡(luò)來(lái)解決對(duì)經(jīng)典算法非常具有挑戰(zhàn)性的復(fù)雜問(wèn)題。
就這篇博文而言,只要知道深度學(xué)習(xí)可用于在信息語(yǔ)料庫(kù)中生成查詢和文檔的向量表示就足夠了。
密集向量表示
可以認(rèn)為傳統(tǒng)的倒排索引將文本建模為“稀疏”向量,其中語(yǔ)料庫(kù)中的每個(gè)詞項(xiàng)對(duì)應(yīng)一個(gè)向量維度。在這樣的模型中(另見(jiàn)詞袋方法),維數(shù)對(duì)應(yīng)于術(shù)語(yǔ)字典基數(shù),并且任何給定文檔的向量大部分包含零(因此它被稱為稀疏,因?yàn)橹挥猩贁?shù)術(shù)語(yǔ)存在于整個(gè)字典中將出現(xiàn)在任何給定的文檔中)。
密集向量表示與基于術(shù)語(yǔ)的稀疏向量表示形成對(duì)比,因?yàn)樗鼘⒔普Z(yǔ)義意義提取為固定(和有限)數(shù)量的維度。
這種方法的維數(shù)通常遠(yuǎn)低于稀疏情況,并且任何給定文檔的向量都是密集的,因?yàn)樗拇蟛糠志S數(shù)都由非零值填充。
與稀疏方法(標(biāo)記器用于直接從文本輸入生成稀疏向量)相比,生成向量的任務(wù)必須在 Apache Solr 外部的應(yīng)用程序邏輯中處理。
BERT[5] 等各種深度學(xué)習(xí)模型能夠?qū)⑽谋拘畔⒕幋a為密集向量,用于密集檢索策略。
有關(guān)更多信息,您可以參考我們的這篇博文。
近似最近鄰
給定一個(gè)對(duì)信息需求進(jìn)行建模的密集向量 v,提供密集向量檢索的最簡(jiǎn)單方法是計(jì)算 v 與代表信息語(yǔ)料庫(kù)中文檔的每個(gè)向量 d 之間的距離(歐幾里得、點(diǎn)積等)。
這種方法非常昂貴,因此目前正在積極研究許多近似策略。
近似最近鄰搜索算法返回結(jié)果,其與查詢向量的距離最多為從查詢向量到其最近向量的距離的 c 倍。
這種方法的好處是,在大多數(shù)情況下,近似最近鄰幾乎與精確最近鄰一樣好。
特別是,如果距離測(cè)量準(zhǔn)確地捕捉到用戶質(zhì)量的概念,那么距離的微小差異應(yīng)該無(wú)關(guān)緊要[6]
分層導(dǎo)航小圖
在 Apache Lucene 中實(shí)現(xiàn)并由 Apache Solr 使用的策略基于 Navigable Small-world 圖。
它為高維向量提供了一種有效的近似最近鄰搜索[7][8][9][10]。
Hierarchical Navigable Small World Graph (HNSW) 是一種基于鄰近鄰域圖概念的方法:
與信息語(yǔ)料庫(kù)相關(guān)聯(lián)的向量空間中的每個(gè)向量都唯一地與一個(gè)
vertex?
?in the graph?
.?
頂點(diǎn)基于它們的接近度通過(guò)邊緣連接,更近的(根據(jù)距離函數(shù))連接。
構(gòu)建圖受超參數(shù)的影響,這些超參數(shù)調(diào)節(jié)每層要構(gòu)建多少個(gè)連接以及要構(gòu)建多少層。
在查詢時(shí),鄰居結(jié)構(gòu)被導(dǎo)航以找到離目標(biāo)最近的向量,從種子節(jié)點(diǎn)開(kāi)始,隨著我們?cè)絹?lái)越接近目標(biāo)而迭代。
我發(fā)現(xiàn)這個(gè)博客對(duì)于深入研究該主題非常有用。
Apache Lucene 實(shí)現(xiàn)
首先要注意的是當(dāng)前的 Lucene 實(shí)現(xiàn)不是分層的。
所以圖中只有一層,請(qǐng)參閱原始 Jira 問(wèn)題中的最新評(píng)論,跟蹤開(kāi)發(fā)進(jìn)度[11]。
主要原因是為了在 Apache Lucene 生態(tài)系統(tǒng)中為這種簡(jiǎn)化的實(shí)現(xiàn)找到更容易的設(shè)計(jì)、開(kāi)發(fā)和集成過(guò)程。
一致認(rèn)為,引入分層分層結(jié)構(gòu)將在低維向量管理和查詢時(shí)間(減少候選節(jié)點(diǎn)遍歷)方面帶來(lái)好處。
該實(shí)施正在進(jìn)行中[12]。
那么,與 Navigable Small World Graph 和 K-Nearest Neighbors 功能相關(guān)的 Apache Lucene 組件有哪些?
讓我們探索代碼:
注:如果您對(duì) Lucene 內(nèi)部結(jié)構(gòu)和編解碼器不感興趣,可以跳過(guò)這一段
org.apache.lucene.document.KnnVectorField 是入口點(diǎn):
它在索引時(shí)需要向量維度和相似度函數(shù)(構(gòu)建 NSW 圖時(shí)使用的向量距離函數(shù))。
這些是通過(guò) #setVectorDimensionsAndSimilarityFunction 方法在 org.apache.lucene.document.FieldType 中設(shè)置的。
更新文檔字段架構(gòu) org.apache.lucene.index.IndexingChain#updateDocFieldSchema 時(shí),信息從 FieldType 中提取并保存在 org.apache.lucene.index.IndexingChain.FieldSchema 中。
并且從 FieldSchema KnnVectorField 配置最終到達(dá) org.apache.lucene.index.IndexingChain#initializeFieldInfo 中的 org.apache.lucene.index.FieldInfo。
現(xiàn)在,Lucene 編解碼器具有構(gòu)建 NSW 圖形所需的所有特定于字段的配置。
讓我們看看如何:
首先,從 org.apache.lucene.codecs.lucene90.Lucene90Codec#Lucene90Codec 你可以看到 KNN 向量的默認(rèn)格式是 org.apache.lucene.codecs.lucene90.Lucene90HnswVectorsFormat。
關(guān)聯(lián)的索引編寫器是 org.apache.lucene.codecs.lucene90.Lucene90HnswVectorsWriter。
該組件可以訪問(wèn)之前在將字段寫入 org.apache.lucene.codecs.lucene90.Lucene90HnswVectorsWriter#writeField 中的索引時(shí)初始化的 FieldInfo。
在編寫 KnnVectorField 時(shí),涉及到 org.apache.lucene.util.hnsw.HnswGraphBuilder,最后是
org.apache.lucene.util.hnsw.HnswGraph 已構(gòu)建。
Apache Solr 實(shí)現(xiàn)
可從 Apache Solr 9.0 獲得
預(yù)計(jì) 2022 年第一季度
這第一個(gè)貢獻(xiàn)允許索引單值密集向量場(chǎng)并使用近似距離函數(shù)搜索 K-最近鄰。
當(dāng)前特點(diǎn):
-
DenseVectorField 類型
-
Knn 查詢解析器
密集向量場(chǎng)(DenseVectorField)
密集向量字段提供了索引和搜索浮點(diǎn)元素的密集向量的可能性。
例如
[1.0, 2.5, 3.7, 4.1]
以下是 DenseVectorField 應(yīng)如何在模式中配置:
<fieldType name="knn_vector" class="solr.DenseVectorField"
vectorDimension="4" similarityFunction="cosine"/>
<field name="vector" type="knn_vector" indexed="true" stored="true"/>
-----------------------------------------------------------------------------------------------------
|Parameter Name? |? Required |? ?Default |? ?Description? ? |Accepted values|
-----------------------------------------------------------------------------------------------------
|vectorDimension? ?| True? ? ?|? ? ? ? ? ? ? ?|The dimension of the dense
vector to pass in.? ? |Integer < = 1024|
—————————————————————————————————————————
|similarityFunction |? ?False? ?| euclidean? ? |Vector similarity function;
used in search to return top K most similar vectors to a target vector.? ?
| euclidean, dot_product or cosine.
———————————————————————————————————————
-
歐幾里得:歐幾里得距離
-
dot_product:點(diǎn)積。注意:這種相似性旨在作為執(zhí)行余弦相似性的優(yōu)化方式。為了使用它,所有向量必須是單位長(zhǎng)度的,包括文檔向量和查詢向量。對(duì)非單位長(zhǎng)度的向量使用點(diǎn)積可能會(huì)導(dǎo)致錯(cuò)誤或搜索結(jié)果不佳。
-
余弦:余弦相似度。注意:執(zhí)行余弦相似度的首選方法是將所有向量歸一化為單位長(zhǎng)度,而不是使用 DOT_PRODUCT。只有在需要保留原始向量且無(wú)法提前對(duì)其進(jìn)行歸一化時(shí),才應(yīng)使用此函數(shù)。
DenseVectorField 支持屬性:索引、存儲(chǔ)。
注:目前不支持多值
自定義索引編解碼器
要使用以下自定義編解碼器格式的高級(jí)參數(shù)和 HNSW 算法的超參數(shù),請(qǐng)確保在 solrconfig.xml 中設(shè)置此配置:
<codecFactory class="solr.SchemaCodecFactory"/>
...
以下是如何使用高級(jí)編解碼器超參數(shù)配置 DenseVectorField:
<fieldType name="knn_vector" class="solr.DenseVectorField"
vectorDimension="4"similarityFunction="cosine"
codecFormat="Lucene90HnswVectorsFormat" hnswMaxConnections="10" hnswBeamWidth="40"/>
<field name="vector" type="knn_vector" indexed="true" stored="true"/>
Parameter Name | Required | Default | Description | Accepted values |
codecFormat |
False |
|
Specifies the knn codec implementation to use |
|
hnswMaxConnections |
False | 16 |
Lucene90HnswVectorsFormat ?only:Controls how many of the nearest neighbor candidates are connected to the new node. It has the same meaning as? M ?from the paper[8]. |
Integer |
hnswBeamWidth |
False | 100 |
Lucene90HnswVectorsFormat ?only:?It is the number of nearest neighbor candidates to track while searching the graph for each newly inserted node.It has the same meaning as? efConstruction ?from the paper[8]. |
Integer |
請(qǐng)注意,codecFormat 接受的值可能會(huì)在未來(lái)版本中更改。
注意 Lucene 索引向后兼容僅支持默認(rèn)編解碼器。如果您選擇在架構(gòu)中自定義 codecFormat,升級(jí)到 Solr 的未來(lái)版本可能需要您切換回默認(rèn)編解碼器并優(yōu)化索引以在升級(jí)之前將其重寫為默認(rèn)編解碼器,或者重新構(gòu)建整個(gè)索引升級(jí)后從頭開(kāi)始。
對(duì)于 HNSW 實(shí)現(xiàn)的超參數(shù),詳見(jiàn)[8]。
如何索引向量
下面是 DenseVectorField 應(yīng)該如何被索引:
JSON
[{ "id": "1",
"vector": [1.0, 2.5, 3.7, 4.1]
},
{ "id": "2",
"vector": [1.5, 5.5, 6.7, 65.1]
}
]
XML
<field name="id">1
<field name="vector">1.0
<field name="vector">2.5
<field name="vector">3.7
<field name="vector">4.1
<field name="id">2
<field name="vector">1.5
<field name="vector">5.5
<field name="vector">6.7
<field name="vector">65.1
Java –?SolrJ
final SolrClient client = getSolrClient();
final SolrInputDocument d1 = new SolrInputDocument();
d1.setField("id", "1");
d1.setField("vector", Arrays.asList(1.0f, 2.5f, 3.7f, 4.1f));
final SolrInputDocument d2 = new SolrInputDocument();
d2.setField("id", "2");
d2.setField("vector", Arrays.asList(1.5f, 5.5f, 6.7f, 65.1f));
client.add(Arrays.asList(d1, d2));
knn 查詢解析器
knn K-Nearest Neighbors 查詢解析器允許根據(jù)給定字段中的索引密集向量查找與目標(biāo)向量最近的 k 文檔。
它采用以下參數(shù):
Parameter?Name | Required | Default | Description |
f |
True | The DenseVectorField to search in. | |
topK |
False | 10 | How many k-nearest results to return. |
以下是運(yùn)行 KNN 搜索的方法:
&q={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]
檢索到的搜索結(jié)果是輸入 [1.0, 2.0, 3.0, 4.0] 中與向量最近的 K-nearest,由在索引時(shí)配置的similarityFunction 排序。
與過(guò)濾查詢一起使用
knn 查詢解析器可用于過(guò)濾查詢:
&q=id:(1 2 3)&fq={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]
knn 查詢解析器可以與過(guò)濾查詢一起使用:
&q={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fq=id:(1 2 3)
重要:
在這些場(chǎng)景中使用 knn 時(shí),請(qǐng)確保您清楚地了解過(guò)濾器查詢?cè)?Apache Solr 中的工作方式:
由主查詢 q 產(chǎn)生的文檔 ID 排名列表與從每個(gè)過(guò)濾器查詢派生的文檔 ID 集合相交 fq.egRanked List from q=[ID1, ID4, ID2, ID10] Set from fq={ID3, ID2 , ID9, ID4} = [ID4,ID2]
用作重新排序查詢
knn 查詢解析器可用于重新排列第一遍查詢結(jié)果:
&q=id:(3 4 9 2)&rq={!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=1}
&rqq={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]
重要:
在重新排序中使用 knn 時(shí),請(qǐng)注意 topK 參數(shù)。
僅當(dāng)來(lái)自第一遍的文檔 d 在要搜索的目標(biāo)向量的 K 最近鄰(在整個(gè)索引中)內(nèi)時(shí),才計(jì)算第二遍分?jǐn)?shù)(從 knn 派生)。
這意味著無(wú)論如何都會(huì)在整個(gè)索引上執(zhí)行第二遍 knn,這是當(dāng)前的限制。
最終排序的結(jié)果列表將第一次通過(guò)分?jǐn)?shù)(主查詢 q)加上第二次通過(guò)分?jǐn)?shù)(到要搜索的目標(biāo)向量的近似相似度函數(shù)距離)乘以乘法因子(reRankWeight)。
因此,如果文檔 d 不存在于 knn 結(jié)果中,即使與目標(biāo)查詢向量的距離向量計(jì)算不為零,您對(duì)原始分?jǐn)?shù)的貢獻(xiàn)也為零。
有關(guān)使用 ReRank 查詢解析器的詳細(xì)信息,請(qǐng)參閱 Apache Solr Wiki[13] 部分。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-605460.html
本文 :https://architect.pub/apache-solr-neural-search | ||
討論:知識(shí)星球【首席架構(gòu)師圈】或者加微信小號(hào)【ca_cto】或者加QQ群【792862318】 | ||
公眾號(hào) ? |
【jiagoushipro】 【超級(jí)架構(gòu)師】 精彩圖文詳解架構(gòu)方法論,架構(gòu)實(shí)踐,技術(shù)原理,技術(shù)趨勢(shì)。 我們?cè)诘饶悖s快掃描關(guān)注吧。 |
|
微信小號(hào) ? |
【ca_cea】 50000人社區(qū),討論:企業(yè)架構(gòu),云計(jì)算,大數(shù)據(jù),數(shù)據(jù)科學(xué),物聯(lián)網(wǎng),人工智能,安全,全棧開(kāi)發(fā),DevOps,數(shù)字化. ? |
|
QQ群 ? |
【285069459】深度交流企業(yè)架構(gòu),業(yè)務(wù)架構(gòu),應(yīng)用架構(gòu),數(shù)據(jù)架構(gòu),技術(shù)架構(gòu),集成架構(gòu),安全架構(gòu)。以及大數(shù)據(jù),云計(jì)算,物聯(lián)網(wǎng),人工智能等各種新興技術(shù)。 加QQ群,有珍貴的報(bào)告和干貨資料分享。 |
|
視頻號(hào) | 【超級(jí)架構(gòu)師】 1分鐘快速了解架構(gòu)相關(guān)的基本概念,模型,方法,經(jīng)驗(yàn)。 每天1分鐘,架構(gòu)心中熟。 |
|
知識(shí)星球 | 【首席架構(gòu)師圈】向大咖提問(wèn),近距離接觸,或者獲得私密資料分享。 | ? |
喜馬拉雅 | 【超級(jí)架構(gòu)師】路上或者車上了解最新黑科技資訊,架構(gòu)心得。 | 【智能時(shí)刻,架構(gòu)君和你聊黑科技】 |
知識(shí)星球 | 認(rèn)識(shí)更多朋友,職場(chǎng)和技術(shù)閑聊。 | 知識(shí)星球【職場(chǎng)和技術(shù)】 |
領(lǐng)英 | Harry | https://www.linkedin.com/in/architect-harry/ |
領(lǐng)英群組 | 領(lǐng)英架構(gòu)群組 | https://www.linkedin.com/groups/14209750/ |
微博?? | 【超級(jí)架構(gòu)師】 | 智能時(shí)刻? |
嗶哩嗶哩 | 【超級(jí)架構(gòu)師】 | |
抖音 | 【cea_cio】超級(jí)架構(gòu)師 | |
快手 | 【cea_cio_cto】超級(jí)架構(gòu)師 | |
小紅書(shū) | 【cea_csa_cto】超級(jí)架構(gòu)師 | ? |
網(wǎng)站 | CIO(首席信息官) | https://cio.ceo |
網(wǎng)站 | CIO,CTO和CDO | https://cioctocdo.com |
網(wǎng)站 | 架構(gòu)師實(shí)戰(zhàn)分享 | https://architect.pub? ? |
網(wǎng)站 | 程序員云開(kāi)發(fā)分享 | https://pgmr.cloud |
網(wǎng)站 | 首席架構(gòu)師社區(qū) | https://jiagoushi.pro |
網(wǎng)站 | 應(yīng)用開(kāi)發(fā)和開(kāi)發(fā)平臺(tái) | https://apaas.dev |
網(wǎng)站 | 開(kāi)發(fā)信息網(wǎng) | https://xinxi.dev |
網(wǎng)站 | 超級(jí)架構(gòu)師 | https://jiagou.dev |
網(wǎng)站 | 企業(yè)技術(shù)培訓(xùn) | https://peixun.dev |
網(wǎng)站 | 程序員寶典 | https://pgmr.pub? ?? |
網(wǎng)站 | 開(kāi)發(fā)者閑談 | https://blog.developer.chat |
網(wǎng)站 | CPO寶典 | https://cpo.work |
網(wǎng)站 | 首席安全官 | https://cso.pub????? |
網(wǎng)站 | CIO酷 | https://cio.cool |
網(wǎng)站 | CDO信息 | https://cdo.fyi |
網(wǎng)站 | CXO信息 | https://cxo.pub |
謝謝大家關(guān)注,轉(zhuǎn)發(fā),點(diǎn)贊和點(diǎn)在看。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-605460.html
到了這里,關(guān)于【搜索引擎Solr】Apache Solr 神經(jīng)搜索的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!