Creación de un asistente de IA con OpenSearch y OCI Generative AI

Crea un asistente de IA con OpenSearch y OCI Generative AI para simplificar el análisis de datos.

En este tema se describe cómo crear su propio chatbot en OpenSearch mediante un agente conversacional. A veces, un modelo de lenguaje grande (LLM) no puede responder a una pregunta porque su base de conocimientos no contiene los datos propietarios necesarios. Aquí, puede que necesite un agente para proporcionar más información a un LLM en una llamada posterior. El agente conversacional puede ejecutar herramientas para acceder a más información desde orígenes de datos configurados y enviar la información adicional al LLM como contexto.

Requisitos

  • El arrendamiento debe estar suscrito a la región del Medio Oeste de EE. UU. (Chicago) o a la región del Centro de Alemania (Fráncfort). No necesita crear el cluster en ninguna de esas regiones, solo asegúrese de que el arrendamiento está suscrito a una de las regiones.
  • Para utilizar el kit de herramientas del asistente de AI con OpenSearch, necesita un cluster con la versión de imagen 2.15 o posterior de OpenSearch. Por defecto, los nuevos clusters están configurados para utilizar la versión 2.15. Para crear un cluster, consulte Creación de un cluster OpenSearch.

    Para los clusters existentes configurados para la versión 2.3 o la versión 2.11, puede realizar una actualización en línea a la versión 2.15. Para obtener más información, consulte OpenSearch Cluster Software Upgrades.

    Para actualizar los clusters existentes configurados para la versión 1.2.3 a 2.15, debe utilizar el proceso de cambio de versión descrito en Actualización manual de un cluster OpenSearch.

  • Cree una política para otorgar acceso a los recursos de IA generativa. El siguiente ejemplo de política incluye los permisos necesarios:
    ALLOW ANY-USER to manage generative-ai-family in tenancy WHERE ALL {request.principal.type='opensearchcluster', request.resource.compartment.id='<cluster_compartment_OCID>'}
    Para obtener información sobre la creación de una política, consulte Creación de una política.

    Si no está familiarizado con las políticas, consulte Introducción a las políticas y Políticas comunes.

  • Utilice la operación de configuración de las API de cluster para configurar los valores de cluster recomendados que le permiten crear un conector. El siguiente ejemplo incluye la configuración recomendada:

    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
          }
        }
      }
    }

    Respuesta de ejemplo:

    {
      "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": {}
    }

Creación del modelo de chat de IA generativa

Para utilizar el Asistente de IA generativa, debe crear un modelo de chat de IA generativa para interpretar las instrucciones del usuario y, a continuación, responder con la información solicitada. La creación de un modelo de IA generativa incluye los siguientes pasos:

  1. Registre el grupo de modelos.
  2. Cree el conector.
  3. Registrar el modelo.
  4. Desplegar el modelo.

Registrar el grupo de modelos

Registre un grupo de modelos mediante la operación register en las API de grupo de modelos, como se muestra en el siguiente ejemplo:

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

Anote el valor model_group_id devuelto en la respuesta:

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

Creación de un conector para la IA generativa

Necesita un conector para crear un modelo con IA generativa. Los comandos para crear el conector son específicos del modelo. Busque otros ejemplos en Create the Connector.

Nota

El servicio de IA generativa actualiza regularmente los modelos disponibles. Consulte Modelos básicos previamente entrenados en IA generativa para obtener información sobre los modelos de chat admitidos. El equipo de servicio de IA generativa normalmente envía notificaciones cuando están a punto de dejar de usar un modelo. Si utiliza el modelo On-DEMAND, siga esas notificaciones y actualice el modelo de agente según sea necesario para evitar interrupciones en el servicio de agente.

Cohere.command-r-plus-08-2024

En el siguiente ejemplo se muestra la configuración de un conector de creación con el 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"
    }
  ]
}

Sustituya <compartment_OCID> por el OCID del compartimento.

