はじめに
Autonomous Databaseでは、表やビュー、PL/SQLプロシージャ/ファンクションなどを簡単にRESTで公開できます。
今回は自然言語プロンプトからSQLを生成するPL/SQLファンクションを作成してRESTで公開してみました。
1. PL/SQLファンクションの作成
SQLの生成に使用するAIプロファイルと自然言語プロンプト(質問文)をパラメータとして渡して実行すると、戻り値として生成されたSQLを返すファンクションgenerate_sql_statementを作成します。
処理の内容は非常に単純で、DBMS_CLOUD_AI.GENERATEファンクションに使用するAIプロファイル名とプロンプトを渡してSQLを生成し、戻り値として生成されたSQLを返します。
SQL> CREATE OR REPLACE FUNCTION generate_sql_statement(ai_profile IN VARCHAR2, nlprompt IN VARCHAR2) RETURN VARCHAR2
2 IS
3 generated_sql VARCHAR2(4000);
4 BEGIN
5 SELECT TO_CHAR(DBMS_CLOUD_AI.GENERATE(prompt => nlprompt, profile_name => ai_profile, action => 'showsql')) INTO generated_sql;
6 RETURN generated_sql;
7 END;
8 /
ファンクションが作成されました。
SQL>
2. 作成したPL/SQLファンクションの動作確認
作成したPL/SQLファンクションgenerate_sql_statementの動作を確認してみます。
ここでは使用するAIプロファイルとしてOCI_GENAIを指定し、プロンプトとして「従業員は何人いますか」という質問文を指定しています。
SQL> SELECT generate_sql_statement('OCI_GENAI','従業員は何人いますか');
GENERATE_SQL_STATEMENT('OCI_GENAI','従業員は何人いますか')
--------------------------------------------------------------------------------
SELECT COUNT("e"."EMPNO") AS "従業員数" FROM "ADMIN"."EMP" "e"
SQL>
正しくSQLが生成できていることが確認できました。
3. PL/SQLファンクションをRESTで公開する
Database ActionsのSQLにアクセスし、ナビゲータに作成したファンクションGENERATE_SQL_STATEMENTを表示ます。
作成したファンクションGENERATE_SQL_STATEMENTの名前を右クリックし、「REST」→「有効化」とクリックします。
オブジェクトのRESTの有効化の画面が表示されますので、プレビューURLをコピーしておき、「有効化」をクリックします。
これで、PL/SQLファンクションがRESTで公開されました。
今回は検証目的のため認証を有効化しませんでしたが、「認証が必要」のトグルをオンにすることで、RESTアクセス時の認証を有効化することができます。
4. 公開したRESTの動作確認
作成したファンクションGENERATE_SQL_STATEMENTの名前を右クリックし、「REST」→「cURLコマンド」とクリックします。
「ファンクションxxxxxのcURL」の画面が表示されます。
ここで、ai_profileの値として使用するAIプロファイル名「OCI_GENAI」を、nlpromptの値として質問文「従業員は何人いますか」を入力します。
値を入力すると、画面下部にそのパラメータを使用する場合のcurlコマンドが表示されますので、このコマンドをコピーします。
コピーしたcurlコマンドを実行してみます。
[opc@test html]$ curl --location --request POST \
> 'https://sya6vphk3pzlkhq-atp23ai.adb.ap-tokyo-1.oraclecloudapps.com/ords/admin/generate_sql_statement/' \
> --header 'Content-Type: application/json' \
> --data-binary '{
> "ai_profile": "OCI_GENAI",
> "nlprompt": "従業員は何人いますか"
> }'
{"~ret":"SELECT COUNT(\"e\".\"EMPNO\") AS \"従業員数\" FROM \"ADMIN\".\"EMP\" \"e\""}
[opc@test html]$
ダブルクウォートが \(バックスラッシュ)でエスケープされていますが、生成されたSQLがレスポンスとして返されていることが確認できました。