代码改变世界

在 Oracle APEX 中用 BGE_BASE 生成向量:从模型导入到历史数据更新

2026-08-24 07:39  AlfredZhao  阅读(17)  评论(0)    收藏  举报

向量检索的第一步,是把文本转成向量。笔者这里使用 Oracle 数据库中的 ONNX 模型 BGE_BASE,并在 APEX 调用匿名块,为历史内容生成或更新向量。

01 | 导入 BGE_BASE ONNX 模型

先将 bge-base-zh-v1.5.onnx 放入数据库目录 DM_DUMP,再通过 DBMS_VECTOR.LOAD_ONNX_MODEL 导入:

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;
/

导入完成后,可查询模型信息:

SELECT model_name, algorithm, mining_function
FROM user_mining_models
WHERE model_name = 'BGE_BASE';

结果中,BGE_BASE 的算法为 ONNX,挖掘函数为 EMBEDDING

02 | 为历史内容生成或更新向量

模型可通过 VECTOR_EMBEDDING 将文本转换为向量。例如:

SELECT VECTOR_EMBEDDING(BGE_BASE USING 'Hi, Alfred' AS DATA) AS embedding;

在历史表 t_history 中,笔者通过匿名块逐行处理内容:仅处理尚未向量化,或标记为需要更新的记录。

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一起成长~