APEX实战第5篇:利用APEX程序直观体验向量近似检索能力

APEX实战第5篇:利用APEX程序直观体验向量近似检索能力

2025-09-29 08:14  AlfredZhao  阅读(0)  评论(0)    收藏  举报

在圈内朋友看来,Oracle 数据库的 多模能力 已经不是什么新鲜话题。它不仅在关系型数据管理方面独树一帜,还能够在同一个数据库引擎中,支持几乎所有主流的数据模型 —— 从 JSON、XML、时序、空间,到图数据、区块链,再到如今最火的向量数据与 AI。

利用 Oracle APEX,可以更简单、高效地展示数据库的多模能力。本文将通过一个 简明示例,演示如何使用 APEX 程序 直观地体验向量近似检索(Approximate Nearest Neighbor, ANN) 的能力,从而让多模数据的操作与查询可视化、易上手。

APEX实现功能:文本内容的近似最近邻检索(ANN) 功能。

  • 1.库内Embedding模型准备
  • 2.APEX简明示例
  • 3.其他细节信息参考

1.库内Embedding模型准备

我们知道,Oracle 23ai数据库原生支持向量数据类型的存储,可以支持直接在任意数据库表对象上增加一个或多个vector数据类型的列,专门用于存储向量数据格式。

具体如何存储向量化的数据呢?

  • 首先我们需要一个Embedding模型,可以对指定的内容向量化,然后将向量化后的结果直接存储到vector数据类型的字段中;

如果还没有Embedding模型可用,不必折腾,Oracle本身支持库内加载onnx模型,具体可以参考之前文章《曾经风光无限的 Oracle DBA 已经落伍了吗?》中提到过的方法,唯一需要注意,当时是直接使用了官方文档介绍的all_MiniLM_L12_v2.onnx模型,这里笔者实际测试发现其对中文的匹配效果并不理想,所以换用另一个Embedding模型bge-base-zh-v1.5.onnx,为了方便大家动手操作,这里贴出导入此模型的关键步骤:

--删除模型(可选)
exec DBMS_VECTOR.DROP_ONNX_MODEL(model_name => 'BGE_BASE', force => true);--加载导入模型:
BEGINDBMS_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;
/--查询导入的EMBEDDING模型:
select model_name, algorithm, mining_function from user_mining_models where model_name='BGE_BASE';--测试EMBEDDING模型可用,可以正常返回向量化结果
SELECT VECTOR_EMBEDDING(BGE_BASE USING 'Hi, Alfred' as DATA) AS embedding;

2.APEX简明示例

随便找一张表,对其中任意一个想做近似检索的文本列字段,针对该表增加一个向量列。然后使用上一步配置好的库内Embedding模型进行向量化处理。

我这里就以之前的Demo为基础,针对t_history表中 content列的内容进行向量化,结果存储到表中列v中,数据类型是vector。

关键步骤:

--1.向量字段存储向量化后的内容,只是测试下模型可用
UPDATE t_history
SET v = VECTOR_EMBEDDING(BGE_BASE USING content AS DATA)
where username = 'test';--2.分批处理更新,向量字段存储向量化后的内容,可配置到APEX页面中前台调用
DECLARECURSOR c_history ISSELECT rowid AS rid, contentFROM t_historyWHERE content is not null and (v IS NULL or v_needs_update=1);  -- 只处理未向量化和需要更新向量化的行
BEGINFOR r IN c_history LOOPUPDATE t_historySET v = VECTOR_EMBEDDING(BGE_BASE USING r.content AS DATA)WHERE rowid = r.rid;END LOOP;COMMIT;
END;
/--3.APEX可以通过报表直观展现近似检索功能
SELECT type, week, day, history_date, content
FROM t_history
where username = :APP_USER
ORDER BY VECTOR_DISTANCE(v, VECTOR_EMBEDDING(BGE_BASE USING :P7_SEARCH_TEXT AS DATA))
FETCH APPROX FIRST 5 ROWS ONLY;

APEX近似检索效果:
这里首先我在表中的content列中,初始化了一些测试数据,比如针对爱情、开发等主题,模拟用户日常操作,录入一些与主题相关的内容,不知道该具体输入啥内容的同学,可以直接让LLM帮你生成哈。

然后,我们到APEX页面上进行检索测试。

输入爱情,点击搜索,就可以从该用户历史记录过的所有内容中,检索到它认为向量近似的前5个结果列出来,可以看到结果都与爱情相关,但未必都包含爱情关键字,比如第5条结果描述的单恋场景:

同样,如果输入开发,点击搜索,结果就是这样,很多结果并没有开发关键字,但表述其实都跟软件开发这个主题密不可分:

这也是向量近似检索的魅力所在,历史传统数据库无论是进行精确或模糊搜索,都只能基于关键字匹配,但如今,向量的近似检索使其可以直接依据语义进行搜索。

