因為找不到第二堂課影片中的 Jupyter Notebook,本文以 Qdrant 在 GitHub 的入門資料 Getting Started with Qdrant 撰寫。
本文由 Claude 協助撰寫,提醒大家,內容有可能不完全正確。
本文基於 Qdrant 官方 GitHub 中的「qdrant_101_getting_started」教學資料,介紹如何使用 Qdrant 向量資料庫。
Qdrant 是一個向量資料庫和向量搜尋引擎,專為下一代 AI 應用程式設計,廣泛應用於 語義搜尋 和 推薦系統 等領域。
▌1. 專案概述
1.1 專案位置
- GitHub:
qdrant/examples
- 專案路徑:
qdrant_101_getting_started/
- 主要檔案:
getting_started.ipynb
和README.md
1.2 學習目標
根據官方文件,此教學的核心學習目標包括:
- 建立、更新和查詢向量集合:學習如何使用 Qdrant 建立和管理向量資料集合
- 執行語義搜尋:基於新資料進行語義搜尋操作
- 理解推薦 API 機制:深入了解 Qdrant 推薦 API 背後的運作原理
- 探索 Payload 資料類型:理解並創造性地運用各種可加入 Payload 的資料類型
▌2. Qdrant 簡介
2.1 技術特色
Qdrant 是一個開源的向量資料庫,具有以下核心特色:
- 程式語言:使用 Rust 編寫,確保高效能和記憶體安全
- 可擴展性:支援大規模向量相似性搜尋服務
- API 友好:提供便捷的 API 介面
- 多平台支援:可透過 Docker 容器、本地安裝或雲端服務部署
2.2 應用場景
向量資料庫在以下應用中表現出色:
- 語義搜尋系統:理解查詢的語義意義,而非僅依賴關鍵字匹配
- 推薦系統:如 Netflix、Amazon、TikTok、Spotify 等公司使用的個人化推薦
- 內容發現:幫助用戶發現新的相關內容
▌3. 環境設置與安裝
3.1 Docker 安裝方式
Qdrant 的開源版本可透過 Docker 映像檔獲得,這是最直接的安裝方式:
# 下載最新的 Qdrant 映像檔
docker pull qdrant/qdrant
# 執行容器
docker run -p 6333:6333 \
-v $(pwd)/qdrant_storage:/qdrant/storage \
qdrant/qdrant
預設配置下:
- 所有資料將儲存在
./qdrant_storage
目錄中 - 服務運行在
localhost:6333
- 預設無加密或身份驗證(生產環境需要額外設置安全性)
3.2 Python 開發環境設置
教學推薦使用 Python 作為開發語言,因為目前 Python 擁有最成熟的資料工具生態系統:
# 使用 conda/mamba 建立環境
mamba env create -n my_env python=3.10
mamba activate my_env
# 或使用 virtualenv
python -m venv venv
source venv/bin/activate
# 安裝必要套件
pip install qdrant-client pandas numpy faker
3.3 程式庫支援
目前 Qdrant 支援的程式語言包括:
- Rust
- Python
- Go
- TypeScript
未來預期將增加更多程式語言支援。
▌4. 核心概念與資料結構
4.1 Points(點)概念
Points 是 Qdrant 操作的核心實體,包含以下組成要素:
- 向量(Vector):實際的數值向量資料
- ID(可選):可使用無符號整數或 UUID 表示
- Payload(可選):額外的元資料,支援 JSON 格式
4.2 Collection(集合)管理
在 Qdrant 中,Collection 類似於關聯式資料庫中的表格概念:
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams
# 建立客戶端連接
client = QdrantClient("localhost", port=6333)
# 建立集合
client.create_collection(
collection_name="test_collection",
vectors_config=VectorParams(
size=4, # 向量維度
distance=Distance.DOT # 距離計算方式
)
)
4.3 向量距離計算
Qdrant 支援多種向量距離計算方式:
- Dot Product(點積):適用於標準化向量
- Cosine Distance(餘弦距離):常用於文本相似性
- Euclidean Distance(歐氏距離):適用於空間位置計算
第一堂課 minsearch 是用 Cosine similarity 餘弦相似性。
▌5. 實務操作流程
5.1 資料準備
教學中使用 NumPy 生成模擬資料:
import numpy as np
# 生成 1,000 個向量,每個向量 100 維度
vectors = np.random.uniform(-1, 1, (1000, 100)).astype(np.float64)
這些向量可以想像為音樂歌曲的特徵表示,其中每個維度代表歌曲的獨特特性(如節拍、音高、歌手聲音特色等)。
5.2 資料插入操作
將向量資料和相關的 Payload 資訊插入到集合中:
# 準備點資料
points = [
{
"id": i,
"vector": vector.tolist(),
"payload": {
# 可包含任意 JSON 結構的元資料
"song_name": f"Song {i}",
"artist": f"Artist {i}",
# 其他元資料...
}
}
for i, vector in enumerate(vectors)
]
# 批次插入
client.upsert(
collection_name="test_collection",
points=points
)
5.3 搜尋操作
當有新音樂進入系統時(例如 Ricky Martin 的 “Living La Vida Loca”),可以立即將其轉換為向量並進行搜尋:
# 新歌曲的向量表示
new_song_vector = model.transform("living la vida loca")
# 執行相似性搜尋
search_results = client.search(
collection_name="test_collection",
query_vector=new_song_vector,
limit=5 # 限制回傳結果數量
)
▌6. 推薦系統實作
6.1 推薦系統原理
推薦系統是一種根據使用者偏好、興趣或過往行為來建議物品或內容的技術。它分析使用者資料並與具有相似品味的其他使用者進行比較。
6.2 Qdrant 推薦 API
Qdrant 提供專門的推薦 API,支援考慮使用者回饋的推薦系統:
recommendations = client.recommend(
collection_name="test_collection",
positive=[1, 2, 3], # 使用者喜歡的歌曲 ID(👍)
negative=[4, 5], # 使用者不喜歡的歌曲 ID(👎)
limit=10, # 推薦結果數量
query_filter={} # 可選的過濾條件
)
6.3 API 參數說明
- collection_name:選擇向量的目標集合
- positive:指定喜歡的歌曲 ID,推薦相似內容
- negative:指定不喜歡的歌曲 ID,排除相似內容
- limit:指定向使用者顯示的推薦數量
- query_filter:可選的搜尋過濾條件
▌7. 進階功能特色
7.1 Payload 支援
Qdrant 支援在向量上附加任意 JSON Payload,允許基於 Payload 值進行資料儲存和過濾:
- 關鍵字匹配
- 全文搜尋過濾
- 數值範圍查詢
- 地理位置搜尋
- 複合查詢條件(should、must、must_not 子句)
7.2 稀疏向量支援
為了解決向量嵌入在特定關鍵字搜尋方面的限制,Qdrant 引入稀疏向量支援:
- 可視為 BM25 或 TF-IDF 排序的一般化
- 利用基於 Transformer 的神經網路有效地加權個別標記
- 同時支援密集向量和稀疏向量
7.3 效能最佳化選項
Qdrant 提供多種選項使向量搜尋更便宜且更有效率:
- SIMD 硬體加速:利用現代 CPU x86-x64 和 Neon 架構
- 非同步 I/O:使用 io_uring 最大化磁碟輸送量利用率
- 寫前日誌(WAL):確保資料持久性
- 查詢規劃和 Payload 索引:最佳化查詢執行策略
▌8. 部署選項
8.1 本地開發
- 記憶體模式:
QdrantClient(":memory:")
適用於測試和原型開發 - 本地儲存:
QdrantClient(path="path/to/db")
將變更持久化到磁碟
8.2 生產環境
- Docker 容器部署:適用於自託管環境
- Qdrant Cloud:完全託管的 SaaS 解決方案,包含免費方案
- 安全性配置:生產環境需要設置加密和身份驗證
8.3 擴展性支援
Qdrant 提供全面的水平擴展支援:
- 分片(Sharding):透過分片進行大小擴展
- 複製(Replication):透過複製提升輸送量
- 零停機時間滾動更新
- 集合的無縫動態擴展
▌9. 整合生態系統
9.1 客戶端程式庫
Qdrant 提供多種程式語言的客戶端程式庫,便於整合到應用程式堆疊中:
- Python Client
- Rust Client
- Go Client
- TypeScript Client
9.2 第三方整合
文件中提及的整合範例:
- Cohere:使用 Cohere embeddings 建構 QA 應用程式
- DocArray:在 DocArray 中使用 Qdrant 作為文件儲存
- 其他 ML 框架:支援各種機器學習和深度學習框架
▌10. 學習資源與後續步驟
10.1 文件資源
- 線上 OpenAPI 3.0 文件:提供完整的 API 參考
- gRPC 介面:適用於高效能生產級搜尋
- 教學和範例:官方提供的各種使用案例
10.2 進階主題
建議的學習路徑:
- 文本資料處理:Qdrant 101 - Text Data
- 音訊資料應用:Qdrant 101 - Audio Data
- 電商應用:反向圖像搜尋實作
- 無伺服器架構:無伺服器語義搜尋
10.3 實際應用場景
- 語義搜尋引擎:5 分鐘內建構科幻小說語義搜尋引擎
- 推薦系統:音樂、電影、商品推薦
- 圖像搜尋:基於視覺特徵的商品搜尋
- 文件檢索:企業級文件管理和搜尋
▌結論
Qdrant 101 入門教學提供了一個實用的向量資料庫學習起點。從基本的安裝設置到進階的推薦系統實作,教學涵蓋了現代 AI 應用開發所需的核心概念和實務技能。
透過實際的程式碼範例和詳細的概念說明,開發者可以快速掌握如何利用 Qdrant 建構高效能的語義搜尋和推薦系統。
隨著 AI 技術的持續發展,掌握向量資料庫技術將成為現代軟體開發的重要技能。
此教學為後續更深入的 AI 應用開發奠定基礎,是希望在語義搜尋和推薦系統領域發展的理想起點。
▌參考資料