Oracle 23ai中重要新特性VECTOR數(shù)據(jù)類型的使用
Oracle 23ai 中的 VECTOR 數(shù)據(jù)類型是 Oracle 數(shù)據(jù)庫在 AI 領(lǐng)域的一個(gè)重要新特性,它允許用戶以向量的形式存儲(chǔ)數(shù)據(jù),并在這些向量的基礎(chǔ)上進(jìn)行高效的搜索和分析。以下是對(duì) Oracle 23ai VECTOR 數(shù)據(jù)類型的詳細(xì)解析:
一、基本概念
Oracle 23ai 中的 VECTOR 數(shù)據(jù)類型是一種用于表示一系列數(shù)值的數(shù)據(jù)類型,這些數(shù)值可以代表不同的含義,比如在幾何學(xué)中代表點(diǎn)的坐標(biāo),在機(jī)器學(xué)習(xí)中代表特征向量等。通過向量化技術(shù),可以將文檔、圖像、視頻等非結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)換為向量形式,進(jìn)而利用這些向量進(jìn)行高效的相似性搜索和分析。
二、主要特性
集成性:VECTOR 數(shù)據(jù)類型完全集成在 SQL 和 PL/SQL 中,支持多種客戶端和編程語言,并在 python-oracledb、node-oracledb、JDBC 和 ODP.NET 驅(qū)動(dòng)程序中具有原生綁定功能。這種全面的支持提供了跨多個(gè)開發(fā)環(huán)境的無縫向量搜索功能。
高效性:Oracle 23ai 提供了高性能的向量索引,如內(nèi)存中的鄰居圖向量索引(In-Memory Neighbor Graph Vector Index)和鄰居分區(qū)矢量索引(Neighbor Partition Vector Index),這些索引技術(shù)能夠顯著加快向量的搜索速度,提高查詢效率。
靈活性:用戶可以根據(jù)需要自定義向量的維度和精度,以適應(yīng)不同的應(yīng)用場景和數(shù)據(jù)類型。同時(shí),Oracle 23ai 還支持在 JSON 類型中嵌入 VECTOR 數(shù)據(jù)類型,使得結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)的處理更加靈活。
安全性:Oracle 23ai 提供了強(qiáng)大的安全性保障,包括透明數(shù)據(jù)加密、Key Vault、Audit Vault 等功能,確保向量數(shù)據(jù)的安全性和隱私性。
三、應(yīng)用場景
Oracle 23ai 的 VECTOR 數(shù)據(jù)類型在多個(gè)領(lǐng)域都有廣泛的應(yīng)用前景,包括但不限于:
- 文檔搜索:在文檔數(shù)據(jù)庫中,用戶可以利用 VECTOR 數(shù)據(jù)類型對(duì)文檔進(jìn)行向量化處理,并通過相似性搜索快速找到相關(guān)的文檔。
- 圖像識(shí)別:在圖像處理領(lǐng)域,VECTOR 數(shù)據(jù)類型可以用于表示圖像的特征向量,并通過向量搜索實(shí)現(xiàn)圖像的快速識(shí)別和分類。
- 推薦系統(tǒng):在電商、社交媒體等平臺(tái)上,推薦系統(tǒng)可以利用 VECTOR 數(shù)據(jù)類型對(duì)用戶和商品進(jìn)行向量化處理,并通過計(jì)算向量之間的相似度來推薦相關(guān)的商品或內(nèi)容。
- 生物信息學(xué):在生物信息學(xué)領(lǐng)域,VECTOR 數(shù)據(jù)類型可以用于表示基因序列、蛋白質(zhì)結(jié)構(gòu)等生物數(shù)據(jù)的特征向量,并通過向量搜索進(jìn)行基因相似性分析、疾病預(yù)測等研究。
四、使用示例
以下是一個(gè)簡單的使用示例,展示了如何在 Oracle 23ai 中創(chuàng)建包含 VECTOR 數(shù)據(jù)類型的表并插入數(shù)據(jù):
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]
在這個(gè)示例中,我們首先創(chuàng)建了一個(gè)名為 orders 的表,該表包含兩個(gè)字段:order_id(訂單ID)和 order_vector(訂單向量)。然后,我們向表中插入了三條記錄,每條記錄的 order_vector 字段都包含了一個(gè)二維向量。最后,我們通過 SELECT 語句查詢了表中的所有記錄。
4.2、將VECTOR數(shù)據(jù)類型與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、匿名塊使用帶有批量獲取的游標(biāo)將VectorTable的向量捕獲到表%ROWTYPE
下面的匿名塊使用帶有批量獲取的游標(biāo)將t_VectorTable的向量和id數(shù)據(jù)捕獲到表%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數(shù)據(jù)類型與PL/SQL觸發(fā)器一起使用
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、將向量距離函數(shù)與PL/SQL一起使用
此示例演示了PL/SQL對(duì)向量距離函數(shù)的支持。
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、將短距運(yùn)算符與PL/SQL一起使用
請(qǐng)注意,由于PL/SQL不支持向量的隱式轉(zhuǎn)換,因此必須在變量賦值之前或在同一行中構(gòu)造向量。這與PL/SQL中的其他距離函數(shù)的行為相同。
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; /
五、總結(jié)
Oracle 23ai 的 VECTOR 數(shù)據(jù)類型是 Oracle 數(shù)據(jù)庫在 AI 領(lǐng)域的一個(gè)重要?jiǎng)?chuàng)新,它為用戶提供了強(qiáng)大的向量化數(shù)據(jù)處理能力,使得用戶能夠更加方便地進(jìn)行相似性搜索和分析。隨著 AI 技術(shù)的不斷發(fā)展,VECTOR 數(shù)據(jù)類型的應(yīng)用前景將越來越廣闊。
到此這篇關(guān)于Oracle 23ai中重要新特性VECTOR數(shù)據(jù)類型的使用的文章就介紹到這了,更多相關(guān)Oracle VECTOR內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle數(shù)據(jù)庫sql的優(yōu)化總結(jié)
自己對(duì)oracle sql的一些優(yōu)化總結(jié),特分享下,方便需要的朋友2013-08-08Oracle實(shí)現(xiàn)細(xì)粒度訪問控制的步驟
細(xì)粒度訪問控制是Oracle數(shù)據(jù)庫中用于提供行級(jí)和列級(jí)安全控制的強(qiáng)大功能,本文主要給大家介紹了Oracle實(shí)現(xiàn)細(xì)粒度訪問控制的步驟,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-09-09Oracle用戶密碼含有特殊字符導(dǎo)致無法登陸解決方法
在客戶端上使用sqlplus用普通用戶可以登錄,但是system以及sys用戶均無法登錄,提示ORA-12154: TNS: 無法解析指定的連接標(biāo)識(shí)符,本文將提供詳細(xì)的解決方法,需要了解的朋友可以參考下2012-11-11Oracle數(shù)據(jù)庫INSERT?INTO的幾種用法舉例
INSERT INTO語句可以有多種寫法,具體取決于插入的數(shù)據(jù)來源和目標(biāo),這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫INSERT?INTO的幾種用法舉例,需要的朋友可以參考下2024-02-02oracle11g管理員密碼忘記怎么辦 sqlplus解決忘記密碼問題
oracle11g管理員密碼忘記了怎么辦?這篇文章主要介紹了oracle 11g管理員密碼忘記問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06MSSQL與Oracle數(shù)據(jù)庫事務(wù)隔離級(jí)別與鎖機(jī)制對(duì)比
事務(wù)隔離級(jí)別是并發(fā)控制的整體解決方案,其實(shí)際上是綜合利用各種類型的鎖和行版本控制,來解決并發(fā)問題。鎖是數(shù)據(jù)庫并發(fā)控制的內(nèi)部機(jī)制,是基礎(chǔ)。對(duì)用戶來說,只有當(dāng)事務(wù)隔離級(jí)別無法解決一些并發(fā)問題和需求時(shí),才有必要在語句中手動(dòng)設(shè)置鎖。2014-08-08與虛擬機(jī)Oracle連接出現(xiàn)ora-12154問題的解決方法
這篇文章主要介紹了與虛擬機(jī)Oracle連接出現(xiàn)ora-12154問題的解決方法,需要的朋友可以參考下2017-03-03Oracle存儲(chǔ)過程、包、方法使用總結(jié)(推薦)
這篇文章主要介紹了Oracle存儲(chǔ)過程、包、方法使用總結(jié)(推薦),需要的朋友可以參考下2017-05-05