Anote el valor connector_id devuelto en la respuesta:

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

OpenAI Cargas útiles del conector del asistente de IA

En esta sección, se muestran los conectores y los agentes para las siguientes cargas útiles de conector de 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"""
    }
  ]
}

Registro del modelo

Registre el modelo como se muestra en el siguiente ejemplo:

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 el valor model_id devuelto en la respuesta:

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

Despliegue del modelo

Despliegue el modelo como se muestra en el siguiente ejemplo:

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

Se devuelve una respuesta similar a la siguiente:

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

Prueba del modelo

Opcionalmente, puede probar el modelo, como se muestra en el siguiente ejemplo:

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

Se devuelve una respuesta similar a la siguiente:

{
  "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
    }
  ]
}

Creación de un agente conversacional

Después de crear el modelo de IA generativa, puede utilizarlo para crear un agente conversacional. Este agente combina el modelo de IA generativa con herramientas especificadas por el usuario, lo que le permite interpretar el texto del usuario en invocaciones de herramientas, devolviendo su interpretación de los resultados al usuario. El modelo devuelve los resultados interpretados. Consulte Creación de su propio bot conversacional y Agentes y herramientas para obtener más información.

En este ejemplo se utiliza el índice opensearch_dashboards_sample_data_ecommerce incorporado, que puede agregar al cluster OpenSearch mediante el panel de control. En este ejemplo, al agente se le asignan PPLTool y CatIndexTool. PPLTool convierte las instrucciones de usuario en lenguaje de procesamiento por pipeline (PPL), que permite al agente ejecutar solicitudes en datos de índice. CatIndexTool permite al agente mostrar índices en el cluster. Esta herramienta es necesaria para cualquier asistente útil. Utilice la OpenSearch documentation en AI Agents para obtener información sobre la configuración de su propio caso de uso.

Seleccione los siguientes enlaces para obtener más información sobre estas funciones de 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)."
    }
  ]
}

Se devuelve una respuesta similar a la siguiente. Anote el valor agent_id devuelto.

{
  "agent_id": "<conversational_agent_ID>"
}

<genAI_model_ID>

Prueba del agente conversacional

Opcionalmente, puede probar el agente conversacional, como se muestra en el siguiente ejemplo:

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"]
    }
}

Se devuelve una respuesta similar a la siguiente:

{
  "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}"}"""]
          }
        }
      }]
    }]
}

Mientras que PPLTool rechaza originalmente la consulta debido a un formato de fecha incorrecto, el agente puede recibir esa respuesta y cambiar el formato de la consulta, lo que permite que la segunda llamada de la herramienta PPL se realice correctamente.

Creación de un agente de chatbot raíz en un panel de control OpenSearch

Después de crear el agente conversacional, cree el agente de chatbot y configúrelo como agente de chatbot raíz en el panel de control OpenSearch para el cluster. El agente de chatbot de este ejemplo utiliza el agente conversacional para interpretar y responder preguntas, y también utiliza MLModelTool para sugerir nuevas preguntas.

Creación del agente de chatbot

Cree el agente de chatbot, como se muestra en el siguiente ejemplo:

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"
  }
}

Se devuelve una respuesta similar a la siguiente. Anote el valor agent_id devuelto.

{
  "agent_id": "-i2m4pQBpfOUfebnxKAf"
}

Configurar el agente de chatbot raíz en el panel de control OpenSearch

Después de crear el agente de chatbot, puede configurar el agente como agente raíz en el panel de control OpenSearch, como se muestra en el siguiente ejemplo:

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

Se devuelve una respuesta similar a la siguiente:

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

Prueba del agente raíz

Puede probar el agente raíz haciendo las preguntas del asistente OpenSearch en el panel de control OpenSearch del cluster OpenSearch:

Captura de pantalla en la que se muestra a un usuario que hace preguntas en el panel de control de chatbot