シナリオ: APEXでSelect AIを使用してIoTデータをクエリ

APEX SQLワークショップまたはSQLclを使用して、IoTデータに関する自然言語の質問を行い、Select AIでSQLを生成します。

IoTドメインがAPEXに接続されている場合、AIを使用してIoTデータを問い合せる場合は、このシナリオを使用できます。IoTデータベース・ユーザーは、Select AIを使用するために必要なデータベース権限および権限をすでに持っています。

このシナリオは、Select AIプロファイルを作成するスクリプトの例を示しており、DBMS_CLOUD_AI.GENERATEを使用して自然言語プロンプトを要求し、Select AIによって生成されたSQLを表示してから、そのSQLをAPEX SQLコマンドで実行できます。

その他の概念については、APEXでのSelect AIのFAQを参照してください。

必要なIAMポリシー

IoTデータを読み取って生成AIリソース・ファミリを使用するには、これらの権限が必要です。

ユーザー・グループが特定のコンパートメント内のIoTドメインを読み取ることができます。
Allow group <your-group-name> to read <iot-domain> in compartment <compartment-name>
ユーザー・グループが特定のコンパートメント内の生成AIリソース・ファミリを使用できるようにします。
allow dynamic-group <your-group-name> to manage generative-ai-family in compartment <compartment-name>

管理者: ポリシーを初めて使用する場合は、ポリシーの設定についてさらに学習するために、Oracle Cloud InfrastructureのIAMポリシーの仕組みを参照してください。具体的な例は、Internet of Things (IoT)プラットフォームのポリシー詳細を参照してください。

始める前に

次のものがあることを確認します。

