RAG基本處理流程

整個流程的優化方向是 “高準確率、快速度、低內存消耗”,利用 Milvus 的向量存儲與檢索能力,實現遊戲數據的高效語義查詢。

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_字段

1. Milvus 核心概念與基礎用法詳解

Milvus 是開源分佈式向量數據庫,以下是其核心概念及創建數據庫、集合、字段的基礎操作:

一、核心概念
  1. 數據庫(Database)
    Milvus 中的獨立數據空間,用於隔離不同業務的集合(類似 MySQL 的數據庫),支持多租户場景。
  2. 集合(Collection)
    Milvus 中存儲數據的容器(類似 MySQL 的表),需定義 Schema(數據結構),包含字段、索引等配置。
  3. Schema
    集合的數據結構定義,包含字段列表、字段類型、主鍵規則等。
  4. 字段架構(Field)
    集合的基本數據單元(類似 MySQL 的列),支持多種類型:
  • 主鍵字段:唯一標識實體,支持 INT64 類型,可手動指定或 Auto ID 自動生成;
  • 向量字段:存儲向量數據,類型為 FLOAT_VECTOR(稠密向量)或 BINARY_VECTOR(二進制向量),需指定維度(如 128、256);
  • 標量字段:存儲結構化數據(如 VARCHARINT32FLOAT),用於條件過濾。
  1. 主鍵和 Auto ID
  • 主鍵:字段需標記 is_primary=True,保證實體唯一性;
  • Auto ID:主鍵字段設置 auto_id=True 時,Milvus 自動生成主鍵值,無需手動傳入。
  1. 索引(Index)
    加速向量檢索的算法結構,支持 HNSW、IVF_FLAT、IVF_PQ 等類型,需在插入數據前創建。
  2. 實體(Entity)
    集合中的一條數據(類似 MySQL 的行),由字段值組成(如 id=1, content="遊戲攻略", vector=[0.1, 0.2...])。
  3. Upsert
    插入或更新實體:若實體主鍵已存在,則更新該實體;若不存在,則插入新實體。
  4. 分區(Partition)
    集合的子集,共享父集合的 Schema,用於按業務規則分組實體(如按“遊戲類型”分區分組)。檢索時可指定分區,減少掃描範圍,提升效率。
  5. 分片(Shard)
    集合的水平切片,對應獨立的數據輸入通道,用於提升寫入吞吐量。集合默認 1 個分片,可在創建時指定分片數(需根據數據量/吞吐量調整)。
  6. 別名(Alias)
    集合的“別名”,一個集合可綁定多個別名,但別名不能共享。用於簡化集合名稱管理(如切換線上/測試集合)。
  7. 函數(Function)
    創建集合時配置的自定義函數,用於導出字段(如從 VARCHAR 字段導出稀疏向量,支持全文+向量混合檢索)。
  8. 一致性級別(Consistency Level)
    定義分佈式場景下數據的一致性,支持 4 種級別:
  • Strong:強一致性(讀操作需等待所有寫操作完成);
  • Bounded Staleness:有限陳舊(讀操作等待指定版本的寫操作完成);
  • Session:會話一致性(同一客户端的讀寫操作保持一致);
  • Eventually:最終一致性(讀操作可能返回舊數據,最終會一致)。
二、基礎用法(以 Python SDK 為例)
1. 連接 Milvus
from pymilvus import MilvusClient

# 連接本地 Milvus 服務
client = MilvusClient(uri="http://localhost:19530")
2. 創建數據庫

在 Milvus 中,數據庫是組織和管理數據的邏輯單元。

  • 多租户創建多個數據庫,為不同的應用程序或租户從邏輯上隔離數據。例如,創建一個數據庫用於存儲用户 A 的數據,另一個數據庫用於存儲用户 B 的數據
# 創建名為 "game_db" 的數據庫
client.create_database(database_name="game_db")

# 切換到該數據庫(後續操作默認在這個庫中)
client.using_database(database_name="game_db")
3. 創建集合(含 Schema、字段、分片)
  • 可以創建多個 Collections 來管理數據,並將數據作為實體插入到 Collections 中。
    Collections 和實體類似於關係數據庫中的表和記錄。
    Collection 是一個二維表,具有固定的列和變化的行。每列代表一個字段,每行代表一個實體。
  • Schema 定義了 Collections 的數據結構。創建 Collections 時,需要根據自己的要求設計模式。
  • 集合架構包含一個主鍵、最多四個向量字段以及多個標量字段。