3.其他细节信息参考

前面已经展示了实际效果,达成了目标,本节主要补充一些信息,方便读者更好地理解实现细节。

我这里在对t_history表处理的过程中,针对向量列的判断里,有写到 (v IS NULL or v_needs_update=1); -- 只处理未向量化和需要更新向量化的行,还特别注释说明了下,这是因为最初我只处理了未向量化的内容,但是我实际在录入文本内容时,存在更新原内容的需求。而原内容因为已经做过向量化,向量部分不会更新,所以搜索会遇到问题,因此需要fix这个更新场景的bug,增加一列,并加入到对应的逻辑判断中:

--fix更新bug
ALTER TABLE t_history ADD v_needs_update NUMBER(1) DEFAULT 0;

这样,当发现有录入或更新内容,都可以做到能提示最终用户,需要处理新内容。

比如用户想近似检索人工智能相关的内容,下面红色数字就表示,表中数据存在更新内容,但还未向量化的情况,检索结果可能存在不准确的情况,这个例子就是如此,除了第一条记录,其他和人工智能其实关系并不大:

此时,用户可以手工点击向量化,将最新更新的一些内容向量化,再次检索,发现除了第一条结果,其他已经不一样了,说明新的内容(这里可以通过History Date列快速识别)确实存在一些比历史数据更匹配人工智能主题的结果:

也许看到这里,有读者会有疑问,为何不直接设计,在更新内容时直接就向量化呢?

嗯,其实也不是不可以,看应用要求,只是我这里这样设计更符合演示要求而已。同时也为了能让大家直观看到,近似检索,实际上检索结果就是distance的排名,如果要求展示的记录数,本身数据集中就没有足够数量匹配的,也会检索出来一些不太相干的内容。

此外,如果数据量较大,基于性能考量,建议创建HNSW(Hierarchical Navigable Small World)类型的向量索引,同时注意Top-K两种写法差异:

--4.创建HNSW索引
create vector index t_history_hnsw_idx on t_history(v)
organization inmemory neighbor graph
distance COSINE
with target accuracy 95;--精确 Top-K
SELECT type, week, day, history_date, content
FROM t_history
ORDER BY VECTOR_DISTANCE(v, VECTOR_EMBEDDING(BGE_BASE USING '爱情' AS DATA))
FETCH FIRST 5 ROWS ONLY;--近似 Top-K,增加了APPROX关键字:
SELECT type, week, day, history_date, content
FROM t_history
ORDER BY VECTOR_DISTANCE(v, VECTOR_EMBEDDING(BGE_BASE USING '爱情' AS DATA))
FETCH APPROX FIRST 5 ROWS ONLY;

至此,我们就利用APEX程序直观体验了向量近似检索能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别复制粘贴!Chat2File-DeepSeek 让 DeepSeek 对话成果直接变“成品” - 指南

告别复制粘贴!Chat2File-DeepSeek 让 DeepSeek 对话成果直接变“成品” - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

详解 PHP 中的命名空间 Namespace 与 PSR4 自动加载

详解 PHP 中的命名空间 Namespace 与 PSR4 自动加载 随着 PHP 项目规模增长,文件管理和类加载问题逐渐凸显:散乱的目录结构、频繁的 require_once 调用、难以维护的类依赖关系。本文通过 namespace 和自动加载技术,…

html5购物网站模板艾佳工业设计

动态调用的作用 类似于其他语言的反射能够开发框架性代码 Call调用语法 (bool success, bytes data) <address>.call(bytes calldata)call是address的方法call返回值(bool success, bytes data)忽视返回值success&#xff0c;会造成严重问题 calldata的结构 call的…

构建易受攻击的AWS DevOps环境:CloudGoat场景实践

本文详细介绍如何在CloudGoat中构建易受攻击的AWS DevOps环境,包含完整的攻击路径分析,从初始权限提升到供应链安全漏洞利用,展示了真实的云安全测试场景。构建易受攻击的AWS DevOps环境作为CloudGoat场景 CloudGoa…

摩尔线程88天过会,过会当天提交注册:看懂这3个关键,才算懂国产GPU的“生存逻辑”

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087摩尔线程88天冲刺上市:看懂这3个关键,才算懂国产GPU的“生存逻辑…

2025最新四面刨厂家权威推荐排行榜:四面刨厂家实力品牌测评,含定制,高速,重型四面刨优选指南

四面刨作为竹木加工的核心设备,其精度与稳定性直接决定产品合格率与生产效率。当前市场中,既有深耕多年的老牌企业,也涌现出一批技术创新的新锐品牌,但同时存在设备精度参差、定制能力不足、售后响应滞后等问题 —…

Java之泛型使用教程

