Qdrant 是一個向量相似性搜索引擎,它提供了一個生產就緒的服務,具有方便的 API,用於儲存、搜索和管理點(即向量)以及附加的有效載荷。有效載荷可以看作是附加訊息,幫助你精確搜索並提供給用戶有用的訊息。
Server 端官方提供原端以及 Docker 容器兩種啟用方法,雲端免費版本提供1 GB RAM, 0.5 CPU 與 4 GB Disk
那麼我們使用 Docker 的方法部屬我們的向量資量庫,執行以下指令,即可部屬自己的服務
docker run -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage:z \
qdrant/qdrant
-v 掛卷會指定當前目錄的 qdrant_storage 資料夾,進行資料的存儲。
待容器起起來後,根據官方的操作手冊,安裝pip套件以及等等會用到的模型
pip install qdrant-client sentence-transformers
透過以下程式碼確認容器與 collection 是否有被起起來~~
from qdrant_client import QdrantClient
client = QdrantClient("http://localhost:6333")
client.create_collection(
collection_name="Health_Tips",
vectors_config=VectorParams(size=384, distance=Distance.COSINE),
)
這時打開瀏覽器,並且輸入網址http://127.0.0.1:6333/dashboard
確認 collection 有被正確建立
在這邊可以特別注意vector_config
裡面參數,取決於你使用的詞嵌入模型而vector_config
的 size
就要根據模型的維度
去做更動,例如 OpenAI 提供的 text-embedding-ada-002 為 1536,這個維度就想像成一句話會被切分成多少等分的向量,而理論上維度越高,對相似搜尋也越有利。
而後方的 distance
則通常是使用餘弦相似度,算是在計算「文本相似度」的任務中比其他演算法還要來的穩定。
而文本的部份,這次就用一點不一樣的吧,我們來點健康方面的小提示。
from qdrant_client.models import *
text = [
"保持適當的體重,減少肥胖相關的健康問題,如糖尿病和高血壓。"
"學會管理壓力,通過冥想、深呼吸和運動等方法來放鬆身心。",
"正確服用藥物,遵從醫生指示,不自行增加或減少劑量。",
"定期進行牙齒檢查和清潔,每天刷牙和使用牙線以保持口腔健康。",
"及早發現和治療心理健康問題,如焦慮和抑鬱,尋求專業幫助。",
"保護皮膚,避免長時間暴露在陽光下,使用防曬霜來減少皮膚癌的風險。",
"正確的姿勢和適當的椅子高度有助於減少頸部和背部疼痛。",
"定期進行視力檢查,特別是使用電腦和手機時間長的人群。",
"確保家庭急救箱內備有基本藥品和急救用品,隨時應對緊急情況。",
"遵守交通規則,佩戴安全帶和頭盔,以減少交通事故的發生。",
"孕婦應定期產檢,保持健康飲食,避免吸菸和飲酒,確保胎兒健康發育。"
]
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
embeded_text = model.encode(text)
client.upsert(
collection_name="Health_Tips",
points=[
PointStruct(id=i, vector=vector.tolist(), payload={"document": text})
for i, (vector, text) in enumerate(zip(embeded_text, text))
]
)
確認資料上傳完成後,進行相似搜尋的部份。
search_text = "能不能給我一些運動的建議?"
search_results = client.search(
collection_name="Health_Tips",
query_vector=model.encode([search_text])[0],
limit=1
)
print(search_results[0].payload["document"])
"""
適量運動,每週進行至少 150 分鐘的中等強度運動,如快走或騎自行車。
"""
Qdrant 與前兩天介紹的 Faiss 與 Milvus,它結合了 faiss 的速度以及 Milvus 的向量儲存功能,並且本地端也可以透過前端界面以及 API 去操控我們的向量資料,在程式開發上 Qdrant 會對開發者更有好。雖然在拓展性方面輸 Milvus