與關係數據庫中的主字段類似,Collection 也有一個主字段,用於將實體與其他實體區分開來。主鍵字段中的每個值都是全局唯一的,並與一個特定實體相對應。

名為id的字段是主字段。主字段只接受整數或字符串。

• 插入實體時,默認情況下應包含主字段值。

• 如果在創建 Collections 時啓用了AutoId,Milvus 將在插入數據時生成這些值。此時,從要插入的實體中排除主字段值

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_主鍵_02

# 定義 Schema(字段列表)
schema = MilvusClient.create_schema(
    auto_id=False,  # 關閉 Auto ID,手動指定主鍵
    enable_dynamic_field=True  # 允許動態字段(可選)
)

# 添加主鍵字段
schema.add_field(
    field_name="id",
    datatype="INT64",
    is_primary=True
)

# 添加向量字段(128維稠密向量)
schema.add_field(
    field_name="game_vector",
    datatype="FLOAT_VECTOR",
    dim=128
)

# 添加標量字段(遊戲名稱)
schema.add_field(
    field_name="game_name",
    datatype="VARCHAR",
    max_length=100
)

# 添加標量字段(遊戲類型)
schema.add_field(
    field_name="game_type",
    datatype="VARCHAR",
    max_length=50
)

# 創建集合(指定分片數為2,一致性級別為Session)
client.create_collection(
    collection_name="game_collection",
    schema=schema,
    shards_num=2,  # 分片數
    consistency_level="Session"  # 一致性級別
)
4. 創建索引

為特定字段創建索引可提高搜索效率 ,向量字段的索引是強制性的。
建議為所有有用字段創建索引。

向量字段需要同時設置索引類型和度量類型,標量字段只需設置索引類型。
創建了包含索引參數的集合,Milvus 會在創建時自動加載該集合。在這種情況下,索引參數中提到的所有字段都會被索引。

# 為向量字段創建 HNSW 索引
client.create_index(
    collection_name="game_collection",
    field_name="game_vector",
    index_params={
        "index_type": "HNSW",
        "metric_type": "COSINE",  # 相似度度量方式(餘弦)
        "params": {"M": 8, "efConstruction": 64}  # HNSW 參數
    }
)
5. 插入/ Upsert 實體

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_主鍵_03

  • insert 操作:主鍵衝突會報錯當插入的實體主鍵已存在於集合中時,insert 會觸發 PrimaryKeyDuplicateException,無法插入新數據,原有數據也不會被修改。
  • upsert 操作:主鍵相同則覆蓋upsert 是 “插入(insert)+ 更新(update)” 的組合邏輯:
    若主鍵不存在:執行插入,新增實體;
    若主鍵已存在:執行更新,用新數據覆蓋原有實體的所有字段(包括向量、標量字段)。
# 準備實體數據
entities = [
    {
        "id": 1,
        "game_vector": [0.1]*128,
        "game_name": "原神",
        "game_type": "開放世界"
    },
    {
        "id": 2,
        "game_vector": [0.2]*128,
        "game_name": "王者榮耀",
        "game_type": "MOBA"
    }
]

# 插入實體
client.insert(
    collection_name="game_collection",
    data=entities
)

# Upsert 實體(更新 id=1 的實體)
upsert_entities = [
    {
        "id": 1,
        "game_vector": [0.15]*128,
        "game_name": "原神(3.0版本)",
        "game_type": "開放世界"
    }
]
client.upsert(
    collection_name="game_collection",
    data=upsert_entities
)
6. 創建分區

在 Milvus 中,Entity是指Collection中共享同一個Schema的數據記錄,一行中每個字段的數據構成
一個 Entity。因此,同一個 Collection 內的 Entity 具有相同的屬性(例如字段名、數據類型和其他
約束)。
將實體插入集合 (Collection) 時,只有包含 Schema 中定義的所有字段,插入的實體才能成功添加。
插入的實體將按插入順序進入名為_default的分區 (Partition )。如果存在某個分區 (Partition),您
也可以通過在插入請求中指定分區名稱,將實體插入到該分區 (Partition) 中。

# 創建分區(按遊戲類型分區分組)
client.create_partition(
    collection_name="game_collection",
    partition_name="open_world_part"  # 開放世界遊戲分區
)

