iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
生成式 AI

RAG自己來系列:客服機器人系列 第 7

[Day 7] 用 Milvus 搜尋相似資料

  • 分享至 

  • xImage
  •  

昨天講了 Faiss + sqlite,今天來講另一個向量資料庫 Milvus。

Milvus

Milvis 初次活躍是在 2019 年,其宣稱可以處理萬億級別的向量資料,並且可以處理,圖像、音樂、影片等等的資訊,隨著互聯網的發展和演變,非結構化數據越來越普遍,包括電子郵件、論文、物聯網感測器數據、Facebook 照片、蛋白質結構等。為了讓計算機理解和處理這些非結構化數據,這些數據使用嵌入技術轉換成向量。Milvus 儲存並索引這些向量,並通過計算它們的相似度來分析兩個向量之間的相關性。如果兩個嵌入向量非常相似,則意味著原始數據來源也非常相似。

那這個開源軟體呢,提供了雲服務以及 Docker 兩種部屬方式,這邊由於不使用雲服務去管理,所以我們直接果斷地使用 Docker 的部屬方式。

官方提供了 Shell script 的安裝方式,所以這邊限定 Linux 系統的使用者進行安裝。

# Download the installation script
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh

# Start the Docker container
bash standalone_embed.sh start

等待終端出現 Start successfully. 後即可開始進行操作。

程式操作的部份我們也使用 Langchain 的 milvus 模塊~~

pip install langchain_milvus langchain-community

文字資料我們也使用前一天使用的文檔!

from pymilvus import MilvusClient
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

client = MilvusClient(
    uri="http://<milvus_server_ip>:19530"
)

client.create_collection(
    collection_name="License_sample",
    dimension=384
)

loader = TextLoader("./license.txt")
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=30)
docs = text_splitter.split_documents(loader.load())
data_temp = [record.page_content for record in docs]
line 6: 記得把 IP 改成部屬 Docker 容器的主機位置

再來比較特別,我們需要手動將我們的文本資料,轉換成詞向量,並且重新將轉換出來的向量資料,轉換成 milvus 的 collection 能接受的格式

embeddings = HuggingFaceBgeEmbeddings(
    model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
    model_kwargs = {'device': 'cpu'},
    encode_kwargs = {'normalize_embeddings': True}
)
embed_docs = embeddings.embed_documents(data_temp)

data = []
for index in range(len(embed_docs)):
    data.append({"id": index, "vector": embed_docs[index]})

輸入資料的部份就直接使用 insert 方法插入就可以了

client.insert(
    collection_name="License_sample",
    data=data
)

資料前處理準備就緒後,我們就可以進行相似搜尋的部份了

from langchain_milvus.vectorstores import Milvus
from langchain_community.embeddings import HuggingFaceBgeEmbeddings

embeddings = HuggingFaceBgeEmbeddings(
    model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
    model_kwargs = {'device': 'cpu'},
    encode_kwargs = {'normalize_embeddings': True}
)

session = Milvus(
    embeddings,
    connection_args={"host": "<milvus_server_ip>", "port": "19530"},
    collection_name="License_sample"
)

results = session.similarity_search("Apache")
print(results[0].page_content)

"""
重點規則:

散佈時要附上 Apache 2.0 授權
衍生作品不需要開源
專利授權方面允許製造、使用、販售等多種權利
可為使用者提供擔保、支援服務等,但是不得使用其他貢獻者的名義擔保或背書支援服務
明確說明授權不處理商標權
關於 Apache 2.0 與 BSD 的差異可以參考這篇林懿萱著作的《化簡為繁的 Apache-2.0 授權條款》。

MPL 2.0 授權
https://opensource.org/licenses/MPL-2.0
"""

參考資料


上一篇
[Day 6] 用 Faiss 搜尋相似資料
下一篇
[Day 8] 用 Qdrant 搜尋相似資料
系列文
RAG自己來系列:客服機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言