偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

基于LangChain和云原生向量數(shù)據(jù)庫(kù)Milvus開(kāi)發(fā)混合搜索AI程序 原創(chuàng)

發(fā)布于 2024-12-13 08:26
瀏覽
0收藏

本文將探討基于LangChain框架和云原生向量數(shù)據(jù)庫(kù)Milvus并將密集嵌入與稀疏嵌入結(jié)合起來(lái)開(kāi)發(fā)混合搜索型AI程序的實(shí)戰(zhàn)過(guò)程。

簡(jiǎn)介

最近,我們——來(lái)自IBM研究中心的團(tuán)隊(duì)——需要在??Milvus???向量存儲(chǔ)中使用混合搜索技術(shù)。因?yàn)槲覀円呀?jīng)在使用??LangChain框架???,所以我們決定一鼓作氣貢獻(xiàn)出在??langchain-milvus???中啟用這一功能所需的一切。其中包括通過(guò)langchain接口支持??稀疏嵌入???和??多向量搜索??技術(shù)。

在本文中,我們首先簡(jiǎn)要介紹密集嵌入和稀疏嵌入之間的區(qū)別,然后分析如何使用混合搜索來(lái)利用這兩種嵌入技術(shù)。然后,我們還將提供關(guān)鍵部分的源代碼分析,以演示如何在langchain-milvus中使用這些新功能。

為了使用本文中的代碼,首先應(yīng)該安裝如下一些軟件包:

pip install langchain_milvus==0.1.6
pip install langchain-huggingface==0.1.0
pip install "pymilvus[model]==2.4.8"

然后,進(jìn)行如下導(dǎo)入:

from langchain_huggingface import HuggingFaceEmbeddings
from langchain_milvus.utils.sparse import BM25SparseEmbedding
from langchain_milvus.vectorstores import Milvus

你還可以在鏈接??https://gist.github.com/omriel1/3b8ea57cc14b896237c47d5417eaec8f處??查看和克隆整個(gè)代碼。

接下來(lái),我們正式開(kāi)始。

密集嵌入

使用向量存儲(chǔ)的最常見(jiàn)方式是使用密集嵌入。在這里,我們使用預(yù)先訓(xùn)練的模型將數(shù)據(jù)(通常是文本,但也可以是其他媒體,如圖像等)嵌入到高維向量中,并將其存儲(chǔ)在向量數(shù)據(jù)庫(kù)中。向量有幾百(甚至幾千)個(gè)維度,每個(gè)條目都是浮點(diǎn)數(shù)。通常,向量中的所有條目都對(duì)應(yīng)非零值,因此稱(chēng)為“密集”。給定一個(gè)查詢(xún),我們使用相同的模型將其嵌入,向量存儲(chǔ)根據(jù)向量相似性檢索相似的相關(guān)數(shù)據(jù)。借助于langchain-milvus這個(gè)框架,只需幾行代碼即可實(shí)現(xiàn)這一點(diǎn)。讓我們具體看一下這是如何完成的。

首先,我們使用來(lái)自??HuggingFace的模型??定義向量存儲(chǔ):

dense_embedding = HuggingFaceEmbeddings(model_name=
"sentence-transformers/all-MiniLM-L6-v2")
vector_store = Milvus(
embedding_function=dense_embedding,
connection_args={"uri": "./milvus_dense.db"}, # Using milvus-lite for simplicity
auto_id=True,
)

然后,我們將數(shù)據(jù)插入到向量存儲(chǔ)中:

document = [
"Today was very warm during the day but cold at night",
"In Israel, Hot is a TV provider that broadcasts 7 days a week",
]
vector_store.add_texts(documents)

在后臺(tái),每個(gè)文檔都使用我們提供的模型嵌入到向量中,并與原始文本一起存儲(chǔ)。

最后,我們可以搜索查詢(xún)并打印得到的結(jié)果:

query = "What is the weather? is it hot?"
dense_output = vector_store.similarity_search(query=query, k=1)
print(f"Dense embeddings results:\n{dense_output[0].page_content}\n")

# 輸出——密集嵌入的結(jié)果如下:
#         Today was very warm during the day but cold at night