下面我将为你编写一个使用泛型类的示例代码,这个示例实现了一个通用的"配对"(Pair)类,可以存储两个相同或不同类型的值,并提供基本的操作方法。 这个示例展示了泛型类的几个重要特性:多类型参数:Pair…

单调栈优化DP [ROI 2018] Decryption

题意 要求把一个序列划分成很多段,要求对于每段,最大值是末项,最小值是首项。 求最小划分段数。 解法 我们贪心来思考,若我们要保证一直到 i 是合法的,左端点显然是越往左越好,但是在全局上是并没有这个性质的,…

上海住宅新规调整,背后的野心可大了

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087各位,看到这份文本了吗 添加图片注释,不超过 140 字(可选)没看…

手工调整pip whl 文件内容

手工调整pip whl 文件内容属于一个比较常见的问题,比如我们希望自己修改一个whl 文件的内容,但是还是通过pip install 的模式,不希望通过pip 安装之后再手工进行文件替换,解决方法比较简单 有源码的 可以自己重新构…

魔兽争霸3冰封王座安装包下载

​在即时战略游戏的发展史上,有一款作品如同丰碑般屹立不倒,它就是2003年发布的《魔兽争霸3:冰封王座》。即便时光流转二十余载,这款游戏依旧凭借其深厚的玩法底蕴与强大的玩家粘性,活跃在游戏圈中,成为无数玩家…

重庆 机械有限公司 沙坪坝网站建设wordpress设置恢复

本文主要用于工作记录&#xff0c;在项目中遇到了就记录一下 在早期&#xff0c;原生的JDK8是不支持HTTP/2协议的&#xff0c;所以&#xff0c;要想使用这个特性&#xff0c;需要有web服务器和应用环境的支持&#xff0c; 例如&#xff1a;在VM中增加-Xbootclasspath/p:/Users…

广州网站设计总部自己做的网站给人攻击了怎么办

Eclipse 创建第一个 springboot 应用 1、前言 一直想把笔记整理出来&#xff0c;分享一下 springboot 的搭建&#xff1b; 因为私下 idea 用的比较多&#xff0c;使用比较方便&#xff0c;但恰逢小伙伴问起 eclipse 怎么搭建的问题&#xff0c; 顾整理以记之。 2、springboot …

vscode tunnel远程隧道访问 正确重启方法

因为有时候电脑休眠一下,远程隧道就挂了,重启vscode也没用,下面是摸索出来的方法: 在linux上:关闭vscode 结束后台code-tunnel进程 启动vscode 在远程资源管理器中,注销2个Tunnels 点击设置按钮旁边的账户,重启…

深圳住房和建设局网站网上预约网站图片上的分享怎么做的

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 所谓自由&#xff0c;不是随心所欲&#xff0c;而是自我主宰。——康德 目录 一、二叉树刷题纲领二、刷题1、104. 二叉树的最大深度2、 二叉…

企业网站建设的成本背景素材

随着AI预训练大模型的价值不断显现&#xff0c;且模型规模愈发庞大。产学各界已经形成了这样一个共识&#xff1a;AI时代&#xff0c;算力就是生产力。 这一认知虽然正确&#xff0c;却并不全面。数字化系统有存、算、网三大支柱&#xff0c;AI技术也是如此。如果抛开存储和网络…

杭州百度推广网站建设北京网站建设好

一、软件设计发展过程二、什么是DDD&#xff1f;2.1 战略设计2.2 战术设计2.3 名词扫盲1. 领域和子域2. 核心域、通用域和支撑域3. 通用语言4. 限界上下文5. 实体和值对象6. 聚合和聚合根 2.4 事件风暴2.5 领域事件 三、DDD与微服务3.1 DDD与微服务的关系3.2 基于DDD进行微服务…

PS时文本框图层如何与图片图层水平中心对齐

背景: 工作遇到临时要处理一个图片1,需要在图片1中加一个文本,要求与图片的水平中心对齐。 工具:PS2021 ==================================================================== 1.打开图片1 2.点击文字工具添加水…

基于推荐算法的网站开发广东工程造价信息网

简介&#xff1a; 伴随着 5G、IoT 等技术的快速发展&#xff0c;边缘计算被越来越广泛地应用于电信、媒体、运输、物流、农业、零售等行业和场景中&#xff0c;成为解决这些领域数据传输效率的关键方式。与此同时&#xff0c;边缘计算形态、规模、复杂度的日益增长&#xff0c;…

做招聘网站怎么办营业执照学校网站建设工作总结

如今每一天都有不知其数的半导体芯片设计公司与设计验证工程师&#xff0c;在用着电路仿真软件SPICE。SPICE广泛应用在仿真模拟电路&#xff08;例如运放Op Amp&#xff0c;能隙基准稳压电源Bandgap Reference&#xff0c;数模/模数转换 AD/DA等&#xff09;&#xff0c;混合信…