LLM/RAG Zoomcamp 課外補充 3:Qdrant 101 入門指南

因為找不到第二堂課影片中的 Jupyter Notebook,本文以 Qdrant 在 GitHub 的入門資料 Getting Started with Qdrant 撰寫。

本文由 Claude 協助撰寫,提醒大家,內容有可能不完全正確。

本文基於 Qdrant 官方 GitHub 中的「qdrant_101_getting_started」教學資料,介紹如何使用 Qdrant 向量資料庫。

Qdrant 是一個向量資料庫和向量搜尋引擎,專為下一代 AI 應用程式設計,廣泛應用於 語義搜尋推薦系統 等領域。

▌1. 專案概述

1.1 專案位置

  • GitHubqdrant/examples
  • 專案路徑qdrant_101_getting_started/
  • 主要檔案getting_started.ipynbREADME.md

1.2 學習目標

根據官方文件,此教學的核心學習目標包括:

  1. 建立、更新和查詢向量集合:學習如何使用 Qdrant 建立和管理向量資料集合
  2. 執行語義搜尋:基於新資料進行語義搜尋操作
  3. 理解推薦 API 機制:深入了解 Qdrant 推薦 API 背後的運作原理
  4. 探索 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 進階主題

建議的學習路徑:

  1. 文本資料處理:Qdrant 101 - Text Data
  2. 音訊資料應用:Qdrant 101 - Audio Data
  3. 電商應用:反向圖像搜尋實作
  4. 無伺服器架構:無伺服器語義搜尋

10.3 實際應用場景

  • 語義搜尋引擎:5 分鐘內建構科幻小說語義搜尋引擎
  • 推薦系統:音樂、電影、商品推薦
  • 圖像搜尋:基於視覺特徵的商品搜尋
  • 文件檢索:企業級文件管理和搜尋

▌結論

Qdrant 101 入門教學提供了一個實用的向量資料庫學習起點。從基本的安裝設置到進階的推薦系統實作,教學涵蓋了現代 AI 應用開發所需的核心概念和實務技能。

透過實際的程式碼範例和詳細的概念說明,開發者可以快速掌握如何利用 Qdrant 建構高效能的語義搜尋和推薦系統。

隨著 AI 技術的持續發展,掌握向量資料庫技術將成為現代軟體開發的重要技能。

此教學為後續更深入的 AI 應用開發奠定基礎,是希望在語義搜尋和推薦系統領域發展的理想起點。

▌參考資料