oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle  VECTOR

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

作者:zxrhhm

Oracle 23ai 中的 VECTOR 数据类型是 Oracle 数据库在 AI 领域的一个重要新特性,它允许用户以向量的形式存储数据,并在这些向量的基础上进行高效的搜索和分析,下面就来介绍一下如何使用

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

二、主要特性

三、应用场景

Oracle 23ai 的 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;

DECLARE
  v_embedding t_VectorTable.embedding%TYPE;
BEGIN
  SELECT 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.

DECLARE
  TYPE vecTabT IS TABLE OF t_VectorTable%ROWTYPE INDEX BY BINARY_INTEGER;
  v_vecTabT vecTabT;
  CURSOR cur IS SELECT * FROM t_VectorTable;
BEGIN
  OPEN cur ;
  FETCH cur  BULK COLLECT INTO v_vecTabT;
  CLOSE cur ;

  -- display the contents of the vector index table
  FOR i IN 1 .. v_vecTabT.LAST LOOP
    DBMS_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
BEGIN
  INSERT 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对向量距离函数的支持。

DECLARE
  v1 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;
BEGIN
  man_dist := L1_DISTANCE(v1, v2); --Manhattan Distance
  euc_dist := L2_DISTANCE(v1, v2); --Euclidean Distance
  cos_dist := COSINE_DISTANCE(v1, v2); --Cosine Distance
  inn_dist := INNER_PRODUCT(v1, v2); --Inner Product
    
  --The Hamming Distance has no standalone function in PL/SQL
  ham_dist := VECTOR_DISTANCE(v1, v2, HAMMING);

  --The Negative Inner (Dot) Product has no standalone function in PL/SQL
  dot_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.

DECLARE
  v1 VECTOR := VECTOR('[1, 2, 3]');
  v2 VECTOR := VECTOR('[4, 5, 6]');
  cos_dist BINARY_DOUBLE;
  euc_dist BINARY_DOUBLE;
  dot_dist BINARY_DOUBLE;
BEGIN
  cos_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 数据类型的应用前景将越来越广阔。

到此这篇关于Oracle 23ai中重要新特性VECTOR数据类型的使用的文章就介绍到这了,更多相关Oracle  VECTOR内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文