2026年10月20日 星期二

什麼是 Oracle AI Database 26ai 的 VECTOR 資料型別 文/恆逸資深講師申建忠

 

什麼是 Oracle AI Database 26ai 的 VECTOR 資料型別

申建忠 Frank Shen

  • 精誠資訊 恆逸教育訓練中心 資深講師
  • 技術分類:資料庫

 

 

VECTOR 是 Oracle AI Database 26ai 中全新引入的原生資料型別,用來儲存「向量嵌入值」(Vector Embeddings),並支援在資料庫內直接執行語意相似性搜尋(Similarity Search)。

簡單來說,就是讓你把非結構化資料(文字、圖片、音訊等)透過 Embedding 模型轉換成向量後,直接存在 Oracle 資料庫裡面,不用再把資料搬到另外一套向量資料庫(像 Pinecone、Milvus 之類)。

為什麼需要 VECTOR?

傳統的關聯式查詢是做「關鍵字比對」,而 VECTOR能做到「語意搜尋」:

傳統搜尋語意搜尋
搜尋 "dog" → 只回傳有 "dog" 的資料搜尋 "puppy" → 也能回傳有 "dog"、"doggie"、"Labrador" 的資料
字面相等語意相似

在向量空間裡,語意相近的資料點彼此距離比較近,所以「找到最接近的 K 個向量」就等於「找到語意最相關的K個結果」。

建立表格與向量欄位

CREATE TABLE my_vectors (id NUMBER, embedding VECTOR);

不指定維度和格式時,可以存入不同維度、不同數值型態的向量(適合開發階段)。

指定維度與格式
CREATE TABLE docs (
    doc_id     INT,
    doc_text   CLOB,
    doc_vector VECTOR(384, FLOAT32) -- 384 維,FLOAT32 格式
);

維度取決於你使用的 Embedding 模型,舉例來說:

  • Cohere embed-english-v3.0 : 1024 維
  • OpenAI text-embedding-3-large : 3072 維
  • Hugging Face all-MiniLM-L6-v2 : 384 維
支援的維度格式(Dimension Format)
格式說明
INT88-bit 整數
FLOAT3232-bit IEEE 浮點數
FLOAT6464-bit IEEE 浮點數
BINARY每個維度 1 bit(以 packed UINT8 儲存),儲存空間縮小 32 倍,距離運算可快 40 倍
注意:BINARY 向量的維度必須是 8 的倍數。非 BINARY 向量最大 65535 維,BINARY 向量最大 65528 維。

DENSE 與 SPARSE 向量

預設是 DENSE(稠密)向量,每個維度都有值。你也可以建立 SPARSE(稀疏)向量,只儲存非零維度:

-- DENSE(預設)
VECTOR(384, FLOAT32, DENSE)

-- SPARSE(只存非零值,節省空間)
VECTOR(10000, FLOAT32, SPARSE)
  • Dense 向量:由 BERT、Sentence Transformers 等模型產生,適合語意搜尋。
  • Sparse 向量:由 SPLADE、BM25 等模型產生,每個非零維度代表一個關鍵字,適合對關鍵字敏感度要求高的場景。

兩者可以結合做 Hybrid Vector Search(混合搜尋),同時拿到語意 + 關鍵字的最佳效果。

向量值的文字表示

在 SQL 中,向量值用純字串表示(方括號 + 逗號分隔):

-- 建立表格
CREATE TABLE my_vect_tab (word VARCHAR2(10),v01 VECTOR(2, INT8));

-- 插入資料
INSERT INTO my_vect_tab VALUES('A','[1,1]'),('B','[2,1]'),('C','[2,2]'),('D','[1,2]');

-- 查詢
SELECT * FROM my_vect_tab;
"WORD","V01"
"A","[1,1]"
"B","[2,1]"
"C","[2,2]"
"D","[1,2]"

距離函數(Distance Functions)

VECTOR_DISTANCE(vector1, vector2, metric)

輸入兩個向量,回傳它們之間的距離(BINARY_DOUBLE)

不指定 metric 時,預設使用 COSINE(BINARY 向量預設使用 HAMMING)

