Oracle 23ai中重要新特性VECTOR数据类型的使用 |
Oracle 23ai 中的 VECTOR 数据类型是 Oracle 数据库在 AI 领域的一个重要新特性,它允许用户以向量的形式存储数据,并在这些向量的基础上进行高效的搜索和分析 。以下是对 Oracle 23ai VECTOR 数据类型的详细解析: 参考官方文档地址 一、基本概念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索引表中 。 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中的其他距离函数的行为相同 。 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内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! |