Oracle 23ai 中的重要新特性 VECTOR 数据类型

server/2024/12/22 20:16:18/

Oracle 23ai 中的 VECTOR 数据类型是 Oracle 数据库在 AI 领域的一个重要新特性,它允许用户以向量的形式存储数据,并在这些向量的基础上进行高效的搜索和分析。以下是对 Oracle 23ai VECTOR 数据类型的详细解析:

参考官方文档地址
https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-data-types.html#GUID-160C5139-EDBE-40BE-8DB4-1CA4E8A1CA46

一、基本概念

Oracle 23ai 中的 VECTOR 数据类型是一种用于表示一系列数值的数据类型,这些数值可以代表不同的含义,比如在几何学中代表点的坐标,在机器学习中代表特征向量等。通过向量化技术,可以将文档、图像、视频等非结构化数据转换为向量形式,进而利用这些向量进行高效的相似性搜索和分析。

二、主要特性

  • 集成性:VECTOR 数据类型完全集成在 SQL 和 PL/SQL 中,支持多种客户端和编程语言,并在 python-oracledb、node-oracledb、JDBC 和 ODP.NET 驱动程序中具有原生绑定功能。这种全面的支持提供了跨多个开发环境的无缝向量搜索功能。

  • 高效性:Oracle 23ai 提供了高性能的向量索引,如内存中的邻居图向量索引(In-Memory Neighbor Graph Vector Index)和邻居分区矢量索引(Neighbor Partition Vector Index),这些索引技术能够显著加快向量的搜索速度,提高查询效率。

  • 灵活性:用户可以根据需要自定义向量的维度和精度,以适应不同的应用场景和数据类型。同时,Oracle 23ai 还支持在 JSON 类型中嵌入 VECTOR 数据类型,使得结构化数据和非结构化数据的处理更加灵活。

  • 安全性:Oracle 23ai 提供了强大的安全性保障,包括透明数据加密、Key Vault、Audit Vault 等功能,确保向量数据的安全性和隐私性。

三、应用场景

Oracle 23ai 的 VECTOR 数据类型在多个领域都有广泛的应用前景,包括但不限于:

  • 文档搜索:在文档数据库中,用户可以利用 VECTOR 数据类型对文档进行向量化处理,并通过相似性搜索快速找到相关的文档。
  • 图像识别:在图像处理领域,VECTOR 数据类型可以用于表示图像的特征向量,并通过向量搜索实现图像的快速识别和分类。
  • 推荐系统:在电商、社交媒体等平台上,推荐系统可以利用 VECTOR 数据类型对用户和商品进行向量化处理,并通过计算向量之间的相似度来推荐相关的商品或内容。
  • 生物信息学:在生物信息学领域,VECTOR 数据类型可以用于表示基因序列、蛋白质结构等生物数据的特征向量,并通过向量搜索进行基因相似性分析、疾病预测等研究。

四、使用示例

以下是一个简单的使用示例,展示了如何在 Oracle 23ai 中创建包含 VECTOR 数据类型的表并插入数据:

4.1、简单的使用示例

CREATE TABLE t_orders (  order_id INT,  order_vector VECTOR  
);  INSERT INTO t_orders VALUES (1, '[100, 200]'), (2, '[210, 220]'), (3, '[310, 330]');  TESTUSER@FREEPDB1> SELECT * FROM t_orders;ORDER_ID ORDER_VECTOR
---------- ----------------------------------------------------------------------------------------------------1 [1.0E+002,2.0E+002]2 [2.1E+002,2.2E+002]3 [3.1E+002,3.3E+002]

在这个示例中,我们首先创建了一个名为 orders 的表,该表包含两个字段:order_id(订单ID)和 order_vector(订单向量)。然后,我们向表中插入了三条记录,每条记录的 order_vector 字段都包含了一个二维向量。最后,我们通过 SELECT 语句查询了表中的所有记录。

4.2、将VECTOR数据类型与PL/SQL一起使用

此示例的第一部分演示了如何将向量选择到PL/SQL向量变量中,在本例中,在向量列上使用%TYPE。

CREATE TABLE t_VectorTable (embedding VECTOR(3, float32), id NUMBER);
INSERT INTO t_VectorTable VALUES ('[1.11, 2.22, 3.33]', 1);
INSERT INTO t_VectorTable VALUES ('[4.44, 5.55, 6.66]', 2);
INSERT INTO t_VectorTable VALUES ('[7.77, 8.88, 9.99]', 3);SET SERVEROUTPUT ON;DECLAREv_embedding t_VectorTable.embedding%TYPE;
BEGINSELECT embedding INTO v_embedding FROM t_VectorTable WHERE id=3;DBMS_OUTPUT.PUT_LINE('Embedding is ' || FROM_VECTOR(v_embedding));
END;
/

