پشتیبانی دیتابیس اوراکل 23ai از AI Vector Search

همانطور که می دانید با استفاده از بردارها می توان داده های بدون ساختار نظیر عکس، ویدئو، صوت و … را به عدد(آرایه ای از اعداد) تبدیل کرد تا علاوه بر حفظ کیفیت محتوا، اثر شایانی را بر روی جستجوی معنایی گذاشت طوری که جستجوی برداری بر بسیاری از محدودیتهای سنتی غلبه کرده و این امکان را به ما می دهد تا با توصیف هر آنچه را که در ذهن داریم عملیات جستجو را انجام دهیم.

به عبارتی دیگر، با کمک جستجوی برداری می توانیم عکس، ویدئو، صوت و … را بر اساس محتوا و بر مبنای Similarity Search جستجو کنیم بدون آنکه از محتوای آنها متنی در جایی ثبت شده باشد، درحالیکه جستجوهای سنتی، جستجو را بر اساس کلمات کلیدی، شباهت واژگانی، فراوانی وقوع کلمات انجام می دهند.

Vector Databaseهای متعددی وجود دارند که می توان از آنها به طور تخصصی به عنوان دیتابیس بردار استفاده کرد اما بسیاری از این دیتابیسها از SQL، عملیات CRUD(create, read, update, delete)، بکاپ و ریکاوری و … پشتیبانی نمی کنند. بنابرین ذخیره این نوع از دیتا در دیتابیسهای رابطه ای می تواند یک مزیت به شمار بیاید چرا که انواع مختلفی از داده را می توان صرفا در یک دیتابیس ذخیره کرد و با ابزارهای سنتی با قابلیتهای مدرن کار کرد.

دیتابیس اوراکل به عنوان یک دیتابیس رابطه ای قدرتمند تلاش کرده تا در این زمینه راهکاری را ارائه کند. این دیتابیس از نسخه 23ai قابلیت AI Vector Search را به طور کامل پشتیبانی می کند. تبدیل داده های بدون ساختار مثل عکس و فیلم به اعداد(Vector Embedding)، ذخیره آنها در دیتابیس، ایندکس گذاری، امکان اجرای جستجوی شباهت(Similarity Search) و … از این نسخه(23ai) در دیتابیس اوراکل قابل انجام است.

همچنین از 23.4، برای بردارها نوع داده جدیدی به نام vector تعریف شده است که در این مستند نکاتی را در مورد این نوع داده و نحوه ذخیره اطلاعات در آن بیان خواهیم کرد.

در ابتدا جدولی با نام tbl_bordar که ستونی با نوع داده vector دارد را ایجاد می کنیم:

[oracle@OEL8 ~]$ sqlplus "/as sysdba"
SQL*Plus: Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems on Fri Aug 30 20:07:03 2024
Version 23.5.0.24.07

SQL> create table tbl_bordar(id number,Bordar vector);
Table created.

SQL> desc tbl_bordar                          
 Name               Null?    Type           
 ------------------ -------- -------------- 
 ID                          NUMBER         
 BORDAR                      VECTOR(*, *)  

اطلاعات بردارها را می توانیم در ستون BORDAR ذخیره کنیم:

SQL> insert into tbl_bordar values(1,'[2,3]');
1 row created.
SQL> insert into tbl_bordar values(2,'[7,2,3,4,6]');
1 row created.

اطلاعات ثبت شده به شکل زیر نمایش داده می شوند:

SQL> select * from tbl_bordar;
        ID BORDAR
---------- --------------------------------------------------
         1 [2.0E+000,3.0E+000]
         2 [7.0E+000,2.0E+000,3.0E+000,4.0E+000,6.0E+000]

امکان بروزرسانی آنها هم وجود دارد:

SQL> update tbl_bordar set BORDAR='[7.65,9.85,4.52]' where id=1;
1 row updated.
SQL> select * from tbl_bordar;
        ID BORDAR
---------- --------------------------------------------------
         1 [7.6500001E+000,9.85000038E+000,4.51999998E+000]
         2 [7.0E+000,2.0E+000,3.0E+000,4.0E+000,6.0E+000]

یک جدول می تواند چندین ستون از نوع داده vector داشته باشد:

SQL> insert into tbl_bordarHa values(1,'[1,2,3]','[23,44,55,66,77]');
1 row created.
SQL> select * from tbl_bordarHa;
        ID BOR1                            BOR2
---------- ------------------------------  --------------------------------------------------
         1 [1.0E+000,2.0E+000,3.0E+000]    [2.3E+001,4.4E+001,5.5E+001,6.6E+001,7.7E+001]