# 向分區插入實體
partition_entities = [
    {
        "id": 3,
        "game_vector": [0.3]*128,
        "game_name": "塞爾達傳説",
        "game_type": "開放世界"
    }
]
client.insert(
    collection_name="game_collection",
    data=partition_entities,
    partition_name="open_world_part"
)
7. 創建別名

您可以為集合創建別名。一個集合可以有多個別名,但集合之間不能共享一個別名。收到
針對某個集合的請求後,Milvus 會根據提供的名稱查找該集合。

# 為集合綁定別名
client.create_alias(
    collection_name="game_collection",
    alias="game_coll_alias"
)
8. 其他概念及一致性
  • Partition - 分區是集合的子集,與其父集合共享相同的字段集,每個分區包含一個實體子集。通過將實體分配到不同的分區,您可以創建實體組。您可以在特定分區內進行搜索和查詢,讓Milvus 忽略其他分區中的實體,從而提高搜索效率。
  • Shard - 分片是集合的水平切片。每個分片對應一個數據輸入通道。
    每個集合默認都有一個分片。您可以根據預期吞吐量和要插入到集合中的數據量,在創建集合時設置適當的分片數量。。
  • Alias - 您可以為集合創建別名。一個集合可以有多個別名,但集合之間不能共享一個別名。收到針對某個集合的請求後,Milvus 會根據提供的名稱查找該集合。
  • Function - 您可以在 Milvus 創建集合時設置函數來導出字段。例如,全文搜索功能使用用户自定義函數從特定的 varchar 字段導出稀疏向量字段。
  • Consistency Level - 分佈式數據庫系統通常使用一致性級別來定義跨數據節點和副本的數據相同性。可以在創建集合或在集合內進行相似性搜索時設置單獨的一致性級別。適用的一致性級別包括Strong, Bounded Staleness, Session, Eventually。

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_數據_04

2. 索引類型

2.1 FLAT 索引 – 全量掃描

FLAT(Flat Index)是向量數據庫的基礎索引類型,核心是無結構全量暴力掃描——檢索時將查詢向量與所有向量逐一計算相似度,無優化結構,以“速度換精度”。

一、核心定義

FLAT的“Flat”指向量平鋪存儲,無分層、分區等優化,本質是“原始向量存儲+全量遍歷比對”,是向量檢索的“基準方案”。

二、工作流程
  1. 存儲:向量按寫入順序平鋪存儲,無預處理;
  2. 檢索:查詢向量與所有存儲向量逐一計算相似度;
  3. 輸出:按相似度排序,返回Top K結果。
三、關鍵特性
  • 精度:100%無近似誤差,是檢索精度的“黃金基準”;
  • 速度:時間複雜度O(N×D)(N為向量數,D為維度),僅適合小數據量(≤10萬條);
  • 易用性:零參數調優,僅需指定向量字段和相似度計算方式(如L2、餘弦)。
四、適用場景

✅ 小數據集(≤10萬條)、高精度需求(如科研驗證)、高頻寫入場景;
❌ 海量數據、高併發、低延遲場景。

五、實操代碼(Milvus)
# 配置FLAT索引
index_params = client.prepare_index_params().add_index(
    field_name="vector",  # 向量字段名
    index_type="FLAT",    # 四級標題對應功能:FLAT全量掃描
    metric_type="Cosine"  # 相似度計算方式
)
2.2 IVF_FLAT - 倒排文件

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_主鍵_05

IVF_FLAT(Inverted File Flat)是基於聚類分區+倒排索引的向量索引,核心是“先縮小搜索範圍,再全量比對”——通過K-means算法將向量聚成多個簇,檢索時僅在與查詢向量相近的簇內做全量掃描,平衡了FLAT的精度和檢索速度,是中小規模數據(10萬~1000萬條)的常用方案。

一、核心原理:聚類+倒排

IVF_FLAT的“倒排”指“簇中心→簇內向量”的映射關係(類似“關鍵詞→文檔”的倒排索引),工作分為離線聚類在線檢索兩步:

  1. 離線聚類(索引構建)
  • 用K-means算法將所有向量聚成nlist個簇(nlist是配置參數,代表簇的數量);
  • 每個簇選一個“簇中心(centroid)”,並建立“簇中心→該簇內所有向量”的倒排映射表。
  1. 在線檢索(查詢匹配)
  • 計算查詢向量與所有簇中心的相似度,找到最相近的nprobe個簇(nprobe是配置參數,代表要搜索的簇數量);
  • 僅在這nprobe個簇內,對所有向量做全量相似度計算(同FLAT的暴力比對);
  • 按相似度排序,返回Top K結果。