Result List

Embedding is [7.76999998E+000,8.88000011E+000,9.98999977E+000]PL/SQL procedure successfully completed.

4.2、匿名块使用带有批量获取的游标将VectorTable的向量捕获到表%ROWTYPE

下面的匿名块使用带有批量获取的游标将t_VectorTable的向量和id数据捕获到表%ROWTYPE索引表中。
The following anonymous block uses a cursor with bulk fetch to capture the VectorTable’s vector and id data into a table%ROWTYPE index table.

DECLARETYPE vecTabT IS TABLE OF t_VectorTable%ROWTYPE INDEX BY BINARY_INTEGER;v_vecTabT vecTabT;CURSOR cur IS SELECT * FROM t_VectorTable;
BEGINOPEN cur ;FETCH cur  BULK COLLECT INTO v_vecTabT;CLOSE cur ;-- display the contents of the vector index tableFOR i IN 1 .. v_vecTabT.LAST LOOPDBMS_OUTPUT.PUT_LINE('Embedding ID ' || v_vecTabT(i).id || ': ' ||FROM_VECTOR(v_vecTabT(i).embedding));END LOOP;
END;
/

在这里插入图片描述

4.3、将VECTOR数据类型与PL/SQL触发器一起使用

CREATE TABLE t_vecLogTable 
(
embedding VECTOR(3, float32), 
describe VARCHAR2(25), 
seq NUMBER
);CREATE SEQUENCE seq_vecTrgSeq;CREATE OR REPLACE TRIGGER tr_VectorTable 
BEFORE UPDATE ON t_VectorTable
FOR EACH ROW
BEGININSERT INTO t_vecLogTable VALUES (:old.embedding, 'OLD.VECTRG',seq_vecTrgSeq.NEXTVAL);INSERT INTO t_vecLogTable VALUES (:new.embedding, 'NEW.VECTRG',seq_vecTrgSeq.NEXTVAL);
END;
/UPDATE t_VectorTable SET embedding='[2.88, 4.99, 8.66]' WHERE id=2;
COMMIT;SELECT * FROM t_vecLogTable  ORDER BY seq;

Result List:

TESTUSER@FREEPDB1> col DESCRIBE format aa30
TESTUSER@FREEPDB1> col DESCRIBE format a30
TESTUSER@FREEPDB1> SELECT * FROM t_vecLogTable  ORDER BY seq;EMBEDDING                                                    DESCRIBE                              SEQ
------------------------------------------------------------ ------------------------------ ----------
[4.44000006E+000,5.55000019E+000,6.65999985E+000]            OLD.VECTRG                              1
[2.88000011E+000,4.98999977E+000,8.65999985E+000]            NEW.VECTRG                              2

4.4、将向量距离函数与PL/SQL一起使用

此示例演示了PL/SQL对向量距离函数的支持。

DECLAREv1 VECTOR := TO_VECTOR('[1, 2, 3]');v2 VECTOR := TO_VECTOR('[4, 5, 6]');man_dist NUMBER;euc_dist NUMBER;cos_dist NUMBER;inn_dist NUMBER;ham_dist NUMBER;dot_dist NUMBER;
BEGINman_dist := L1_DISTANCE(v1, v2); --Manhattan Distanceeuc_dist := L2_DISTANCE(v1, v2); --Euclidean Distancecos_dist := COSINE_DISTANCE(v1, v2); --Cosine Distanceinn_dist := INNER_PRODUCT(v1, v2); --Inner Product--The Hamming Distance has no standalone function in PL/SQLham_dist := VECTOR_DISTANCE(v1, v2, HAMMING);--The Negative Inner (Dot) Product has no standalone function in PL/SQLdot_dist := VECTOR_DISTANCE(v1, v2, DOT);DBMS_OUTPUT.PUT_LINE('The Manhattan distance is: ' || man_dist);DBMS_OUTPUT.PUT_LINE('The Euclidean distance is: ' || euc_dist);DBMS_OUTPUT.PUT_LINE('The Cosine distance is: ' || cos_dist);DBMS_OUTPUT.PUT_LINE('The Inner Product is: ' || inn_dist);DBMS_OUTPUT.PUT_LINE('The Hamming distance is: ' || ham_dist);DBMS_OUTPUT.PUT_LINE('The Dot Product is: ' || dot_dist);
END;
/

在这里插入图片描述

4.5、将短距运算符与PL/SQL一起使用

