[Oracle Cloud] 既存環境にSELECT AI（自然言語によるクエリ実行）を活用するコツ（Comment文) (2024/02/20)

# はじめに
Oracle CloudのAutonomous Databaseで提供される自然言語によるクエリ実行（SELECT AI）を既存環境で活用しようとした際の課題に、表名や列名にその意味を持たせていないことがあります。SQLのコメント文で表や列の意味を定義することで、SELECT AI が表および列の意味を解釈することを可能にします。また、コメントがよいほど、LLMはその表または列を使用して正しい問合せを生成する方法を知っている可能性が高くなります。

# 事前準備
[Autonomous Database：SELECT AI（自然言語によるクエリ実行）がOCI生成AIサービスに対応したので試してみた](https://qiita.com/500InternalServerError/items/17255806823161a2b6bb)などを参考にSELECT AIを使うことができる準備をします。

# スキーマ構成

```TABLE1.sql
CREATE TABLE TABLE1 (
c1 number,
c2 varchar2(200),
c3 varchar2(200)
)
```

```TABLE2.sql
CREATE TABLE TABLE2 (
c1 number,
c2 varchar2(200),
c3 varchar2(200)
)
```

```TABLE3.sql
CREATE TABLE TABLE3 (
c1 TIMESTAMP,
c2 number,
c3 number,
c4 number,
c5 number
)
```

[コメント](https://docs.oracle.com/cd/F19136_01/sqlrf/COMMENT.html#GUID-65F447C4-6914-4823-9691-F15D52DB74D7)を追加することであいまいさを修正し、このような表名、列名に意味を持っていないスキーマに対してもSELECT AIをつかって自然言語によるクエリ実行できるようになります。

# コメントの追加

以下のようにコメントを追加します。

```TABLE1Comment.sql
COMMENT ON TABLE table1 IS 'Contains product,product name and product category';
COMMENT ON COLUMN table1.c1 IS 'product ids. Use this column to join to other tables';
COMMENT ON COLUMN table1.c2 IS 'product name';
COMMENT ON COLUMN table1.c3 IS 'product category';
```

```TABLE2Comment.sql
COMMENT ON TABLE table2 IS 'Contains product,product name and product category';
COMMENT ON COLUMN table2.c1 IS 'country ids. Use this column to join to other tables';
COMMENT ON COLUMN table2.c2 IS 'country name';
COMMENT ON COLUMN table2.c3 IS 'region name';
```

```TABLE3Comment.sql
COMMENT ON TABLE table3 IS 'transactions for product sales';
COMMENT ON COLUMN table3.c1 IS 'date of sales';
COMMENT ON COLUMN table3.c2 IS 'product ids. Use this column to join to other tables';
COMMENT ON COLUMN table3.c3 IS 'customer ids. Use this column to join to other tables';
COMMENT ON COLUMN table3.c4 IS 'quantity of sold';
COMMENT ON COLUMN table3.c5 IS 'amount of sold';
```

# コメントを使用するようにSELECT AIプロファイルを設定
SELECT AIプロファイルを作成する際に、COMMENTS 属性を `TRUE` に設定します。

```
exec dbms_cloud_ai.drop_profile('shprofile');
begin

  dbms_cloud_ai.create_profile(
    profile_name => 'shprofile',
    attributes =>       
        '{"provider": "oci",
               "credential_name": "OCI_GENAI_CRED",
               "comments":"true",
               "object_list": [
                     {"owner": "ADMIN", "name": "TABLE1"},
                     {"owner": "ADMIN", "name": "TABLE2"},            
                     {"owner": "ADMIN", "name": "TABLE3"}            
          ]          
          }'
    );

    dbms_cloud_ai.set_profile(
        profile_name => 'shprofile'
    );
end;
/

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

# SELECT AI の実行
`SELECT AI` キーワードを付記した自然言語で検索を実行します。

```
select ai what are our total sales amout;

TOTAL_SALES_AMOUNT
------------------
        98205831.2
```

```
select ai 合計売上は？;

TOTAL_SOLD
----------
98205831.2
```

生成されたSQLの確認

```
select ai showsql what are our total sales amout;

RESPONSE                                                     
-------------------------------------------------------------
SELECT SUM("TABLE3"."C5") AS total_sales_amount FROM "TABLE3"
```

# さいごに

コメントを使うことによって既存のスキーマ構成を変更することなく、SELECT AIを活用した自然言語によるクエリ実行ができました。

### 参考情報

- [How to help AI models generate better natural language queries](https://blogs.oracle.com/datawarehousing/post/how-to-help-ai-models-generate-better-natural-language-queries-in-autonomous-database)
- [Use natural language to query data in Autonomous Database](https://www.youtube.com/watch?v=2C-wirdC0aw)