二、關鍵參數(平衡精度與速度)

IVF_FLAT的性能由nlistnprobe共同決定:

  • nlist(簇數量)
  • 越大→簇內向量越少,簇間區分度越高,但聚類開銷越大;
  • 建議值:數據量的1/1000~1/100(如100萬條向量,nlist=1000)。
  • nprobe(搜索簇數量)
  • 越大→覆蓋的簇越多,檢索精度越接近FLAT,但速度越慢;
  • 建議值:nlist1%~5%(如nlist=1000nprobe=10~50)。
三、核心特性

維度

特性描述

檢索速度

遠快於FLAT(僅掃描部分簇),數據量越大優勢越明顯

檢索精度

接近FLAT(nprobe越大,精度越高,最高≈98%)

存儲開銷

額外存儲簇中心和倒排映射表,開銷略高於FLAT

適用數據量

10萬~1000萬條向量(中小規模場景)

四、適用場景

✅ 中小規模向量庫(10萬~1000萬條)、需要平衡“速度與精度”的場景(如企業知識庫、中等流量推薦系統);
❌ 超大規模數據(>1000萬條,建議用HNSW)、極端高精度需求(需用FLAT)。

五、實操代碼(Milvus)
# 配置IVF_FLAT索引
index_params = client.prepare_index_params().add_index(
    field_name="vector",
    index_type="IVF_FLAT",  # 索引類型:IVF_FLAT
    metric_type="Cosine",
    params={
        "nlist": 1000,  # 簇數量
        "nprobe": 20    # 搜索簇數量(檢索時可動態調整)
    }
)
2.3 IVF_PQ:倒排文件與乘積量化

IVF_PQ(Inverted File + Product Quantization)是在IVF_FLAT基礎上結合**乘積量化(PQ)**的向量索引,核心是“聚類縮小範圍+向量壓縮”——既通過IVF的簇分區減少檢索空間,又用PQ將高維向量壓縮為低維編碼,大幅降低存儲開銷與計算成本,適配百萬~億級大規模向量庫。

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_字段_06

一、核心原理:IVF聚類 + 乘積量化

IVF_PQ的工作分為離線編碼在線檢索兩步,核心是“向量分塊壓縮+倒排索引”:

  1. 離線編碼(索引構建)
  • 步驟1:IVF聚類:用K-means將向量聚成nlist個簇,建立“簇中心→簇內向量”的倒排映射(同IVF_FLAT);
  • 步驟2:乘積量化(PQ)
  • 將每個高維向量分塊:把D維向量拆分為m個連續的子向量(如768維拆為12個64維子向量);
  • 子向量聚類:對每個子向量維度,用K-means聚成k個“子簇中心”(稱為“碼本,codebook”);
  • 向量編碼:每個子向量用“距離最近的子簇中心的索引”表示(如用1個字節存儲索引),最終整個向量被壓縮為m個索引組成的“PQ編碼”(存儲開銷僅為原向量的1/m)。
  1. 在線檢索(查詢匹配)
  • 計算查詢向量與簇中心的相似度,選擇nprobe個目標簇;
  • 將查詢向量也拆分為m個子向量,計算每個子向量與對應碼本子簇中心的距離,得到“距離表”;
  • 用“距離表”快速計算查詢向量與目標簇內所有向量的PQ編碼的近似距離,排序後返回Top K結果。
二、關鍵參數(平衡存儲、速度、精度)

參數

含義

調優建議

nlist

IVF的簇數量

同IVF_FLAT(數據量的1/1000~1/100)

nprobe

檢索時選擇的簇數量

同IVF_FLAT(nlist的1%~5%)

m

向量分塊數(PQ的子向量數量)

常用12/24(分塊越多,壓縮率越高,精度略降)

k

每個子向量的碼本大小(子簇數量)

常用256(即每個子向量用1字節編碼)

三、核心特性
  • 存儲開銷極低:高維向量被壓縮為PQ編碼(如768維向量→12字節編碼,壓縮率64:1);
  • 檢索速度快:IVF縮小範圍+PQ編碼的近似距離計算,比IVF_FLAT快1~2個數量級;
  • 精度可控:通過nprobem調優(nprobe越大、m越小,精度越高),最高接近IVF_FLAT;
  • 適用數據量:百萬~億級向量庫(大規模場景的主流選擇)。
四、適用場景

✅ 億級大規模向量庫(如推薦系統、大規模知識庫)、存儲資源有限的場景、高併發低延遲需求;
❌ 極端高精度場景(需用FLAT/IVF_FLAT)、小數據量場景(壓縮收益不明顯)。

2.4 HNSW:分層可導航小世界

HNSW(Hierarchical Navigable Small World)是基於分層圖結構的向量索引,核心是“模擬小世界網絡的分層導航”——通過構建多層連接的圖結構,檢索時從頂層快速定位大致範圍,再逐層向下精細搜索,兼顧了檢索速度與精度,是當前大規模向量庫(億級+)的主流選擇之一。

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_字段_07

一、核心原理:分層小世界圖

HNSW的“小世界”指圖中節點(向量)間存在“短路徑連接”,分層結構則讓檢索能“先粗後細”,工作分為離線建圖在線檢索兩步:

  1. 離線建圖(分層圖構建)
  • 為每個向量隨機分配一個“層數”(頂層向量少,底層向量多);
  • 從頂層開始,為每個向量在同層/高層中選擇M個“近鄰節點”建立連接(M是每個節點的最大連接數);
  • 逐層向下構建,最終形成“頂層稀疏、底層稠密”的分層圖結構。
  1. 在線檢索(分層導航)
  • 從頂層任意節點(入口點)開始,搜索當前層的近鄰節點,找到與查詢向量最相似的節點,作為下一層的入口;
  • 逐層下探至底層,在底層以ef為搜索廣度(ef是底層搜索的候選節點數),遍歷近鄰節點,最終找到Top K最相似向量。
二、關鍵參數(平衡速度與精度)

參數

含義

調優建議

M

每個節點的最大連接數

常用16~64(M越大,精度越高、速度越慢)

ef_construction

建圖時的搜索廣度