请注意,由于PL/SQL不支持向量的隐式转换,因此必须在变量赋值之前或在同一行中构造向量。这与PL/SQL中的其他距离函数的行为相同。
Note that because PL/SQL does not support implicit conversion with vectors, you must construct the vectors before the variable assignment or in the same line. This is the same behavior as the other distance functions in PL/SQL.

DECLAREv1 VECTOR := VECTOR('[1, 2, 3]');v2 VECTOR := VECTOR('[4, 5, 6]');cos_dist BINARY_DOUBLE;euc_dist BINARY_DOUBLE;dot_dist BINARY_DOUBLE;
BEGINcos_dist := v1 <=> v2;euc_dist := v1 <-> v2;dot_dist := v1 <#> v2;DBMS_OUTPUT.PUT_LINE(cos_dist);DBMS_OUTPUT.PUT_LINE(euc_dist);DBMS_OUTPUT.PUT_LINE(dot_dist);
END;
/

在这里插入图片描述

五、总结

Oracle 23ai 的 VECTOR 数据类型是 Oracle 数据库在 AI 领域的一个重要创新,它为用户提供了强大的向量化数据处理能力,使得用户能够更加方便地进行相似性搜索和分析。随着 AI 技术的不断发展,VECTOR 数据类型的应用前景将越来越广阔。


http://www.ppmy.cn/server/59980.html

相关文章

VS2019使用C#写窗体程序技巧(1)

1、打开串口 private void button1_Click(object sender, EventArgs e){myPort cmb1.Text;mybaud Convert.ToInt32(cmb2.Text, 10);databit 8;parity Parity.None;stopBit StopBits.One;textBox9.Text "2";try{sp new SerialPort(myPort, mybaud, parity, dat…

SVN 分支管理深入解析

SVN 分支管理深入解析 引言 在软件开发过程中,版本控制是一个核心环节,它帮助团队有效地管理代码变更,协作开发,并维护项目历史。SVN(Subversion)作为一种流行的版本控制系统,提供了分支(Branch)功能,允许开发者在独立的线路上进行工作,而不会影响到主代码库。本文…

2713. 矩阵中严格递增的单元格数

2713. 矩阵中严格递增的单元格数 题目链接&#xff1a;2713. 矩阵中严格递增的单元格数 代码如下&#xff1a; //动态规划&#xff0b;优化 //参考链接:https://leetcode.cn/problems/maximum-strictly-increasing-cells-in-a-matrix/solutions/2286920/dong-tai-gui-hua-you…

鸿蒙读取本地文件同步,异步的优化问题

一、问题引入 有这样一个业务场景&#xff0c; 在进入一个新页面前&#xff0c;需要读取本地文件 。 当这个文件比较大时 &#xff0c;会造成加载页面时间过长。 二、 问题讲解 一般在页面的aboutToAppear里&#xff0c;我们会同步读取文件 &#xff0c; 因为页面UI 依赖文件…

【大模型书籍】复旦新出!大规模语言模型:从理论到实践(推荐)

自2018年以来&#xff0c;包含Google、OpenAI、Meta、百度、华为等公司和研究机构都纷纷发布了包括BERT&#xff0c; GPT等在内多种模型&#xff0c;并在几乎所有自然语言处理任务中都表现出色。 今天给大家推荐一本大模型方面的书籍<大规模语言模型&#xff1a;从理论到实…

2023年高教杯数学建模2023B题解析(仅从代码角度出发)

前言 最近博主正在和队友准备九月的数学建模,在做往年的题目&#xff0c;博主主要是负责数据处理&#xff0c;运算以及可视化&#xff0c;这里分享一下自己部分的工作,相关题目以及下面所涉及的代码后续我会作为资源上传 问题求解 第一题 第一题的思路主要如下&#xff1a;…

stm32h743 NetXduo 实现http server CubeIDE+CubeMX

在这边要设置mpu的大小,要用到http server,mpu得设置的大一些 我是这么设置的,做一个参考 同样,在FLASH.ld里面也要对应修改,SECTIONS里增加.tcp_sec和 .nx_data两个区,我们用ram_d2区域去做网络,这个就是对应每个数据在d2区域的起点。 在CubeMX里,需要用到filex、dhc…

Python-数据爬取(爬虫)

~~~理性爬取~~~ 杜绝从入门到入狱 1.简要描述一下Python爬虫的工作原理&#xff0c;并介绍几个常用的Python爬虫库。 Python爬虫的工作原理 发送请求&#xff1a;爬虫向目标网站发送HTTP请求&#xff0c;通常使用GET请求来获取网页内容。解析响应&#xff1a;接收并解析HTTP响…