Criando um Assistente de IA com OpenSearch e OCI Generative AI

Crie um assistente de IA com a OpenSearch e a OCI Generative AI para simplificar a análise de dados.

Este tópico descreve como criar seu próprio chatbot no OpenSearch usando um agente de conversação. Às vezes, um grande modelo de linguagem (LLM) não pode responder a uma pergunta porque sua base de conhecimento não contém os dados proprietários necessários. Aqui, você pode precisar de um agente para fornecer mais informações a um LLM em uma chamada posterior. O agente de conversação pode executar ferramentas para acessar mais informações de origens de dados configuradas e enviar as informações adicionais ao LLM como contexto.

Pré-requisitos

  • A tenancy deve estar inscrita na região Centro-Oeste dos EUA (Chicago) ou na região Central da Alemanha (Frankfurt). Não é necessário criar o cluster em nenhuma dessas regiões, apenas certifique-se de que a tenancy esteja inscrita em uma das regiões.
  • Para usar o kit de ferramentas do assistente do AI com o OpenSearch, você precisa de um cluster com a imagem OpenSearch versão 2.15 ou posterior. Por padrão, novos clusters são configurados para usar a versão 2.15. Para criar um cluster, consulte Criando um Cluster OpenSearch.

    Para clusters existentes configurados para a versão 2.3 ou 2.11, você pode executar um upgrade em linha para a versão 2.15. Para obter mais informações, consulte OpenSearch Cluster Software Upgrades.

    Para fazer upgrade de clusters existentes configurados para a versão 1.2.3 para 2.15, use o processo de upgrade descrito em Fazendo Upgrade Manual de um Cluster OpenSearch.

  • Crie uma política para conceder acesso a recursos do serviço Generative AI. O exemplo de política a seguir inclui as permissões necessárias:
    ALLOW ANY-USER to manage generative-ai-family in tenancy WHERE ALL {request.principal.type='opensearchcluster', request.resource.compartment.id='<cluster_compartment_OCID>'}
    Para obter informações sobre como criar uma política, consulte Criando uma Política.

    Se você não conhece as políticas, consulte Conceitos Básicos de Políticas e Políticas Comuns.

  • Use a operação configurações das APIs do Cluster para configurar as definições de cluster recomendadas que permitem criar um conector. O exemplo a seguir inclui as configurações recomendadas:

    PUT _cluster/settings
    {
      "persistent": {
        "plugins": {
          "ml_commons": {
            "only_run_on_ml_node": "false",
            "model_access_control_enabled": "true",
            "native_memory_threshold": "99",
            "rag_pipeline_feature_enabled": "true",
            "memory_feature_enabled": "true",
            "allow_registering_model_via_local_file": "true",
            "allow_registering_model_via_url": "true",
            "model_auto_redeploy.enable":"true",
            "model_auto_redeploy.lifetime_retry_times": 10
          }
        }
      }
    }

    Exemplo de resposta:

    {
      "acknowledged": true,
      "persistent": {
        "plugins": {
          "ml_commons": {
            "rag_pipeline_feature_enabled": "true",
            "memory_feature_enabled": "true",
            "only_run_on_ml_node": "false",
            "model_access_control_enabled": "true",
            "native_memory_threshold": "99",
            "allow_registering_model_via_local_file": "true",
            "model_auto_redeploy": {
              "lifetime_retry_times": "10",
              "enable": "true"
            },
            "allow_registering_model_via_url": "true"
          }
        }
      },
      "transient": {}
    }

Criando o Modelo de Chat de IA Generativa

Para usar o Assistente de IA Generativa, crie um modelo de chat de IA Generativa para interpretar as instruções do usuário e, em seguida, responder com as informações solicitadas. A criação de um modelo de IA Generativa inclui as seguintes etapas:

  1. Registre o grupo de modelos.
  2. Crie o conector.
  3. Registre o modelo.
  4. Implante o modelo.

Registrar o Grupo de Modelos

Registre um grupo de modelos usando a operação registrar nas APIs do Grupo de Modelos, conforme mostrado no seguinte exemplo:

POST /_plugins/_ml/model_groups/_register
{
    "name": "demo_model_group",
    "description": "This is a model group"
}

Anote o model_group_id retornado na resposta:

{
  "model_group_id": "<model_group_id>",
  "status": "CREATED"
}

Criando um Conector para IA Generativa

Você precisa de um conector para criar um modelo com a IA Generativa. Os comandos para criar o conector são específicos para o modelo. Localize outros exemplos em Criar o Conector.

Observação

