Autonomous Databaseのデータ分析機能で、AIを使用したクエリの説明を試してみた

# はじめに
この記事では、Autonomous Databaseの2024/10の新機能「Data Studio Analysis- Explain query using AI (データ分析におけるAIを使用したクエリの説明)」をご紹介します。

マニュアルは[こちら](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/ai-explain.html#GUID-E68BBB61-517C-4E2A-92E7-7DE2D5C47411)です。

Database Actionsのツール群であるData Studio内のデータ分析に関するもので、AIを使用して、データ分析ツールが生成するSQLクエリをテキスト形式で説明できるようになりました。

## 使用するデータセットについて

*  この記事で使用するデータセット、ユーザーはこちらの[Live Labs](https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=3831&p210_wec=&session=5588266334061)内でデプロイできるMOVIESTREAMを使います。

* 下準備として、以下の作業が必要です。[マニュアル](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/run-natural-language.html#GUID-84156AAF-0CF3-4EED-ACB7-A57B76590D48)には以下の記載があります。
   > Prerequisites　    
    To utilize the Natural Language Query, you must have:
    An OpenAI, or Cohere or An Azure OpenAI account service with credit
    An access to DBMS_CLOUD_AI package.
    Note:
    You must set your AI profile using the Natural Language Query feature. Follow the steps mentioned in this chapter to Use Select AI to Generate SQL from Natural Language Prompts.
    After you have created and configured your AI profile, set your AI profile in Data Studio Preferences wizard on the Connections page to use AI features such as generating SQL from Natural Language in the Data Studio tool.

→AIプロファイルの設定 ＋ Data Studio内での設定が必要です。

## 下準備1- AIプロファイルの設定
* 本記事ではAIプロバイダとして、**Open AI**を使います。
* まず、ADMINユーザーでAutonomous Databaseにサインインして、以下を実行します。
    ```
    GRANT DWROLE, UNLIMITED TABLESPACE TO MOVIESTREAM;
    ```
* DBMS_CLOUD_AIパッケージの実行権限を付与します。
    ```
    GRANT EXECUTE ON DBMS_CLOUD_AI TO MOVIESTREAM
    ```
* OpenAIのAPIのホストapi.openai.comに対するHTTPアクセスを許可します。
    ```
    BEGIN
        DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
            host => 'api.openai.com',
            ace  => xs$ace_type(privilege_list => xs$name_list('http'),
                                principal_name => 'MOVIESTREAM',
                                principal_type => xs_acl.ptype_db)
        );
  END;
    ```
* ADMINからはサインアウトし、MOVIESTREAMユーザーでログインします。以下を実行します。
    ```
    --OpenAIのAPIに接続するためのクレデンシャルを作成
    BEGIN
            DBMS_CLOUD.CREATE_CREDENTIAL(
              credential_name => 'OPENAI_CRED',　--クレデンシャル名
             username        => 'OPENAI',　
              password        => '**-proj-****************************************************************' --Open AIのAPIキー
          );
      END;
      /
      --AIプロファイルを作成
       BEGIN
           DBMS_CLOUD_AI.CREATE_PROFILE(
               profile_name => 'OPENAI',
                attributes   => '{"provider": "openai",
                                  "credential_name": "OPENAI_CRED",
                                  "object_list": [{"owner": "MOVIESTREAM"}]　--スキーマオブジェクトとしてMOVIESTREAM全体を指定
                              }'
           );
       END;
       /
       --現在のセッションでAIプロファイルを有効化
       EXEC DBMS_CLOUD_AI.SET_PROFILE('OPENAI');
      END;
    ```
:::note info
**object_listについて**
今回はスキーマオブジェクトとしてMOVIESTREAMスキーマを指定しましたが、スキーマ内のオブジェクト毎(表単位など)に絞って指定することもできます。object_listの指定は必須で、今の所DB全体を指定することはできないようです。また、あまり指定範囲を広くすると、使用するトークン量が増える可能性があります。
:::

:::note info
また、上記のセットアップはDatabase ActionsのSQLの機能でも実行することができます。
:::


## 下準備2- Data Studio内の設定
* 続いて、Database Actions内のData Studioの設定をしていきます。
* Database ActionsにMOVIESTREAMユーザーでサインインします。
* Data Studioを開き、左下の設定を開きます。
    ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/3acfdc06-3749-38e7-90a0-a9ee5fc7c2ae.png)
* AIプロファイルを開き、Open AIを選択します。まだ試験的みたいです。
    ![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/e0b6bd57-2e5a-0cac-3dbe-627b2bf31702.png)
* AI アクセスのチェックをクリックします。緑のチェックマークがつき、アクセスの確認ができました。
　AIプロバイダと、モデル、作成したクレデンシャルが自動で選択されています。
    ![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/3939ee21-bf2c-a3f4-29e6-a8637659da4f.png)

これで下準備が終わりました。

## データ分析機能でAIを使用してクエリの説明させてみる

* Data Studioからデータ分析を開きます。
* 画面下の表からクエリをしたい表、今回はACTORSを開いてみます。
    ![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/efcb51e3-b920-9f80-7206-1ce04419dde5.png)

* 下準備が正常にできると、自然言語を入力するところや、AI Explainのボタンが表示され、本機能が使えるようになります。逆にセットアップができていないと下記画像のようには表示されません。
    ![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/be227e5c-0967-c619-832f-4eeb1a92b639.png)
* 画面上部の「自然問合せの使用(日本語がおかしいですね)」のトグルをオンにして自然言語の入力を有効にします。

*  表の選択をクリックし、クエリしたい対象の表にチェックします。複数選択することもできます。対象のデータがどこにあるか分からなかったら、全てにチェックを付けるのも手段としてありかもしれません。
* 「自然問合せの入力」の欄に、
    ```
    show me all actors.
    ```
と入力し、全ての俳優の情報が欲しいと問い合わせてみます。
* 画像のように、自然言語から生成されたSQLクエリを表示、かつその説明もしてくれています。
    ![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/5248ff67-a4cd-8b76-c7dc-f0e5b09c37a2.png)

* 説明に記載されているSQL文を実行してみます。俳優(ACTOR)の情報がクエリできていることが分かります。
    ![画像6.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/f2a80cde-58d3-4524-8a98-d83294a5839e.png)
    
* もう1つ自然言語で問合せをしてみます。今度は、
    ```
    Show me the names of actors whose names begin with the letter A.
    ```
という風に自然言語の入力欄に入力して、名前が'A'から始まる俳優の情報を表示をするように問い合わせをしてみます。
* そして、「AI Explain」をクリックしてみます。すると、SELECT文を変更するようにアドバイスされ、クエリの例が表示されます。
    ![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/de4c7dea-e2e0-745f-3aa0-2aeae2e60106.png)
* 提案してくれたクエリを実行してみます。
実行結果見ると、エラーになっています。ACTOR_NAME列が無効だということです。LLMが提案してくれたクエリは実行できませんでしたので、必ずしも毎度正確なものを提供してくれるわけではなさそうです。
    ![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/30b38e02-23b1-441e-b329-b3cef631c523.png)
* 画面左側のACTORS表を展開してみると、ACTOR_NAME列は存在していないです。おそらくACTOR列に俳優の名前が格納されていると思われます。
先ほど実行に失敗したSELECT文のWHERE句内のACTOR_NAMEをACTORに変更して、再度実行してみます。
するとクエリは実行され、結果を見てみるとAから始まる俳優の名前が出力されています。
    ![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/febae147-4488-3818-c607-a8178d55bb1b.png)

# まとめ
本記事では、Database Actions内のデータ分析機能で新しく提供された「AIを使用したクエリの説明」を試してみました。
### 参考
* [Example: Select AI with OpenAI](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/select-ai-examples.html#GUID-D33BA5D9-59FB-4B98-948F-D768D13ED01B)
* [Autonomous Database：SELECT AI機能を使用してOpenAIを利用した自然言語によるクエリ実行を試してみた（日本語でも実行できた）](https://qiita.com/500InternalServerError/items/10d1af43a381514a51dd)
* [Generate Natural Language explanation from SQL Query using AI Explain](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/ai-explain.html#GUID-E03B14C4-8D85-4B9D-8415-F5E9575B9932)