Autonomous Database：SELECT AI（自然言語によるクエリ実行）がOCI生成AIサービスに対応したので試してみた

# はじめに
Autonomous DatabaseのSELECT AI（自然言語によるクエリ実行）機能で、AIプロバイダとしてOCI生成AIサービスが利用できるようになったので、早速試してみました。


# 1. クレデンシャルの作成

Autonomous Databaseに接続します。
接続ユーザには予めDBMS_CLOUDパッケージ、DBMS_CLOUD_AIパッケージの実行権限を付与しておきます。

今回は、こちらのLiveLabsをデプロイした際に作成されるMOVIESTREAMユーザを使用しました。

https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=3831

```
[opc@tools ~]$ sql MOVIESTREAM/watchS0meMovies#@ADB


SQLcl: Release 23.3 Production on Wed Feb 07 05:04:54 2024

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.22.0.1.0

SQL>
```
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、OCI生成AIサービスに接続するためのクレデンシャルを作成します。

今回はクレデンシャル名をOCI_GENAI_CREDとしました。

OCI生成AIサービスをSELECT AIのLLMとして使用する場合、クレデンシャルにはOCI生成AIサービスを利用可能なOCIユーザのAPIキーの情報を設定します。
※クレデンシャルとしてAutonomous Databaseのリソース・プリンシパルも利用可能です。
```
SQL> BEGIN
         DBMS_CLOUD.CREATE_CREDENTIAL(
             credential_name => 'OCI_GENAI_CRED',
             user_ocid       => 'ocid1.user.oc1..axxxxxxxxxxxxxxxxq',
             tenancy_ocid    => 'ocid1.tenancy.oc1..aaxxxxxxxxxxxxa',
             private_key     => '-----BEGIN PRIVATE KEY-----
     MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCegvX4x7E8zpi3
　　　＜中略＞
     1D3iheu1ct50SB0aIQz9Ow==
     -----END PRIVATE KEY-----',
             fingerprint     => 'xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx'
         );
     END;
     /

PL/SQL procedure successfully completed.

SQL> 
```

# 2. AIプロファイルの作成

DBMS_CLOUD_AI.CREATE_PROFILEプロシージャを使用して、AIプロファイルを作成します。
今回はプロファイル名をOCI_GENAIとしました

AIプロバイダとしてOCI生成AIサービスを使用する場合はパラメータproviderにociを指定します。

今回は、AIプロファイルで使用するスキーマ・オブジェクトとして、MOVIESTREAMスキーマ内の、GENRE、CUSTOMER、PIZZA_SHOP、STREAMS、MOVIES、ACTORSの６つの表を指定しました。
providerにociを設定しモデルを指定しない場合、デフォルトではモデルとしてcohere.commandが使用されます。
```
SQL> BEGIN
         DBMS_CLOUD_AI.CREATE_PROFILE(
             'OCI_GENAI',
             '{"provider": "oci",
               "credential_name": "OCI_GENAI_CRED",
               "object_list": [
                     {"owner": "MOVIESTREAM", "name": "GENRE"},
                     {"owner": "MOVIESTREAM", "name": "CUSTOMER"},
                     {"owner": "MOVIESTREAM", "name": "PIZZA_SHOP"},
                     {"owner": "MOVIESTREAM", "name": "STREAMS"},            
                     {"owner": "MOVIESTREAM", "name": "MOVIES"},
                     {"owner": "MOVIESTREAM", "name": "ACTORS"}
                 ]
             }'
         );
     END;
     /

PL/SQL procedure successfully completed.

SQL>
```

# 3. SELECT AIの実行

DBMS_CLOUD_AI.SET_PROFILEプロシージャを使用して、セッションで使用するAIプロファイルとしてOCI_GENAIを指定します。
```
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_GENAI');

PL/SQL procedure successfully completed.

SQL> 
```
SELECT AIを実行してみます。
```
SQL> SELECT AI how many customers exist;

   NUM_CUSTOMERS 
________________ 
          148129 

SQL> 
```
結果が妥当かを確認するために、customer表の件数を確認してみます。
```
SQL> SELECT COUNT(*) FROM customer;

   COUNT(*) 
___________ 
     148129 

SQL> 
```
SELECT AIの結果とcustomer表の件数が一致していることが確認できました。

SELECT AI SHOWSQLで生成されたSQLを確認してみます。
```
SQL> SELECT AI SHOWSQL how many customers exist;

RESPONSE                                                      
_____________________________________________________________ 
SELECT COUNT(*) AS num_customers
FROM MOVIESTREAM.CUSTOMER    

SQL>
```
SELECT AIで日本語で問合せを実行してみます。
```
SQL> SELECT AI 顧客は何人いますか;

   CUSTOMER_COUNT 
_________________ 
           148129 

SQL>
```
日本語で問合せした場合でも、SQLが実行されることが確認できました。

# 参考情報
・[生成AIリソースへのアクセス](https://docs.oracle.com/ja-jp/iaas/Content/generative-ai/iam-policies.htm)
・[Create and Set an AI Profile](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/sql-generation-ai-autonomous.html#GUID-7B6A819E-AF51-445B-949D-E8E16A936CFE)
・[DBMS_CLOUD_AI Package](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-ai-package.html#GUID-000CBBD4-202B-4E9B-9FC2-B9F2FF20F246)