先前我們在Day 5: 向量資料庫很重要嗎?可以怎麼挑呢?有做過基本的向量資料庫介紹,接下來的程式會有比較多使用到Qdrant的部分,因此我們在這個章節想先進一步和大家做分享。
Qdrant 是一個以 Rust 實作的高效能向量資料庫,主要特點包含:
我們還是先和前面有使用的ChromaDB做比較,整理如下:
特性 | Qdrant | ChromaDB |
---|---|---|
開發語言 / 實作 | Rust(高效能、低延遲) | Python 為主(開發快速,效能相對較低) |
部署方式 | 提供 Docker、Kubernetes、雲端服務(Qdrant Cloud) | 以 Python package 為主,較適合本地快速測試 |
檢索演算法 | HNSW(Hierarchical Navigable Small World) | HNSW |
擴充性 | 分散式支援,可用於大規模生產環境 | 適合小規模專案或原型開發 |
功能特色 | 提供 向量 + 結構化 Filter 檢索、Payload 支援(metadata) | 支援 metadata,但進階 Filter 能力較弱 |
API / SDK | REST / gRPC API,多語言 SDK(Python, JS, Go, Rust 等) | Python SDK 為主 |
適用場景 | 企業級應用、大型知識庫、需要強大 Filter 的情境 | 個人專案、快速 Demo、學術研究 |
面向 | Qdrant |
---|---|
資料量支援 | 單機即可處理 數億到數十億筆向量(官方測試可達數百 GB 到 TB 級資料) |
分散式架構 | 支援 分片(Sharding)與副本(Replication),可橫向擴充叢集 |
佈署模式 | Docker、Kubernetes、裸機安裝、雲端(Qdrant Cloud)皆可,適合企業級佈署 |
索引更新能力 | 支援 即時寫入與更新索引,不需重建整個資料庫 |
整合性 | REST / gRPC API + 多語言 SDK,方便與微服務架構結合 |
生產場景 | 適合 大規模文件庫、需高效檢索的企業應用 |
結論: |
# 使用 Docker 啟動 Qdrant
docker run -p 6333:6333 qdrant/qdrant
pip install qdrant-client
from qdrant_client import QdrantClient
client = QdrantClient(host="localhost", port=6333)
client.create_collection(
collection_name="RAG_Demo", # Collection 名稱
vectors_config=VectorParams(
size=1024, # 向量維度(和你選用的embedding model有關,不能亂設)
distance=Distance.COSINE # 使用餘弦相似度
)
)
這邊補充說明一下向量資料庫的用詞給大家做參考:
傳統關聯式資料庫 | Qdrant 向量資料庫 |
---|---|
Database | Qdrant Instance |
Table | Collection |
Row | Point (資料點) |
Column | Vector + Payload |
Index | Vector Index (HNSW) |
# 列出所有 Collection
collections = client.get_collections()
print(collections)
# 查看特定 Collection 資訊
info = client.get_collection("RAG_Demo")
print(f"向量數量: {info.points_count}")
print(f"向量維度: {info.config.params.vectors.size}")
# 刪除整個 Collection(相當於 DROP TABLE)
client.delete_collection("RAG_Demo")
在 Qdrant 中,我們可以透過 Payload (meta data) 來幫助檢索時進行 Filter,筆者認為這是非常方便的功能。。
例如:你在儲存文本向量時,還可以附加「來源檔名」、「日期」、「類別」、「作者」、「語言」等欄位,讓檢索更精確。
Note:
在使用 filter
之前,你必須先對該欄位建立 index。
如果沒有建立 index,Qdrant 會進行全量掃描(full scan),導致檢索效能非常低落。
下面我們使用一些官方的範例來做說明解釋,示範如何為每個要用來過濾的欄位新增索引。例如:
{
"field_name": "life",
"field_schema": "bool"
}
{
"field_name": "color",
"field_schema": "keyword"
}
{
"field_name": "humidity",
"field_schema": {
"type": "integer",
"range": true
}
}
這樣就能支援布林值、文字標籤 (keyword)、以及數值範圍查詢。
Filter主要有分:
{
"must": [
{
"key": "color",
"match": { "value": "red" }
},
{
"key": "humidity",
"range": { "gte": 60 }
}
]
}
今天針對qdrant做了一些進階的介紹,現在我要來繼續思考後面的題目範例,要怎麼樣能夠真實表現出這些功能的好處,苦惱啊~~~