Cenário: Consultar Dados IoT com o Select AI no APEX

Use o APEX SQL Workshop ou SQLcl para fazer perguntas em linguagem natural sobre seus dados IoT para gerar SQL com o Select AI.

Quando seu domínio IoT estiver conectado ao APEX, você poderá usar esse cenário se quiser consultar seus dados IoT usando IA. O usuário do banco de dados IoT já tem os privilégios e concessões de banco de dados necessários para usar o Select AI.

O cenário mostra um exemplo de script que cria um perfil Select AI, solicita um prompt de linguagem natural com DBMS_CLOUD_AI.GENERATE, mostra o SQL que Select AI gerou e, em seguida, você pode executar esse SQL em Comandos SQL do APEX.

Para obter mais conceitos, consulte Perguntas frequentes sobre seleção de IA no APEX.

Políticas Obrigatórias do IAM

Você precisa dessas permissões para ler dados IoT e usar a família de recursos de IA generativa.

Permite que um grupo de usuários leia um domínio IoT em um compartimento específico.
Allow group <your-group-name> to read <iot-domain> in compartment <compartment-name>
Permite que um grupo de usuários use a família de recursos do serviço Generative AI em um compartimento específico.
allow dynamic-group <your-group-name> to manage generative-ai-family in compartment <compartment-name>

Administradores: Se você for iniciante em políticas, para saber mais sobre como configurar políticas, consulte Como as Políticas do Serviço IAM Funcionam para o Oracle Cloud Infrastructure. Para obter exemplos específicos, consulte Detalhes da Política da Plataforma Internet of Things (IoT).

Fazer upload, personalizar e executar o Select AI Setup Script no APEX

  1. Copie este exemplo de script SQL e salve o trecho de código como um arquivo para upload, por exemplo: select_ai_apex_setup.sql
    O script cria um object_list para os objetos de esquema da IoT, incluindo RAW_DATA, HISTORIZED_DATA, SNAPSHOT_DATA, DIGITAL_TWIN_MODELS, DIGITAL_TWIN_INSTANCES e DIGITAL_TWIN_ADAPTERS.
    Exemplo de script 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. No APEX, selecione SQL Workshop e SQL Scripts.

  3. Selecione Upload para adicionar o arquivo select_ai_apex_setup.sql ao APEX.
  4. Selecione Editar para atualizar o script com variáveis para o seu ambiente.
    Substitua-os pelos valores do seu ambiente:
    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';
    Esse script usa o serviço GenAI que usa essas constantes e "provider": "oci". Se você quiser usar outro modelo, poderá atualizar esses valores no script. Consulte Configurar Selecionar IA para Usar Provedores de IA Suportados.
  5. Substitua o texto select e prompt pela pergunta que você deseja que a IA responda.

    Substitua o profile_name pelo perfil do AI no qual você deseja executar.

    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. Selecione Executar e, em seguida, Executar Agora.
  7. Selecione Exibir e, em seguida, Ir, role para baixo para revisar o SQL gerado com base na pergunta IoT no prompt.
  8. Copie o SQL Gerado, selecione SQL Workshop e SQL Commands.
  9. Cole o SQL gerado e selecione Executar para executar o SQL gerado.
  10. Para esse prompt, os Resultados mostram o OCID da instância gêmea digital, seu nome para exibição, a temperatura e os valores de umidade.
Advertência

Grandes modelos de linguagem (LLMs) foram treinados em um amplo conjunto de documentação e conteúdo de texto, geralmente da Internet. Como resultado, os LLMs podem ter incorporado padrões de conteúdo inválido ou malicioso, incluindo injeção de SQL. Os LLMs são hábeis em gerar conteúdo útil e relevante, eles também podem gerar informações incorretas e falsas, incluindo consultas SQL que produzem resultados imprecisos e/ou comprometem a segurança de seus dados.

As consultas geradas em seu nome pelo provedor de LLM especificado pelo usuário serão executadas em seu banco de dados. Seu uso deste recurso é por sua conta e risco e, não obstante quaisquer outros termos e condições relacionados aos serviços prestados pela Oracle, constitui sua aceitação desse risco e expressa a exclusão da responsabilidade ou responsabilidade da Oracle por quaisquer danos resultantes desse uso.

Exemplos de Consulta

Use esses exemplos como prompts iniciais em APEX SQL Commands ou SQLcl. No APEX, use o texto dentro das aspas como o valor prompt.