在這里,查詢(xún)被嵌入,向量存儲(chǔ)執(zhí)行(通常是近似的)相似性搜索并返回找到的最接近的內(nèi)容。

密集嵌入模型經(jīng)過(guò)訓(xùn)練,可以捕獲數(shù)據(jù)的語(yǔ)義含義并將其表示在多維空間中。其優(yōu)勢(shì)很明顯——它支持語(yǔ)義搜索;這意味著,結(jié)果基于查詢(xún)的含義。但是,有時(shí)僅僅這些還不夠。譬如,如果你尋找特定的關(guān)鍵字,甚至是沒(méi)有更廣泛含義的單詞(如名稱(chēng)),語(yǔ)義搜索就會(huì)誤導(dǎo)你,這種方法就會(huì)失敗。

稀疏嵌入

在LLM成為現(xiàn)實(shí)之前,學(xué)習(xí)模型還沒(méi)有那么流行,搜索引擎使用傳統(tǒng)方法(如??TF-IDF算法???或其現(xiàn)代增強(qiáng)版的??BM25算法???——因其在開(kāi)源分布式搜索引擎??Elasticsearch??中的使用而聞名)來(lái)搜索相關(guān)數(shù)據(jù)。使用這些方法,維度的數(shù)量就是詞匯量(通常為數(shù)萬(wàn),比密集向量空間大得多),每個(gè)條目代表關(guān)鍵字與文檔的相關(guān)性,同時(shí)這也考慮到該術(shù)語(yǔ)的頻率及其在文檔語(yǔ)料庫(kù)中的稀有性。對(duì)于每個(gè)數(shù)據(jù)點(diǎn),大多數(shù)條目都是零(表示未出現(xiàn)的單詞),因此稱(chēng)為“稀疏”。雖然底層實(shí)現(xiàn)不同,但使用langchain-milvus接口后,它變得非常相似。讓我們看看它的實(shí)際效果:

sparse_embedding = BM25SparseEmbedding(corpus=documents)
vector_store = Milvus(
embedding_function=sparse_embedding,
connection_args={"uri": "./milvus_sparse.db"},
auto_id=True,
)
vector_store.add_texts(documents)

query = "Does Hot cover weather changes during weekends?"
sparse_output = vector_store.similarity_search(query=query, k=1)
print(f"Sparse embeddings results:\n{sparse_output[0].page_content}\n")

#輸出:稀疏嵌入結(jié)果:
#         In Israel, Hot is a TV provider that broadcast 7 days a week

BM25適用于精確關(guān)鍵字匹配,這對(duì)于缺乏明確語(yǔ)義含義的術(shù)語(yǔ)或名稱(chēng)非常有用。但是,它不會(huì)捕捉查詢(xún)的意圖,并且在需要語(yǔ)義理解的許多情況下會(huì)產(chǎn)生較差的結(jié)果。

【注意】“稀疏嵌入”一詞也指SPLADE或Elastic Elser等高級(jí)方法。這些方法也可以與Milvus一起使用,并可以集成到混合搜索中!

基于LangChain和云原生向量數(shù)據(jù)庫(kù)Milvus開(kāi)發(fā)混合搜索AI程序-AI.x社區(qū)

作者本人提供的圖片

混合搜索

如果你在上面兩個(gè)示例之間交換查詢(xún),并將每個(gè)查詢(xún)與另一個(gè)嵌入一起使用,則兩者都會(huì)產(chǎn)生錯(cuò)誤的結(jié)果。這表明每種方法都有其優(yōu)點(diǎn),也有其缺點(diǎn)?;旌纤阉鲗烧呓Y(jié)合起來(lái),旨在充分利用兩者的優(yōu)點(diǎn)。通過(guò)使用密集和稀疏嵌入對(duì)數(shù)據(jù)進(jìn)行索引,我們可以執(zhí)行同時(shí)考慮語(yǔ)義相關(guān)性和關(guān)鍵字匹配的搜索,并根據(jù)自定義權(quán)重平衡結(jié)果。同樣,內(nèi)部實(shí)現(xiàn)更復(fù)雜,但langchain-milvus庫(kù)使得這一過(guò)程非常容易。讓我們看看它是如何工作的:

