Oracle 23aiを使ったAI Vector Searchについて(その１)

約1年前に検証した内容を記載していますので、現時点では変更されている箇所があると思いますので、その点は読み替えていただければと思います。

## １．ベクトル検索とは
自分がベクトル検索というものについて調べるきっかけとなったのが、Oracle 23aiの新機能としてAI Vector Searchが導入されたというのを見た事でした。
だいぶ前に調べたものなので今更感が漂うものですが、ある一件でベクトル検索の話が出てきたことで改めて整理しようと思った次第です。

まず、ベクトル検索とはなんぞやというところからだと思い、ChatGPTに問合せしてみました。

＜ベクトル検索とは何ですか？
＞** ベクトル検索（Vector Search）**とは、データをベクトル（数値の集合）として表現し、それらの類似性に基づいて検索を行う技術です。
＞従来のキーワード検索とは異なり、意味的な関連性を考慮した検索が可能になります。

とりあえず、データをベクトル(数値の集合)として表して、それの類似性に基づいて検索という事のようです。
初見だと何がなんだかという感じだと思いますが、一先ずここら辺のキーワードを紐解いて行こうと思います。

## ２．ベクトル化(Embedding)
ベクトル化とは、数値データではないデータを数値の配列（ベクトル）に変換する処理のことになります。
テキストや画像などのデータを数値にすることによって似ているものを計算によって求める事が可能になります。

ここからはテストとして実際にOracle Database 23aiにてAI Vector Search機能の確認をしていきます。
その手順として、OCI BaseDBでOracle Database 23aiのインスタンスを作成し、
インスタンス上に作成した通常のテーブルのデータをOCI Generative AIサービスのEmbbedingモデルを利用し、
Embbedingしたベクトルデータをベクトルデータ型に格納してベクトル検索を実行していく流れを想定しています。

以下のステップで実施していきます。
a．事前準備
b．credentialの作成
c．Embbedingの確認
※以下の作業はSQL Plus上で行っています。また、コマンドの内容は一例として各環境でそれぞれ読み替えて下さい。

## ３．ベクトル検索検証
#### a．事前準備
OCI上でOracle23aiのDBインスタンス(BaseDBを利用)作成後、検証用データベースユーザの作成
PDBにSYSDBA権限でログインし、専用テーブルスペースを作成。
その後、データベースユーザを作成し権限を設定。

~~~
select tablespace_name,file_name,bytes/1024/1024 MB from dba_data_files;
create tablespace vector datafile '+DATA' size 300m; 
create user vtest identified by *** default tablespace vector temporary tablespace temp;
select username from dba_users order by username;
grant dba to vtest;
~~~
※自分のみが使う検証なのでDBA権限を付けてますが、他の人が使う場合は適切な権限を付与してください。

次にネットワークACLの設定
データベースユーザーにホストに対する接続権限を付与。

~~~
BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
 host => '*',
 ace => xs$ace_type(privilege_list => xs$name_list('connect'),
 principal_name => 'vtest',
 principal_type => xs_acl.ptype_db));
END;
/
~~~
※ここも自分のみが使う検証なので全てのホストを指定していますが、他の人が使う場合は適切なホストを付与してください。

#### b．credentialの作成
OCI Generative AIサービスを利用するための credentialを作成します。
そこでOCI CLIの構成ファイル情報を使います。
　OCIユーザOCID
　テナンシーOCID
　コンパートメントOCID
　pem形式の秘密鍵(ファイルの内容を使用)
　API Keyフィンガープリント

~~~
declare
  jo json_object_t;
begin
  jo := json_object_t();
  jo.put('user_ocid','ocid1.user.oc1..aaaaaaaa***');
  jo.put('tenancy_ocid','ocid1.tenancy.oc1..aaaaaaaa***');
  jo.put('compartment_ocid','ocid1.compartment.oc1..aaaaaaaa***');
  jo.put('private_key','M***');
  jo.put('fingerprint',’9f:***');
  dbms_output.put_line(jo.to_string);
  dbms_vector.create_credential(
    CREDENTIAL_NAME   => 'OCI_GENAI_CRED',
    PARAMS        => json(jo.to_string));
end;
/
~~~


### c．Embbedingの確認
OCI Generative AIサービスを利用してEmbbedingできるか確認していきます。
また、credentialが正しく設定されているか確認を兼ねてEmbbedingを実施します。
Embeddingモデルに「cohere.embed-multilingual-v3.0」を使用します。
　provider：ocigenai
　credential_name：OCI_GENAI_CRED　
　url：OCI Generative AI Embedding のエンドポイントURL
　model：使用するEmbbedingモデル
　utl_to_embeddinsの引数：Embeddingする文字列(CLOB)とJSON形式のパラメータ値

~~~
var embed_genai_params clob;
exec :embed_genai_params := '{"provider": "ocigenai", "credential_name": "OCI_GENAI_CRED", "url": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText", "model": "cohere.embed-multilingual-v3.0"}';
select et.* from dbms_vector.utl_to_embeddings('こんにちは',json(:embed_genai_params)) et;
~~~
・実行結果
~~~
SQL> select et.* from dbms_vector.utl_to_embeddings('こんにちは', json(:embed_genai_params)) et;

COLUMN_VALUE
`--------------------------------------------------------------------------------`
{"embed_id":"1","embed_data":"こんにちは","embed_vector":"[0.013832092,0.05
~~~


ここまででテキストがベクトル化されたことが確認できました。
[次回](https://qiita.com/kousasak/items/fb7cf6e80288909f4340 "Oracle 23aiを使ったAI Vector Searchについて(その２)")は実際にパワーポイントやPDF等のファイルからテキストを抽出してベクトル検索を行っていきます。