2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Autonomous Database:自然言語プロンプトからSQLを生成するPL/SQLファンクションを作成してRESTで公開してみた

Last updated at Posted at 2025-01-31

はじめに

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を表示ます。
スクリーンショット 2025-01-31 10.42.04.png

作成したファンクションGENERATE_SQL_STATEMENTの名前を右クリックし、「REST」→「有効化」とクリックします。
スクリーンショット 2025-01-31 10.44.14.png

オブジェクトのRESTの有効化の画面が表示されますので、プレビューURLをコピーしておき、「有効化」をクリックします。
スクリーンショット 2025-01-31 10.26.51.png

これで、PL/SQLファンクションがRESTで公開されました。

今回は検証目的のため認証を有効化しませんでしたが、「認証が必要」のトグルをオンにすることで、RESTアクセス時の認証を有効化することができます。

4. 公開したRESTの動作確認

作成したファンクションGENERATE_SQL_STATEMENTの名前を右クリックし、「REST」→「cURLコマンド」とクリックします。
スクリーンショット 2025-01-31 10.27.30.png

「ファンクションxxxxxのcURL」の画面が表示されます。

ここで、ai_profileの値として使用するAIプロファイル名「OCI_GENAI」を、nlpromptの値として質問文「従業員は何人いますか」を入力します。
値を入力すると、画面下部にそのパラメータを使用する場合のcurlコマンドが表示されますので、このコマンドをコピーします。
スクリーンショット 2025-01-31 10.28.14.png

コピーした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がレスポンスとして返されていることが確認できました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?