Oracle Database 23ai AI Vector Searchの開始 (2025/02/01)
Oracle Database 23ai AI Vector Searchの開始 (2025/02/01)
https://blogs.oracle.com/database/post/getting-started-with-oracle-database-23ai-ai-vector-search
投稿者: Andy Rivenes | Product Manager
Oracleは、2024年5月にOracle Database 23aiの提供を発表しました。300以上の新機能を搭載し、学ぶべきことがたくさんあります。Dominic Gilesは、ブログ投稿でいくつかの重要な機能を紹介していますが、Oracle Database 23aiの最もエキサイティングな新機能の1つはOracle AI Vector Searchです。
AI Vector Searchのご紹介はこちらから。類似性検索、主な利点、およびAI Vector Searchが対処するユース・ケースをサポートするためのOracle Databaseの追加について詳しく説明します。
また、ベクトル埋め込みモデルを使用してベクトルを作成し、類似性検索を実行するために必要な手順を説明するブログやラボもいくつかあります。しかし、これらすべてのものが何であるか、そしてなぜそれらについて知る必要があるかを説明する記事は少なくなっています。この投稿では、AI Vector SearchがOracle Databaseでこれらの機能をどのように提供するかについて、さらに説明し、例を紹介します。
AI Vector Searchの中核は、類似性検索を実行する機能です。類似性検索は、値(単語またはピクセル)ではなくデータのセマンティック表現で機能し、類似オブジェクトをすばやく検出します。たとえば、このような他のイメージやドキュメントを検索します。ベクトル(より正確にはベクトル埋込み)を使用して、互いに近接性に基づいて、意味的に類似したオブジェクトを検索します。つまり、ベクトル埋込みは、テキスト、イメージ、ビデオ、音楽などのほぼすべての種類のデータを、それらの点の位置と他のデータとの近接性が意味的に意味のある多次元空間内のポイントとして表す方法です。
従来、リレーショナル検索は属性値またはキーワードに基づいていました。AI Vector Searchでは、構造化され、さらに重要なことに、データの意味に基づいて非構造化データを類似性を検索できます。これにより、まったく新しい可能性の世界が開かれ、この新しい機能にとても興奮している理由です。チャットボット、自然言語処理、データ分析、画像処理、地理分析などのユース・ケースでは、AI Vector Searchを新しいエキサイティングな方法で活用できます。
Oracle AI Vector Searchには、Oracle Database内でセマンティックまたは類似性検索を有効にする機能のコレクションが含まれています。これらの機能は次のとおりです。
• ベクトル埋込みを格納するための新しいベクトル・データ型
• Oracle Databaseへの事前トレーニング済埋込みモデルのインポート
• データベースにローカルに埋め込むか、外部で生成された埋め込みをロードする
• 高速な類似性検索のための新しい最先端のベクトル索引
• ビジネス・データの関係検索とセマンティック検索を簡単に組み合せる新しいSQL演算子および構文
• Retrieval Augmented Generation(RAG)をサポートし、企業固有のコンテンツでLLMの応答を強化
これらの各機能の説明を繰り返すのではなく、この投稿と将来の投稿の残りの部分では、これらの機能の例と、類似性検索を有効にして使用するためのこれらの機能の使用方法について説明します。
Getting Started
Oracle AI Vector Searchには、Oracle Database 23aiが必要です。現在、Oracle Cloud(Oracle Autonomous Databaseを含む)、Oracle Cloud@Customer、Oracle Exadata、Oracle Database Appliance、Oracle Database@Azure、Oracle Database@Google Cloud、Oracle Database@AWS、Oracle Database 23ai Freeでご利用いただけます。プラットフォームの可用性に関する最新情報については、現在のデータベース・リリースのMOSノート・リリース・スケジュール(ドキュメントID 742060.1)を参照してください。
サンプルデータセット
この記事の次の例については、シカゴ・データ・ポータルで入手可能な犯罪事件データセットの一部を使用します。このデータセットは、両方のカテゴリ・フィールドと、類似性検索の実行方法、および類似性検索でリレーショナル検索を実行するための属性フィルタリングと組み合せる方法を強調するために使用するテキストの説明を組み合せます。ダウンロードしたデータには、複数年にわたる約680万行が含まれています。
データセットのサブセットを使用し、SEARCH_DATAという新しい表の次の列を使用します。
SQL> desc search_data
Name Null? Type
----------------------------- -------- --------------------
ID NUMBER
DESCRIPTION VARCHAR2(100)
LOCATION_DESC VARCHAR2(100)
DISTRICT VARCHAR2(20)
WARD NUMBER
COMMUNITY VARCHAR2(20)
C_YEAR NUMBER
SEARCH_DATA表には、2004年の469,380行があります。前述のDESCRIPTION列には、次のような内容があります。
DESCRIPTION
------------------------------------------------------
TO PROPERTY
POSS: CANNABIS 30GMS OR LESS
AGGRAVATED: HANDGUN
OTHER VEHICLE OFFENSE
AUTOMOBILE
ベクトル埋め込みモデル
類似性検索を有効にするには、検索する列のベクトル埋込みを作成する必要があります。この例では、DESCRIPTION列です。ベクトル埋込みは、VECTORデータ型の列に格納されます。ベクトル埋込みは、データ・ポイントの数学的ベクトル表現、またはより単純に数値の配列です。ベクトル埋込みは、機械学習モデルを使用して生成されます。これが、AIが登場する初めての場所です。
使用する埋込みモデルをどのように決定しますか。結局のところ、オープンソースの埋め込みモデルと独自の埋め込みモデルがあり、支払いが必要な場合もあれば、独自の埋め込みモデルを作成してトレーニングすることもできます。混乱を加えるために、各埋込みモデルは特定のデータについてトレーニングされています。使用する埋込みモデルのタイプは、埋め込む予定のデータ・タイプと、そのモデルが自分またはアプリケーションで実行する必要がある検索に対してどの程度パフォーマンスを発揮するかによって異なります。
1つ以上の埋込みモデルを選択して試行すると、モデルがOpen Neural Network Exchange (ONNX)標準と互換性がある場合に、モデルをOracle Databaseに直接インポートして、データベースの外部またはデータベース内にベクトル埋込みを作成することを選択できます。Oracle DatabaseはONNXランタイムをデータベース内に直接実装するため、これらのインポートされたモデルを使用して、Oracle Databaseにベクトル埋込みを生成できます。
次の例では、テキストベースのデータで操作するため、センテンストランスフォーマ・モデルを使用します。Hugging Faceからの事前トレーニング済トランスフォーマ・モデルの変換の詳細を示すブログ投稿を次に示します。これは、ディープ・ラーニング用のオープンソースのPythonライブラリをホストし、数千の事前トレーニング済モデルを、OML4PyというOracleユーティリティを使用してONNX形式に変換するサイトです。次に、Oracle Databaseへのモデルのロード方法を詳しく説明します。
次に、モデルをONNX形式に変換するために必要な前処理ステップと後処理ステップを使用してモデルを拡張することなく、事前に構築されたベクトル埋め込みモデルをデータベースにロードする方法の詳細を示す別のブログ投稿を示します。最後に、AI Vector Searchでテストされた埋め込みモデルの種類の詳細を紹介する記事です。
この例では、簡単なパスをとり、前述の事前構築済ベクトル埋込みモデルの使用に関するブログ投稿で詳細に説明されている、事前構築済のオールMiniLM-L12-v2モデルを使用します。コンパクトでパワフルなセンテンストランスモデルで、データ要件に対応できます。データベース・サーバー上のOSディレクトリに解凍され、そのOSディレクトリを指すDM_DUMPというデータベース・ディレクトリが作成されています。その後、次のコマンドを実行して、ONNXファイルをデータベースにインポートできます。
SQL> exec dbms_vector.load_onnx_model('DM_DUMP','all_MiniLM_L12_v2.onnx','minilm_l12_v2',
JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input": {"input": ["DATA"]}}'));
次のSQLを実行すると、モデル名"MINILM_L12_V2"がデータベースにロードされたことが示されます。
SQL> SELECT model_name, mining_function, algorithm, algorithm_type, model_size
FROM user_mining_models;
MODEL_NAME MINING_FUNCTION ALGORITHM ALGORITHM_TYPE MODEL_SIZE
-------------- ---------------- ---------- -------------- ----------
MINILM_L12_V2 EMBEDDING ONNX NATIVE 133322334
SQL>
モデルの特性を表示することもできます。
SQL> SELECT model_name, attribute_name, attribute_type, data_type, vector_info
FROM user_mining_model_attributes;
MODEL_NAME ATTRIBUTE_NAME ATTRIBUTE_TYPE DATA_TYPE VECTOR_INFO
-------------- ---------------- --------------- ----------- -------------------
MINILM_L12_V2 ORA$ONNXTARGET VECTOR VECTOR VECTOR(384,FLOAT32)
MINILM_L12_V2 INPUT TEXT VARCHAR2
SQL>
VECTOR_INFO列を確認します。これは、モデルのディメンション形式を示します。ディメンション形式については、「ベクトル埋込みの作成」の項で詳しく説明します。
「hello」という単語を埋め込む簡単なクエリーを実行して、これまでに実行した内容をテストできます。
SQL> SELECT TO_VECTOR(VECTOR_EMBEDDING(minilm_l12_v2 USING 'hello' as input));
TO_VECTOR(VECTOR_EMBEDDING(MINILM_L12_v2USING'HELLO'ASINPUT))
------------------------------------------------------------------------------------------------------------------------------------------------------
[-7.49069825E-002,-1.44330608E-002,4.86499295E-002,-2.713810
28E-002,-4.30882089E-002,-1.47763401E-001,6.88331053E-002,-1
.37038985E-002,-5.35686724E-002,2.69752908E-002,-6.28339127E
-003,-3.98834869E-002,7.65678426E-003,-3.78089696E-002,-1.17
558083E-002,-3.46409045E-002,1.29357144E-001,-2.52777878E-00
2,-1.52099226E-002,7.30356318E-004,-8.06888491E-002,2.693785
54E-002,-9.87356976E-002,-3.41076851E-002,-2.70294175E-002,-
7.32003674E-002,5.08588664E-002,-1.72562376E-002,7.28218481E
< A bunch of numbers have been deleted >
41633E-002,5.40374406E-002,4.60668281E-003,4.81108278E-002,-
1.18950203E-001,-4.22098711E-002,4.28496249E-004,-4.60483041
E-003,-6.80256784E-002,2.4777215E-002,5.72777987E-002,3.3987
131E-002,-3.80932316E-002,5.46789682E-003,1.50439981E-002,-1
.71866838E-003,-4.49497951E-003,8.36174041E-002,3.61522138E-
002,-2.27608755E-002,1.0930731E-002,-4.64579314E-002,-2.5119
7945E-002,3.10342927E-002,1.40036559E-002,2.80776881E-002,-7
.75460666E-003,-3.13466154E-002,5.54159284E-002]
SQL>
ベクトル埋込みの作成
これで、DESCRIPTION列のベクトル埋込みを作成する準備ができました。まず、ベクトル埋め込みを格納するためにテーブルに列を追加する必要があります。列のデータ型はVECTORになります。オプションで、ディメンションの数とその書式を指定できます。これらのいずれも指定しない場合は、異なる形式の異なるディメンションのベクトルを入力できます。これは、Oracle Databaseでベクトルの使用を開始する際に役立つ簡略化であり、ベクトル埋込みモデルを後で変更し、異なる数のディメンションまたはフォーマット(あるいはその両方)を使用する場合、ベクトル定義を再作成する必要がなくなります。
ディメンションの数は厳密にゼロより大きく、非BINARYベクトルの場合は最大65535、BINARYベクトルの場合は65528である必要があります。
使用可能なディメンション形式は次のとおりです。
• INT8 (8ビット整数)
• FLOAT32 (32ビットIEEE浮動小数点数)
• FLOAT64 (64ビットIEEE浮動小数点数)
• BINARY (各ディメンションが単一ビットの場合にパックされたUINT8バイト)
既存の表にベクトル列を追加するには、ALTER TABLE文のみが必要です。
SQL> ALTER TABLE search_data ADD vector_desc VECTOR;
describeコマンドで、ディメンションの数と形式が含まれていない場合は、VECTOR(*、 *)の定義が表示されることに注意してください。
SQL> desc search_data
Name Null? Type
----------------------------- -------- --------------------
ID NUMBER
DESCRIPTION VARCHAR2(100)
LOCATION_DESC VARCHAR2(100)
DISTRICT VARCHAR2(20)
WARD NUMBER
COMMUNITY VARCHAR2(20)
C_YEAR NUMBER
VECTOR_DESC VECTOR(*, *)
ベクトル埋込みを生成し、それらをベクトル・データ型列にロードするには、様々な方法があります。この例では、CREATE TABLE AS SELECTコマンドを実行することを選択しました。これは、データベースにロードされた埋込みモデルを使用しているため、最も簡単で高速な方法だと思ったためです。
SQL> DROP TABLE search_data PURGE;
SQL> CREATE TABLE search_data AS
SELECT id, description, location_desc, district, ward, community, c_year,
vector_embedding(minilm_l12_v2 using DESCRIPTION as input) as vector_desc
FROM chicago_data WHERE c_year = 2004;
同じことを成し遂げる方法は他にもたくさんあります。VECTOR列の追加後に表に対してUPDATE文を実行することも、元の表の対応するID列を使用してデータを別の表にINSERTedさせることもできます。ベクトル埋込みをデータベースの外部で生成し、SQL Loaderを使用してデータをロードして、いくつかの名前を付けることさえできました。
類似性検索
私たちは大きな迂回路に乗したように思えるかもしれないが、今や、ベクトル埋め込みを作成して、犯罪事件データへ戻り、それらをどう活用できるか探求する準備ができている。類似性検索を使用する理由は、意味的に類似した用語に基づいてデータを検索する必要があるためです。最初の例では、強盗の記述を見つけることができるかどうかを確認しました。ただし、「DESCRIPTION」列には「robbery」という語は表示されません。
SQL> SELECT count(*) FROM search_data
2 WHERE UPPER(description) LIKE '%ROBBERY%';
COUNT(*)
----------
0
これで、データをふるいにかけることができ、意味的に似たような単語を自分で考え出して、上のSQL問合せにプラグインできるかもしれません。しかし、大規模なデータセットと、あまり魅力的ではない多くの異なる検索用語があります。AI Vector Searchで類似性検索を実行するとどうなるかを見てみましょう。次に、SQLとその結果を示します。
select description, TO_NUMBER(vector_distance) as vector_distance
from (
select id, description,
vector_distance(vector_desc, VECTOR_EMBEDDING(minilm_l12_v2 USING 'ROBBERY' as data),
COSINE) as vector_distance
from search_data
order by 3
fetch exact first 50000 rows only )
group by description, vector_distance
order by 2
fetch first 10 rows only ;
DESCRIPTION VECTOR_DISTANCE
---------------------------------------- ---------------
RETAIL THEFT .299974263
ATTEMPT THEFT .336217165
KIDNAPPING .449222624
PREDATORY .450500667
OTHER CRIME INVOLVING PROPERTY .462044001
AGGRAVATED FINANCIAL IDENTITY THEFT .462046862
EXTORTION .466129601
FORGERY .481875181
ATTEMPT FINANCIAL IDENTITY THEFT .485770345
THEFT/RECOVERY: AUTOMOBILE .494581938
類似性検索のSQL構文は、使用したものと少し異なる場合があります。ベクトルで動作し、他の同様のベクトルとの距離があるため、新しいVECTOR_DISTANCE関数が使用されます。この例では、ベクトル化検索語「ROBBERY」からの距離をSEARCH_DATA表の他のベクトルと比較しています。それぞれの記述が検索ベクトルから少し遠いところをどのように動かすかという点と同じように、ベクトル距離を含んでいました。
また、VECTOR_DISTANCE関数はORDER BY句の一部であり、VECTOR_DISTANCE計算を含むSELECTリストの列位置として使用される数値3です。これは、類似性検索では、データ・セット内の他のベクトルと比較した問合せベクトルの相対距離が検索され、最も近い最上位のベクトルが返されるためです。
問合せ結果は有望に見えます。確かに、「盗難」という言葉を含む記述は、強盗と見なされます。データセットのさらなる分析で、犯罪事件の説明を実際に分類するPRIMARY_TYPEという別の属性があることがわかりました。最初は自分の発見にがっかりした。ROBBERYのカテゴリを含むプライマリ・タイプとTHEFTおよびBURGLARYを問い合せて、様々なタイプの強盗を決定するだけで、AI Vector Searchを使用するのはなぜですか。それから、これは本当に大きな利点であることに気付きました。なぜなら、類似性の検索がどれほど正確であるかを確認する方法を提供してくれるからです。結局のところ、類似性検索の大きな利点の1つは、意味的に類似したデータを検索できることです。
PRIMARY_TYPE属性が追加されたのと同じ問合せを次に示します(最初にPRIMARY_TYPE列を含んでおらず、属性とデータを追加する最も簡単な方法であるように見えたため、表を再作成しました)。
select primary_type, description
from (
select primary_type, description,
vector_distance(vector_desc, VECTOR_EMBEDDING(minilm_l12_v2 USING 'ROBBERY' as data),
COSINE) as vector_distance
from search_data
order by 3
fetch exact first 50000 rows only )
group by primary_type, description, vector_distance
order by TO_NUMBER(vector_distance)
fetch first 10 rows only ;
PRIMARY_TYPE DESCRIPTION
-------------------- ----------------------------------------
THEFT RETAIL THEFT
THEFT ATTEMPT THEFT
KIDNAPPING KIDNAPPING
CRIM SEXUAL ASSAULT PREDATORY
OTHER OFFENSE OTHER CRIME INVOLVING PROPERTY
DECEPTIVE PRACTICE AGGRAVATED FINANCIAL IDENTITY THEFT
INTIMIDATION EXTORTION
DECEPTIVE PRACTICE FORGERY
THEFT ATTEMPT FINANCIAL IDENTITY THEFT
MOTOR VEHICLE THEFT THEFT/RECOVERY: AUTOMOBILE
PRIMARY_TYPE列とDESCRIPTION列データを比較すると、類似性の検索がかなりうまくいったようです。私たちは強盗の舞台に立っているようで、強盗や盗難を使用したキーワード検索は、財布の引っ掛けのような犯罪を生み出さなかっただろうし、デセプティブ・プラクティスのような他のカテゴリーで強盗を見逃したかもしれないし、おそらくモーター・バイクル・セフト。この例では、類似性の検索によって利点が得られると思いますが、これは本当に氷山の一角にすぎません。データ、特に非テキスト・データを検索する必要があると考えるだけで、類似点がほとんど見えません。
まとめ
私たちはこの記事で多くの分野をカバーしており、将来の記事で話すべきことがたくさんあります。AI Vector Searchの核心である類似性検索の紹介から始めました。次に、サンプル・データ・セット、ベクター埋込みモデルの説明、およびデータベースにインポートしました。次に、インポートしたモデルを使用してベクトル埋込みを作成し、それらのベクトル埋込みをVECTORデータ型列に格納しました。最後に、いくつかの類似性検索を実行し、テキストベースのデータの単純なキーワード検索とは対照的に、セマンティック比較の力を調べました。
コメント
コメントを投稿