Autonomous Database:S3内のテキストファイルに対してRAGを使用した自然言語問合せを実行してみた（SELECT AI RAG）

# はじめに

Autonomous Databaseに実装されている「SELECT AI RAG」の機能を使用すると、クラウド・ストレージ内にあるテキストファイルの情報の元に、ベクトル・ストア、ベクトル索引、およびその更新を自動化するためのパイプラインを簡単に構築し、作成されたベクトル索引を使用して、RAGを用いた自然言語による問合せが簡単に実現できます。

今回は、SELECT AI RAGを使用して、S3バケット内にあるテキストファイルに対して自然言語問合せを実行してみました。

※こちらの内容はあくまで個人が検証した内容であり、他の環境で正しく動作することを保証するものではありません。また、こちらの記事を元にしたOracleサポートへの問い合わせはご遠慮ください。

# 1. 事前準備
S3バケット内にテキストファイルを配置します。
今回は、txt-bucket-s3というS3バケットを作成し、その中にrocket.txtというファイルをアップロードしました。

![スクリーンショット 2024-12-24 12.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/284a3f98-6839-d4d5-c1dd-2713ffba011f.png)

rocket.txtの内容は、こちらの画像の内容で、Oraboosterという架空のロケットエンジンの情報が含まれています。
![スクリーンショット 2024-12-24 12.03.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f9a84713-ffdb-dddf-fb6d-e57c62afe3ac.png)

さらに、OCI Generative AI Service、AWS S3にアクセスするためのクレデンシャルを予め作成しておきます。

今回は、OCI Generative AI ServiceへのアクセスにはAutonomous Databaseのリソース・プリンシパルを使用し、AWS S3へのアクセスには、アクセスキーとシークレットアクセスキーを使用してDBMS_CLOUD.CREATE_CREDENTIALプロシージャで作成したクレデンシャルS3_CREDを使用しました。

# 2. AIプロファイルの作成
DBMS_CLOUD_AI.CREATE_PROFILEプロシージャを使用して、SELECT AI RAGで使用する生成モデル、埋め込みモデル等を指定するAIプロファイルを作成します。
ここでは、AIプロバイダとしてOCI Generative AI Serviceを使用し、生成モデルとしてmeta.llama-3.1-70b-instruct、埋め込みモデルとしてcohere.embed-multilingual-v3.0を使用する設定を行うGENAI_RAGというAIプロファイルを作成します。
```
SQL> BEGIN
  2    DBMS_CLOUD_AI.CREATE_PROFILE(
  3  	 profile_name =>'GENAI_RAG',
  4  	 attributes   => '{ "provider" : "oci",
  5  			            "region"   : "ap-osaka-1",
  6  			            "model"    : "meta.llama-3.1-70b-instruct",
  7  			            "embedding_model"	: "cohere.embed-multilingual-v3.0",
  8  			            "credential_name"	: "OCI$RESOURCE_PRINCIPAL",
  9  			            "vector_index_name" : "MY_VECTOR_INDEX" }'
 10    );
 11  END;
 12  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

# 3. ベクトル索引の作成
DBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャを使用して、ベクトル・ストア、ベクトル索引、およびベクトル索引を自動更新するパイプラインを作成します。
ここでは、locationで指定されているS3バケット「txt-bucket-s3」内にあるテキストファイルに対してベクトル・ストアを作成し、MY_VECTOR_INDEXという名前のベクトル索引を作成します。
S3バケットにアクセスする際に使用するクレデンシャル「S3_CRED」をobject_storage_credential_nameで指定しています。
また、ベクトル索引の更新間隔（refresh_rate）を10分としています。
```
SQL> BEGIN
  2    DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
  3  	 index_name  => 'MY_VECTOR_INDEX',
  4  	 attributes  => '{ "vector_db_provider": "oracle",
  5  			           "location": "https://txt-bucket-s3.s3.ap-northeast-1.amazonaws.com/",
  6  			           "object_storage_credential_name": "S3_CRED",
  7  			           "profile_name": "GENAI_RAG",
  8  			           "vector_distance_metric": "cosine",
  9  			           "vector_dimension": 1024,
 10  			           "chunk_overlap":128,
 11  			           "chunk_size":400,
 12  			           "refresh_rate":10 }'
 13    );
 14  END;
 15  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

# 4. セッションで使用するAIプロファイルの設定
DBMS_CLOUD_AI.SET_PROFILEプロファイルで、現行セッションで使用するプロファイルを設定します。
ここでは、2.で作成したAIプロファイル「GENAI_RAG」を有効にします。
```
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('GENAI_RAG');

PL/SQLプロシージャが正常に完了しました。

SQL> 
```
# 5. RAGを使用した自然言語問合せの実行

準備が整ったので、RAGを使用した自然言語問合せ（SELECT AI RAG）を実行してみます。

「SELECT AI NARRATE」に続いて、質問を入力します。

```
SQL> SELECT AI NARRATE OraBoosterとは;

RESPONSE
--------------------------------------------------------------------------------
OraBoosterは、当社が開発したロケットエンジンです。次世代の宇宙探査を支える先進的
な推進技術の象徴であり、その独自の設計は、高性能と革新性を融合させ、人類の宇宙進
出を加速させるための革命的な一歩となります。

Sources:
  - rocket.txt (https://txt-bucket-s3.s3.ap-northeast-1.amazonaws.com/rocket.txt
)


SQL>
```
実行結果として、S3バケットに格納した独自のデータに基づいて、自然言語で結果が返ってきました。
また、「Sources」として、回答のソースとなったファイル名とそのURIも合わせて表示されました。

# 6. ベクトル索引の自動更新

SELECT AI NARRATEで、OraBoosterの価格に関して質問してみます。
```
SQL> SELECT AI NARRATE OraBoosterの価格は;

RESPONSE
--------------------------------------------------------------------------------
OraBoosterの価格に関する情報は、提供されたデータでは見つかりませんでした。

Sources:
  - rocket.txt (https://txt-bucket-s3.s3.ap-northeast-1.amazonaws.com/rocket.txt
)


SQL>
```
rocket.txtにはOraBoosterの価格に関する情報が含まれていないため、情報が見つかりませんでしたという回答になりました。

OraBoosterの価格情報を含むCSVファイル「rocekt_price.csv」を準備します。

![スクリーンショット 2024-12-24 13.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bbbf25b6-6bdb-c2b3-d939-76e7e745e9b5.png)

S3バケットにCSVファイル「rocekt_price.csv」を追加します。

![スクリーンショット 2024-12-24 13.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/50d15760-9bf9-425d-dbfb-fdb6244f833b.png)

DBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャ実行時にベクトル索引の更新頻度を10分（"refresh_rate":10)を指定したので、10分ほど待ってから再度SELECT AI NARRATEでOraBoosterの価格に関して質問してみます。

```
SQL> SELECT AI NARRATE OraBoosterの価格は;

RESPONSE
--------------------------------------------------------------------------------
OraBoosterの価格は1000000ドルです。

Sources:
  - rocket_price.csv (https://txt-bucket-s3.s3.ap-northeast-1.amazonaws.com/rock
et_price.csv)


SQL> 
```
ベクトル索引が更新され、S3バケット内の最新の情報を元にした回答が返ってきました。