Encontre a telemetria mais recente de um dispositivo
'Show the most recent telemetry readings for device <device-id>';
Encontre a instância de HVAC mais quente
'Which HVAC instance and model has the highest temperature in the last 1 hour?';
Localizar erros recentes do dispositivo
'Which devices reported errors in the last 24 hours?';
Resuma a umidade por dispositivo
'Show average humidity by device for the last 7 days';
Encontre dispositivos sem telemetria hoje, identifique dispositivos que podem estar off-line ou configurados incorretamente
'List devices that have not sent telemetry today';
Resumir leituras de fábrica anormais
'Summarize abnormal readings for factory floor sensors this week';
Contar registros de dados históricos
'How many historized data records are in the IoT domain?';
Contar instâncias de gêmeos digitais historiadas
'How many digital twin instances are in historized data?';
Localize a instância de dados brutos mais movimentada
'What instance sent most of the raw data last day?';
Adaptadores de contagem no domínio
'How many adapters are in the domain?';
Contar instâncias no domínio
'How many instances are in the domain?';
Média de instâncias por modelo
'What is the average number of instances that implement one model?';
Verificar dados rejeitados
'Is there rejected data in the domain?';
Taxa de ingestão de dados brutos por hora
'What is the average raw data ingestion rate per hour last day, each hour?';
Tamanho da carga útil do registro bruto
'What is the average and max raw record payload size?';
Tamanho da carga útil do registro histórico
'What is the average and max historized record payload size?';
Tendência de temperatura por hora
'Show the average temperature by hour for the last day';
Agrupar erros de dispositivo por tipo
'Show devices with error events in the last 7 days grouped by error type';

Práticas Recomendadas

  • Use showsql primeiro para que você possa revisar a SQL gerada antes de ela ser executada.
  • Faça uma pergunta de IoT por vez.
  • Inclua o tipo de dispositivo, o nome da métrica, o URI de especificação do modelo ou o intervalo de tempo quando for importante.
  • Use nomes de perfil separados para modelos separados, por exemplo, OpenAI, GOOGLE_GEMINI ou CLAUDE.

Perguntas Frequentes

Por que o exemplo do APEX usa profile_name em vez de SET_PROFILE?
SET_PROFILE define o perfil da sessão atual do banco de dados com monitoramento de estado. O APEX e o Database Actions podem usar conexões sem monitoramento de estado; portanto, o padrão mais simples é passar profile_name diretamente para DBMS_CLOUD_AI.GENERATE.
Preciso de vários perfis?
Não. Use um perfil se desejar usar apenas um provedor e um modelo. Crie vários perfis somente quando quiser comparar ou alternar entre modelos, como Open AI, Gemini ou Claude.
Por que a OCI Generative AI e a Select AI mencionam diferentes listas de modelos?
Selecionar IA é o recurso do banco de dados. A lista de modelos depende do provedor no perfil Selecionar IA. A documentação do modelo-região do OCI Generative AI e do modelo importado se aplica quando o perfil usa "provider": "oci". Os modelos Gemini e Claude vêm do Google e Anthropic, não da lista de modelos de serviço da OCI Generative AI.
Como isso se relaciona com a IoT?
Os dados IoT são os dados do banco de dados que selecionam consultas de IA. O perfil Selecionar IA aponta para os objetos do esquema IoT, e o provedor/modelo transforma o prompt de linguagem natural em SQL.
Preciso adicionar permissões ou concessões de banco de dados para o usuário IoT?
Não. Para usar Selecionar IA, os privilégios e concessões de banco de dados necessários já foram atribuídos ao usuário do banco de dados IoT.

Diagnóstico e Solução de Problemas

A consulta não retorna linhas

Confirme se o dispositivo reportou dados para o intervalo de tempo solicitado. Tente ampliar o intervalo de tempo ou consultar um dispositivo ativo conhecido.

A consulta faz referência à coluna errada

Use palavras mais específicas no prompt. Inclua a métrica exata, o identificador do dispositivo ou o tipo de evento.

Permissão negada

Verifique se o usuário tem privilégios de banco de dados e as permissões do IAM do OCI para obter os recursos necessários.

Os resultados parecem incompletos

Verifique se a consulta é filtrada por compartimento, tenant, grupo de dispositivos, região ou intervalo de tempo.