建議為M×2(如M=16時,ef_construction=32

ef

檢索時的底層搜索廣度

常用100~200(ef越大,精度越高、延遲越高)

三、核心特性
  • 檢索速度極快:分層導航避免全量掃描,億級數據也能毫秒級響應;
  • 精度高:近似精度可達95%~99%(接近IVF_FLAT);
  • 可擴展性強:支持億級以上大規模向量庫;
  • 存儲開銷中等:需額外存儲節點連接關係,開銷略高於IVF_PQ。
四、適用場景

✅ 億級大規模向量庫(如電商推薦、短視頻檢索)、高併發低延遲場景、對精度要求較高的大規模檢索;
❌ 小數據量場景(建圖開銷大於收益)、極端存儲受限場景(優先選IVF_PQ)。

2.5 DISKANN(磁盤版圖索引)

DISKANN(Disk - based Approximate Nearest Neighbor)是專為超大規模向量檢索設計的磁盤優化圖索引,核心亮點是突破內存限制,將海量向量數據與圖索引主體存儲在SSD,僅通過內存緩存輕量信息,結合優化的Vamana圖結構減少磁盤IO開銷,實現了億級到百億級數據下高召回率與低成本的平衡,是大規模向量檢索中兼顧性價比和穩定性的優選方案。

一、核心原理:Vamana圖與磁盤協同架構

DISKANN的核心是基於Vamana圖結構,並通過磁盤 - 內存協同策略解決大規模數據的存儲與檢索效率問題,整體流程分為離線建索引在線檢索兩部分:

  1. 離線建索引(分塊構圖+磁盤存儲)
  1. 數據分簇分片:先通過全局Kmeans將海量向量分成若干個簇,每個向量會分配到1 - 2個相近簇中,以此拆分超大規模數據集,適配內存有限的建圖需求;
  2. 構建Vamana子圖:為每個簇單獨構建Vamana圖索引,該圖通過兩輪裁邊策略優化——首輪用較嚴格的裁邊條件精簡邊數,第二輪放鬆裁邊參數增加長邊,最終形成直徑小、搜索跳數少的高效圖結構,其搜索性能不遜色於HNSW等主流圖索引;
  3. 索引合併落盤:將所有簇的Vamana子圖合併為全局索引,同時把原始向量數據、圖的鄰接關係等核心數據存儲到SSD,僅將壓縮後的PQ碼、熱點節點等輕量信息預留緩存空間,大幅降低內存佔用。
  1. 在線檢索(緩存加速+批量IO)
  1. 緩存優先查詢:檢索時優先從內存緩存中讀取熱點節點和壓縮向量,快速完成粗粒度篩選,減少磁盤訪問頻次;
  2. 批量磁盤讀取:當需要訪問非緩存節點時,利用beam search策略批量加載多個節點的鄰接信息和向量數據。由於磁盤單次少量隨機訪問與單扇區訪問耗時接近,批量操作可顯著減少IO輪次;
  3. 精確距離重排:粗篩階段用內存中的壓縮向量計算距離,確定候選集後,再讀取磁盤中對應的原始向量計算精確距離,最終返回Top - K最相似結果,兼顧效率與精度。
二、關鍵參數(適配磁盤與性能平衡)

DISKANN的參數調優聚焦於控制索引規模、磁盤IO和召回率,在Milvus等向量數據庫中的核心參數如下:

參數

含義

調優建議

MaxDegree

Vamana圖中節點的最大連接數

默認值56,取值範圍1 - 512。數值越大召回率越高,但會增加索引體積和建圖時間,百億級數據可適當調至80 - 128

search_list

檢索時的候選列表大小

默認值16,需大於查詢的Top - K值。增大該值可提升召回率,但會增加檢索時延

SearchListSize

建索引時的候選列表大小

默認值100,建議設置為小於MaxDegree的值,若無需縮短建圖時間,保持默認即可保障召回率

BeamWidthRatio

每次迭代的最大IO請求數與CPU數量的比值

默認值4.0,取值需匹配磁盤IO能力,過高易造成帶寬浪費,過低則無法發揮多路讀取優勢

PQCodeBugetGBRatio

PQ量化代碼的內存佔用比例

默認值0.125,範圍0.0 - 0.25,增大可提升檢索速度,但會增加內存開銷

三、核心特性
  1. 極致內存節省:僅緩存輕量數據,原始向量和索引常駐SSD,相比HNSW可節省95%以上的內存資源,1台64G內存機器即可支撐十億級向量檢索;
  2. 高召回且低時延:依託Vamana圖的高效結構,召回率可達95%以上,配合批量IO優化,單查詢平均時延可控制在毫秒級,十億級數據集QPS能達到5000;
  3. 可擴展性極強:從千萬級到百億級數據規模,查詢性能波動小,且支持與RaBitQ等量化算法結合,進一步降低內存佔用或提升性能;
  4. 靈活適配場景:支持磁盤模式(低成本大規模存儲)和性能模式(全量加載內存追求極致速度)兩種部署方式。
四、適用場景

✅ 百億級大規模向量存儲場景,如大模型RAG知識庫、百億級商品推薦、短視頻檢索;
✅ 內存成本敏感場景,需在控制硬件開銷的同時保障高召回率;
❌ 極致低時延的內存優先場景(優先選HNSW);
❌ 小數據量場景(建圖和分塊開銷大於收益,FLAT或IVF_FLAT更高效)。

五、與其他主流索引的對比

索引類型

速度

精度

適用數據量

內存開銷

FLAT

極慢

100%

≤10萬條

極高

IVF_FLAT

中等

≈98%

10萬 - 1000萬條


IVF_PQ

極快

≈90%

1000萬 - 10億條

極低

HNSW

極快

≈98%

≥1億條

中等

DISKANN


≈95%

≥10億條

極低

2.6 各種索引類型

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_字段_08

2.7 選型快速預覽

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_主鍵_09

2.8 Milvus中索引的工作機制

Milvus 向量索引的核心是 “數據結構粗過濾→量化加速計算→精煉器重排修正” 的三層協同架構,通過“先粗篩、再加速、最後精準修正”的流程,實現“大規模數據下效率與精度的平衡”。

一、三層架構的具體分工

Milvus 索引的每個模塊承擔不同職責,環環相扣保障檢索效果:

  1. 數據結構(粗過濾:縮小檢索範圍)
  • 作用:從全量向量中快速篩選出與查詢向量“可能相關”的候選子集,避免全量掃描;
  • 實現方式:
  • 如 IVF 類索引:通過 K-means 聚類將向量劃分為多個“桶”,僅掃描與查詢向量最接近的若干桶;
  • 如 HNSW 類索引:通過分層圖結構,從頂層快速定位到底層的近鄰區域,僅遍歷局部節點;
  • 核心目標:將檢索範圍從“全量”縮小到“小部分候選集”,是提升速度的基礎。
  1. 量化(加速計算:降低資源開銷)
  • 作用:對粗過濾後的候選向量做“有損壓縮”,用低精度編碼(如 8 位整數)替代 32 位浮點向量,減少內存佔用與距離計算耗時;
  • 實現方式:
  • 如 SQ8:將向量歸一化後壓縮為 8 位整數;
  • 如 PQ:將向量分塊後用“碼本索引”表示;
  • 核心目標:以輕微精度損失為代價,大幅提升候選集的距離計算速度。
  1. 精煉器(精準重排:修正精度)
  • 作用:彌補量化的精度損失,對量化後的候選集(通常取 topK×擴展率 個結果,如 top10×2=20 個候選),用原始 32 位浮點向量重新計算精確距離,再排序得到最終 topK 結果;
  • 核心目標:在“加速計算”的基礎上,把精度拉回接近原始向量比對的水平,保障最終結果的高質量。
二、完整檢索流程(以 HNSW+PQ+精煉器為例)

以“用户查詢‘2025 新能源政策’”為例,Milvus 索引的工作流程為:

  1. SearchReq 發起:用户請求檢索向量字段,指定返回 top10 結果;
  2. 數據結構粗篩:HNSW 分層圖快速定位到查詢向量的近鄰區域,篩選出 100 個候選向量;
  3. 量化加速計算:用 PQ 編碼快速計算這 100 個候選與查詢向量的近似距離,初步排序後取 top20top10×2);
  4. 精煉器重排:加載這 20 個候選的原始 32 位浮點向量,計算精確距離,重新排序後取 top10 返回給用户。