支援的度量(Metrics)
Metric說明
COSINE餘弦距離(預設)
DOT內積
EUCLIDEAN歐幾里德距離(L1)
EUCLIDEAN_SQUARED歐幾里德距離但不開根號
MANHATTAN曼哈頓距離(L2)
HAMMING漢明距離
JACCARDJaccard 距離(僅限BINARY向量)
向量運算子(Operator)
運算子對等函數
v1<->v2VECTOR_DISTANCE(v1, v1, EUCLIDEAN)或L2_DISTANCE(v1,v2)
v1<=>v2VECTOR_DISTANCE(v1, v1, COSINE)或CONSINE_DISTANCE(v1,v2)
v1<#>v2-1* VECTOR_DISTANCE(v1, v1, DOT)或INNER_PRODUCT(v1,v2)
-- 找語意最接近的 5 筆(精確搜尋)
SELECT word,v01,vector_distance(v01,to_vector('[1,0]',2,INT8)) dist
FROM my_vect_tab
ORDER BY dist ASC
FETCH FIRST 5 ROWS ONLY;
"WORD","V01","DIST"
"B","[2,1]",0.10557280900008414
"A","[1,1]",0.29289321881345254
"C","[2,2]",0.29289321881345254
"D","[1,2]",0.5527864045000421

-- 使用向量運算子(更簡潔)
SELECT word,v01,vector_distance(v01,to_vector('[1,0]',2,INT8)) dist
FROM my_vect_tab
ORDER BY v01<=> to_vector('[1,0]',2,INT8) ASC
FETCH FIRST 5 ROWS ONLY;
常見錯誤:
ORA-51812: The vector SQL function VECTOR_DISTANCE() requires all
input vectors to have the same dimension format : encountered dimension formats (INT8, FLOAT32).

解決方法:使用to_vector()變更vector格式

向量索引(Vector Index)

向量索引可以加速搜尋,用近似結果換取效能。Oracle 支援兩種索引:

IVF(Inverted File)索引

基於分區(partition-based)的索引,適合大規模資料。

CREATE VECTOR INDEX vec_v01_idx1 ON my_vect_tab (v01)
  ORGANIZATION NEIGHBOR PARTITIONS
  DISTANCE COSINE
  WITH TARGET ACCURACY 90;
HNSW(Hierarchical Navigable Small World)索引

基於圖(graph-based)的索引,適合需要高查詢效能的場景。

CREATE VECTOR INDEX vec_v01_idx2 ON my_vect_tab (v01)
  ORGANIZATION INMEMORY NEIGHBOR GRAPH
  DISTANCE COSINE
  WITH TARGET ACCURACY 95;
索引參數說明
參數IVFHNSW
DISTANCECOSINE(預設)COSINE(預設)
WITH TARGET ACCURACY1~1001~100
NEIGHBOR PARTITIONS分區數(1 ~ 10,000,000)
NEIGHBORS最大鄰居數(2 ~ 2048)
EFCONSTRUCTION建立時每步考慮的候選數(1 ~ 65535)
注意:SPARSE 向量只能建立 HNSW 索引,不能建立 IVF 索引。

向量運算

VECTOR 型別支援跟數字一樣的運算子,運算會作用在每個維度元素上:

-- 加法
SELECT to_vector('[1,1]',2,INT8)+to_vector('[2,1]',2,INT8);
[3,2]

-- 減法
SELECT to_vector('[1,1]',2,INT8)-to_vector('[2,1]',2,INT8);
[-1,0]

-- 乘法
SELECT to_vector('[1,1]',2,INT8)+to_vector('[2,1]',2,INT8);
[2,1]

--avg(),sum()
SELECT sum(v01),avg(v01) FROM my_vect_tab;
"SUM(V01)","AVG(V01)"
"[6.0E+000,6.0E+000]","[1.5E+000,1.5E+000]"

限制(Restrictions)

不能用在以下場景的 VECTOR 欄位:

  • IOT(Index-Organized Table)
  • Cluster / Cluster Table
  • Global Temporary Table
  • 分區鍵(Partitioning Key)
  • Primary Key、Foreign Key
  • Unique / Check Constraint(NOT NULL 除外)
  • Default Value
  • 非向量索引(B-tree、Bitmap、Text、Spatial 等)

不支援的 SQL 構建(針對 VECTOR 欄位):

  • DISTINCT、COUNT DISTINCT
  • ORDER BY、GROUP BY(直接用 VECTOR 欄位)
  • JOIN 條件中直接使用 VECTOR 欄位
  • 比較運算子(>、<、= 等)

總結

VECTOR 資料型別讓 Oracle 從「只能存結構化資料」跨入「能直接處理 AI 語意搜尋」的領域,核心價值在於:

  • 不用在資料庫間搬移資料:向量和業務資料在同一個資料庫裡
  • 同一個SQL查詢:可以將關聯式過濾 + 向量相似搜尋合併在同一個查詢中
  • 完整生態:PL/SQL、JDBC、JSON、External Table、Sharding 全面支援
  • 資料庫內建 Embedding:匯入 ONNX 模型後直接用 SQL 產生向量,資料不用離開資料庫

這讓開發者可以用最熟悉的 SQL 來建構 AI 驅動的應用程式,而不用額外維繫一套向量資料庫。



您可在下列課程中了解更多技巧喔!

0 意見:

張貼留言