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 吃内存、模型有大小限制,大数据量先算好资源再上车。