三、核心優勢
  1. 效率與精度的平衡:粗過濾解決“全量掃描慢”的問題,量化解決“計算開銷大”的問題,精煉器解決“精度損失”的問題,三者結合實現“快且準”;
  2. 模塊可靈活組合:數據結構(如 HNSW/IVF)、量化算法(如 PQ/SQ8)可按需搭配(例如 IVF+PQ、HNSW+SQ8),適配不同場景的速度/精度需求;
  3. 適配大規模數據:三層架構的分工讓 Milvus 能支撐億級甚至百億級向量的低延遲檢索。
2.9 內存估算

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_#milvus_10

3. 檢索(搜索)、度量類型 和 條件過濾

3.1 ANN搜索

Milvus的ANN搜索是一種高效的向量相似度搜索方法,它通過預構建的索引文件來加速搜索過程。與kNN搜索相比,ANN搜索不需要遍歷所有向量,而是通過索引快速定位可能包含最相似向量的子集,從而大大提高了搜索效率。

主要特點包括:

  1. 支持單向量和批量向量搜索
  2. 可以在特定分區內進行搜索
  3. 支持多種相似度度量方式(L2、IP、COSINE等)
  4. 可以通過過濾條件、範圍搜索等方式增強搜索效果
  5. 支持分頁查詢和輸出字段控制
3.2 距離度量
  1. L2(歐氏距離)
    • 適用於連續數值型特徵,如圖像像素或聲紋特徵;
    • 常見於需要精確度量“幾何距離”的場景,例如視覺檢索、點雲匹配等。
  2. IP(內積)
    • 在向量長度(範數)有意義時使用,比如評估未歸一化嵌入向量的匹配強度;
    • 若向量已歸一化,等價於餘弦相似度,可用於文本或推薦系統中的評分計算。
  3. COSINE(餘弦相似度)
    • 最常用於文本、自然語言嵌入之間的語義相似性計算;
    • 不受向量長度影響,關注方向一致性,適合主題或意圖匹配。
  4. JACCARD(交併比距離)
    • 用於集合或二值特徵的相似度評估,如標籤集合、關鍵詞重疊;
    • 在文本片段重疊、推薦系統中基於興趣標籤的匹配場景常見。
  5. HAMMING(海明距離)
    • 專用於二進制向量(如感知哈希、二值化特徵)的相似度度量;
    • 常見於圖像指紋檢索、人臉二值編碼或者簡易哈希匹配場景。
  6. BM25(全文檢索評分)
    • 專為稀疏向量上的全文搜索設計,結合 TF、IDF 和文檔長度歸一化;
    • 適用於文檔檢索、問答系統的倒排索引搜索場景。
3.2.1 字段支持的度量類型

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_#milvus_11

3.2.2 各種度量類型的取值範圍

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_#milvus_12

3.3 過濾搜索