O serviço de IA Generativa atualiza regularmente os modelos disponíveis. Verifique Modelos Básicos Pré-treinados no Serviço Generative AI para obter informações sobre os modelos de chat suportados. A equipe de serviço de IA generativa geralmente envia notificações quando está prestes a descontinuar um modelo. Se você estiver usando o modelo On-DEMAND, adote essas notificações e atualize seu modelo de agente conforme necessário para evitar interrupções no serviço do agente.

Cohere.command-r-plus-08-2024

O exemplo a seguir mostra a configuração de um conector de criação com o modelo de chat Cohere.command-r-plus-08-2024:

POST _plugins/_ml/connectors/_create
{
    "name": "Cohere Commndr-R-Plus Chat Connector",
    "description": "demo genai connector",
    "version": 2,
    "protocol": "oci_sigv1",
    "parameters": {
    "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
      "auth_type": "resource_principal"
    },
    "credential": {
    },
    "actions": [
      {
        "action_type": "predict",
        "method": "POST",
        "url": "https://${parameters.endpoint}/20231130/actions/chat",
        "request_body": "{\"compartmentId\":\"<compartment_OCID>\",\"servingMode\":{\"modelId\":\"cohere.command-r-plus-08-2024\",\"servingType\":\"ON_DEMAND\"},\"chatRequest\":{\"message\":\"${parameters.prompt}\",\"maxTokens\":600,\"temperature\":1,\"frequencyPenalty\":0,\"presencePenalty\":0,\"topP\":0.75,\"topK\":0,\"isStream\":false,\"chatHistory\":[],\"apiFormat\":\"COHERE\"}}",
        "post_process_function": "def text = params['chatResponse']['text'].replace('\n', '\\\\n').replace('\"','');\n return text"
    }
  ]
}

Substitua <compartment_OCID> pelo OCID do seu compartimento.

Anote o connector_id retornado na resposta:

{
  "connector_id": "<connector_ID>",
}

OpenAI Payloads do Conector do AI Assistant

Esta seção mostra os conectores e agentes para os seguintes payloads do conector do AI Assistant OpenAI:

40
POST _plugins/_ml/connectors/_create
{
     "name": "4o-agent-connector",
     "description": "OpenAI 4o connector for AI assistant",
     "version": 2,
     "protocol": "oci_sigv1",
     "parameters": {
         "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
         "auth_type": "resource_principal"
     },
     "credential": {
     },
     "actions": [
         {
             "action_type": "predict",
             "method": "POST",
             "url": "https://${parameters.endpoint}/20231130/actions/chat",
             "request_body": "{\"compartmentId\":\"<compartment_ocid>\",\"servingMode\":{\"modelId\":\"openai.gpt-4o\",\"servingType\":\"ON_DEMAND\"},\"chatRequest\":{\"maxCompletionTokens\":600,\"temperature\":0.5,\"frequencyPenalty\":0,\"presencePenalty\":0,\"topP\":1.0,\"isStream\":false,\"apiFormat\":\"GENERIC\",\"messages\":[{\"role\":\"USER\",\"content\":[{\"type\":\"TEXT\",\"text\":\"${parameters.prompt}\"}]}]}}",
              "post_process_function": "def text = params['chatResponse']['choices'][0]['message']['content'][0]['text'];\n return text"
         }
     ]
 } 
4o-mini
POST _plugins/_ml/connectors/_create
{
     "name": "4o-mini-agent-connector",
     "description": "OpenAI 4o-mini connector for AI Assistant",
     "version": 2,
     "protocol": "oci_sigv1",
     "parameters": {
         "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
         "auth_type": "resource_principal"
     },
     "credential": {
     },
     "actions": [
         {
             "action_type": "predict",
             "method": "POST",
             "url": "https://${parameters.endpoint}/20231130/actions/chat",
             "request_body": "{\"compartmentId\":\"<compartment_ocid>\",\"servingMode\":{\"modelId\":\"openai.gpt-4o-mini\",\"servingType\":\"ON_DEMAND\"},\"chatRequest\":{\"maxCompletionTokens\":600,\"temperature\":0.5,\"frequencyPenalty\":0,\"presencePenalty\":0,\"topP\":1.0,\"isStream\":false,\"apiFormat\":\"GENERIC\",\"messages\":[{\"role\":\"USER\",\"content\":[{\"type\":\"TEXT\",\"text\":\"${parameters.prompt}\"}]}]}}",
              "post_process_function": "def text = params['chatResponse']['choices'][0]['message']['content'][0]['text'];\n return text"
         }
     ]
 } 
