iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0

前言

先前我們在Day 5: 向量資料庫很重要嗎?可以怎麼挑呢?有做過基本的向量資料庫介紹,接下來的程式會有比較多使用到Qdrant的部分,因此我們在這個章節想先進一步和大家做分享。

📊 Qdrant 簡介

Qdrant 是一個以 Rust 實作的高效能向量資料庫,主要特點包含:

  1. 高效檢索:使用 HNSW 演算法,能在大規模向量集合中快速檢索。
  2. Payload 支援:可以儲存文件 metadata(例如:來源、時間、分類等)。
  3. Filter 功能:支援在檢索時同時使用 metadata 過濾(例如:只檢索特定日期或分類的文件)。
  4. 多語言 SDK:官方提供 Python、TypeScript、Go、Rust 等 SDK。
  5. 彈性部署:可本地執行,也可使用 Qdrant Cloud。

🔍Qdrant的優勢

Qdrant 與 ChromaDB 比較

我們還是先和前面有使用的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的擴充性比較

面向 Qdrant
資料量支援 單機即可處理 數億到數十億筆向量(官方測試可達數百 GB 到 TB 級資料)
分散式架構 支援 分片(Sharding)與副本(Replication),可橫向擴充叢集
佈署模式 Docker、Kubernetes、裸機安裝、雲端(Qdrant Cloud)皆可,適合企業級佈署
索引更新能力 支援 即時寫入與更新索引,不需重建整個資料庫
整合性 REST / gRPC API + 多語言 SDK,方便與微服務架構結合
生產場景 適合 大規模文件庫、需高效檢索的企業應用
結論
  • 如果只是要快速測試 RAG 概念,ChromaDB 較為方便。
  • 如果需要 生產級大量文件進階檢索條件(Filter),則建議選擇 Qdrant

⚙️Qdrant 基本操作

1. 安裝與啟動

# 使用 Docker 啟動 Qdrant
docker run -p 6333:6333 qdrant/qdrant

2. python SDK安裝

pip install qdrant-client

3. 建立連線

from qdrant_client import QdrantClient

client = QdrantClient(host="localhost", port=6333)

4.建立Collection

client.create_collection(
    collection_name="RAG_Demo",           # Collection 名稱
    vectors_config=VectorParams(
        size=1024,                        # 向量維度(和你選用的embedding model有關,不能亂設)
        distance=Distance.COSINE          # 使用餘弦相似度
    )
)

這邊補充說明一下向量資料庫的用詞給大家做參考:

  • 傳統關聯式資料庫 vs Qdrant 向量資料庫
傳統關聯式資料庫 Qdrant 向量資料庫
Database Qdrant Instance
Table Collection
Row Point (資料點)
Column Vector + Payload
Index Vector Index (HNSW)

5.查看collection資訊

# 列出所有 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}")

6.刪除collection

# 刪除整個 Collection(相當於 DROP TABLE)
client.delete_collection("RAG_Demo")

🔑 Qdrant的Filter功能

在 Qdrant 中,我們可以透過 Payload (meta data) 來幫助檢索時進行 Filter,筆者認為這是非常方便的功能。。
例如:你在儲存文本向量時,還可以附加「來源檔名」、「日期」、「類別」、「作者」、「語言」等欄位,讓檢索更精確。

⚠️ Filter 注意事項

Note:
在使用 filter 之前,你必須先對該欄位建立 index
如果沒有建立 index,Qdrant 會進行全量掃描(full scan),導致檢索效能非常低落。


建立欄位索引 (Set index for fields)

下面我們使用一些官方的範例來做說明解釋,示範如何為每個要用來過濾的欄位新增索引。例如:

  • 對life設定是bool
{
    "field_name": "life",
    "field_schema": "bool"
}
  • 對color設定是keyword
{
    "field_name": "color",
    "field_schema": "keyword"
}
  • 對humidity設定是integer
{
    "field_name": "humidity",
    "field_schema": {
        "type": "integer",
        "range": true
    }
}

這樣就能支援布林值、文字標籤 (keyword)、以及數值範圍查詢。

Filtering 語法

Filter主要有分:

  1. must:條件必須符合
  2. should符合條件的結果會被優先排序,但不是強制
  3. must_not:排除不符合條件的結果
  4. range:範圍條件,常用於數字或日期
  • 範例:查詢「color = red」且「humidity > 60」的文件
{
  "must": [
    {
      "key": "color",
      "match": { "value": "red" }
    },
    {
      "key": "humidity",
      "range": { "gte": 60 }
    }
  ]
}

📌小結

今天針對qdrant做了一些進階的介紹,現在我要來繼續思考後面的題目範例,要怎麼樣能夠真實表現出這些功能的好處,苦惱啊~~~


上一篇
Day 15: 在地端運行 LLM:Ollama、vLLM 與 llama.cpp 比較以及ollama安裝
下一篇
Day 17: 大家都在Agent,那你知道什麼是Agentic RAG嗎?
系列文
從 RAG 到 Agentic RAG:30 天打造本機智慧檢索系統20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言