Oracle AI Database AI Vector Searchの開始 (2025/10/14)

Oracle AI Database AI Vector Searchの開始 (2025/10/14)

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の提供開始を発表しました。Oracle AI Databaseは、Oracle Database 23aiで利用可能な300以上の新機能にさらに追加されたため、学ぶべき点が数多くあります。Dominic Giles氏はブログ記事でいくつかの目玉機能について紹介していますが、Oracle AI Databaseの最もエキサイティングな新機能の一つはOracle AI Vector Searchです。

AI Vector Searchの優れた入門書は、こちらでご覧いただけます。類似検索をサポートするためにOracle AI Databaseに追加された機能、主なメリット、そしてAI Vector Searchが対応するユースケースの一部について、詳細に解説しています。

ベクトル埋め込みモデルを用いたベクトル作成や類似性検索の実行に必要な手順を解説したブログやラボも数多く存在します。しかし、これらの機能のすべてとは何か、そしてなぜ知っておく必要があるのか​​を解説した記事は少ないのが現状です。本記事では、Oracle AI DatabaseにおけるAI Vector Searchがこれらの機能をどのように実現するのかについて、さらに詳しく説明し、例を挙げて解説します。

注: この投稿の執筆後、AI Vector Searchと、この投稿で取り上げている内容に類似した例を試すことができるOracle LiveLabを追加しました。詳細はこちらの投稿をご覧ください:新しいAI Vector Search LiveLabsワークショップが利用可能になりました。または、こちらからお試しいただけます

AI Vector Searchの中核を成すのは、類似検索機能です。類似検索は、データの値(単語やピクセル)ではなく、意味的表現に基づいて類似オブジェクトを迅速に見つけます。例えば、この画像や文書に似た他の画像や文書を検索できます。ベクトル、より正確にはベクトル埋め込みを用いて、意味的に類似するオブジェクトを、それらの近接性に基づいて検索します。言い換えれば、ベクトル埋め込みとは、テキスト、画像、動画、さらには音楽など、ほぼあらゆる種類のデータを多次元空間内の点として表現する方法であり、それらの点の位置や他のデータとの近接性は意味的に意味を持ちます。

従来、リレーショナル検索は属性値やキーワードに基づいて行われてきました。AI Vector Searchでは、構造化データだけでなく、さらに重要な点として非構造化データも、データの意味に基づいて類似性を検索できます。これにより全く新しい可能性の世界が開かれ、この新機能への期待が高まっています。チャットボット、自然言語処理、データ分析、画像処理、地理分析といったユースケースにおいて、AI Vector Searchは斬新でエキサイティングな方法で活用できます。

Oracle AI Vector Searchには、Oracle AI Database内でセマンティック検索や類似検索を可能にする一連の機能が含まれています。これらの機能には以下が含まれます。

•ベクトル埋め込みを保存するための新しいVECTORデータ型
•    事前トレーニング済みの埋め込みモデルをOracle AI Databaseにインポート
•    データベースにローカルで埋め込みを作成するか、外部で生成された埋め込みをロード
高速類似検索のための最新のベクトル索引•ビジネスデータのリレーショナル検索とセマンティック検索を簡単に組み合わせるための
新しいSQL演算子と構文
エンタープライズ固有のコンテンツでLLM応答を拡張するための検索拡張生成(RAG)をサポート

これらの各機能の説明を繰り返すのではなく、この投稿の残りの部分と今後の投稿では、これらの機能の例を示しながら、これらの機能を使用して類似性検索を有効にして使用する方法について説明します。

Getting Started