o3-mini/o1
{
  "name": "agent-connector",
  "description": "OpenAI connector for AI Assitant",
  "version": "2",
  "protocol": "oci_sigv1",
  "parameters": {
    "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
    "auth_type": "resource_principal"
  },
  "actions": [
    {
      "action_type": "PREDICT",
      "method": "POST",
      "url": "https://${parameters.endpoint}/20231130/actions/chat",
      "request_body": """{"compartmentId":"<compartment_ocid>","servingMode":{"modelId":"<MODEL NAME>","servingType":"ON_DEMAND"},"chatRequest":{"isStream":false,"apiFormat":"GENERIC","reasoningEffort":"LOW","messages":[{"role":"USER","content":[{"type":"TEXT","text":"${parameters.prompt}"}]}]}}""",
      "post_process_function": """def text = params['chatResponse']['choices'][0]['message']['content'][0]['text'].replace('\n', '\\\n');\nreturn text"""
    }
  ]
}

Registrar o Modelo

Registre o modelo conforme mostrado no seguinte exemplo:

POST /_plugins/_ml/models/_register
{
  "name": "demo_genai_model",
  "function_name": "remote",
  "model_group_id": "<model_group_ID>",
  "description": "demo genai model",
  "connector_id": "<connector_ID>"
}

Anote o model_id retornado na resposta:

{
  "task_id": "<task_ID>",
  "status": "CREATED",
  "model_id": "<genAI_model_ID>"
}

Implantar o Modelo

Implante o modelo conforme mostrado no seguinte exemplo:

POST /_plugins/_ml/models/<genAI_model_ID>/_deploy

Uma resposta semelhante à seguinte é retornada:

{
  "task_id": "-C1m4pQBpfOUfebnTqCc",
  "task_type": "DEPLOY_MODEL",
  "status": "COMPLETED"
}

Testar o Modelo

Opcionalmente, você pode testar o modelo, conforme mostrado no seguinte exemplo:

POST /_plugins/_ml/models/<genAI_model_ID>/_predict
{
  "parameters": {
    "prompt": "\n\nHuman: how are you? \n\nAssistant:"
  }
}

Uma resposta semelhante à seguinte é retornada:

{
  "inference_results": [
    {
      "output": [
        {
          "name": "response",
          "dataAsMap": {
            "inferenceResponse": {
              "generatedTexts": [
                {
                  "text": "I'm an AI language model, so I don't have feelings or emotions as 
                  humans do. However, I'm functioning properly and ready to assist you with any questions 
                  or tasks you may have! How can I help you today?"
                }
              ]
            }
          }
        }
      ],
      "status_code": 200
    }
  ]
}

Criar um Agente de Conversação

Depois de criar o modelo de IA Generativa, você poderá usá-lo para criar um agente de conversação. Este agente combina o modelo de IA generativa com ferramentas especificadas pelo usuário, permitindo que ele interprete o texto do usuário em invocações de ferramentas, retornando sua interpretação dos resultados ao usuário. O modelo retorna os resultados interpretados. Consulte Crie seu próprio chatbot e Agentes e ferramentas para obter mais informações.

Este exemplo usa o índice opensearch_dashboards_sample_data_ecommerce incorporado, que você pode adicionar ao cluster OpenSearch por meio do Painel de Controle. Neste exemplo, o agente recebe um PPLTool e CatIndexTool. O PPLTool traduz as instruções do usuário para a Linguagem de Processamento Piped (PPL), que permite ao agente executar solicitações em dados de índice. O CatIndexTool permite que o agente liste índices no cluster. Esta ferramenta é necessária para qualquer assistente útil. Use a documentação OpenSearch em AI Agents para obter informações sobre como configurar seu próprio caso de uso.

Selecione os seguintes links para obter mais informações sobre esses recursos do OpenSearch:

POST _plugins/_ml/agents/_register
{
  "name": "Chat Agent with Llama",
  "type": "conversational",
  "description": "this is a test agent",
  "app_type": "os_chat",
  "llm": {
    "model_id": "<genAI_model_ID>",
    "parameters": {
      "max_iteration": 5,
      "message_history_limit": 5,
      "disable_trace": false
    }
  },
  "memory": {
    "type": "conversation_index"
  },
  "tools": [
    {
      "type": "PPLTool",
      "description": "Use this tool to transfer natural language to generate PPL and execute PPL to query inside. Use this tool after you know the index name, otherwise, call IndexRoutingTool first. The input parameters are: {index:IndexName, question:UserQuestion}.",
      "parameters": {
        "model_id": "<genAI_model_ID>",
        "model_type": "OPENAI",
        "execute": true
      },
      "include_output_in_agent_response": true
    },
    {
      "type": "CatIndexTool",
      "description": "Use this tool to get OpenSearch index information: (health, status, index, uuid, primary count, replica count, docs.count, docs.deleted, store.size, primary.store.size). \nIt takes 2 optional arguments named `index` which is a comma-delimited list of one or more indices to get information from (default is an empty list meaning all indices), and `local` which means whether to return information from the local node only instead of the cluster manager node (default is false)."
    }
  ]
}

