oracle-vector-search-article_精简版

Oracle 26ai 向量搜索实战:把语义搜索塞进数据库

传统做法:数据在 Oracle,向量在 Pinecone/Milvus,两边同步是噩梦。Oracle 26ai 的思路:AI 模型搬到数据旁边,而不是数据搬到 AI 旁边。 一个库搞定全部。


5 步跑通语义搜索

1. 建表

sql 复制代码
CREATE TABLE docs (
  id   NUMBER PRIMARY KEY,
  text CLOB,
  vec  VECTOR(384, FLOAT32)   -- 原生列类型,384 维
);

精度选择:FLOAT32(默认,4字节)| INT8(省空间,1字节)| FLOAT64(高精度,8字节)

2. 加载嵌入模型(ONNX 格式,数据库内直接跑)

sql 复制代码
BEGIN
  DBMS_VECTOR.LOAD_ONNX_MODEL(
    directory  => 'ONNX_DIR',
    file_name  => 'all_MiniLM_L12_v2.onnx',
    model_name => 'MINILM',
    metadata   => JSON('{"function":"embedding","embeddingOutput":"embedding","input":{"input":["DATA"]}}')
  );
END;
/

3. 生成嵌入

sql 复制代码
-- 插入时实时生成
INSERT INTO docs VALUES (1, 'Oracle 支持向量搜索',
  VECTOR_EMBEDDING(MINILM USING 'Oracle 支持向量搜索' AS DATA));

-- 批量补嵌入
UPDATE docs SET vec = VECTOR_EMBEDDING(MINILM USING text AS DATA) WHERE vec IS NULL;

4. 建索引

sql 复制代码
-- HNSW:查询快,适合百万级(推荐)
CREATE VECTOR INDEX docs_hnsw ON docs(vec)
  ORGANIZATION INMEMORY NEIGHBOR GRAPH
  WITH DISTANCE COSINE
  PARAMETERS (type HNSW, neighbors 32, efconstruction 200);

-- IVF:构建快,省内存,适合千万级+
CREATE VECTOR INDEX docs_ivf ON docs(vec)
  ORGANIZATION NEIGHBOR PARTITIONS
  WITH DISTANCE COSINE WITH TARGET ACCURACY 95
  PARAMETERS (type IVF, neighbor partitions 10);

5. 搜索

sql 复制代码
SELECT id, text FROM docs
ORDER BY VECTOR_DISTANCE(vec,
  VECTOR_EMBEDDING(MINILM USING '如何做向量搜索' AS DATA), COSINE)
FETCH APPROXIMATE FIRST 5 ROWS ONLY WITH TARGET ACCURACY 95;

杀手锏:混合搜索

语义搜索 + 业务过滤,一条 SQL 搞定,独立向量库做不到。

sql 复制代码
-- "轻便跑鞋",500 元以内、有库存
SELECT name, price FROM products
WHERE  price <= 500 AND stock > 0 AND category = '鞋类'
ORDER BY VECTOR_DISTANCE(embedding,
  VECTOR_EMBEDDING(PROD_MODEL USING '轻便跑鞋' AS DATA), COSINE)
FETCH APPROXIMATE FIRST 20 ROWS ONLY WITH TARGET ACCURACY 90;

接地气的例子:客服工单自动匹配

sql 复制代码
-- 建表
CREATE TABLE tickets (
  id NUMBER PRIMARY KEY, question VARCHAR2(1000),
  answer CLOB, q_vec VECTOR(384, FLOAT32)
);

-- 导入历史数据 + 生成嵌入
INSERT INTO tickets (question, answer, q_vec)
SELECT question, answer,
       VECTOR_EMBEDDING(MINILM USING question AS DATA)
FROM legacy_tickets;

-- 建索引
CREATE VECTOR INDEX t_idx ON tickets(q_vec)
  ORGANIZATION INMEMORY NEIGHBOR GRAPH
  WITH DISTANCE COSINE
  PARAMETERS (type HNSW, neighbors 32, efconstruction 200);

-- 新工单:"课程视频打不开",自动找历史相似解法
SELECT question, answer FROM tickets
WHERE answer IS NOT NULL
ORDER BY VECTOR_DISTANCE(q_vec,
  VECTOR_EMBEDDING(MINILM USING '课程视频打不开' AS DATA), COSINE)
FETCH APPROXIMATE FIRST 3 ROWS ONLY WITH TARGET ACCURACY 90;

以前客服手动翻 5 分钟,现在 SQL 3 秒出结果。


RAG 切块

长文档不能直接嵌入,Oracle 内置切块:

sql 复制代码
CREATE TABLE doc_chunks AS
SELECT d.id, c.chunk_id, c.chunk_text,
       VECTOR_EMBEDDING(MINILM USING c.chunk_text AS DATA) AS vec
FROM documents d,
     TABLE(DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS(
       d.text, JSON('{"by":"words","max":200,"overlap":20}'))) c;

对比独立向量库

Oracle 26ai Pinecone/Milvus
数据同步 不需要,就在库里 必须搞同步管道
混合查询 一条 SQL 向量查完再回业务库过滤
事务 ACID 最终一致
运维 零额外 部署+监控+扩缩容
成本 已有 Oracle 就免费 额外付费

踩坑

  • 内存:HNSW 全在内存,百万级至少 4GB Vector Pool
  • 模型大小:ONNX 模型累计上限 2GB,仅支持 Linux
  • 文本长度:单条最长 4000 字符,超长需先切块
  • 驱动:19c/21c 客户端看到 VECTOR 是 CLOB,需最新驱动
  • 索引限制:TRUNCATE 表后向量索引失效需重建

一句话总结

建 VECTOR 列 → 加索引 → 一条 SQL 语义搜索,不用独立向量库。HNSW 吃内存、模型有大小限制,大数据量先算好资源再上车。