Oracle AI Vector SearchにはOracle AI Databaseが必要です。現在、Oracle Cloud(Oracle Autonomous AI Databaseを含む)、Oracle Cloud@Customer、Oracle Exadata、Oracle Database Appliance、Oracle Database@AzureOracle Database@Google CloudOracle Database@AWS 、およびOracle AI Database Freeで利用可能です。プラットフォームの可用性に関する最新情報については、MOS Noteの最新データベースリリースのリリーススケジュール(ドキュメント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 AI Databaseに直接インポートするかを選択できます。Oracle AI Databaseはデータベース内にONNXランタイムを直接実装しているため、インポートしたモデルを使用してOracle AI Databaseでベクトル埋め込みを生成できます。

以下の例では、テキストベースのデータを扱うため、センテンストランスフォーマーベースのモデルを使用します。こちらのブログ記事では、Hugging Face(ディープラーニング用のオープンソースPythonライブラリをホストし、数千ものトレーニング済みモデルを提供しているサイト)の事前トレーニング済みトランスフォーマーモデルを、OracleユーティリティOML4Pyを使用してONNX形式に変換する方法について詳しく説明しています。さらに、モデルをOracle AI Databaseにロードする方法についても詳しく説明しています。

こちらのブログ記事では、事前に構築されたベクター埋め込みモデルをデータベースにロードする方法について詳しく説明しています。モデルに必要な前処理および後処理を施してONNX形式に変換する必要もありません。最後に、 AI Vector Searchでテスト済みの埋め込みモデルの種類について詳しく説明した記事も掲載しています。

この例では、簡単な方法として、上記のブログ記事で紹介した、構築済みのall-MiniLM-L12-v2モデルを使用します。このモデルはコンパクトながらも強力で、sentence-transformersライブラリを使用して構築されており、今回のデータ要件を満たしています。このモデルはデータベースサーバー上の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 AI Databaseでベクトルの使用を開始するための簡素化であり、後でベクトル埋め込みモデルを変更して次元数や形式を変更する場合でも、ベクトル定義を再作成する必要がなくなります。

次元の数は必ず 0 より大きく、最大ベクトル数は 65535 です。

使用可能な次元形式は次のとおりです:
• INT8 (8ビット整数)
• FLOAT32 (32ビットIEEE浮動小数点数)
• FLOAT64 (64ビットIEEE浮動小数点数)
• BINARY (各次元が1ビットのパックされたUINT8バイト)

既存のテーブルにベクター列を追加するには、ALTER TABLE ステートメントだけが必要です。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
SQL> ALTER TABLE search_data ADD vector_desc VECTOR;

以下の記述コマンドでは、次元数と形式が含まれていない場合、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(*, *)

ベクトル埋め込みを生成し、それを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列を使って別のテーブルにデータをINSERTしたりすることもできました。データベース外でベクトル埋め込みを生成し、SQL Loaderを使ってデータをロードすることもできました。

類似検索

大きく回り道をしたように思われるかもしれませんが、ベクトル埋め込みが完成したので、犯罪事件データに戻り、それらをどのように活用できるか検討する準備が整いました。類似検索を使用する理由は、意味的に類似した用語に基づいてデータから情報を検索したいからです。最初の例では、強盗の説明を見つけられるかどうかを確認したいと考えました。しかし、DESCRIPTION列には「強盗」という単語がどこにも出てきません。


クリップボードにコピーされました
エラー: コピーできませんでした
クリップボードにコピーされました
エラー: コピーできませんでした
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句の一部であることにも注目してください。3という数値は、VECTOR_DISTANCE計算を含むSELECTリストの列位置として使用されています。これは、類似度検索がクエリベクトルとデータセット内の他のベクトルとの相対距離を調べ、上位k個の最も近いベクトルを返すためです。

クエリ結果は期待できそうです。確かに、「盗難」という単語を含む記述は強盗に該当するでしょう。データセットをさらに分析していくと、犯罪事件の記述を分類するPRIMARY_TYPEという別の属性があることがわかりました。最初はこの発見にがっかりしました。「強盗」「盗難」「強盗」といった主要タイプでクエリするだけで強盗の種類を特定できるのに、なぜわざわざAIベクター検索を使う必要があるのでしょうか?その後、類似検索の精度を検証できるという大きなメリットに気づきました。類似検索の大きなメリットの一つは、意味的に類似したデータを検索できることです。

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データ型の列に保存しました。最後に、類似検索をいくつか実行し、テキストベースのデータに対して、単純なキーワード検索ではなく、セマンティック比較の威力を確認しました。

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle GoldenGate 23aiでMicrosoft Fabricでのオープン・ミラーリングがサポートされるようになりました (2024/11/19)

OCIサービスを利用したWebサイトの作成 その4~Identity Cloud Serviceでサイトの一部を保護 (2021/12/30)