Oracle APEXアプリケーションへの自然言語インタフェースの追加
イントロダクション
Database Expert Resources (DBExpert Toolkit)サイトを運用しています。このサイトでは、ユーザーがユース・ケースに最適なOracle Database Cloud Serviceを識別するのに役立つ比較情報と対話型ツールが提供されます。最近では、ユーザーがクラウド・サービスに関する質問もできるように、自然言語インタフェースをWebサイトに追加しました。
当社のWebサイトは、Oracle Autonomous Transaction Processing Serverlessデータベース上で実行されているOracle Application Express (Oracle APEX)インスタンスであり、新しいOracle Autonomous Database Select AIが利用可能で、自然言語によるデータとのやり取りを可能にしました。
コンテンツ関連の質問だけでなく、ヘルプのリクエストも正常に処理し、ユーザーのフィードバックを受け入れるために、自然言語問合せのフロントエンドとしてOracle Digital Assistantを選択しました。
このチュートリアルでは、自然言語インタフェースを追加するために実行したタスクの概要を示します。
目的
- Oracle APEXアプリケーション内でOracle Digital Assistantインタフェースを設定して、アプリケーションのOracle Autonomous Databaseでデータを問い合せるための自然言語インタフェースを提供します。
前提条件
-
Oracle Digital AssistantとOracle APEXのインストール、およびこれに精通していること。
-
Oracle APEXアプリケーションは、Oracle Autonomous Database Select AIをサポートするOracle Databaseのバージョン上にある必要があります。
-
大規模言語モデル(LLM)の資格証明を持つアカウント。ユーザー入力に基づいてSQLが生成されます。この前提条件に関するガイダンスは、Mark Hornickのブログ「Autonomous DatabaseでのSelect AI - Natural Language to SQL Generationの概要」を参照してください。
タスク1: Oracle Autonomous Database Select AIとLLMの接続
APEXワークスペースの「SQLワークショップ」→「SQLコマンド」で、次のコードを実行して人工知能(AI)プロファイルを作成し、Select AIで使用されるスキーマおよびデータベース・オブジェクトを指定します。このプロファイルはタスク2で使用されます。
このチュートリアルでは、LLMとしてOpenAIを使用しました。
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OPENAI_CRED',
username => 'OPENAI',
password => '...' );
END;
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'OPENAI_PROFILE',
attributes => '{ "provider": "openai",
"credential_name": "OPENAI_CRED",
"comments":"true",
"object_list": [{"owner": "DB_SCHEMA", "name":"OBJECT_NAME"}]
}',
description => 'AI profile to use OpenAI for SQL translation'
);
END;
Oracle Autonomous Database Select AI構成を確認するには、次を実行します
select dbms_cloud_ai.generate(
prompt => 'How many employees work at Oracle?',
action => 'SHOWSQL',
profile_name => 'OPENAI_PROFILE'
)
FROM DUAL;
これから、SQL問合せを出力として受け取り、構成を検証する必要があります。
タスク2: REST APIの統合
Oracle Autonomous Database Select AIがデータベース・オブジェクトと連携したら、Oracle Digital Assistantと統合されるREST POSTエンドポイントを作成します。Oracle APEXでこれを作成するには、「SQLワークショップ」→「RESTfulデータ・サービス」を開き、POSTハンドラを使用してモジュールを作成します。モジュール名とPOSTハンドラ名は、タスク3でOracle Digital Assistantを構成するために使用されます。
POSTハンドラは、Oracle Digital Assistantから自然言語の質問を受信し、SQL問合せを取得します。結果のSQL問合せが実行され、出力がデジタル・アシスタントに戻されて表示されます。作成したモジュールのPOSTハンドラに次のコードを貼り付けます。
ヒント: Oracle APEXを使用したRESTfulサービスの詳細は、RESTfulサービスを使用したデータ交換の有効化を参照してください。
DECLARE
l_response CLOB;
l_sql CLOB;
l_prompt VARCHAR2 (4000);
l_cursor NUMBER := DBMS_SQL.open_cursor;
l_profile_name user_cloud_ai_profiles.profile_name%TYPE := 'YOUR_PROFILE'; -- the LLM profile you created per (link to Select AI setup)
p_refcursor SYS_REFCURSOR;
l_result CLOB;
BEGIN
/*
The variable name for the 'prompt' parameter below must match the variable used in the
Oracle Digital Assistant Flow, in the State that calls the REST endpoint
*/
l_sql :=
dbms_cloud_ai.generate (prompt => :l_prompt,
action => 'showsql',
profile_name => l_profile_name);
-- check if SQL could be generated.
BEGIN
DBMS_SQL.PARSE (l_cursor, l_sql, DBMS_SQL.native);
l_response := l_sql;
parse_cursor (l_sql, p_refcursor, l_result);
if l_result is not null then
:status := 200;
else
raise_application_error(-20987,'No records found');
end if;
EXCEPTION
WHEN OTHERS
THEN
:status := 400;
l_result := 'Something went wrong while processing...';
END;
APEX_UTIL.PRN (l_result, FALSE);
END;
Oracle APEXの「SQLワークショップ」→「SQLコマンド」で次を実行して、Oracle Autonomous Database Select AIから受信したSQL問合せを実行するプロシージャを作成します。
CREATE OR REPLACE PROCEDURE parse_cursor (p_query IN VARCHAR2,
cur IN OUT SYS_REFCURSOR,
p_result OUT CLOB)
AS
curs INT;
cols INT;
d DBMS_SQL.desc_tab2;
val VARCHAR2 (32767);
l_row_count INTEGER := 0;
BEGIN
OPEN cur FOR p_query;
curs := DBMS_SQL.to_cursor_number (cur);
DBMS_SQL.describe_columns2 (curs, cols, d);
p_result := p_result || '<table> <tr>';
FOR i IN 1 .. cols
LOOP
DBMS_SQL.define_column (curs,
i,
val,
32767);
p_result := p_result || '<th>' || d (i).col_name || '</th>';
END LOOP;
p_result := p_result ||'</tr>';
WHILE DBMS_SQL.fetch_rows (curs) > 0
LOOP
p_result := p_result ||'<tr>';
FOR i IN 1 .. cols
LOOP
DBMS_SQL.COLUMN_VALUE (curs, i, val);
p_result := p_result ||'<td>' || val || '</td>';
END LOOP;
p_result := p_result ||'</tr>';
l_row_count := l_row_count + 1;
END LOOP;
p_result := p_result ||'</table>';
IF l_row_count = 0
THEN
p_result := NULL;
END IF;
DBMS_SQL.close_cursor (curs);
END;
/
出力は、Oracle Digital Assistantで使用するために表にフォーマットされます。JSON出力は、アプリケーションごとに別のオプションです。
ノート:このエンドポイントは、複数のOracleデジタル・アシスタント(または同様のアプリケーション)から使用して、Oracle Autonomous Database Select AIによって実行されるデータと処理を活用できます。
タスク3: Oracle Digital Assistantの構成
Oracle Digital Assistantインスタンスでは、データに関する質問を処理するフローを作成しました。追加フローでは、ヘルプ、小規模トークおよびフィードバックの要求を処理します。次のスクリーンショットは、チャットボットをRESTサービスに接続するためにタスク2で作成したRESTエンドポイントに関する情報を使用したOracle Digital Assistantの場所を示しています。
ヒント:このチュートリアルでは、Oracle Digital Assistantの作成および構成は説明しません。詳細は、Oracle Digital Assistantを参照してください。
このフローは、処理のためにユーザー入力をRESTエンドポイントに渡します。
タスク4: Oracle Autonomous Database Select AIのデータの準備
スキーマには、マッピング表と結合された複数の表が含まれています。これらすべてをLLMに渡すのではなく、ドメイン知識を使用して、必要なすべてのデータ(およびのみ)を含む表を送信し、関連する表を結合するビューを作成しました。このビューは、最新の状態に保つために、ソース表から定期的にリフレッシュされます。
Retrieval Augmented Generation(RAG)の経験を磨く
完全で信頼できるデータをLLMに送信していましたが、アプリケーションが良い結果を生み出すためには、より多くの情報が必要であることがすぐにわかりました。(プロンプト・エンジニアリングは迅速にコーディングすることを意味しないことがわかりました。)取得拡張生成(RAG)を使用することで、結果を改善できました。たとえば、データに表されるOracleパッケージ・アプリケーションは、様々な略語および頭字語によって認識され、関連する列についてコメントとして提供されるようになりました。結果を改善するために、このタイプのアクションを検討できます。
タスク5: Oracle APEXアプリケーションへのOracle Digital Assistantの統合
アプリケーションは、Oracle Autonomous DatabaseインスタンスでホストされるOracle APEXインスタンスです。Oracle Digital Assistantをアプリケーションに統合します。
-
Oracle APEXアプリケーションで、「共有コンポーネント」および「静的アプリケーション・ファイル」に移動します。
これらの静的アプリケーション・ファイルは、チャットボットの構成および起動に使用されます。
settings.js
web-sdk.js
chatbot_style.css
ノート: Oracle Digital Assistant (ODA)およびOracle Mobile Cloud (OMC)のダウンロードから、次のOracle Digital Assistantテンプレートをダウンロードします。
-
settings.js
:このファイルは、Oracle Digital Assistant構成用です。次の値を更新します。- URL: Oracle Digital AssistantインスタンスのURLを入力します。
- 名前: Oracle APEXアプリケーションのページ・ロード時イベントから参照されるボットの名前をページ0に入力します。
- チャネルID: Oracle Digital AssistantアプリケーションからコピーされたチャネルIDを入力します。
- Oracle APEXアプリケーション・ユーザー・セッションを、ユーザーがナビゲートするときに異なるアプリケーション・ページにわたって維持されるボット・インスタンスに結び付けます。
- userId:
document.getElementById("pInstance").value
.
- userId:
-
web-idk.js
:このファイルは変更する必要はありませんが、Oracle Digital Assistantのバージョンと一致するように、Oracle Digital Assistantプラットフォームの新しいリリースごとに更新する必要があります。 -
chatbot_style.css
: CSSファイルを最初から作成して、チャットボット・アイコンをカスタマイズします。
-
使用するようにアプリケーションを構成するには、ファイルを静的アプリケーション・ファイルにアップロードします。「共有コンポーネント」、「ユーザー・インタフェース属性」、JavaScriptに移動し、
settings.js
およびweb-sdk.js
のURLを入力します。 -
「CSS」タブに移動し、CSSファイルのURLを入力します。
-
アプリケーションのグローバル・ページ0で、ページ・ロード時に起動するイベントを追加して、
settings.js
ファイルのinitSdk
関数を呼び出します。
Oracle APEXアプリケーションを実行すると、画面の右下にチャットボット・アイコンが表示されます。ユーザーが自然言語の質問をする準備ができています!
次のステップ
自然言語問合せによるデータへの値の追加の有効化
3つの戦略的なOracleテクノロジを組み合せることで、他のアプリケーションやWebサイトで使用できる新しいチャットボットを使用して、有用で拡張可能なAI機能をアプリケーションにすばやく導入しました。Oracle Autonomous Database Select AIを使用して処理されるデータの範囲を拡大し、新しいOracle Digital Assistantフローを処理するための追加の情報ソースを統合できます。
データベース・エキスパート・リソースにアクセスし、自然言語のインタフェースを試してフィードバックをお寄せください。
関連リンク
承認
-
著者 - Burt Clouse、Omar Gallardo
-
貢献者 - Marty Gubar、Mark Hornick、Watari裕子
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントは、Oracle Help Centerを参照してください。
Add a Natural Language Interface to Oracle APEX Application
G11968-04
October 2024