Oracle Database 26ai (旧 23ai) の最大の目玉機能と言えば、「AI Vector Search(ベクトル検索)」 です。 これまで「専門的なAIの知識がないと難しい」「専用のベクトルデータベースが必要」と思われていたこの技術が、使い慣れた Oracle Database と SQL だけで実現できるようになりました。
この記事では、AI Vector Search の概念を身近な例で解説し、実際に SQL を使って実装する手順をステップ・バイ・ステップで紹介します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
1. 「ベクトル検索」を身近な例で理解する
従来のデータベース検索(キーワード検索)と、ベクトル検索は何が違うのでしょうか? 「図書館での本探し」 や 「ネットショッピング」 を例に考えてみましょう。
従来の検索(キーワード検索)
- ユーザー: 「『美味しい』『パスタ』のレシピ本」と検索機に入力。
- システム: 本のタイトルや説明文に「美味しい」と「パスタ」という文字が完全に含まれているものだけを表示します。
- 弱点: 「絶品スパゲッティ」という本は、「パスタ」という文字が含まれていないためヒットしません。
AI Vector Search(ベクトル検索・意味検索)
- ユーザー: 「週末に作りたい、おしゃれなイタリアン」と司書さん(AI)に相談。
- システム(司書): 質問の意味(ニュアンス)を理解し、文字が一致していなくても、そのイメージに近い本を探します。
- 結果: 「本格ボロネーゼの極意」「プロが教えるパスタとワイン」などがヒットします。
「ベクトル」とは?
この「意味」をコンピュータが理解できるように数値の列(座標)に変換したものが「ベクトル」です。 例えば、あらゆる言葉を「甘さ」「辛さ」「熱さ」のような無数のパラメータで数値化し、地図上の点として配置します。
- 「カレー」と「シチュー」は地図上で近い場所にある。
- 「カレー」と「アイスクリーム」は遠い場所にある。
ベクトル検索とは、この「地図上の距離の近さ」を計算してデータを探す技術なのです。
2. Oracle AI Vector Search の実装手順
それでは、実際に Oracle Database 26ai 環境でベクトル検索を行ってみましょう。 ここでは、「映画のレビュー検索」 を例に実装します。
前提条件
- Oracle Database 26ai (または 23ai) 環境があること
- 管理者権限(SYSなど)でログインできること
Step 0: 準備(PDBへの接続とユーザー作成)
Oracle Database 26ai はマルチテナント・アーキテクチャ(CDB/PDB)が必須です。 通常のテーブル作成やデータ操作は、PDB(プラガブル・データベース) 内のユーザーで行います。
ここでは、デフォルトで作成される FREEPDB1 に作業用ユーザーを作成し、接続する手順を解説します。
1. 管理者でPDBへ切り替え
まず、データベース・サーバー上のターミナルで sqlplus / as sysdba でログインし、PDBへ移動します。
-- 現在のコンテナを確認(最初は CDB$ROOT にいるはずです)
SHOW CON_NAME;
-- PDB (FREEPDB1) へ切り替え
ALTER SESSION SET CONTAINER = FREEPDB1;
-- 切り替わったか確認
SHOW CON_NAME;
-- 結果: FREEPDB1 と表示されればOK
2. 作業用ユーザーの作成
PDB内にローカルユーザーを作成し、必要な権限を付与します。 23ai/26ai から導入された便利なロール DB_DEVELOPER_ROLE を使うと、開発に必要な権限を一括で付与できます。
-- ユーザー作成 (ユーザー名: vector_user / パスワード: password)
CREATE USER vector_user IDENTIFIED BY password;
-- 開発者用ロールと表領域の権限付与
GRANT DB_DEVELOPER_ROLE TO vector_user;
GRANT UNLIMITED TABLESPACE TO vector_user;
3. リモート接続(簡易接続)の確認
作成したユーザーで接続できるか確認します。 リモートのクライアント(A5:SQL Mk-2, SQL Developer, VS Codeなど)から接続する場合の情報は以下の通りです。 lsnrctl status コマンドで確認できるサービス名 freepdb1 を指定します。
- ホスト名: サーバーのIPアドレス または ホスト名(例:
26ai-single) - ポート:
1521 - サービス名:
freepdb1 - ユーザー:
vector_user - パスワード:
password
SQL*Plus での接続例:
-- 書式: sqlplus ユーザー/パスワード@ホスト:ポート/サービス名
sqlplus vector_user/password@localhost:1521/freepdb1
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
Step 1: ベクトル型を持つテーブルの作成
ここからは、作成した vector_user で実行します。 従来の VARCHAR2 や NUMBER に加え、新しく VECTOR 型が使えるようになりました。
-- 映画情報テーブルの作成
CREATE TABLE movies (
movie_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
title VARCHAR2(100),
genre VARCHAR2(50),
description VARCHAR2(1000),
-- VECTOR型: ここでは簡易的に3次元のベクトルとして定義
-- 本来は数百〜数千次元になります
movie_vector VECTOR(3, FLOAT32)
);
💡 構文の解説:VECTOR型
VECTOR(次元数, データ型): カラム定義で使用する新しいデータ型です。3(次元数): ベクトルの長さ(数値の個数)を指定します。- 例では簡略化して
3ですが、実際のAIモデル(OpenAIのtext-embedding-3-smallなど)では1536や1024といった大きな数値を指定します。
- 例では簡略化して
FLOAT32(データ型): 各数値の精度を指定します。FLOAT32: 標準的な単精度浮動小数点(デフォルト)。FLOAT64: 高精度な倍精度。INT8: データサイズを圧縮したい場合に使用(量子化)。
Step 2: データの登録(ベクトルデータの挿入)
本来は、OpenAI などの埋め込みモデル(Embedding Model)を使ってテキストをベクトル変換しますが、ここでは仕組みを理解するためにダミーの数値データを直接挿入します。
- アクション映画(激しい・爆発・戦い) →
[0.9, 0.1, 0.1]のような傾向 - 恋愛映画(感動・静か・愛) →
[0.1, 0.9, 0.2]のような傾向 - SF映画(未来・宇宙・科学) →
[0.1, 0.1, 0.9]のような傾向
と仮定してデータを入れます。
INSERT INTO movies (title, genre, description, movie_vector) VALUES
('爆走チェイス2026', 'Action', '激しいカーチェイスと爆発の連続', '[0.95, 0.05, 0.05]');
INSERT INTO movies (title, genre, description, movie_vector) VALUES
('星空の約束', 'Romance', '田舎町で出会った二人の静かな愛の物語', '[0.05, 0.95, 0.1]');
INSERT INTO movies (title, genre, description, movie_vector) VALUES
('ギャラクシー・ウォー', 'Sci-Fi', '宇宙艦隊とエイリアンの壮絶な戦い', '[0.6, 0.1, 0.8]'); -- アクション要素とSF要素を持つ
COMMIT;
💡 構文の解説:ベクトルデータの表記
'[0.95, 0.05, 0.05]': SQLでベクトルデータを扱う際は、数値をカンマ区切りにし、大括弧[]で囲んだ文字列として表現します。Oracleが自動的にVECTOR型へ変換して格納します。
Step 3: ベクトル検索の実行(類似性検索)
ここがハイライトです。 ユーザーが「スカッとする激しい映画が見たい」と検索したとします。 この検索クエリをベクトル化すると [0.9, 0.1, 0.0] (アクション要素強め)になったと仮定します。
このベクトルに近い映画を探すには、VECTOR_DISTANCE 関数を使います。
-- 「スカッとする激しい映画([0.9, 0.1, 0.0])」に近い順に検索
SELECT
title,
genre,
description,
-- 検索ベクトルとの距離を計算(数値が小さいほど似ている)
VECTOR_DISTANCE(movie_vector, '[0.9, 0.1, 0.0]', COSINE) AS distance
FROM
movies
ORDER BY
distance ASC
FETCH FIRST 3 ROWS ONLY;
💡 構文の解説:VECTOR_DISTANCE関数
VECTOR_DISTANCE(対象列, 検索ベクトル, 距離メトリック): 2つのベクトル間の「距離」を計算する関数です。- 第1引数: テーブル内のベクトル列(ここでは
movie_vector)。 - 第2引数: 比較したい検索クエリのベクトル。
- 第3引数: 距離の計算方法(メトリック)。
COSINE(コサイン類似度): ベクトルの「方向」の近さを測ります。文章や意味の検索には最も一般的に使われます。EUCLIDEAN(ユークリッド距離): 2点間の直線距離を測ります。物理的な位置関係などに適しています。DOT(内積): ベクトルの大きさと方向の両方を考慮します。
- 第1引数: テーブル内のベクトル列(ここでは
ORDER BY distance ASC: 距離が「近い」ものほど似ているため、昇順(小さい順) で並べ替えるのが基本です。
実行結果のイメージ:
| TITLE | GENRE | DESCRIPTION | DISTANCE |
|---|---|---|---|
| 爆走チェイス2026 | Action | 激しいカーチェイス… | 0.002 |
| ギャラクシー・ウォー | Sci-Fi | 宇宙艦隊とエイリアン… | 0.150 |
| 星空の約束 | Romance | 田舎町で出会った… | 0.850 |
「Action」映画が最も上位に来て、次にアクション要素を含む「Sci-Fi」が続き、全く傾向の異なる「Romance」は距離が遠くなる(類似度が低い)ことがわかります。これがベクトル検索です。
3. なぜ Oracle Database でやるのか?
専用のベクトルデータベース(Pinecone, Milvusなど)も存在しますが、Oracle Database で行うメリットは以下の通りです。
- データの一元管理: 顧客データや在庫データ(リレーショナルデータ)と同じ場所にベクトルデータを置けるため、データ移動の手間やセキュリティリスクがありません。
- ハイブリッド検索が可能: 「アクション映画(ベクトル検索)」かつ「2020年以降に公開されたもの(リレーショナル検索)」のような、従来のSQL条件との組み合わせが非常に高速かつ簡単に記述できます。
SELECT title FROM movies WHERE release_year >= 2020 -- 既存のSQL条件 ORDER BY VECTOR_DISTANCE(movie_vector, :query_vector, COSINE); -- ベクトル検索 - 既存スキルの活用: 新しい言語やAPIを覚える必要なく、いつもの SQL だけで最先端の AI 検索機能を実装できます。
4. まとめ
Oracle AI Vector Search は、データベースに「意味」を理解させる画期的な機能です。
- 直感的な検索: キーワードが一致しなくても、ユーザーの意図に近いデータを探せる。
- SQLで完結: 複雑なAIプログラミングなしで実装可能。
- RAGへの応用: 生成AI(ChatGPTなど)に社内データを与えるための検索基盤として最適。
まずは Oracle Database 26ai Free 版などを利用して、VECTOR 型と VECTOR_DISTANCE 関数を実際に触ってみることをお勧めします。
[参考]
Oracle AI Vector Search | Oracle 日本
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント