向量检索的第一步,是把文本转成向量。笔者这里使用 Oracle 数据库中的 ONNX 模型 BGE_BASE,并在 APEX 调用匿名块,为历史内容生成或更新向量。
01 | 导入 BGE_BASE ONNX 模型
先将 bge-base-zh-v1.5.onnx 放入数据库目录 DM_DUMP,再通过 DBMS_VECTOR.LOAD_ONNX_MODEL 导入:
sql
BEGIN
DBMS_VECTOR.LOAD_ONNX_MODEL(
directory => 'DM_DUMP',
file_name => 'bge-base-zh-v1.5.onnx',
model_name => 'BGE_BASE',
metadata => JSON('{
"function": "embedding",
"embeddingOutput": "embedding",
"input": {"input": ["DATA"]}
}')
);
END;
/
导入完成后,可查询模型信息:
sql
SELECT model_name, algorithm, mining_function
FROM user_mining_models
WHERE model_name = 'BGE_BASE';
结果中,BGE_BASE 的算法为 ONNX,挖掘函数为 EMBEDDING。
02 | 为历史内容生成或更新向量
模型可通过 VECTOR_EMBEDDING 将文本转换为向量。例如:
sql
SELECT VECTOR_EMBEDDING(BGE_BASE USING 'Hi, Alfred' AS DATA) AS embedding;
在历史表 t_history 中,笔者通过匿名块逐行处理内容:仅处理尚未向量化,或标记为需要更新的记录。
sql
DECLARE
CURSOR c_history IS
SELECT rowid AS rid, content
FROM t_history
WHERE content IS NOT NULL
AND (v IS NULL OR v_needs_update = 1);
BEGIN
FOR r IN c_history LOOP
UPDATE t_history
SET v = VECTOR_EMBEDDING(BGE_BASE USING r.content AS DATA),
v_needs_update = 0
WHERE rowid = r.rid;
END LOOP;
COMMIT;
END;
其中,v 用于保存生成后的向量;v_needs_update 用于标识是否需要重新向量化。内容为空的数据不会参与处理,已完成且无需更新的数据也会被跳过。
关注我,和AI一起成长~