APEXでのSelect AI設定スクリプトのアップロード、カスタマイズおよび実行

  1. この例のSQLスクリプトコピーし、コード・スニペットをアップロードするファイルとして保存します(例: select_ai_apex_setup.sql)。
    このスクリプトは、IoTスキーマ・オブジェクト(RAW_DATAHISTORIZED_DATASNAPSHOT_DATADIGITAL_TWIN_MODELSDIGITAL_TWIN_INSTANCESDIGITAL_TWIN_ADAPTERSなど)のobject_listを作成します。
    SQLスクリプトの例
    -- APEX SQL Commands setup script.
    -- Run this code block first in APEX SQL Commands or SQL Scripts.
    
    alter session set nls_language = 'ENGLISH';
    
    declare
      c_domain_short_id       constant varchar2(128)  := '<domain short id in upper case>';
      c_genai_user_ocid       constant varchar2(4000) := 'ocid1.user.oc1..unique';
      c_genai_tenancy_ocid    constant varchar2(4000) := 'ocid1.tenancy.oc1..unique';
      c_genai_fingerprint     constant varchar2(4000) := 'unique';
      c_genai_region          constant varchar2(128)  := 'region';
      c_genai_model           constant varchar2(4000) := 'xai.grok-4.20-reasoning';
      c_genai_credential_name constant varchar2(128)  := 'GENAI_CRED';
      c_genai_profile_name    constant varchar2(128)  := 'GENAI_XAI_GROK_420';
    
      c_private_key constant clob := q'~-----BEGIN PRIVATE KEY-----
    <private key>
    -----END PRIVATE KEY-----~';
    
      type t_name_list is table of varchar2(128);
      l_objects t_name_list := t_name_list(
        'RAW_DATA',
        'HISTORIZED_DATA',
        'REJECTED_DATA',
        'SNAPSHOT_DATA',
        'RAW_COMMAND_DATA',
        'DIGITAL_TWIN_MODEL_SPECS',
        'DIGITAL_TWIN_MODELS',
        'DIGITAL_TWIN_INSTANCES',
        'DIGITAL_TWIN_RELATIONSHIPS',
        'DIGITAL_TWIN_ADAPTERS'
      );
    
      l_iot_owner   varchar2(130);
      l_attributes  clob;
      l_object_list clob := '[';
    begin
      l_iot_owner := upper(trim(c_domain_short_id)) || '__IOT';
    
      begin
        dbms_cloud_ai.drop_profile(c_genai_profile_name);
      exception
        when others then
          null;
      end;
    
      begin
        dbms_cloud.drop_credential(c_genai_credential_name);
      exception
        when others then
          null;
      end;
    
      dbms_cloud.create_credential(
        credential_name => c_genai_credential_name,
        user_ocid       => c_genai_user_ocid,
        tenancy_ocid    => c_genai_tenancy_ocid,
        private_key     => c_private_key,
        fingerprint     => c_genai_fingerprint
      );
    
      for i in 1 .. l_objects.count loop
        if i > 1 then
          l_object_list := l_object_list || ',';
        end if;
        l_object_list := l_object_list ||
          '{"owner":"' || l_iot_owner || '","name":"' || l_objects(i) || '"}';
      end loop;
      l_object_list := l_object_list || ']';
    
      l_attributes := '{' ||
        '"provider":"oci",' ||
        '"credential_name":"' || c_genai_credential_name || '",' ||
        '"region":"' || c_genai_region || '",' ||
        '"oci_compartment_id":"' || c_genai_tenancy_ocid || '",' ||
        '"model":"' || c_genai_model || '",' ||
        '"annotations":false,' ||
        '"comments":true,' ||
        '"object_list":' || l_object_list ||
      '}';
    
      dbms_cloud_ai.create_profile(
        profile_name => c_genai_profile_name,
        attributes   => l_attributes
      );
    end;
    /
  2. APEXで、「SQLワークショップ」を選択し、「SQLスクリプト」を選択します。

  3. 「アップロード」を選択して、select_ai_apex_setup.sqlファイルをAPEXに追加します。
  4. 環境の変数を使用してスクリプトを更新するには、「編集」を選択します。
    これらの値は、ご使用の環境に固有の値に置き換えてください。
    c_domain_short_id       constant varchar2(128)  := '<DOMAIN_SHORT_ID>';
    c_genai_region          constant varchar2(128)  := '<region>';
    c_genai_model           constant varchar2(4000) := 'xai.grok-4.20-reasoning';
    c_genai_profile_name    constant varchar2(128)  := 'GENAI_XAI_GROK_420';
    このスクリプトは、これらの定数および"provider": "oci"を使用する生成AIサービスを使用します。別のモデルを使用する場合は、スクリプトでこれらの値を更新できます。サポートされているAIプロバイダを使用するためのSelect AIの構成を参照してください。
  5. selectおよびpromptテキストを、AIが回答する質問に置き換えます。

    profile_nameを、実行するAIプロファイルに置き換えます。

    select 'GENAI_XAI_GROK_420' as profile_name,
           upper(trim('IN2AHR4KWKIRC')) || '__IOT' as iot_owner,
           'Setup complete' as status
    from dual;
    
    
    select 'which digital twin instances with the model spec uri dtmi:com:oracle:iot:sample:hvac:iot-domain-short-id' as prompt_text,
           dbms_lob.substr(
             replace(
               replace(
                 dbms_cloud_ai.generate(
                   prompt       => 'which model spec uri has exactly two digital twin instances and both in active state',
                   profile_name => 'GENAI_XAI_GROK_420',
  6. 「Run」を選択し、「Run Now」を選択します。
  7. 「表示」を選択し、「実行」をスクロール・ダウンして、プロンプト内のIoT質問に基づいて生成されたSQLを確認します。
  8. 生成されたSQLコピーし、「SQLワークショップ」「SQLコマンド」の順に選択します。
  9. 生成されたSQL貼り付け「実行」を選択して生成されたSQLを実行します。
  10. このプロンプトでは、「結果」デジタル・ツイン・インスタンスのOCID、その表示名温度および湿度の値が表示されます。
警告

大規模言語モデル(LLM)は、一般的にインターネットから、幅広いテキスト・ドキュメントおよびコンテンツに基づいてトレーニングされています。その結果、LLMは、SQLインジェクションを含む、無効または悪意のあるコンテンツからのパターンを組み込んだ可能性があります。LLMは、有用で関連性の高いコンテンツの生成に精通しており、不正確な結果を生成するSQLクエリやデータのセキュリティを損なうSQLクエリなど、誤った情報や誤った情報を生成することもできます。

ユーザー指定のLLMプロバイダによってユーザーにかわって生成された問合せは、データベースで実行されます。この機能の使用は、お客様自身の責任においてのみ行われるものとし、Oracleが提供するサービスに関連するその他の条件にかかわらず、お客様はそのリスクを受け入れるとともに、その使用によって生じた損害についてOracleの責任または責任を明確に排除します。

問合せの例

これらの例は、APEX SQLコマンドまたはSQLclでの開始プロンプトとして使用します。APEXでは、引用符内のテキストをprompt値として使用します。

デバイスの最新のテレメトリを検索
'Show the most recent telemetry readings for device <device-id>';
最もホットなHVACインスタンスの検索
'Which HVAC instance and model has the highest temperature in the last 1 hour?';
最近のデバイスエラーを検索
'Which devices reported errors in the last 24 hours?';
デバイス別の湿度の集計
'Show average humidity by device for the last 7 days';
現在テレメトリのないデバイスを検出し、オフラインまたは正しく構成されていない可能性のあるデバイスを特定します
'List devices that have not sent telemetry today';
異常な工場検針の要約
'Summarize abnormal readings for factory floor sensors this week';
棚卸履歴データ・レコード
'How many historized data records are in the IoT domain?';
履歴デジタル・ツイン・インスタンスのカウント
'How many digital twin instances are in historized data?';
最もビジーなRAWデータ・インスタンスの検索
'What instance sent most of the raw data last day?';
ドメイン内のアダプタの数
'How many adapters are in the domain?';
ドメイン内のインスタンスのカウント
'How many instances are in the domain?';
モデル当たりの平均インスタンス数
'What is the average number of instances that implement one model?';
拒否されたデータの確認
'Is there rejected data in the domain?';
時間別のRAWデータ取込み率
'What is the average raw data ingestion rate per hour last day, each hour?';
RAWレコードのペイロード・サイズ
'What is the average and max raw record payload size?';
履歴レコード・ペイロード・サイズ
'What is the average and max historized record payload size?';
時間別温度トレンド
'Show the average temperature by hour for the last day';
デバイスエラーをタイプ別にグループ化
'Show devices with error events in the last 7 days grouped by error type';

ベスト・プラクティス

  • 最初にshowsqlを使用して、生成されたSQLを実行前に確認できるようにします。
  • 一度にIoTの質問をします。
  • デバイス・タイプ、メトリック名、モデル仕様URIまたは時間範囲を含めます。
  • OpenAIGOOGLE_GEMINICLAUDEなど、個別のモデルに個別のプロファイル名を使用します。

FAQ

APEXの例では、SET_PROFILEのかわりにprofile_nameを使用するのはなぜですか。
SET_PROFILEは、現在のステートフル・データベース・セッションのプロファイルを設定します。APEXおよびデータベース・アクションではステートレス接続を使用できるため、より簡単なパターンはprofile_nameDBMS_CLOUD_AI.GENERATEに直接渡すことです。
複数のプロファイルが必要ですか。
番号1つのプロバイダとモデルのみを使用する場合は、1つのプロファイルを使用します。複数のプロファイルを作成するのは、Open AI、Gemini、Claudeなどのモデルを比較または切り替える場合のみです。
OCI Generative AIとSelect AIが異なるモデル・リストを示している理由
Select AIはデータベース機能です。モデル・リストは、Select AIプロファイルのプロバイダによって異なります。OCI生成AIモデル・リージョンおよびインポートされたモデルのドキュメントは、プロファイルで"provider": "oci"が使用される場合に適用されます。GeminiおよびClaudeモデルは、OCI Generative AIサービス・モデル・リストではなく、GoogleおよびAnthropicから取得されます。
これはIoTとどのように関係しているのでしょうか。
IoTデータは、Select AIが問い合せるデータベース・データです。Select AIプロファイルはIoTスキーマ・オブジェクトを指し、プロバイダ/モデルは自然言語プロンプトをSQLに変換します。
IoTユーザーのデータベース権限または権限を追加する必要がありますか。
番号Select AIを使用するには、必要なデータベース権限および権限がすでにIoTデータベース・ユーザーに割り当てられています。

トラブルシューティング

問合せは行を返しません

デバイスが要求された時間範囲のデータをレポートしたことを確認します。時間範囲を広げるか、既知のアクティブデバイスに問い合わせてください。

問合せが間違った列を参照しています

プロンプトでより具体的な表現を使用します。正確なメトリック、設備識別子またはイベント・タイプを含めます。

権限が拒否されました

ユーザーに、必要なリソースに対するデータベース権限およびOCIIAM権限があることを確認します。

結果は不完全です

問合せがコンパートメント、テナント、デバイス・グループ、リージョンまたは時間範囲でフィルタされているかどうかを確認します。