標準過濾會先過濾再搜索,迭代過濾會邊搜索邊過濾,這在處理複雜過濾條件時可能會更高效。

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_主鍵_13

3.4 範圍搜索
  • 範圍搜索是在 ANN 搜索結果的基礎上,進一步按相似度(或距離)
    閾值進行篩選,將符合條件的向量返回。
  • 通過兩個參數 radius(外圈半徑)和 range_filter(內圈半徑)構成一
    對同心圓,返回落在這兩個圓之間(或內外圈定義區間內)的所有向量。
3.5 分組搜索

目的:在基於向量的相似度搜索結果中,按某個標量字段(如 docId、category)分組,以提高結果多樣性,避免同一組內多個相似片段搶佔 Top-K。

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_字段_14

場景舉例:對拆分成多個段落的文檔做檢索,希望最終返回最相關的文檔列表,而不是返回同一文檔中多個相似段落。

流程:

1.ANN 檢索 對整個集合執行近似最近鄰搜索,得到若干最相似實體(chunk)。
2.按字段分組 將檢索結果按 group_by_field 指定的字段值(如 docId)分桶。
3.選取每組 TopN 默認從每個組中取最相似的 1條; 如需更多,可通過 group_size(每組返回條數)和 strict_group_size(是否嚴格保證每組條數)進行控制。
4.整體彙總 最終按組級 TopK(limit)選出若干組,並返回各組內按相似度排序的實體。

3.6 混合搜索

同時對同一實體中的多種向量字段(如稠密向量 dense 與稀疏向量 sparse)
分別執行 ANN 搜索,將各自返回的 Top-K 結果按得分或排名策略重新融合
(rerank),最後輸出一個統一的結果集。
目的:融合多模態或多視角特徵,提高檢索的準確性和魯棒性。

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_字段_15

  1. Embedding 生成
    • 稠密向量(dense):用 BERT、CLIP、其他深度模型生成。
    • 稀疏向量(sparse):用 BM25、SPLADE、BGE-M3 等算法或 Milvus Function 生成。
  2. 創建集合並定義多向量字段
    • 在建表時同時包括 FLOAT_VECTOR(稠密)
    • 和 SPARSE_FLOAT_VECTOR(稀疏)字段, 並分別建立索引。
  3. 插入數據
    • 同一條記錄同時插入兩種向量。
    • 發起多次基礎 ANN 搜索
    • 針對每個向量字段構造一個AnnSearchRequest
  4. 選擇重排序(Reranking)策略
    • WeightedRanker:可為每個向量字段分配權重,強化某些字段的重要性
    • RRFRanker(Reciprocal Rank Fusion):平衡融合,默認參數 k 可調
  5. 執行 Hybrid Search
    • limit 決定最終輸出的 Top-K 條融合結果。
3.7 BM25 全文關鍵字檢索

通過 BM25 對原始文本進行關鍵詞匹配排序,彌補語義向量檢索可能忽略精確詞條匹配的不足.

優勢:
• 接受原始文本輸入,無需手動生成向量;
• 自動將文本分詞、映射為稀疏向量(PARSE_FLOAT_VECTOR);
• 適合需精確命中關鍵術語的場景,如法律、醫藥、配置文檔等;
• 與稠密向量檢索結合,可在 RAG 中實現“語義 + 關鍵詞”雙保險。

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_主鍵_16

3.8 Text Match: 精確文本匹配
  • 精確匹配:基於倒排索引查找包含指定詞條的文檔,不計算相關度分數,僅返回命中實體。
  • 底層引擎:集成 Tantivy ,針對每個 VARCHAR 字段建立倒排索引,按詞條快速定位

– 包含 machine 或 deep
TEXT_MATCH(text, ‘machine deep’)
– 包含 machine 且包含 deep
TEXT_MATCH(text, ‘machine’) AND TEXT_MATCH(text, ‘deep’)
– 包含 machine、learning,但不包含 deep
TEXT_MATCH(text, ‘machine’)
AND TEXT_MATCH(text, ‘learning’)
AND NOT TEXT_MATCH(text, ‘deep’)

3.9 搜索和查詢

搜索是根據度量標準找到相似(距離相近)的向量;
查詢是根據元數據直接定位實體;

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_主鍵_17

4. 多模態檢索方案

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_字段_18

RAG從入門到精通(九)——Milvus數據庫操作介紹及索引類型介紹_數據_19