はじめに
Oracle Database 23aiの新機能のSELECT AI機能(NL2SQL)は、自然言語でデータベースに問い合わせができる非常に強力な機能です。
しかし、Sidecar技術を利用して複数DBとの連携をする場合などで、時々意図した通りのSQLが生成されなかったり、動作が不安定になったりすることがあります。
この記事では、SELECT AIの動作が安定しないときに試せるいくつかのTipsを紹介します。
事前の環境は下記記事でセットアップしてあるものとします。
1.コメント・アノテーションを利用する
テーブルやカラムにコメントやアノテーションを付与することで、LLMがスキーマをより正確に理解し、適切なSQLを生成するのに役立ちます。特に、専門用語や省略語が使われている場合や翻訳が必要な場合に有効です。
COMMENT ON COLUMN highschools_view.BOROUGH IS '高校が所在する地区。カタカナで地区名が格納されています。';
下記ドキュメントが参考になりますので、ご確認ください。
2.LLMを変更してみる
SELECT AIは、複数のLLM(大規模言語モデル)をサポートしています。利用中のLLMでうまく動作しない・精度が悪い場合、別のLLMに変更することで結果が改善されることがあります。
利用可能なモデルは下記ご参考ください。
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
'GENAI_COHERE_2025',
'{
"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"model":"cohere.command-a-03-2025",
"oci_apiformat":"COHERE",
"region": "ap-osaka-1",
"object_list": [
{"owner": "ADMIN", "name": "V_MYSQL_ACTOR"},
{"owner": "ADMIN", "name": "V_MYSQL_FILM"}
]
}'
);
END;
登録したプロファイルのセットも忘れずに。
EXEC DBMS_CLOUD_AI.SET_PROFILE('GENAI_COHERE_2025');
3.FEEDBACK機能を活用する
SELECT AIのFEEDBACK機能を利用することで、より正確なSQLクエリを生成する能力を向上させるためのフィードバックを与えることができるようになります。
下記記事が詳細に説明頂いているので参考にして頂ければと思います。
4.(Sidecar利用の場合)Materialized Viewを活用する
こちらが今回のメインテーマです。
Sidecar技術を利用して、他のDBからテーブルを参照している場合、クエリパフォーマンスが問題になることがあります。
また、ソース側DBに対してもSQLが発行されるたびに負荷がかかり、下記のようなエラーが頻繁に表示されます。
lost RPC connection to heterogeneous remote agent using SID=: lost RPC connection to heterogeneous remote agent using SID=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=pvt…
ORA-28509: unable to establish connection to a system outside the Oracle network
ORA-02063: preceding line from MYSQL_HW_LINK https://docs.oracle.com/error-help/db/ora-28511/. A fatal error occurred in one of the following places -- the connection between the ORACLE server and the agent -- the heterogeneous services remote agent itself -- the connection to the non-Oracle system This error occurred after communication had been established successfully. Check for network problems and remote host crashes. The problem is probably in the agent software. If so, contact a customer support representative of the agent vendor
このような場合、頻繁に使用するクエリや複雑な結合を含むクエリの結果をマテリアライズド・ビュー(実体化ビュー)としてOracle Database上に作成しておくことで、SELECT AIからのパフォーマンスを大幅に向上させることができます。
CREATE MATERIALIZED VIEW actor_mv_hw
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND
AS
SELECT
"a"."actor_id",
"a"."first_name",
"a"."last_name",
"a"."last_update"
FROM
"actor"@MYSQL_HW_LINK "a";
上記のように、異種間接続においてのDBLinkでもMATERIALIZED VIEWの作成が可能です。
再度プロファイルを登録し直すことも忘れずに。object_listの対象がMVIEWになります。
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
'GENAI_COHERE_2025',
'{
"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"model":"cohere.command-a-03-2025",
"oci_apiformat":"COHERE",
"region": "ap-osaka-1",
"object_list": [
{"owner": "WKSP_APEXDEV", "name": "ACTOR_MV_HW"}
]
}'
);
END;
また、マテリアライズド・ビューを利用する場合は、定期的にリフレッシュをしないソースDBとの鮮度が高く保てなくなるためご注意ください。夜間など定期的にリフレッシュことをご検討ください。
EXECUTE DBMS_MVIEW.REFRESH('ACTOR_MV_HW');
マテリアライズド・ビューを設定することで、(実体をOracel Database側に持つので当たり前ですが)Lost Connectionが頻発する問題を回避でき、SELECT AIの実行についても安定して動作するようになりました。
情報の鮮度の保ち方は課題にはなりますがお試しください。
まとめ
SELECT AIはここで紹介したTipsを活用することで、より安定して便利に使うことができます。ぜひ試してみてください。