Uma resposta semelhante à seguinte é retornada. Anote o agent_id retornado.

{
  "agent_id": "<conversational_agent_ID>"
}

<genAI_model_ID>

Testar o Agente de Conversação

Opcionalmente, você pode testar o agente de conversação, conforme mostrado no seguinte exemplo:

POST _plugins/_ml/agents/<conversational_agent_ID>/_execute
{
    "parameters": {
    "question": "Can you query with index opensearch_dashboards_sample_data_ecommerce to find out how many orders happened between 4 AM and 9 PM on 3/24/2025?",
    "verbose": false,
    "selected_tools": ["PPLTool", "CatIndexTool"]
    }
}

Uma resposta semelhante à seguinte é retornada:

{
  "inference_results": [
   {
     "output": [
     {
       "name": "memory_id",
       "result": "11lPppUBsqYDrOfXM-Uf"
     },
     {
       "name": "parent_interaction_id",  
       "result": "2FlPppUBsqYDrOfXM-Ur"
     },
     {
       "name": "response",
       "dataAsMap": 
       {
         "response": "The count of orders between 4 AM and 9 PM on 3/24/2025 is 102.",
         "additional_info": 
         {  
            "TransferQuestionToPPLAndExecuteTool.output": [
                "Failed to run the tool TransferQuestionToPPLAndExecuteTool with the error message execute ppl:source=opensearch_dashboards_sample_data_ecommerce | where type = 'order' AND order_date >= '2025-03-24T04:00:00+00:00' AND order_date < '2025-03-24T21:00:00+00:00' | stats COUNT() AS count, get error: timestamp:2025-03-24T04:00:00+00:00 in unsupported format, please use 'yyyy-MM-dd HH:mm:ss[.SSSSSSSSS]'.",
                """{"ppl":"source\u003dopensearch_dashboards_sample_data_ecommerce | where order_date \u003e\u003d \u00272025-03-24 04:00:00\u0027 AND order_date \u003c\u003d \u00272025-03-24 21:00:00\u0027 | stats COUNT() AS count","executionResult":"{\n  \"schema\": [\n    {\n      \"name\": \"count\",\n      \"type\": \"integer\"\n    }\n  ],\n  \"datarows\": [\n    [\n      102\n    ]\n  ],\n  \"total\": 1,\n  \"size\": 1\n}"}"""]
          }
        }
      }]
    }]
}

Embora o PPLTool rejeite originalmente a consulta por causa de um formato de data inadequado, o agente pode receber essa resposta e reformatar a consulta, permitindo que a segunda chamada da ferramenta PPL seja bem-sucedida.

Criar um Agente de Chatbot Raiz em um Painel de Controle OpenSearch

Depois de criar o agente de conversação, você cria o agente de chatbot e o configura como o agente de chatbot raiz no Painel de Controle OpenSearch do cluster. O agente de chatbot neste exemplo usa o agente de conversação para interpretar e responder perguntas e também usa o MLModelTool para sugerir novas perguntas.

Criar o Agente do Chatbot

Crie o agente de chatbot, conforme mostrado no seguinte exemplo:

POST /_plugins/_ml/agents/_register
{
  "name": "Chatbot agent",
  "type": "flow",
  "description": "this is a test chatbot agent",
  "tools": [
    {
      "type": "AgentTool",
      "name": "LLMResponseGenerator",
      "parameters": {
        "agent_id": "<conversational_agent_ID>" 
      },
      "include_output_in_agent_response": true
    }
  ],
  "memory": {
    "type": "conversation_index"
  }
}

Uma resposta semelhante à seguinte é retornada. Anote o agent_id retornado.

{
  "agent_id": "-i2m4pQBpfOUfebnxKAf"
}

Configurar o Agente de Chatbot Raiz no Painel de Controle OpenSearch

Depois de criar o agente de chatbot, você pode configurar o agente como o agente raiz no Painel de Controle OpenSearch, conforme mostrado no seguinte exemplo:

PUT .plugins-ml-config/_doc/os_chat
{
    "type":"os_chat_root_agent",
    "configuration":{
        "agent_id": "<root_conversational_agent_ID>"
    }
}

Uma resposta semelhante à seguinte é retornada:

{
  "_index": ".plugins-ml-config",
  "_id": "os_chat",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}

Testando o Agente Raiz

Você pode testar o agente raiz fazendo as perguntas do Assistente OpenSearch no Painel de Controle OpenSearch do cluster OpenSearch:

Captura de tela mostrando um usuário fazendo perguntas no painel do chatbot