vector_store = Milvus(
embedding_function=[
sparse_embedding,
dense_embedding,
],
connection_args={"uri": "./milvus_hybrid.db"}, 
auto_id=True,
)
vector_store.add_texts(documents)

在此設(shè)置中,稀疏和密集嵌入均適用。下面,讓我們測(cè)試一下具有相等權(quán)重的混合搜索:

query = "Does Hot cover weather changes during weekends?"
hybrid_output = vector_store.similarity_search(
query=query,
k=1,
ranker_type="weighted",
ranker_params={"weights": [0.49, 0.51]},  # Combine both results!
)
print(f"Hybrid search results:\n{hybrid_output[0].page_content}")

#輸出:混合搜索結(jié)果:
#         In Israel, Hot is a TV provider that broadcast 7 days a week

這將使用每個(gè)嵌入函數(shù)搜索相似的結(jié)果,為每個(gè)分?jǐn)?shù)賦予權(quán)重,并返回具有最佳加權(quán)分?jǐn)?shù)的結(jié)果。我們可以看到,如果對(duì)密集嵌入賦予稍微多一點(diǎn)的權(quán)重,我們就會(huì)得到想要的結(jié)果。對(duì)于第二個(gè)查詢(xún)也是如此。

如果我們對(duì)密集嵌入賦予更多權(quán)重,我們將再次得到不相關(guān)的結(jié)果,就像單獨(dú)使用密集嵌入一樣:

query = "When and where is Hot active?"
hybrid_output = vector_store.similarity_search(
query=query,
k=1,
ranker_type="weighted",
ranker_params={"weights": [0.2, 0.8]},  # Note -> the weights changed
)
print(f"Hybrid search results:\n{hybrid_output[0].page_content}")

# 輸出:混合搜索結(jié)果:
#         Today was very warm during the day but cold at night

在密集和稀疏之間找到適當(dāng)?shù)钠胶獠⒎且资?,可以看作是更廣泛的超參數(shù)優(yōu)化問(wèn)題的一部分。目前正在進(jìn)行的研究和工具試圖解決該領(lǐng)域的此類(lèi)問(wèn)題,例如IBM的??AutoAI for RAG??。

你可以通過(guò)更多方式調(diào)整和使用混合搜索方法。例如,如果每個(gè)文檔都有一個(gè)關(guān)聯(lián)的標(biāo)題,則可以使用兩個(gè)密集嵌入函數(shù)(可能使用不同的模型)——一個(gè)用于標(biāo)題,另一個(gè)用于文檔內(nèi)容——并對(duì)兩個(gè)索引執(zhí)行混合搜索。Milvus目前支持多達(dá)10個(gè)不同的向量字段,為復(fù)雜的應(yīng)用程序提供了靈活性。還有用于索引和重新排名方法的其他配置,你可以查看有關(guān)可用參數(shù)和選項(xiàng)的??Milvus文檔??。

結(jié)束語(yǔ)

現(xiàn)在,可以通過(guò)LangChain訪問(wèn)Milvus的多向量搜索功能,你可以輕松地將混合搜索集成到自己的應(yīng)用程序中。這為在你的應(yīng)用程序中應(yīng)用不同的搜索策略開(kāi)辟了新的可能性,從而可以輕松地定制搜索邏輯以適應(yīng)特定使用場(chǎng)景。對(duì)我們來(lái)說(shuō),這是為開(kāi)源項(xiàng)目做貢獻(xiàn)的好機(jī)會(huì)。我們?nèi)粘J褂玫脑S多庫(kù)和工具都是開(kāi)源的,回饋社區(qū)是件好事。希望這對(duì)其他人有所幫助。

最后,我要大聲感謝??Erick Friis???和??Cheng Zi??為langchain-milvus所做的所有努力。沒(méi)有他們,這項(xiàng)工作就不可能完成。

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專(zhuān)家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。

原文標(biāo)題:??Dance Between Dense and Sparse Embeddings: Enabling Hybrid Search in LangChain-Milvus??,作者:Omri Levy,Ohad Eytan

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
已于2024-12-13 09:58:42修改
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