文章目錄
- Oracle 23ai Vector Search 系列之5 向量索引
- Oracle 23ai支持的向量索引類型
- 內存中的鄰居圖向量索引 (In-Memory Neighbor Graph Vector Index)
- 磁盤上的鄰居分區矢量索引 (Neighbor Partition Vector Index)
- 創建向量索引
- HNSW索引
- IVF索引
- 向量索引示例
- 參考
Windows 環境圖形化安裝 Oracle 23ai
Oracle 23ai Vector Search 系列之1 架構基礎
Oracle 23ai Vector Search 系列之2 ONNX(Open Neural Network Exchange)
Oracle 23ai Vector Search 系列之3 集成嵌入生成模型(Embedding Model)到數據庫示例,以及常見錯誤
Oracle 23ai Vector Search 系列之4 VECTOR數據類型和基本操作
Oracle 23ai Vector Search的典型工作流程:
來源:https://blogs.oracle.com/coretec/post/getting-started-with-vectors-in-23ai
Oracle 23ai Vector Search 系列之5 向量索引
Oracle Database 23ai推出了?AI Vector Search??功能,和數據庫的普通索引一樣,對于向量檢索也可以通過??向量索引(Vector Indexes)??加速高維向量的相似性搜索(similarity search)。
Oracle 23ai支持的向量索引類型
Oracle提供了兩種主要索引類型:
- 內存中的鄰居圖向量索引 (In-Memory Neighbor Graph Vector Index)
- 磁盤上的鄰居分區矢量索引(Neighbor Partition Vector Index)
內存中的鄰居圖向量索引 (In-Memory Neighbor Graph Vector Index)
HNSW(Hierarchical Navigable Small World :分層可導航小世界)索引 是 Oracle AI Vector Search 中唯一支持的內存鄰居圖向量索引類型。基于HNSW圖算法,通過多層圖結構加速搜索。
HNSW索引在23ai版本引入的新的內存結構:向量內存池(Vector Memory Pool)中創建;向量內存池(Vector Memory Pool)位于SGA中,Oracle通過 vector_memory_size參數控制這塊內存的大小。
參考:
Understand Hierarchical Navigable Small World Indexes
磁盤上的鄰居分區矢量索引 (Neighbor Partition Vector Index)
IVF(Inverted File Flat :倒排文件扁平) 索引是一種基于分區的向量索引技術,是 Oracle AI Vector Search 中唯一支持的鄰居分區向量索引類型。
IVF索引在磁盤上創建,并且和其他數據塊一樣可以緩存在buffer cache。
參考:
Understand Inverted File Flat Vector Indexes
創建向量索引
創建不同類型向量索引的語法稍有不同。
參考:
CREATE VECTOR INDEX
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-vector-index.html
HNSW索引
HNSW索引創建語法如下:
CREATE VECTOR INDEX vector_index_name ON table_name ( vector_column )[ GLOBAL ] ORGANIZATION INMEMORY [ NEIGHBOR ] GRAPH [ WITH ] [ DISTANCE metric name ][ WITH TARGET ACCURACY percentage_value ][ PARAMETERS ( TYPE HNSW , { [ NEIGHBORS ] | M } max_closest_vectors_connected , [ EFCONSTRUCTION ] max_candidates_to_consider )] [ PARALLEL degree_of_parallelism ]
?參數說明:?
- ORGANIZATION INMEMORY [NEIGHBOR] GRAPH?
聲明索引類型為 ??HNSW(基于內存的圖結構索引)
必須包含 INMEMORY 和 GRAPH 關鍵字。- DISTANCE(可選)??
定義向量相似度的計算方式。
??可選值??:EUCLIDEAN(歐氏距離)L2_SQUARED(歐氏距離平方,即CLIDEAN_SQUARED`)COSINE(余弦相似度)DOT(點積相似度)MANHATTAN(曼哈頓距離)HAMMING(漢明距離)
??默認??:若省略,使用系統默認距離函數(通常是 EUCLIDEAN- WITH TARGET ACCURACY(可選)??
??作用??:指定索引的目標搜索精度(百分比)。
??取值范圍??:>0 且 <=100。
??示例??:WITH TARGET ACCURACY 95 表示目標精度為 95%。
??注意??:精度越高,查詢速度可能越慢。- PARAMETERS(可選)????TYPE HNSW?? 定義 HNSW 索引??NEIGHBORS 或 M???? 作用??:定義每個層中向量最多可連接的鄰居數量(最后一層允許最多 2M 個鄰居)。?? 取值范圍??:>0 且 <=2048。?? 示例??:NEIGHBORS 64 或 M 64。??影響??:值越大,索引構建時間越長,但查詢精度可能更高。??EFCONSTRUCTION???? 作用??:控制索引構建時每一步插入操作搜索的候選向量數量。??取值范圍??:>0 且 <=65535。??示例??:EFCONSTRUCTION 500。??影響??:值越大,索引構建時間越長,但索引質量(精度)更高。- PARALLEL(可選)??
??作用??:指定索引構建時的并行度(如多線程或分布式加速)。
??示例??:PARALLEL 8 表示使用 8 個并行線程。
IVF索引
IVF索引創建語法如下:
CREATE VECTOR INDEX vector_index_name ON table_name ( vector_column )[ INCLUDE ( covering_column[,covering_column]+ ) ][ GLOBAL ] ORGANIZATION [ NEIGHBOR ] PARTITIONS [ WITH ] [ DISTANCE metric name ][ WITH TARGET ACCURACY percentage_value ][ PARAMETERS ( TYPE IVF , { NEIGHBOR PARTITIONS number_of_partitions | [ SAMPLES_PER_PARTITION number_of_samples ]| [ MIN_VECTORS_PER_PARTITION min_number_of_vectors_per_partition] })] [ PARALLEL degree_of_parallelism ]
?參數說明:?
- ??INCLUDE(可選)??
??作用??:指定索引包含的非向量列,用于非向量列的查詢優化。
??示例??:INCLUDE (colomn1)。- GLOBAL(可選)??
??作用??:聲明索引為全局索引(適用于分布式或分區表場景)。
??默認??:省略時為局部索引。- ORGANIZATION [NEIGHBOR] PARTITIONS??
??作用??:聲明索引類型為 ??IVF(基于分區的索引)??。
必須包含 PARTITIONS 關鍵字,NEIGHBOR 為可選修飾符。- DISTANCE(可選)??
定義向量相似度的計算方式。
??可選值??:EUCLIDEAN(歐氏距離)L2_SQUARED(歐氏距離平方,即CLIDEAN_SQUARED`)COSINE(余弦相似度)DOT(點積相似度)MANHATTAN(曼哈頓距離)HAMMING(漢明距離)
??默認??:若省略,使用系統默認距離函數(通常是 EUCLIDEAN- WITH TARGET ACCURACY(可選)??
??作用??:指定索引的目標搜索精度(百分比)。
??取值范圍??:>0 且 <=100。
??示例??:WITH TARGET ACCURACY 95 表示目標精度為 95%。
??注意??:精度越高,查詢速度可能越慢。- PARAMETERS(可選)??
??作用??:定義 IVF 索引的詳細參數,必須包含 TYPE IVF。??NEIGHBOR PARTITIONS????作用??:指定分區的數量(即聚類中心的數量)。??取值范圍??:>0 且 <=10,000,000。??示例??:NEIGHBOR PARTITIONS 1000。??分區越多,每個分區的向量越少,搜索速度越快,但精度可能降低。??SAMPLES_PER_PARTITION????作用??:指定每個分區用于聚類算法的采樣數。??取值范圍??:1 ≤ 值 ≤ 總向量數/分區數。??示例??:SAMPLES_PER_PARTITION 1000。采樣數越多,聚類中心越準確,但構建時間越長。默認值通常為總向量數的 1%~10%。??MIN_VECTORS_PER_PARTITION????作用??:設置每個分區的最小向量數,低于此值的分區會被合并或剔除。??取值范圍??:0 ≤ 值 ≤ 總向量數。??示例??:MIN_VECTORS_PER_PARTITION 100。避免過小的分區(例如設置 ≥100),以提高搜索效率。設為 0 表示不進行分區剪裁。- PARALLEL(可選)??
??作用??:指定索引構建時的并行度(如多線程或分布式加速)。
??示例??:PARALLEL 8 表示使用 8 個并行線程。
參考:
Manage the Different Categories of Vector Indexes
向量索引示例
SQL> CREATE TABLE documents_hnsw (2 id NUMBER PRIMARY KEY,3 content VARCHAR2(4000),4 embedding VECTOR5 );表已創建。SQL> INSERT INTO documents_hnsw (id, content, embedding)2 VALUES3 (1, '自然語言處理技術', VECTOR('[0.1, 0.3, 0.8]')),4 (2, '機器學習算法', VECTOR('[0.2, 0.5, 0.7]')),5 (3, '人工智能應用', VECTOR('[0.4, 0.6, 0.9]'));已創建 3 行。SQL> -- HNSW索引(基于內存圖)
SQL> CREATE VECTOR INDEX idx_docs_hnsw2 ON documents_hnsw (embedding)3 ORGANIZATION INMEMORY NEIGHBOR GRAPH4 DISTANCE COSINE5 WITH TARGET ACCURACY 956 PARAMETERS (7 TYPE HNSW,8 NEIGHBORS 64, -- 每層最大鄰居數9 EFCONSTRUCTION 500 -- 構建時候選數10 )11 PARALLEL 4;索引已創建。SQL> select owner, index_name, index_organization, allocated_bytes, used_bytes, num_vectors2 from v$vector_index where index_organization = 'INMEMORY NEIGHBOR GRAPH';OWNER
--------------------------------------------------------------------------------
INDEX_NAME
--------------------------------------------------------------------------------
INDEX_ORGANIZATION
--------------------------------------------------------------------------------
ALLOCATED_BYTES USED_BYTES NUM_VECTORS
--------------- ---------- -----------
VECTOR
IDX_DOCS_HNSW
INMEMORY NEIGHBOR GRAPH1179648 65660 3SQL> drop INDEX idx_docs_hnsw;索引已刪除。SQL> -- IVF索引(基于分區)
SQL> CREATE VECTOR INDEX idx_docs_ivf2 ON documents_hnsw (embedding)3 ORGANIZATION NEIGHBOR PARTITIONS4 DISTANCE COSINE5 WITH TARGET ACCURACY 906 PARAMETERS (7 TYPE IVF,8 NEIGHBOR PARTITIONS 100, -- 分區數9 SAMPLES_PER_PARTITION 500, -- 每個分區采樣數10 MIN_VECTORS_PER_PARTITION 50 -- 最小向量數/分區11 )12 PARALLEL 4;索引已創建。SQL> select owner, index_name, index_organization, allocated_bytes, used_bytes, num_vectors2 from v$vector_index ;OWNER
--------------------------------------------------------------------------------
INDEX_NAME
--------------------------------------------------------------------------------
INDEX_ORGANIZATION
--------------------------------------------------------------------------------
ALLOCATED_BYTES USED_BYTES NUM_VECTORS
--------------- ---------- -----------
VECTOR
IDX_DOCS_IVF
NEIGHBOR PARTITIONS0 0 3
參考
Oracle AI Vector Search User’s Guide
6 Create Vector Indexes and Hybrid Vector Indexes
CREATE_INDEX
Getting Started with Oracle Database 23ai AI Vector Search
Getting started with vectors in 23ai
Using HNSW Vector Indexes in AI Vector Search
Hybrid Vector Index - a combination of AI Vector Search with Text Search