برای هر بردار می توان محدودیت ابعاد گذاشت مثلا در قسمت زیر، بردار باید سه بعد داشته باشد:

SQL> create table tbl_bordar(id number,Bor1 vector(3));
Table created.
SQL> insert into tbl_bordar values(1,'[1,2,3]');
1 row created.

در غیر این صورت، خطای ORA-51803 رخ خواهد داد:

SQL> insert into tbl_bordar values(2,'[1,2]');
ORA-51803: Vector dimension count must match the dimension count specified in the column definition (actual: 2, required: 3).
Help: https://docs.oracle.com/error-help/db/ora-51803/

SQL> insert into tbl_bordar values(2,'[1,2,3,4]');
ORA-51803: Vector dimension count must match the dimension count specified in the column definition (actual: 4, required: 3).
Help: https://docs.oracle.com/error-help/db/ora-51803/

برای جداولی که از قبل ایجاد شده اند هم می توان ستونهای از نوع vector اضافه کرد:

SQL> create table tbl_person(id number,name varchar2(14),last_name varchar2(14));
Table created.
SQL> alter table tbl_person add Bordar vector;
Table altered.

برای نوع داده vector امکان ایندکس گذاری هم وجود دارد برای استفاده از این قابلیت در ابتدا باید پارامتر vector_memory_size را به مقداری بیشتر از 0 تنظیم کرد:

SQL> alter system set vector_memory_size=300m scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.
Total System Global Area 1322838520 bytes
Fixed Size                  5360120 bytes
Variable Size             905969664 bytes
Database Buffers          184549376 bytes
Redo Buffers                8855552 bytes
Vector Memory Area        318103808 bytes
Database mounted.
Database opened.

بعد از تنظیم این پارامتر، ایندکسی را روی ستون bor1 ایجاد می کنیم:

SQL> create vector index ind_bordar1 on tbl_bordar(Bor1)
organization inmemory neighbor graph
distance COSINE
with target accuracy 96;
Index created.

برای جستجوی شباهت نمی توان از عملگرهای مقایسه ای در قسمت where clause استفاده کرد:

SQL> select * from tbl_bordar where Bor1='[[1,2,3]';
ERROR at line 1:
ORA-22848: cannot use VECTOR type as comparison key
Help: https://docs.oracle.com/error-help/db/ora-22848/

برای این کار می توانیم از توابعی نظیر VECTOR_DISTANCE استفاده کنیم. این تابع دو بردار را به عنوان پارامتر ورودی دریافت می کند و بر اساس معیارهایی چون شباهت کسینوس(Cosine similarity)، فاصله اقلیدسی(Euclidean distance) و … فاصله بین این دو را مشخص می کند:

VECTOR_DISTANCE(L1_DISTANCE, L2_DISTANCE,[COSINE_DISTANCE])

متریک پیش فرض شباهت کسینوس است.

SQL> SELECT
 a1.id AS id1,
 a2.id AS id2,
 VECTOR_DISTANCE(a2.bordar, a1.bordar) AS distance
FROM bordar a1, bordar a2
where a1.id in ('1','2')
ORDER BY distance ASC;
       ID1        ID2   DISTANCE
---------- ---------- ----------
         1          1 -1.19E-007
         2          2          0
         2          5 4.116E-002
         1          8 5.109E-002
         1          4 6.498E-002
         1          2  6.56E-002
         2          1  6.56E-002
         1          3 7.804E-002
         1          5 7.882E-002
         2          8 9.306E-002
         2          4 1.036E-001
         2          7 1.059E-001
         1          7 1.442E-001
         2          3 1.511E-001
         1          6 2.211E-001
         2          6 2.405E-001
         1          9 2.562E-001
         2          9 3.299E-001

18 rows selected.

Euclidean 

SQL> SELECT
 a1.id AS id1,
 a2.id AS id2,
 VECTOR_DISTANCE(a2.bordar, a1.bordar,Euclidean) AS distance
FROM bordar a1, bordar a2
where a1.id in ('1','2')
ORDER BY distance ASC; 

       ID1        ID2   DISTANCE
---------- ---------- ----------
         1          1          0
         2          2          0
         2          5 2.865E-001
         1          8 3.401E-001
         1          4 3.816E-001
         1          2 3.833E-001
         2          1 3.833E-001
         1          3 4.167E-001
         1          5 4.187E-001
         2          8 4.315E-001
         2          4 4.545E-001
         2          7 4.601E-001
         2          3 5.494E-001
         1          7 5.621E-001
         2          6 6.932E-001
         1          6 6.938E-001
         1          9 7.541E-001
         2          9 8.235E-001

 

 

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *