Generar SQL a partir de peticiones de datos de lenguaje natural mediante Select AI

Autonomous AI Database on Dedicated Exadata Infrastructure Select AI te permite consultar tus datos con lenguaje natural.

La función Select AI permite a Autonomous AI Database utilizar IA generativa con grandes modelos de lenguaje (LLM) para convertir el texto de entrada del usuario en Oracle SQL. Seleccione AI procesa la petición de datos en lenguaje natural, complementa la petición de datos con metadatos y, a continuación, genera y ejecuta una consulta SQL.

Acerca de Select AI

Utiliza el lenguaje natural para interactuar con tu base de datos y LLM a través de SQL para mejorar la productividad del usuario y desarrollar aplicaciones basadas en IA. Select AI simplifica y automatiza el uso de la IA generativa, ya sea generando, ejecutando y explicando SQL a partir de una petición de datos en lenguaje natural, utilizando la generación aumentada de recuperación con almacenes vectoriales, generando datos sintéticos o chateando con el LLM.

Al utilizar Select AI, Autonomous AI Database gestiona el proceso de conversión del lenguaje natural en SQL. Esto significa que puede proporcionar una petición de datos en lenguaje natural en lugar de código SQL para interactuar con los datos. Select AI sirve como una herramienta de productividad para los usuarios y desarrolladores de SQL y permite a los usuarios de SQL no expertos obtener información útil de sus datos, sin tener que comprender estructuras de datos o lenguajes técnicos.

Select AI también automatiza el proceso de generación aumentada de recuperación (RAG) desde la generación de incrustaciones vectoriales hasta la recuperación de contenido relevante basado en su petición de datos a través de la búsqueda de similitud semántica utilizando su almacén de vectores. Otras funciones incluyen la generación de datos sintéticos, el soporte del historial de chat para conversaciones y otras funciones, todo desde una interfaz SQL.

El paquete DBMS_CLOUD_AI permite la integración con un LLM especificado por el usuario para generar código SQL mediante peticiones de datos en lenguaje natural. Para la generación de lenguaje natural a SQL, este paquete proporciona una petición de datos aumentada al LLM que contiene los metadatos de esquema de base de datos relevantes. Esto permite generar, ejecutar y explicar consultas SQL basadas en peticiones de datos en lenguaje natural. También facilita la recuperación de la generación aumentada utilizando almacenes vectoriales, la generación de datos sintéticos y permite chatear con el LLM. El paquete DBMS_CLOUD_AI funciona con los proveedores de IA que se muestran en Seleccionar su proveedor de IA y LLM.

Nota:

Plataformas soportadas

Select AI está soportado en Autonomous AI Database Serverless y Autonomous AI Database en una infraestructura de Exadata dedicada y en la nube en los clientes.

Terminología relacionada

Es importante comprender los diversos términos utilizados con Select AI antes de usarlo.

A continuación, se muestran los términos relacionados con la función Seleccionar IA:

Término Definición
Conversaciones Las conversaciones en Select AI representan un intercambio interactivo entre el usuario y el sistema, lo que permite a los usuarios consultar o interactuar con la base de datos a través de una serie de peticiones de datos en lenguaje natural. Select AI incorpora conversaciones a corto plazo basadas en sesiones para generar respuestas adaptadas al contexto para la petición de datos actual en función de interacciones anteriores. Se incorporan hasta 10 peticiones de datos anteriores a la solicitud actual con conversaciones a corto plazo, lo que crea una petición de datos aumentada que se envía al LLM. Select AI admite el uso de conversaciones personalizables a largo plazo, lo que le permite usar Select AI con diferentes temas sin mezclar contexto, que se puede configurar mediante API de conversación desde el paquete DBMS_CLOUD_AI. Consulte Uso y Personalización de Conversaciones para obtener más información.
Credencial de Base de Datos Las credenciales de base de datos son credenciales de autenticación que se utilizan para acceder e interactuar con las bases de datos. Normalmente consisten en un nombre de usuario y una contraseña, a veces complementados por factores de autenticación adicionales como tokens de seguridad. Estas credenciales se utilizan para establecer una conexión segura entre una aplicación o un usuario y una base de datos, lo que garantiza que solo las personas o sistemas autorizados puedan acceder y manipular los datos almacenados en la base de datos.
Alucinación en LLM La alucinación en el contexto de los grandes modelos de lenguaje se refiere a un fenómeno en el que el modelo genera texto que es incorrecto, sin sentido o no relacionado con la petición de datos de entrada. A pesar de ser el resultado del intento del modelo de generar texto coherente, estas instancias pueden contener información que es fabricada, engañosa o puramente imaginativa. La alucinación puede ocurrir debido a sesgos en los datos de entrenamiento, falta de comprensión adecuada del contexto o limitaciones en el proceso de entrenamiento del modelo.
IAM Oracle Cloud Infrastructure Identity and Access Management (IAM) le permite controlar quién tiene acceso a sus recursos en la nube. Puede controlar qué tipo de acceso tiene un grupo de usuarios y a qué recursos específicos. Para obtener más información, consulte Visión general de Identity and Access Management.
Refinación iterativa

El refinamiento iterativo es un proceso de mejorar gradualmente una solución o un modelo a través de ciclos repetidos de ajustes basados en la retroalimentación o evaluación. Comienza con una aproximación inicial, la refina paso a paso y continúa hasta que se logra la precisión o el resultado deseado. Cada iteración se basa en la anterior, incorporando correcciones u optimizaciones para acercarse al objetivo.

En la generación de resúmenes de texto, la acotación iterativa puede ser útil para procesar archivos o documentos grandes. El proceso divide el texto en fragmentos de tamaño manejable, por ejemplo, que se ajustan a los límites de token de un LLM, genera un resumen para un fragmento y, a continuación, mejora el resumen mediante la incorporación secuencial de los siguientes fragmentos.

Casos de uso para la acotación iterativa:

  • Se adapta mejor a situaciones donde la precisión contextual y la coherencia son críticas, como cuando se resumen textos complejos o altamente interconectados donde cada parte se basa en el anterior.
  • Ideal para tareas de menor escala donde el procesamiento secuencial es aceptable.

Consulte Técnicas de resumen.

MapReduce

En general, el modelo de programación MapReduce permite procesar datos de gran volumen dividiendo las tareas en dos fases: Map y Reduce.

  • Mapa: procesa los datos de entrada y los transforma en pares clave-valor.
  • Reduce: agrega y resume los datos asignados en función de las claves. MapReduce realiza el procesamiento paralelo de grandes juegos de datos.

En el caso de Select AI Summarize, MapReduce divide el texto en varios fragmentos y los procesa en paralelo e independientemente, generando resúmenes individuales para cada fragmento. A continuación, estos resúmenes se combinan para formar un resumen global coherente.

Los casos de uso para la asignación reducen:

  • Ideal para tareas paralelas a gran escala donde la velocidad y la escalabilidad son prioridades, como resumir conjuntos de datos o documentos muy grandes.
  • Ideal para situaciones en las que la independencia de fragmentos es aceptable y los resúmenes se pueden agregar más tarde.

Consulte Técnicas de resumen.

Metadatos

Los metadatos son datos que describen los datos. En el caso de Select AI, los metadatos son metadatos de base de datos, que hacen referencia a los datos que describen la estructura, la organización y las propiedades de las tablas y vistas de base de datos.

Para las tablas y vistas de la base de datos, los metadatos incluyen nombres y tipos de columnas, restricciones y claves, definiciones de vistas, relaciones, linaje, indicadores de calidad y frescura, clasificaciones de seguridad y políticas de acceso. Los metadatos bien gestionados permiten la capacidad de detección, el uso correcto, el ajuste del rendimiento y la conformidad. Seleccione AI aumenta las peticiones de datos NL2SQL con metadatos de tabla que incluyen la definición de tabla (nombre de tabla, nombres de columnas y sus tipos de dato), y, opcionalmente, comentarios, anotaciones y restricciones de tabla y columna.

Enriquecimiento de metadatos

Práctica de aumentar los esquemas de la base de datos con descripciones, comentarios y anotaciones de alta calidad para que un LLM pueda comprender mejor la intención de las tablas y columnas, aclarar el significado empresarial y generar SQL más preciso. Convierte los nombres de tablas o columnas con hardware dedicado en activos bien documentados con intenciones, relaciones y restricciones claras.

Información del candidato para incluir:

  • Descripciones de tablas y columnas: finalidad, definiciones de negocio, unidades y rangos de valores permitidos
  • Claves y relaciones: claves primarias/extranjeras, rutas de acceso de unión
  • Semántica de datos: granularidad de tiempo, dimensiones que cambian lentamente, reglas de desduplicación
  • Restricciones y calidad: nulidad, unicidad, reglas de validación, frescura de datos
  • Sinónimos y alias: términos de negocio comunes que se asignan a nombres técnicos
  • Ejemplos y patrones: valores de ejemplo, filtros comunes o agregaciones

Consulte Visión general del enriquecimiento de IA para obtener más información sobre la adición de dichos metadatos mediante Oracle SQL Developer for VS Code a través de Visual Studio Code.

Peticiones de datos de lenguaje natural Las peticiones de datos de lenguaje natural son instrucciones o solicitudes legibles por humanos que se proporcionan para guiar los modelos de IA generativa, como los modelos de lenguaje grande. En lugar de utilizar lenguajes de programación o comandos específicos, los usuarios pueden interactuar con estos modelos introduciendo peticiones de datos en una forma de lenguaje más conversacional o natural. A continuación, los modelos generan una salida basada en la petición de datos proporcionada.
Lista de control de acceso de red (ACL) Una lista de control de acceso de red es un conjunto de reglas o permisos que definen qué tráfico de red puede pasar a través de un dispositivo de red, como un enrutador, un firewall o una puerta de enlace. Las ACL se utilizan para controlar y filtrar el tráfico entrante y saliente en función de diversos criterios, como direcciones IP, números de puerto y protocolos. Desempeñan un papel crucial en la seguridad de la red al permitir a los administradores gestionar y restringir el tráfico de red para evitar el acceso no autorizado, posibles ataques y violaciones de datos.
Búsqueda de similitud La búsqueda de similitud identifica y recupera puntos de datos que coinciden estrechamente con una consulta determinada mediante la comparación de vectores de funciones en un almacén de vectores.
Distancias vectoriales Las distancias vectoriales miden la similitud o disimilitud entre los vectores de características calculando la distancia entre ellos en un espacio multidimensional.
Índice de vector Un índice vectorial organiza y almacena vectores de características para permitir una búsqueda de similitud eficiente y la recuperación de datos relacionados.
Almacén de vectores Un almacén de vectores incluye sistemas que almacenan, gestionan y permiten la búsqueda de similitud semántica con incrustaciones vectoriales. Esto incluye bases de datos vectoriales independientes y Oracle Database 23ai AI Vector Search.

Seleccionar casos de uso de IA

Select AI mejora la interacción de datos y permite a los desarrolladores crear aplicaciones basadas en IA directamente desde SQL, transformando peticiones de datos en lenguaje natural en consultas SQL y respuestas de texto, soportando la interacción de chat con LLM, mejorando la precisión de las respuestas con los datos actuales mediante RAG y generando datos sintéticos.

Entre los casos de uso se incluyen:

Instrucciones de uso

Proporciona directrices de uso que garantizan un uso eficaz y adecuado de las peticiones de datos en lenguaje natural para la generación de SQL a fin de garantizar una experiencia de usuario mejorada.

Uso previsto

Esta función está destinada a la generación y ejecución de consultas SQL derivadas de peticiones de datos en lenguaje natural proporcionadas por el usuario. Automatiza lo que un usuario podría hacer manualmente en función de los metadatos de su esquema en combinación con un modelo de lenguaje grande (LLM) de su elección.

Aunque se puede proporcionar cualquier petición de datos, incluidas las que no están relacionadas con la producción de resultados de consultas SQL, Select AI se centra en la generación de consultas SQL. Seleccione AI para enviar solicitudes generales con la acción chat.

Datos de aumento de petición de datos

La base de datos aumenta la petición de datos especificada por el usuario con metadatos de base de datos para mitigar las alucinaciones desde el LLM. La petición de datos aumentada se envía al LLM especificado por el usuario para producir la consulta.

La base de datos aumenta la petición de datos solo con metadatos de esquema. Estos metadatos pueden incluir definiciones de esquema, comentarios de tabla y columna y contenido disponible en el catálogo y el diccionario de datos. Para la generación de SQL, la base de datos no proporciona contenido de tabla o vista (valores reales de fila o columna) al aumentar la petición de datos.

Sin embargo, la acción narrate proporciona el resultado de la consulta, que puede contener datos de base de datos, al LLM especificado por el usuario a partir del cual se genera texto en lenguaje natural que describe los resultados de la consulta.

ADVERTENCIA: los grandes modelos de lenguaje (LLM) se han entrenado en un amplio conjunto de documentación y contenido de texto, normalmente desde Internet. Como resultado, los LLM pueden haber incorporado patrones de contenido no válido o malicioso, incluida la inyección SQL. Por lo tanto, mientras que los LLM son expertos en generar contenido útil y relevante, también pueden generar información incorrecta y falsa, incluidas consultas SQL que producen resultados inexactos y / o comprometen la seguridad de sus datos. Las consultas generadas en su nombre por el proveedor de LLM especificado por el usuario se ejecutarán en la base de datos. El uso que Vd. haga de esta función será a su propio riesgo e, independientemente de cualesquiera otros términos y condiciones relacionados con los Servicios prestados por Oracle, constituirá su aceptación de dicho riesgo y exclusión expresa de la responsabilidad de Oracle por cualesquiera daños resultantes del uso de esta función.

Seleccione su proveedor de IA y LLM

Elige un proveedor de IA y un LLM que cumpla con tus estándares de seguridad y se ajuste a tus necesidades específicas, como la generación de texto o código.

Los diferentes LLM sobresalen en varias tareas en función de sus datos de entrenamiento y el propósito previsto. Algunos modelos son excelentes para la generación de texto, pero pueden no funcionar bien en la generación de código, mientras que otros están específicamente optimizados para tareas de codificación. Elija un LLM que mejor se adapte a sus necesidades.

Proveedor de IA LLM Modelo de inserción para RAG Finalidad
OCI Generative AI
  • meta.llama-3.3-70b-instruct (predeterminado)
  • meta.llama-3.2-90b-vision-instruct
  • meta.llama-3.2-11b-instrucción de visión
  • meta.llama-3.1-70b-instruct
  • meta.llama-3.1-405b-instruct
  • cohere.command-r-08-2024
  • cohere.command-r-plus-08-2024
  • cohere.command-r-16k (en desuso)
  • cohere.command-r-plus (en desuso)
  • xai.grok-3
  • xai.grok-3-rápido

Consulte:

  • cohere.embed-english-v3.0 (predeterminado)
  • cohere.embed-multilingual-v3.0
  • cohere.embed-english-light-v3.0
  • cohere.embed-multilingual-light-v3.0

Consulte Acerca de la incorporación de modelos en la IA generativa.

Los modelos de chat de OCI Generative AI están soportados para todas las acciones SELECT AI, como runsql, showsql, explainsql, narrate y chat.

Los modelos de texto Generar de OCI solo están soportados para la acción SELECT AI chat.

Para configurar los atributos de perfil, consulte Atributos de perfil.

Servicio OpenAI de Azure

  • GPT-4o
  • GPT-4
  • GPT-4 Turbo con Visión
  • GPT-3.5-Turbo

texto-embedding-ada-002 Se adapta mejor a la generación de SQL a partir de peticiones de datos en lenguaje natural, la acción chat y Select AI RAG.
OpenAI

  • gpt-3.5-turbo (predeterminado)
  • gpt-4o
  • gpt-4o-mini
  • gpt-4
  • gpt-4-0613
  • gpt-4-32k
  • gpt-4-32k-0613
  • gpt-3.5-turbo-0613
  • gpt-3.5-turbo-16k
  • gpt-3.5-turbo-16k-0613

texto-embedding-ada-002 Se adapta mejor a la generación de SQL a partir de peticiones de datos en lenguaje natural, la acción chat y Select AI RAG.
Compatible con OpenAI

Modelos de proveedores compatibles con OpenAI, como:

  • Fireworks AI
  • xAI
  • Otros

Incorporación de modelos de proveedores compatibles con OpenAI. Por ejemplo, consulte Modelos de incrustación de Fireworks AI. Admite una amplia gama de casos de uso.
Cohere

  • comando (predeterminado)
  • comando-noche (experimental)
  • comando-r
  • comando-r-plus
  • luz de comandos
  • comando-luz-noche (experimental)
  • modelos personalizados

embebido-español-v2.0 Más adecuado para la acción chat.
Google

  • gemini-1.5-flash (predeterminado)
  • gemini-1.5-pro
  • gemini-1.0-pro

text-embedding-004 (por defecto) Se adapta mejor a la generación de SQL a partir de peticiones de datos en lenguaje natural, la acción chat y Select AI RAG.
Antropología

  • claude-3-5-sonnet-20240620 (valor por defecto)
  • claude-3-opus-20240229
  • claude-3-sonnet-20240229
  • claude-3-haiku-20240307

NA Se adapta mejor a la generación de SQL a partir de peticiones de datos en lenguaje natural, la acción chat y Select AI RAG.
Hugging Face

  • Mixtral-8x7B-Instruct-v0.1 (predeterminado)
  • Meta-Llama-3-70B-Instruct
  • Qwen1.5-1.8B
  • otras modelos de chat

NA Se adapta mejor a la generación de SQL a partir de peticiones de datos en lenguaje natural, la acción chat y Select AI RAG.
AWS

  • amazon.titan-embed-text-v1
  • amazon.titan-embed-text-v2:0
  • cohere.embed-english-v3
Admite una amplia gama de casos de uso.

Nota:

Configuración de perfiles de IA mediante DBMS_CLOUD_AI

La base de datos de IA autónoma utiliza perfiles de IA para facilitar y configurar el acceso a un LLM y para configurar la generación, ejecución y explicación de SQL en función de peticiones de datos en lenguaje natural. También facilita la recuperación de la generación aumentada utilizando modelos de incrustación e índices vectoriales y permite chatear con el LLM.

Los perfiles de AI incluyen objetos de base de datos que son el destino de las consultas en lenguaje natural. Los metadatos utilizados desde estos destinos pueden incluir nombres de tabla de base de datos, nombres de columna, tipos de dato de columna y comentarios. Los perfiles AI se crean y configuran mediante los procedimientos DBMS_CLOUD_AI.CREATE_PROFILE y DBMS_CLOUD_AI.SET_PROFILE.

Requisitos para DBMS_CLOUD_AI

Para ejecutar DBMS_CLOUD_AI, es necesario lo siguiente:

Para configurar DBMS_CLOUD_AI:

  1. Otorgue el privilegio EXECUTE en el paquete DBMS_CLOUD_AI al usuario que desea utilizar Select AI.

    Por defecto, solo se otorga el privilegio EXECUTE al usuario ADMIN. El usuario ADMIN puede otorgar el privilegio EXECUTE a otros usuarios.

    En el siguiente ejemplo, se otorga el privilegio EXECUTE a ADB_USER:

     grant execute on DBMS_CLOUD_AI to ADB_USER;
    

    En el siguiente ejemplo, se otorga a ADB_USER el privilegio para utilizar el punto final api.openai.com.

     BEGIN
         DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
              host => 'api.openai.com',
              ace  => xs$ace_type(privilege_list => xs$name_list('http'),
                                  principal_name => 'ADB_USER',
                                  principal_type => xs_acl.ptype_db)
        );
     END;
     /
    
  2. Otorgue acceso de ACL de red al usuario que desea utilizar Select AI y para el punto final del proveedor de AI.

    El usuario ADMIN puede otorgar acceso a la ACL de red. Consulte APPEND_HOST_ACE Procedure en Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 26ai PL/SQL Packages and Types Reference para obtener más información.

  3. Cree una credencial para permitir el acceso a su proveedor de IA.

    Consulte Procedimiento CREATE_CREDENTIAL para obtener más información.

    A continuación, se muestra un ejemplo de cómo crear una credencial para activar el acceso a OpenAI.

     EXEC DBMS_CLOUD.CREATE_CREDENTIAL('OPENAI_CRED', 'OPENAI', '*your_api_token`');
    

Parámetros de función APPEND_HOST_ACE

parámetro Descripción
host

El host, que puede ser el nombre o la dirección IP del host. Puede utilizar un comodín para especificar un dominio o una subred IP. El nombre de host o dominio no distingue entre mayúsculas y minúsculas.

Para OpenAI, utilice api.openai.com.

Para Cohere, utiliza api.cohere.ai.

Para Azure OpenAI Service, utilice <nombre_recurso_azure>.openai.azure.com. Consulte Atributos de perfil para obtener más información sobre azure_resource_name.

Para Google, utilice generativelanguage.googleapis.com.

Para usar Anthropic, usa api.anthropic.com.

Para Hugging Face, use api-inference.huggingface.co.

ace Las entradas de control de acceso (ACE). El tipo XS$ACE_TYPE se proporciona para crear cada entrada ACE para la ACL.

Para obtener más información, consulte Creación de ACL y ACE en Oracle Database 19c Real Application Security Administrator's and Developer's Guide u Oracle Database 26ai Real Application Security Administrator's and Developer's Guide.

Parámetros DBMS_CLOUD.CREATE_CREDENTIAL

parámetro Descripción
credential_name Nombre de la credencial que se va a almacenar. El parámetro credential_name debe cumplir las convenciones de nomenclatura de objetos de Oracle, que no permiten espacios ni guiones.
username

Los argumentos username y password juntos especifican las credenciales del proveedor de AI.

username es un nombre de usuario especificado por el usuario.

password

Los argumentos username y password juntos especifican las credenciales del proveedor de AI.

password es la clave de API secreta de tu proveedor de IA, y depende del proveedor, es decir, OpenAI, Cohere, Azure OpenAI Service, OCI, Google, Anthropic o Hugging Face. Consulte para obtener detalles.

Crear y definir un perfil de AI

Describe los pasos para crear y activar un perfil de AI.

Utilice DBMS_CLOUD_AI.CREATE_PROFILE para crear un perfil de AI. A continuación, inicie DBMS_CLOUD_AI.SET_PROFILE para activar el perfil AI para que pueda utilizar SELECT AI con un indicador de lenguaje natural.

Nota: Debe ejecutar DBMS_CLOUD_AI.SET_PROFILE en cada nueva sesión de base de datos (conexión) antes de utilizar SELECT AI.

En el siguiente ejemplo con el proveedor de OpenAI, se crea un perfil AI denominado OPENAI y se define el perfil OPENAI para la sesión de usuario actual.

-- Create AI profile
--
SQL> BEGIN
  DBMS_CLOUD_AI.create_profile(
      'OPENAI',
      '{"provider": "openai",
        "credential_name": "OPENAI_CRED",
        "object_list": [{"owner": "SH", "name": "customers"},
                        {"owner": "SH", "name": "sales"},
                        {"owner": "SH", "name": "products"},
                        {"owner": "SH", "name": "countries"}]
       }');
END;
/
--
-- Enable AI profile in current session
--
EXEC DBMS_CLOUD_AI.set_profile('OPENAI');

Usar palabra clave de IA para introducir peticiones de datos

Utilice AI como palabra clave en una sentencia SELECT para interactuar con la base de datos mediante peticiones de datos en lenguaje natural.

La palabra clave AI en una sentencia SELECT indica al motor de ejecución SQL que utilice el LLM identificado en el perfil de AI activo para procesar el lenguaje natural y generar SQL.

Puede utilizar la palabra clave AI en una consulta con clientes de Oracle, como SQL Developer, OML Notebooks y herramientas de terceros, para interactuar con la base de datos en lenguaje natural.

Nota: No puede ejecutar sentencias PL/SQL, sentencias DDL ni sentencias DML mediante la palabra clave AI.

Sintaxis

La sintaxis para ejecutar el indicador AI es:

SELECT AI `action` `natural_language_prompt`

Parámetros

A continuación se muestran los parámetros disponibles para el parámetro action:

parámetro Descripción
runsql Ejecute el comando SQL proporcionado mediante un símbolo del sistema en lenguaje natural. Esta es la acción por defecto y es opcional especificar este parámetro.
showsql Muestra la sentencia SQL para una petición de datos en lenguaje natural.
narrate La salida de la petición de datos se explica en lenguaje natural. Esta opción envía el resultado SQL al proveedor de AI para producir un resumen de lenguaje natural.
chat Genera una respuesta directamente desde el LLM según la petición de datos. Si conversation en la función DBMS_CLOUD_AI.CREATE_PROFILE se define en true, esta opción incluye contenido de interacciones o peticiones de datos anteriores, lo que podría incluir metadatos de esquema.
explainsql El SQL generado desde la petición de datos se explica en lenguaje natural. Esta opción envía el SQL generado al proveedor de AI para producir una explicación en lenguaje natural.

Notas de uso

Uso y personalización de conversaciones

Las conversaciones en Select AI hacen referencia al diálogo interactivo entre el usuario y el sistema, donde se almacena y se gestiona una secuencia de peticiones de datos de lenguaje natural proporcionadas por el usuario para admitir la memoria a largo plazo para las interacciones de LLM.

Select AI admite conversaciones basadas en sesiones a corto plazo, que se activan en el perfil de IA, así como conversaciones con nombre a largo plazo, que se activan mediante procedimientos o funciones específicos e ID de conversación.

Nota: El soporte para conversaciones de selección de IA está disponible en Oracle Database 19c a partir de la versión 19.30 y en Oracle Database 26ai a partir de la versión 23.26.1.

Tipos de Conversaciones

Select AI admite conversaciones a corto plazo basadas en sesiones y conversaciones personalizables.

Conversaciones a corto plazo basadas en sesiones: la selección de IA incluye conversaciones a corto plazo basadas en sesiones para generar respuestas conscientes del contexto para la petición de datos actual en función de interacciones anteriores.

Puede activarla definiendo el atributo conversation en true|false en su perfil AI. A diferencia de la función de varias conversaciones, las conversaciones basadas en sesiones almacenan mensajes solo durante la sesión. Las peticiones de datos se almacenan en una tabla temporal, se borran automáticamente cuando finaliza la sesión y no se pueden volver a utilizar ni cambiar entre conversaciones.

Conversaciones personalizables a largo plazo: la opción Seleccionar IA soporta la creación y el uso de conversaciones personalizables, lo que le permite utilizar la opción Seleccionar IA con diferentes temas sin mezclar contexto, lo que mejora la flexibilidad y la eficiencia. Puede crear, definir, suprimir y actualizar conversaciones mediante las funciones y los procedimientos de conversación DBMS_CLOUD_AI. Al activar conversaciones, Select AI recupera el historial de peticiones de datos y los envía al LLM para generar una respuesta para la petición de datos actual. Estas respuestas se almacenan en una tabla persistente para su uso futuro.

Nota: Las conversaciones de AI seleccionadas soportan las siguientes acciones: runsql, showsql, explainsql, narrate y chat.

Cómo utilizar conversaciones personalizables

Puede utilizar Select AI para conversaciones personalizables de las siguientes formas:

Nota: Si utiliza varias conversaciones y el valor conversation: [true|false], el sistema ignora el valor conversation.

En el contexto de la generación de consultas SQL (NL2SQL), las conversaciones permiten una forma más intuitiva y accesible de trabajar con los datos, lo que facilita a los usuarios la extracción de estadísticas y la realización de tareas sin necesidad de un profundo conocimiento técnico de SQL. Las conversaciones también se pueden utilizar con las capacidades de chat y RAG de Select AI.

Por ejemplo, las conversaciones proporcionan una forma intuitiva de analizar datos:

Para activar conversaciones, consulte Ejemplo: activación de conversaciones en Seleccionar IA para obtener un ejemplo completo.

Conversaciones Basadas en Sesión frente a Conversaciones Personalizables

La siguiente tabla compara la conversación basada en sesión y las conversaciones personalizables en Seleccionar IA:

Preguntas Conversaciones a corto plazo basadas en sesiones Conversaciones a largo plazo personalizables
¿Cuándo debo utilizar? Lo mejor para los chats rápidos y temporales en los que desea que el modelo recuerde las preguntas y respuestas recientes durante una sola sesión. Es útil cuando no necesita guardar o reutilizar la conversación más adelante. Diseñado para conversaciones más largas o continuas que pueden abarcar varias sesiones. Es útil cuando se desea realizar un seguimiento, revisar o gestionar el historial de conversaciones, o cuando diferentes partes de una aplicación necesitan acceder al mismo contexto de conversación a lo largo del tiempo.
¿Cómo se activa? Defina {"conversation": true or false} en su perfil de AI. Utilice el procedimiento DBMS_CLOUD_AI.SET_CONVERSATION_ID o el procedimiento DBMS_CLOUD_AI.GENERATE
¿Cuántas conversaciones se permiten? Uno.

Puede crear varias conversaciones.

Si especifica de forma explícita las Id. de conversación, puede alternar entre ellas para asociar campos a las conversaciones adecuadas según sea necesario.

¿Dónde se almacenan las peticiones de datos y durante cuánto tiempo? Las peticiones de datos se almacenan en una tabla temporal y se borran cuando finaliza la sesión.

Las peticiones se almacenan en una tabla permanente.

Las peticiones de datos se mantienen en la base de datos durante el número de días especificado por el parámetro retention_days en el procedimiento DBMS_CLOUD_AI.CREATE_CONVERSATION. Después del período de retención, la conversación y sus campos se eliminan automáticamente. También puede suprimir peticiones de datos manualmente mediante el procedimiento DBMS_CLOUD_AI.DELETE_CONVERSATION_PROMPT.

¿Cuántas peticiones de datos se almacenan y cuántas peticiones de datos se envían al LLM? Se almacenan y envían al LLM un máximo de 10 peticiones de datos. No puede personalizar este límite.

Se almacenan todas las peticiones de datos.

De manera predeterminada, el sistema envía las 10 peticiones de datos más recientes al LLM. Puede personalizar esto mediante el parámetro conversation_length. Consulte Atributos de CREATE_CONVERSATION.

¿Puedo eliminar peticiones de datos individuales? No, no puede suprimir una petición de datos individual manualmente. Puede eliminar peticiones de datos individuales específicas mediante el ID de petición de datos especificado en la vista USER_CLOUD_AI_CONVERSATION_PROMPTS y mediante el procedimiento DBMS_CLOUD_AI.DELETE_CONVERSATION_PROMPT.
¿Se utilizan los perfiles de IA para la recuperación de conversaciones? Sí, Select AI recupera peticiones de datos y respuestas generadas previamente con el mismo perfil de AI. No, Select AI realiza un seguimiento del perfil de AI utilizado al almacenar peticiones de datos y respuestas, pero no restringe su recuperación en función de ese perfil. Envía todos los historiales de conversaciones al LLM para guiar la generación de respuestas, independientemente del perfil utilizado para generarlas.
¿Dónde puedo comprobar el historial de peticiones de datos? Las peticiones de datos se guardan en una tabla temporal en CLOUD USER, pero no se puede acceder a ellas para realizar consultas. Puede consultar y revisar conversaciones y peticiones de datos a través de las vistas de conversación DBMS_CLOUD_AI. Consulte Vistas DBMS_CLOUD_AI para obtener más información.

Proporcionar comentarios para mejorar los LLM

Select AI te permite proporcionar comentarios para ayudar a mejorar la capacidad de tu LLM seleccionado para generar consultas SQL más precisas.

Nota: Esta función sólo está disponible en Oracle Database 23ai. Puede utilizarlo junto con las acciones Select AI existentes: runsql, showsql y explainsql. Asegúrese de que su perfil de AI esté configurado para la generación de NL2SQL y no para RAG.

Puede proporcionar comentarios para mejorar la precisión del SQL generado mediante la acción feedback o el procedimiento DBMS_CLOUD_AI.FEEDBACK. Al seleccionar AI, se crea un índice vectorial por defecto denominado <profile_name>_FEEDBACK_VECINDEX con atributos por defecto al utilizar la función de comentarios por primera vez. Este índice ayuda a acotar el SQL generado en el futuro en función de los comentarios proporcionados. Consulte Índice de vector para FEEDBACK para obtener más información.

Consejo: utilice el procedimiento DBMS_CLOUD_AI.FEEDBACK cuando el LLM especificado no genere la consulta SQL correcta o no devuelva el resultado esperado de una de las acciones SELECT AI de NL2SQL. También puede utilizar el procedimiento DBMS_CLOUD_AI.FEEDBACK para agregar el SQL correcto directamente a la tabla vectorial. Esto ayuda a guiar la futura generación de SQL al servir de referencia para peticiones de datos similares.

Se aceptan los siguientes tipos de comentarios:

Ventajas del uso de comentarios

La acción de comentarios y el procedimiento en Select AI introducen un mecanismo de ajuste de peticiones de datos que mejora la precisión de la generación de consultas SQL.

El propietario del perfil AI puede proporcionar comentarios para las consultas SQL generadas y el sistema Select AI aprende de la interacción del usuario a lo largo del tiempo. Este aprendizaje implica acumular un repositorio de peticiones de datos y contenido de comentarios donde la búsqueda vectorial se utiliza para identificar peticiones de datos similares a la petición de datos actual. Los ejemplos de coincidencia principales se proporcionan como metadatos para el LLM como parte de la petición de datos aumentada. Las siguientes son las ventajas:

Cómo proporcionar comentarios

Select AI le permite proporcionar comentarios mediante la acción feedback o llamando al procedimiento DBMS_CLOUD_AI.FEEDBACK.

Atención: no utilice la acción de comentarios en aplicaciones en las que varios usuarios comparten sesiones de base de datos en un único usuario de base de datos propietario del perfil de IA. El propietario del perfil de AI debe proporcionar comentarios solo después de confirmar que la consulta corregida es adecuada para todos los usuarios de ese perfil.

Puede proporcionar comentarios incluyendo lo siguiente:

Nota: Para utilizar el último SQL, asegúrese de desactivar la salida del servidor en Oracle SQL*Plus u Oracle SQLcl. Debe tener el privilegio READ en las tablas sys.v_$session y v_$mapped_sql.

  GRANT READ ON SYS.V_$MAPPED_SQL TO ADB_USER;
  GRANT READ ON SYS.V_$SESSION TO ADB_USER;

Consulte Procedimiento FEEDBACK y Ejemplo: Seleccionar comentarios de AI para obtener más información.

Consultar datos de gráficos con gráficos de propiedades

Seleccione AI genera Property Graph Query (PGQ) en Oracle Property Graphs mediante lenguaje natural. Permite a los usuarios consultar datos de gráficos mediante el operador GRAPH_TABLE con un conocimiento mínimo de SQL.

Select AI amplía su lenguaje natural a la capacidad SQL (NL2SQL) para graficar estructuras que le permiten consultar gráficos de propiedades SQL mediante lenguaje natural. Select AI aplica el operador GRAPH_TABLE para interpretar relaciones y atributos en datos estructurados por gráficos. Genera consultas de gráficos SQL o PGQ basadas en los objetos de datos definidos en el perfil AI. Cuando se incluye un gráfico de propiedades en el perfil de AI, Select AI utiliza la IA generativa para crear una consulta de PGQ que haga referencia al gráfico mediante el operador GRAPH_TABLE. El LLM recibe automáticamente los metadatos del objeto de gráfico, como sentencias CREATE PROPERTY GRAPH, para generar consultas precisas. Cuando se especifica una tabla, vista u objeto relacional, Select AI genera una consulta SQL. Esta capacidad simplifica las consultas de coincidencia de patrones en los datos de gráficos almacenados en Oracle AI Database y reduce la dependencia de la creación manual de consultas SQL.

Al crear un perfil de AI con uno o más gráficos de propiedades definidos en el atributo object_list, el LLM definido en el perfil de AI interpreta las peticiones de datos mediante el contexto de los gráficos de propiedades especificados. Select AI crea una petición de datos aumentada que incluye:

Esta petición de datos aumentada se envía al LLM. Seleccione AI ejecuta la consulta y devuelve los resultados. Si se especifica un gráfico de propiedades junto con otros tipos de objetos, como tablas, esquemas o vistas en el perfil AI, la opción Seleccionar AI genera un error.

SQL frente a PGQ

Con Select AI, el tipo de consulta generada depende de los objetos definidos en el atributo object_list de su perfil AI.

Consulte Gráfico de propiedades SQL y Consultas de GRAPH SQL para obtener más información.

Ventajas de usar Select AI en gráficos de propiedades

Los usuarios de bases de datos pueden consultar gráficos de propiedades mediante Select AI para generar consultas de grafos a partir del lenguaje natural, reduciendo el trabajo manual y mejorando la comprensión de las relaciones de grafos.

Entre las ventajas clave se incluyen:

Limitaciones

La selección de AI para Property Graphs no admite las siguientes capacidades:

Cómo utilizar Select AI en gráficos de propiedades

Select AI permite explorar datos de gráficos mediante la función DBMS_CLOUD_AI.GENERATE o mediante Select AI <action> <prompt>.

Después de haber definido gráficos de propiedades en el atributo object_list de su perfil AI, puede utilizar:

Las siguientes son las acciones soportadas: runsql, showsql, explainsql, narrate y showpropmt. Select AI for Property Graph también admite conversaciones a corto plazo y personalizables a largo plazo basadas en sesiones.

Consulte Ejemplo: Seleccionar AI para los gráficos de propiedades y Ejemplo: peticiones de datos de ejemplo para los gráficos de propiedades para obtener más información.

Generar un resumen con IA seleccionada

Select AI le permite generar un resumen de su texto, especialmente textos de gran tamaño, que generalmente admiten hasta 1 GB mediante proveedores de IA. Puede extraer información clave de textos o archivos grandes según sus necesidades específicas. Esta función utiliza el LLM especificado en su perfil de IA para generar un resumen para un texto determinado.

Select AI ofrece un resumen de su contenido de las siguientes maneras:

Nota:

Técnicas de resumen

Puede resumir un documento grande introduciendo el texto completo como una petición de datos para el LLM. Sin embargo, dado que los LLM tienen límites de tokens, Select AI aplica diferentes técnicas para resumir documentos grandes.

Select AI utiliza la acotación iterativa y MapReduce como técnicas de resumen. Consulte Terminología relacionada para obtener más información.

Según el tamaño máximo de token de un LLM determinado, Select AI puede dividir el contenido grande en fragmentos más pequeños y fáciles de manejar que se ajusten a los límites del LLM. Seleccione AI y, a continuación, utilice la técnica de acotación iterativa o reducción de asignación para generar el resumen. Seleccionar AI utiliza MapReduce como valor por defecto. Consulte Función SUMMARIZE y Parámetros SUMMARIZE para obtener más información.

Traducir texto con Select AI

Con Select AI, puedes utilizar la IA generativa del servicio de traducción de OCI para traducir tu texto al idioma que elijas.

Puede usar esta función junto con la RAG Select AI existente. Puede combinar translate con DBMS_CLOUD_AI.GENERATE o narrate para utilizar la IA generativa para producir salidas traducidas en el idioma que prefiera.

Consulte TRANSLATE Function, GENERATE Function y Example: Select AI TRANSLATE para obtener más información.

Ventajas de usar la traducción

La función de traducción en Select AI le permite traducir texto de entrada en diferentes idiomas para los siguientes beneficios:

Cómo utilizar la conversión

Select AI permite traducir la entrada de texto a su idioma preferido mediante la acción translate o llamando a las funciones DBMS_CLOUD_AI.GENERATE o DBMS_CLOUD_AI.TRANSLATE.

Para utilizar la función Seleccionar traducción de IA, debe tener los permisos de política de IAM adecuados para acceder a los servicios de Oracle Cloud Infrastructure Language.

Otorgue el permiso para utilizar el recurso ai-service-language-family en la política de IAM. Una sentencia de política de ejemplo para otorgar permiso a un grupo de usuarios en un compartimento específico es:

allow group <your group name> to use ai-service-language-family in compartment <your_compartment>

Un grupo dinámico identifica recursos como bases de datos o funciones mediante la coincidencia de sus OCID o etiquetas, mientras que un grupo de usuarios contiene usuarios individuales de IAM.

Utilizar un grupo dinámico cuando la política se aplique a recursos de OCI y utilizar un grupo de usuarios cuando la política se aplique a usuarios humanos. Para obtener más información sobre los pasos para crear grupos dinámicos y de usuarios, consulte Gestión de grupos dinámicos.

Consulte Políticas de idioma para obtener más información.

Puede traducir texto utilizando lo siguiente:

Seleccionar IA para Python

Select AI for Python integra capacidades de IA generativa en flujos de trabajo de base de datos de IA autónoma. Seleccione AI para Python proporciona una biblioteca de cliente, select_ai, que permite utilizar las capacidades DBMS_CLOUD_AI en Autonomous AI Database desde Python. Select AI for Python admite flujos de trabajo de IA generativa mejorados, resúmenes, mecanismos de retroalimentación, gestión de metadatos coherente y capacidades de IA ágentes. También es compatible con Python 3.14 e incluye un sitio de documentación HTML actualizado (Nuevo)

Acciones que Puede Realizar

Plataformas soportadas

Select AI for Python está certificado para Autonomous Database 19c y Autonomous AI Database 26ai. Seleccionar AI para Python puede funcionar en otras plataformas, sin embargo, no está certificado.

Haga clic en https://github.com/oracle/python-select-ai/issues para informar los problemas.

Nota: Seleccione el agente de IA para Python no disponible en Autonomous AI Database on Dedicated Exadata Infrastructure.

Funciones admitidas para seleccionar perfil de AI (sincrónico y asíncrono)

Cuando envía peticiones de datos a través de un perfil, puede elegir entre varias funciones definidas para los objetos de perfil AI. Algunos son los siguientes:

Para obtener una lista completa de funciones, consulte la guía Seleccionar AI para Python. Consulte también Uso de palabra clave AI para introducir peticiones de datos para obtener más información sobre las acciones Seleccionar AI.

Clases Soportadas

La biblioteca incluye clases para gestionar proveedores, perfiles, conversaciones, índices vectoriales y datos sintéticos. Tanto las versiones síncronas como las asíncronas están disponibles.

Existen equivalentes asíncronos para las clases Profile, Conversation y VectorIndex.

Para obtener una referencia completa de la API, consulte la guía Select AI for Python.

Mejoras en la actualización de API y atributos

Están disponibles las siguientes mejoras:

Privilegio y acceso HTTP

La gestión de privilegios es independiente de la configuración de acceso HTTP.

API de privilegios:

Los privilegios se actualizan para incluir:

API de acceso HTTP:

Otras mejoras

Ejemplos de uso de Select AI

Explora la integración de Select AI de Oracle con varios proveedores de IA soportados para generar, ejecutar y explicar SQL a partir de peticiones de datos en lenguaje natural o chatear con el LLM.

Ejemplo: Seleccionar acciones de IA

En el siguiente ejemplo se muestran acciones como runsql (valor por defecto), showsql, narrate, chat, explainsql, feedback y summarize que puede realizar con SELECT AI. Estos ejemplos utilizan el esquema sh con los atributos de perfil y proveedor de AI especificados en la función DBMS_CLOUD_AI.CREATE_PROFILE. Utilice las acciones Select AI después de definir el perfil AI mediante el procedimiento DBMS_CLOUD_AI.SET_PROFILE en la sesión actual.

Para generar un resumen del texto, utilice SELECT AI SUMMARIZE <TEXT>.

select ai how many customers exist;
CUSTOMER_COUNT
--------------
         55500
select ai showsql how many customers exist;
RESPONSE
----------------------------------------------------
SELECT COUNT(*) AS total_customers
FROM SH.CUSTOMERS
select ai narrate how many customers exist;
RESPONSE
------------------------------------------------------
There are a total of 55,500 customers in the database.
SQL> select ai chat how many customers exist;
RESPONSE
--------------------------------------------------------------------------------
It is impossible to determine the exact number of customers that exist as it constantly changes due to various factors such as population growth, new businesses, and customer turnover. Additionally, the term "customer" can refer to individuals, businesses, or organizations, making it difficult to provide a specific number.
SQL> select ai explainsql how many customers in San Francisco are married;
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(*) AS customer_count
FROM SH.CUSTOMERS AS c
WHERE c.CUST_STATE_PROVINCE = 'San Francisco' AND c.CUST_MARITAL_STATUS = 'Married';

Explanation:
- We use the 'SH' table alias for the 'CUSTOMERS' table for better readability.
- The query uses the 'COUNT(*)' function to count the number of rows that match the given conditions.
- The 'WHERE' clause is used to filter the results:
  - 'c.CUST_STATE_PROVINCE = 'San Francisco'' filters customers who have 'San Francisco' as their state or province.
  - 'c.CUST_MARITAL_STATUS = 'Married'' filters customers who have 'Married' as their marital status.
The result of this query will give you the count of customers in San Francisco who are married, using the column alias 'customer_count' for the result.

Remember to adjust the table and column names based on your actual schema if they differ from the example.

Feel free to ask if you have more questions related to SQL or database in general.
-- Feedback on SQL Text
-- Negative feedback example:
select ai feedback for query "select ai showsql how many watch histories in total", please use sum instead of count;
-- Positive feedback example:
select ai feedback for query "select ai showsql how many watch histories in total", the sql query generated is correct;
-- Feedback on SQL ID
-- Negative feedback example:
select ai feedback please use sum instead of count for sql_id  1v1z68ra6r9zf;
-- Positive feedback example:
select ai feedback sql query result is correct for sql_id  1v1z68ra6r9zf;
-- If not specified, use default LASTAI SQL
-- To use default LASTAI sql, make sure that set server output off;
-- Negative feedback example:
select ai feedback please use ascending sorting for ranking;
-- Positive feedback example:
select ai feedback the result is correct;
SELECT AI SUMMARIZE
Like countless other people around the globe, I stream music, and like more than six hundred million of them I mainly use Spotify. Streaming currently accounts for about eighty per cent of the American recording industry's revenue, and in recent years Spotify's health is often consulted as a measure for the health of the music business over all. Last spring, the International
Federation of the Phonographic Industry reported global revenues of $28.6 billion, making for the ninth straight year of growth. All of this was unimaginable in the two-thousands, when the major record labels appeared poorly equipped to deal with piracy and the so-called death of physical media.
On the consumer side, the story looks even rosier. Adjusted for inflation, a 

... (skipped 1000 rows in the middle)

Pelly writes of some artists, in search of viral fame, who surreptitiously use social media to effectively beta test melodies and motifs, basically putting together songs via crowdsourcing. Artists have always fretted about the pressure to conform, but the data-driven, music-as-content era feels different. "You are a Spotify employee at that point," Daniel Lopatin, who makes abstract electronic music as Oneohtrix Point Never, told Pelly. "If your art practice is so ingrained in the brutal reality that Spotify has outlined for all of us, then what is the music that you're not making? What does the music you're not making sound like?" Listeners might wonder something similar.
What does the music we're not hearing sound like?;
RESPONSE
------------------------------------------------------------------------------
The music streaming industry, led by Spotify, has revolutionized the way people consume music, with streaming accounting for 80% of the American recording industry's revenue. However, this shift has also complicated the lives of artists, who struggle to survive in a hyper-abundant present where music is often valued for its convenience rather than its artistic merit.
Spotify's algorithms prioritize popularity and profitability over artistic diversity, leading to a homogenization of music and a devaluation of the labor that goes into creating it. Meanwhile, the company's executives reap enormous profits, with CEO Daniel Ek's net worth rivaling that of the wealthiest musicians. As music critic Liz Pelly argues, the streaming economy raises important questions about autonomy, creativity, and the value of art in a world where everything is readily available and easily accessible.

Ejemplo: selección de IA con AWS

En este ejemplo, se muestra cómo puede utilizar AWS para generar, ejecutar y explicar SQL a partir de peticiones de datos en lenguaje natural o chatear con los modelos disponibles con AWS.

En el siguiente ejemplo se muestra cómo utilizar AWS como proveedor de IA con Amazon Bedrock y sus modelos básicos. El ejemplo muestra la creación de credenciales de AWS, el acceso a la red, la creación de un perfil de IA y el uso de acciones Select AI para generar consultas SQL a partir de peticiones de datos en lenguaje natural y el chat mediante los modelos básicos de AWS.

Para utilizar AWS, obtenga la clave de acceso, las claves secretas y el ID de modelo. Consulte Instrucciones específicas de AWS en Configuración de perfiles de AI mediante DBMS_CLOUD_AI. Utilice el identificador de modelo como atributo model en el procedimiento DBMS_CLOUD_AI.CREATE_PROFILE. Debe especificar el atributo model explícitamente, ya que no se proporciona ningún modelo por defecto.

--Grant EXECUTE privilege to ADB_USER
GRANT EXECUTE on DBMS_CLOUD_AI to ADB_USER;

--
-- Create Credential for AI provider
--
BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'AWS_CRED',
        username    => '<your_AWS_access_key>',
        password    => '<your_AWS_secret_key>'
      );
END;
/
--
-- Grant Network ACL for AWS
--
BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => 'bedrock-runtime.us-east-1.amazonaws.com',
        ace  => xs$ace_type(privilege_list => xs$name_list('http'),
                    principal_name => 'ADB_USER',
                    principal_type => xs_acl.ptype_db)
       );
END;
/
--
-- Create AI profile
--
BEGIN
      DBMS_CLOUD_AI.CREATE_PROFILE(
        profile_name =>'AWS',
        attributes   =>'{"provider": "aws",
          "credential_name": "AWS_CRED",
          "object_list": [{"owner": "SH", "name": "customers"},
                        {"owner": "SH", "name": "countries"},
                        {"owner": "SH", "name": "supplementary_demographics"},
                        {"owner": "SH", "name": "profits"},
                        {"owner": "SH", "name": "promotions"},
                        {"owner": "SH", "name": "products"}],
           "model" : "anthropic.claude-v2",
           "conversation" : "true"
          }');
END;
/
--
-- Enable AI profile in current session
--
EXEC DBMS_CLOUD_AI.SET_PROFILE('AWS');
--
-- Use AI
--

SELECT AI how many customers exist;
"RESPONSE"
"COUNT(*)"
55500

SELECT AI how many customers in San Francisco are married;
"RESPONSE"
"COUNT(*)"
46

SELECT AI showsql how many customers in San Francisco are married;
"RESPONSE"
"SELECT COUNT(*) AS "Number of Married Customers in San Francisco"
FROM "SH"."CUSTOMERS" C
WHERE UPPER(C."CUST_CITY") = UPPER('San Francisco')
AND UPPER(C."CUST_MARITAL_STATUS") = UPPER('Married')"

SELECT AI explainsql how many customers in San Francisco are married;

"RESPONSE""SELECT
COUNT(*) AS "Number of Married Customers in San Francisco"
FROM "SH"."CUSTOMERS" C
WHERE C."CUST_CITY" = 'San Francisco'
AND C."CUST_MARITAL_STATUS" = 'Married'

Explanation:
- Used table alias C for CUSTOMERS table 
- Used easy to read column names like CUST_CITY, CUST_MARITAL_STATUS
- Enclosed table name, schema name and column names in double quotes
- Compared string values in WHERE clause without UPPER() since the values are not in double quotes
- Counted number of rows satisfying the condition and aliased the count as "Number of Married Customers in San Francisco""

SELECT AI narrate what are the top 3 customers in San Francisco;
"RESPONSE"
The top 3 customers in San Francisco ordered by credit limit in descending order are:

1. Bert Katz
2. Madallyn Ladd
3. Henrietta Snodgrass

SELECT AI chat what is Autonomous AI Database;
"RESPONSE"
"An Autonomous AI Database is a cloud database service provided by Oracle Corporation. Some key features of Oracle Autonomous AI Database include:

- Fully automated and self-driving - The database automatically upgrades, patches, tunes, and backs itself up without any human intervention required.

- Self-securing - The database uses machine learning to detect threats and automatically apply security updates.

- Self-repairing - The database monitors itself and automatically recovers from failures and errors without downtime.

- Self-scaling - The database automatically scales compute and storage resources up and down as needed to meet workload demands.

- Serverless - The database is accessed as a cloud service without having to manually provision any servers or infrastructure.

- High performance - The database uses Oracle's advanced automation and machine learning to continuously tune itself for high performance.

- Multiple workload support - Supports transaction processing, analytics, graph processing, etc in a single converged database.

- Fully managed - Oracle handles all the management and administration of the database. Users just load and access their data.

- Compatible - Supports common SQL and Oracle PL/SQL for easy migration from on-prem Oracle databases.

So in summary, an Oracle Autonomous AI Database is a fully automated, self-driving, self-securing, and self-repairing database provided as a simple cloud service. The automation provides high performance, elasticity, and availability with minimal human labor required."
--
--Clear the profile
--
BEGIN
   DBMS_CLOUD_AI.CLEAR_PROFILE;
END;
/
--
--Drop the profile
--
EXEC DBMS_CLOUD_AI.DROP_PROFILE('AWS');

Ejemplo: activación de conversaciones en Seleccionar IA

Estos ejemplos ilustran la activación de conversaciones en Select AI.

Nota: Un usuario con privilegios de administrador (ADMIN) debe otorgar EXECUTE y activar la lista de control de acceso de red (ACL).

Conversaciones Basadas en Sesión

Cree su perfil de IA. Defina el atributo conversation en true en el perfil, esta acción incluye el contenido de interacciones o peticiones de datos anteriores, lo que podría incluir metadatos de esquema, y defina el perfil. Una vez que el perfil está activado, puede comenzar a tener conversaciones con sus datos. Utiliza el lenguaje natural para hacer preguntas y hacer un seguimiento según sea necesario.

--Grants EXECUTE privilege to ADB_USER
--
grant execute on DBMS_CLOUD_AI to ADB_USER;

-- Grant Network ACL for OpenAI endpoint
--
BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
      host => 'api.openai.com',
      ace  => xs$ace_type(privilege_list => xs$name_list('http'),
                          principal_name => 'ADB_USER',
                          principal_type => xs_acl.ptype_db)
  );
END;
/
--
-- Create Credential for AI provider
--
EXEC
DBMS_CLOUD.CREATE_CREDENTIAL(
CREDENTIAL_NAME   => 'OPENAI_CRED',
username          =>  'OPENAI',
password          =>  '`<your_api_token>`');
--
-- Create AI profile
--
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
  profile_name   => 'OPENAI',
  attributes     =>'{"provider": "openai",
        "credential_name": "OPENAI_CRED",
        "object_list": [{"owner": "SH", "name": "customers"},
                        {"owner": "SH", "name": "countries"},
                        {"owner": "SH", "name": "supplementary_demographics"},
                        {"owner": "SH", "name": "profits"},
                        {"owner": "SH", "name": "promotions"},
                        {"owner": "SH", "name": "products"}],
        "conversation": "true"
       }');
     END;
     /
--
-- Enable AI profile in current session
--
EXEC DBMS_CLOUD_AI.SET_PROFILE('OPENAI');
--
-- Get Profile in current session
--
SELECT DBMS_CLOUD_AI.get_profile() from dual;
DBMS_CLOUD_AI.GET_PROFILE()
--------------------------------------------------------------------------------
"OPENAI"
--
-- Use AI
--
what are the total number of customers;
CUSTOMER_COUNT
--------------
         55500
break out count of customers by country;
RESPONSE
-----------------
COUNTRY_NAME 			CUSTOMER_COUNT
Italy 				7780
Brazil 				832
Japan 				624
United Kingdom 			7557
Germany 			8173
United States of America 	18520
France 				3833
Canada 				2010
Spain 				2039
China 				712
Singapore 			597
New Zealand 			244
Poland 	708
Australia 			831
Argentina 			403
Denmark 			383
South Africa 			88
Saudi Arabia 			75
Turkey 				91
what age group is most common;
RESPONSE
--------------------------------------------------------------------------------
AGE_GROUP 	CUSTOMER_COUNT
65+ 		28226
select ai keep the top 5 customers and their country by their purchases and include a rank in the result;
RESPONSE
--------------------------------------------------------------------------------
RANK 	CUSTOMER_NAME 		COUNTRY 	PURCHASES
1 	Abigail Ruddy 		Japan 		276
2 	Abigail Ruddy 		Italy 		168
3 	Abigail Ruddy 		Japan 		74
3 	Abner Robbinette 	Germany 	74
5 	Abner Everett 		France 		68
EXEC DBMS_CLOUD_AI.DROP_PROFILE('OPENAI');

Conversaciones personalizables

En los siguientes ejemplos se muestra el uso de la API de gestión de conversaciones que admite conversaciones personalizables. Para utilizar Select AI para varias conversaciones:

  1. Creación de una conversación

  2. Establecer la conversación en la sesión de usuario actual

  3. Utilice Select AI <action> <prompt>

Puede crear y establecer la conversación de las siguientes formas:

Ejemplo: creación y definición de conversaciones personalizables

En el siguiente ejemplo se muestra cómo crear una conversación mediante la función DBMS_CLOUD_AI.CREATE_CONVERSATION y definirla mediante el procedimiento DBMS_CLOUD_AI.SET_CONVERSATION_ID.

SELECT DBMS_CLOUD_AI.CREATE_CONVERSATION;  -- in 19c, run SELECT DBMS_CLOUD_AI.create_conversation FROM dual;
CREATE_CONVERSATION
------------------------------------
30C9DB6E-EA4D-AFBA-E063-9C6D46644B92
EXEC DBMS_CLOUD_AI.SET_CONVERSATION_ID('30C9DB6E-EA4D-AFBA-E063-9C6D46644B92');

En el siguiente ejemplo, se muestra la ejecución del procedimiento DBMS_CLOUD_AI.CREATE_CONVERSATION para crear y definir conversation_id directamente.

EXEC DBMS_CLOUD_AI.create_conversation;

También puede personalizar los atributos de conversación, como los atributos title, description, retention_days y conversation_length.

SELECT DBMS_CLOUD_AI.CREATE_CONVERSATION(
            attributes => '{"title":"My first conversation",
			"description":"this is my first conversation",
			"retention_days":5,
			"conversation_length":5}');
CREATE_CONVERSATION
------------------------------------
38F8B874-7687-2A3F-E063-9C6D4664EC3A

Puede ver si existe una conversación determinada consultando la vista DBA/USER_CLOUD_AI_CONVERSATIONS.

-- Verify the setup
SELECT conversation_id, conversation_title, description, retention_days,
conversation_length FROM DBA_CLOUD_AI_CONVERSATIONS WHERE
conversation_id = '38F8B874-7687-2A3F-E063-9C6D4664EC3A';
CONVERSATION_ID                      	CONVERSATION_TITLE                              DESCRIPTION                        RETENTION_DAYS                 CONVERSATION_LENGTH
------------------------------------ 	----------------------------------------------- ---------------------------------- ------------------------------ -------------------
38F8B874-7687-2A3F-E063-9C6D4664EC3A 	My first conversation                           this is my first conversation     +00005 00:00:00.000000         5

También puede verificar si se define una conversación llamando a la función DBMS_CLOUD_AI.GET_CONVERSATION_ID.

SELECT DBMS_CLOUD_AI.GET_CONVERSATION_ID;
--------------------------------------------------------------------------------
30C9DB6E-EA4F-AFBA-E063-9C6D46644B92

Ejemplo: uso de conversaciones personalizables con Select AI

Después de crear y establecer la conversación y activar tu perfil de IA, puedes comenzar a interactuar con tus datos. Utiliza el lenguaje natural para hacer preguntas y hacer un seguimiento según sea necesario.

Utilice SELECT AI <ACTION> <PROMPT>.

SELECT AI CHAT What is the difference in weather between Seattle and San Francisco?;
RESPONSE
--------------------------------------------------------------------------------
Seattle and San Francisco are both located on the West Coast of the United States, but they have distinct weather patterns due to their unique geography and climate conditions. Here are the main differences:

1. **Rainfall**: Seattle is known for its rainy reputation, with an average annual rainfall of around 37 inches (94 cm). San Francisco, on the other hand, recei
ves significantly less rainfall, with an average of around 20 inches (51 cm) per year.
2. **Cloud Cover**: Seattle is often cloudy, with an average of 226 cloudy days per year. San Francisco is also cloudy, but to a lesser extent, with an average of 165 cloudy days per year.

......
SELECT AI CHAT Explain the difference again in one paragraph only.;
RESPONSE
--------------------------------------------------------------------------------
Seattle and San Francisco have different weather patterns despite both experiencing a mild oceanic climate. San Francisco tends to be slightly warmer, with average temperatures ranging from 45?F to 67?F, and receives less rainfall, around 20 inches per year, mostly during winter. In contrast, Seattle is cooler, with te
mperatures ranging from 38?F to 64?F, and rainier, with around 37 inches of rainfall per year, distributed throughout the year. San Francisco is also known for its fog, particularly during summer, and receives more sunshine, around 160 sunny days per year, although it's often filtered through the fog. Overall, San Fran
cisco's weather is warmer and sunnier, with more pronounced seasonal variations, while Seattle's is cooler and rainier, with more consistent temperatures throughout the year.

Ejemplo: uso de la función GENERATE para comparar dos conversaciones

El siguiente ejemplo muestra cómo se usan dos conversaciones indistintamente para hacer preguntas y verificar respuestas precisas. Cada conversación comienza con una pregunta diferente centrada en la comparación. Más adelante, cuando se hace la misma pregunta de seguimiento en ambas conversaciones, cada una devuelve una respuesta diferente en función de su contexto anterior.

-- First conversation
SELECT DBMS_CLOUD_AI.CREATE_CONVERSATION;
CREATE_CONVERSATION
------------------------------------
30C9DB6E-EA4D-AFBA-E063-9C6D46644B92
-- Second conversation
SELECT DBMS_CLOUD_AI.CREATE_CONVERSATION;
CREATE_CONVERSATION
------------------------------------
30C9DB6E-EA4E-AFBA-E063-9C6D46644B92
-- Call generate using the first conversation.
SELECT DBMS_CLOUD_AI.GENERATE(
        prompt       =>  'What is the difference in weather between Seattle and San Francisco?',
        profile_name =>  'GENAI',
        action       =>  'CHAT',
        params       =>  '{"conversation_id":"30C9DB6E-EA4D-AFBA-E063-9C6D46644B92"}') AS RESPONSE;
RESPONSE
--------------------------------------------------------------------------------
Seattle and San Francisco, both located in the Pacific Northwest and Northern California respectively, experience a mild oceanic climate. However, there are some notable differences in their weather patterns:
1. **Temperature**: San Francisco tends to be slightly warmer than Seattle, especially during the summer months. San Francisco's average temperature ranges from 45?F (7?C) in winter to 67?F (19?C) in summer, while Seattle's average temperature ranges from 38?F (3?C) in winter to 64?F (18?C) in summer.
2. **Rainfall**: Seattle is known for its rainy reputation, with an average annual rainfall of around 37 inches (94 cm). San Francisco receives less rainfall, with an average of around 20 inches (51 cm) per year. However, San Francisco's rainfall is more concentrated during the winter months, while Seattle's rainfall i
s more evenly distributed throughout the year.

......
-- Call generate using the second conversation.
SELECT DBMS_CLOUD_AI.GENERATE(
        prompt       =>  'How does the cost of living compare between New York and Los Angeles?',
        profile_name =>  'GENAI',
        action       =>  'CHAT',
        params       =>  '{"conversation_id":"30C9DB6E-EA4E-AFBA-E063-9C6D46644B92"}') AS RESPONSE;
RESPONSE
--------------------------------------------------------------------------------
The cost of living in New York and Los Angeles is relatively high compared to other cities in the United States. However, there are some differences in the cost of living between the two cities. Here's a comparison of the cost of living in New York and Los Angeles:
1. Housing: The cost of housing is significantly higher in New York than in Los Angeles. The median home price in New York is around $999,000, while in Los Angeles it's around $849,000. Rent is also higher in New York, with the average rent for a one-bedroom apartment being around $3,000 per month, compared to around $2,400 per month in Los Angeles.
2. Food: The cost of food is relatively similar in both cities, with some variation in the cost of certain types of cuisine. However, eating out in New York can be more expensive, with the average cost of a meal at a mid-range restaurant being around $15-20 per person, compared to around $12-18 per person in Los Angeles.

......
-- Call generate using the first conversation.
SELECT DBMS_CLOUD_AI.GENERATE(
        prompt       =>  'Explain the difference again in one paragraph only.',
        profile_name =>  'GENAI',
        action       =>  'CHAT',
        params       =>  '{"conversation_id":"30C9DB6E-EA4D-AFBA-E063-9C6D46644B92"}') AS RESPONSE;
RESPONSE
--------------------------------------------------------------------------------
Seattle and San Francisco have different weather patterns despite both experiencing a mild oceanic climate. San Francisco tends to be slightly warmer, with average temperatures ranging from 45?F to 67?F, and receives less rainfall, around 20 inches per year, mostly during winter. In contrast, Seattle is cooler, with temperatures ranging from 38?F to 64?F, and rainier, with around 37 inches of rainfall per year, distributed throughout the year. San Francisco is also known for its fog, particularly during summer, and receives more sunshine, around 160 sunny days per year, although it's often filtered through the fog. Overall, San Francisco's weather is warmer and sunnier, with more pronounced seasonal variations, while Seattle's is cooler and rainier, with more consistent temperatures throughout the year.
-- Call generate using the second conversation.
SELECT DBMS_CLOUD_AI.GENERATE(
        prompt       =>  'Explain the difference again in one paragraph only.',
        profile_name =>  'GENAI',
        action       =>  'CHAT',
        params       =>  '{"conversation_id":"30C9DB6E-EA4E-AFBA-E063-9C6D46644B92"}') AS RESPONSE;
RESPONSE
--------------------------------------------------------------------------------
The cost of living in New York is approximately 20-30% higher than in Los Angeles, mainly due to the higher cost of housing and transportation. New York has a median home price of around $999,000 and average rent of $3,000 per month for a one-bedroom apartment, compared to Los Angeles' median home price of $849,000 and average rent of $2,400 per month. While the cost of food and utilities is relatively similar in both cities, the cost of transportation is higher in Los Angeles due to its car-centric culture, but the cost of public transportation is higher in New York. Overall, the total monthly expenses for a single person in New York can range from $4,600, compared to around $4,050 in Los Angeles, making New York the more expensive city to live in.

Puede llamar a la función DBMS_CLOUD_AI.GENERATE sin especificar una conversación; sin embargo, en tales casos, no se debe esperar una respuesta significativa.

-- Ask SELECT AI using the second conversation.
SELECT DBMS_CLOUD_AI.GENERATE(
        prompt       =>  'Explain the difference again in one paragraph only.',
        profile_name =>  'GENAI',
        action       =>  'CHAT') AS RESPONSE;
RESPONSE
--------------------------------------------------------------------------------
There is no previous explanation to draw from, as this is the beginning of our conversation. If you would like to ask a question or provide a topic, I would be happy to explain the differences related to it in one paragraph.

Ejemplo: verificación de conversaciones mediante vistas DBMS_CLOUD_AI

Puede consultar las vistas de conversación DBMS_CLOUD_AI para revisar los detalles de conversación y petición de datos. Consulte Vistas DBMS_CLOUD_AI para obtener más información.

Nota: Las vistas con el prefijo DBA_ solo están disponibles para los usuarios con privilegios de administrador (ADMIN).

SELECT conversation_id, conversation_title, description FROM dba_cloud_ai_conversations;
CONVERSATION_ID
------------------------------------
CONVERSATION_TITLE
----------------------------------------------------------------------------------------------------
DESCRIPTION
--------------------------------------------------------------------------------
30C9DB6E-EA4D-AFBA-E063-9C6D46644B92
Seattle vs San Francisco Weather
The conversation discusses the comparison of weather patterns between Seattle and San Francisco, focusing on the differences in temperature, rainfall, fog, sunshine, and seasonal variation between the two cities.

30C9DB6E-EA4E-AFBA-E063-9C6D46644B92
NY vs LA Cost Comparison
The conversation discusses and compares the cost of living in New York and Los Angeles, covering housing, food, transportation, utilities, and taxes to provide an overall view of the expenses in both cities.
SELECT conversation_id, count(*) FROM dba_cloud_ai_conversation_prompts
     GROUP BY conversation_id;
CONVERSATION_ID                COUNT(*)
------------------------------------ ----------
30C9DB6E-EA4D-AFBA-E063-9C6D46644B92          2
30C9DB6E-EA4E-AFBA-E063-9C6D46644B92          2

Ejemplo: Actualizar Detalles de Conversación

Puede actualizar title, description y retention_days de una conversación mediante el procedimiento DBMS_CLOUD_AI.UPDATE_CONVERSATION. Puede verificar la actualización consultando la vista de conversación DBMS_CLOUD_AI.

-- Update the second conversation's title, description and retention_days
EXEC DBMS_CLOUD_AI.update_conversation(conversation_id => '30C9DB6E-EA4E-AFBA-E063-9C6D46644B92',
											attributes => '{"retention_days":20,
														"description":"This a description",
														"title":"a title",
														"conversation_length":20}');
-- Verify the information for the second conversation
SELECT conversation_title, description, retention_days
FROM dba_cloud_ai_conversations
WHERE conversation_id = '30C9DB6E-EA4E-AFBA-E063-9C6D46644B92';
CONVERSATION_TITLE         DESCRIPTION                          RETENTION_DAYS         LENGTH
-------------------------- ------------------------------------ -------------- --------------
a title                    This a description                   20                         20

Ejemplo: supresión de una petición de datos

Puede suprimir una petición de datos individual de las conversaciones y verificar la modificación consultando la vista de conversación DBMS_CLOUD_AI.

-- Find the latest prompt for first conversation
SELECT conversation_prompt_id FROM dba_cloud_ai_conversation_prompts
     WHERE conversation_id = '30C9DB6E-EA4D-AFBA-E063-9C6D46644B92'
     ORDER BY created DESC
     FETCH FIRST ROW ONLY;
CONVERSATION_PROMPT_ID
------------------------------------
30C9DB6E-EA61-AFBA-E063-9C6D46644B92
-- Delete the prompt
EXEC DBMS_CLOUD_AI.DELETE_CONVERSATION_PROMPT('30C9DB6E-EA61-AFBA-E063-9C6D46644B92');
-- Verify if the prompt is deleted
SELECT conversation_prompt_id FROM dba_cloud_ai_conversation_prompts
WHERE conversation_id = '30C9DB6E-EA4D-AFBA-E063-9C6D46644B92';
-- Only one prompt now
CONVERSATION_PROMPT_ID
------------------------------------
30C9DB6E-EA5A-AFBA-E063-9C6D46644B92

Ejemplo: Borrado de una conversación

Puede eliminar toda la conversación, lo que también quita todos los campos asociados a ella.

-- Delete the first conversation
EXEC DBMS_CLOUD_AI.DROP_CONVERSATION('30C9DB6E-EA4D-AFBA-E063-9C6D46644B92');

-- Verify if the conversation and its prompts are removed
SELECT conversation_id FROM dba_cloud_ai_conversations;
-- We only have the second conversation now
CONVERSATION_ID
------------------------------------
30C9DB6E-EA4E-AFBA-E063-9C6D46644B92
SELECT conversation_id, count(*) FROM dba_cloud_ai_conversation_prompts GROUP BY conversation_id;
-- We only have prompts in the second conversation
CONVERSATION_ID                COUNT(*)
------------------------------------ ----------
30C9DB6E-EA4E-AFBA-E063-9C6D46644B92          2

Ejemplo: Seleccionar comentarios de IA

En estos ejemplos se muestra cómo puede utilizar el procedimiento DBMS_CLOUD_AI.FEEDBACK y los diferentes escenarios para proporcionar comentarios con el fin de mejorar la posterior generación de consultas SQL.

Nota: Puede proporcionar comentarios para las peticiones de datos Select AI SQL, incluso si la petición de datos no se ha ejecutado anteriormente. Seleccionar AI no requiere que la petición de datos SQL se utilice en una consulta antes de enviar comentarios; puede proporcionar comentarios para cualquier petición de datos válida en cualquier momento.

Ejemplo: proporcionar comentarios negativos

En el siguiente ejemplo se muestra cómo proporcionar correcciones al SQL generado como comentarios (comentarios negativos) mediante feedback_type como negative y cómo proporcionar la consulta SQL.

Agregue sus comentarios al perfil de AI denominado OCI_FEEDBACK1 llamando al procedimiento DBMS_CLOUD_AI.FEEDBACK con el parámetro sql_text que contiene la petición de datos. Consulte Procedimiento de comentarios para obtener más información sobre los atributos. A continuación, recupere las columnas content y attributes de la tabla <profile_name>_FEEDBACK_VECINDEX$VECTAB, que está enlazada a esa consulta SQL específica. Seleccione AI para crear automáticamente esta tabla vectorial cuando utilice por primera vez la función de comentarios. Consulte Índice de vector para comentarios para obtener más información.

SQL> select ai showsql how many movies;
RESPONSE
------------------------------------------------------------------------
SELECT COUNT(m."MOVIE_ID") AS "Number of Movies" FROM "ADB_USER"."MOVIES" m
exec DBMS_CLOUD_AI.FEEDBACK(profile_name=>'OCI_FEEDBACK1', sql_text=> 'select ai showsql how many movies', feedback_type=> 'negative', response=>'SELECT SUM(1) FROM "ADB_USER"."MOVIES"');
select CONTENT, ATTRIBUTES from OCI_FEEDBACK1_FEEDBACK_VECINDEX$VECTAB where JSON_VALUE(attributes, '$.sql_text') = 'select ai showsql how many movies';
CONTENT
----------------------------------------------------------------------------------------------------
how many movies
ATTRIBUTES
----------------------------------------------------------------------------------------------------

{"response":"SELECT SUM(1) FROM "ADB_USER"."MOVIES"","feedback_type":"negative","sql_id":null,"sql_text":"select ai showsql how many movies","feedback_content":null}

Ejemplo: proporcionar comentarios positivos

En el siguiente ejemplo se muestra cómo proporcionar su aprobación para que acepte y confirme el SQL generado (comentarios positivos) mediante feedback_type como positive.

En este ejemplo, la consulta recupera sql_id de la vista v$mapped_sql para la petición de datos determinada. Consulte V_MAPPED_SQL para obtener más información.

Agregue sus comentarios al perfil de AI denominado OCI_FEEDBACK1 llamando al procedimiento DBMS_CLOUD_AI.FEEDBACK con el parámetro sql_id. A continuación, recupere las columnas content y attributes de la tabla <profile_name>_FEEDBACK_VECINDEX$VECTAB, que está enlazada a esa consulta SQL específica. Seleccione AI para crear automáticamente esta tabla vectorial cuando utilice por primera vez la función de comentarios. Consulte Índice de vector para comentarios para obtener más información.

select ai showsql how many distinct movie genres?;
RESPONSE
-----------------------------------------------------------------------------------------
SELECT COUNT(DISTINCT g."GENRE_NAME") AS "Number of Movie Genres" FROM "ADB_USER"."GENRES" g
SELECT sql_id FROM v$mapped_sql WHERE sql_text = 'select ai showsql how many distinct movie genres?';
SQL_ID
-------------
852w8u83gktc1
exec DBMS_CLOUD_AI.FEEDBACK(profile_name=>'OCI_FEEDBACK1', sql_id=> '852w8u83gktc1', feedback_type=>'positive', operation=>'add');
SELECT content, attributes FROM OCI_FEEDBACK1_FEEDBACK_VECINDEX$VECTAB WHERE JSON_VALUE(attributes, '$.sql_id') ='852w8u83gktc1';
CONTENT
----------------------------------------------------------------------------------------------------
how many distinct movie genres?
ATTRIBUTES
----------------------------------------------------------------------------------------------------
{"response":"SELECT COUNT(DISTINCT g."GENRE_NAME") AS "Number of Movie Genres" FROM "ADB_USER"."GENRES" g","feedback_type":"positive","sql_id":"852w8u83gktc1","sql_text":"select ai showsql how many distinct movie genres?","feedback_content":null}

Ejemplo: proporcionar comentarios sin uso previo

Puede proporcionar comentarios para peticiones de datos SQL incluso si la petición de datos no se ha utilizado anteriormente. Por ejemplo:

BEGIN
  DBMS_CLOUD_AI.FEEDBACK(
    profile_name=>'AI_PROFILE',
    sql_text=>'select ai runsql how many products named PAD', -- Prior usage not required
    feedback_type=>'negative',
    response=>'SELECT COUNT(*) AS "Num" FROM "PRODUCTS"."CATG" o WHERE UPPER(o."NAME") LIKE ''%PAD%''',
    feedback_content=>'Use LIKE instead of ='
  );
END;
/

En este caso, los comentarios para la petición de datos select ai runsql how many products named PAD se envían sin necesidad de utilizar la petición de datos de antemano.

Ejemplo: adición o supresión de comentarios para el SQL generado

En el siguiente ejemplo se muestra cómo agregar o suprimir comentarios para el SQL generado especificando los parámetros del procedimiento DBMS_CLOUD_AI.FEEDBACK. En este ejemplo se muestra el uso de sql_id y sql_text junto con otros parámetros.

Nota: la opción Seleccionar IA solo permite una entrada de comentarios única para cada sql_id. Si proporciona comentarios adicionales para el mismo sql_id, Select AI sustituye la entrada anterior por la nueva.

Consulte Procedimiento de comentarios para obtener más información sobre los parámetros.

EXEC DBMS_CLOUD_AI.FEEDBACK(profile_name=>'OCI_FEEDBACK1',
                                   sql_id=> '852w8u83gktc1',
                                   feedback_type=>'positive',
                                   operation=>'add');
EXEC DBMS_CLOUD_AI.FEEDBACK(profile_name=>'OCI_FEEDBACK1',
                                   sql_text=> 'select ai showsql how many movies',
                                   feedback_type=> 'negative',
                                   response=>'SELECT SUM(1) FROM "ADB_USER"."MOVIES"',
                                   feedback_content=>'Use SUM instead of COUNT');
EXEC DBMS_CLOUD_AI.FEEDBACK(profile_name=>'OCI_FEEDBACK1',
                                   sql_id=> '852w8u83gktc1',
                                   operation=>'delete');

Ejemplo: uso de la acción de comentarios con el último SQL de IA para proporcionar comentarios negativos

En este ejemplo se muestra el uso de la acción feedback para mejorar el SQL generado sugiriendo las modificaciones mediante el lenguaje natural.

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name=>'OCI_FEEDBACK1',
    attributes=>'{"provider": "oci",
      "credential_name": "GENAI_CRED",
      "oci_compartment_id": "ocid1.compartment.oc1..aaaa...",
      "object_list": [{"owner": "ADB_USER", "name": "users"},
                      {"owner": "ADB_USER", "name": "movies"},
                      {"owner": "ADB_USER", "name": "genres"},
                      {"owner": "ADB_USER", "name": "watch_history"},
                      {"owner": "ADB_USER", "name": "movie_genres"},
                      {"owner": "ADB_USER", "name": "employees1"},
                      {"owner": "ADB_USER", "name": "employees2"}
                        ]
      }');
END;
/

EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_FEEDBACK1');
select ai showsql rank movie duration;
RESPONSE
-------------------------------------------------------------------------------
SELECT "DURATION" AS "Movie Duration" FROM "ADB_USER"."MOVIES" ORDER BY "DURATION"
select ai feedback use ascending sorting;
RESPONSE
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Based on your feedback, the SQL query for prompt "rank movie duration" is successfully refined. The refined SQL query as following:
SELECT m."DURATION" AS "Movie Duration" FROM "ADB_USER."MOVIES" m ORDER BY m."DURATION" ASC
select ai showsql rank the movie duration;
RESPONSE
-----------------------------------------------------------------------------------------
SELECT m."DURATION" AS "Movie Duration" FROM "ADB_USER."MOVIES" m ORDER BY m."DURATION" ASC

Ejemplo: uso de la acción de comentarios con el último SQL de IA para proporcionar comentarios positivos

En este ejemplo se muestra el uso de la acción feedback para aceptar el SQL generado mediante lenguaje natural.

--Positive feedback

select ai showsql which movies are comedy?;
RESPONSE
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT DISTINCT m."TITLE" AS "Movie Title" FROM "ADB_USER"."MOVIES" m INNER JOIN "ADB_USER"."MOVIE_GENRES" mg ON m."MOVIE_ID" = mg."MOVIE_ID" INNER JOIN "ADB_USER"."GENRES" g ON mg."GENRE_ID" = g."GENRE_ID" WHERE g."GENRE_NAME" = 'comedy'
select ai feedback this is correct;
RESPONSE
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Thank you for your positive feedback. The SQL query for prompt "which movies are comedy?" is correctly implemented and delivering the expected results. It will be referenced for future optimizations and improvements.
Select AI Feedback Action Referring SQL_ID

Ejemplo: uso de la acción de comentarios con SQL_ID para proporcionar comentarios

En este ejemplo se muestra el uso de SQL_ID con la acción feedback para proporcionar comentarios para una consulta SQL generada concreta. Puede obtener SQL_ID consultando la tabla v$MAPPED_SQL.

-- Query mentioned with SQL_ID

select ai showsql how many movies are in each genre;
RESPONSE
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT g."GENRE_NAME" AS "Genre Name", COUNT(m."MOVIE_ID") AS "Number of Movies" FROM "ADB_USER"."MOVIES" m INNER JOIN "ADB_USER"."MOVIE_GENRES" mg ON m."MOVIE_ID" = mg."MOVIE_ID" INNER JOIN "ADB_USER"."GENRES" g ON mg."GENRE_ID" = g."GENRE_ID" GROUP BY g."GENRE_NAME"
select sql_id from v$cloud_ai_sql where sql_text = 'select ai showsql how many movies are in each genre';
SQL_ID
-------------
8azkwc0hr87ga
select ai feedback for query with sql_id = '8azkwc0hr87ga', rank in descending sorting;
RESPONSE
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Based on your feedback, the SQL query for prompt "how many movies are in each genre" is successfully refined. The refined SQL query as following:
SELECT g."GENRE_NAME" AS "Genre Name", COUNT(m."MOVIE_ID") AS "Number of Movies"
FROM "ADB_USER"."MOVIES" m
INNER JOIN "ADB_USER"."MOVIE_GENRES" mg ON m."MOVIE_ID" = mg."MOVIE_ID"
INNER JOIN "ADB_USER"."GENRES" g ON mg."GENRE_ID" = g."GENRE_ID"
GROUP BY g."GENRE_NAME"
ORDER BY COUNT(m."MOVIE_ID") DESC

Ejemplo: uso de acción de comentarios con texto de consulta

En este ejemplo se muestra la acción feedback para una consulta Select AI específica mediante la inclusión de la petición de datos Select AI entre comillas seguida de sus comentarios.

-Query mentioned with SQL_TEXT

select ai showsql how many watch history in total;
RESPONSE
----------------------------------------------------------------------------------
SELECT COUNT(w."WATCH_ID") AS "Total Watch History" FROM "ADB_USER"."WATCH_HISTORY" w
select ai feedback for query "select ai showsql how many watch history in total", name the column as total_watch;
RESPONSE
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Based on your feedback, the SQL query for prompt "how many watch history in total" is successfully refined. The refined SQL query as following:
SELECT COUNT(w."WATCH_ID") AS "total_watch" FROM "ADB_USER"."WATCH_HISTORY" w

Ejemplo: selección de AI para gráficos de propiedades

En este ejemplo se muestra cómo puede utilizar el procedimiento DBMS_CLOUD_AI.GENERATE y una petición de datos en lenguaje natural para generar consultas de gráficos de PGQ para consultar datos de gráficos.

Ejemplo: especificación de varios gráficos en el perfil de AI

En este ejemplo, se muestra cómo definir varios gráficos de propiedades en el perfil AI, incluida una consulta de ejemplo y su salida.

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
      profile_name =>'OPENAI',
      attributes   =>'{"provider": "openai",
        "model": "gpt-4o",
        "credential_name": "OPENAI_CRED",
        "object_list": [{"owner": "ADB_USER", "name": "LDBC_GRAPH"},
                        {"owner": "ADB_USER", "name": "G"}]
       }');
END;
/

SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE(profile_name => 'OPENAI');
select ai who bought a dress;
CUSTOMER_N
----------
Kate

1 row selected.

Ejemplo: peticiones de datos de ejemplo para gráficos de propiedades

Estos ejemplos muestran cómo crear datos de ejemplo y mostrar el SQL generado mediante la acción showsql para una petición de datos determinada.

Ejemplo: creación de tabla de gráficos de propiedades

En el siguiente ejemplo se crean tablas de ejemplo y un gráfico de propiedades.

CREATE TABLE Person
(
    id         NUMBER PRIMARY KEY,
    firstName  VARCHAR2(20 CHAR),
    lastName   VARCHAR2(20 CHAR),
    age        NUMBER,
    jsonProp   VARCHAR2(40 CHAR)
);

CREATE TABLE Post
(
    id         NUMBER PRIMARY KEY,
    content    VARCHAR2(20 CHAR)
);

CREATE TABLE personLikesPost
(
    idPerson NUMBER REFERENCES Person (id),
    idPost   NUMBER REFERENCES Post (id)
);

CREATE TABLE personKnowsPerson
(
    idPerson1 NUMBER REFERENCES Person (id),
    idPerson2 NUMBER REFERENCES Person (id)
);

CREATE PROPERTY GRAPH person_graph
  VERTEX TABLES (
    Person KEY (id) LABEL Person
      PROPERTIES (firstName, lastName, age, jsonProp),
    Post KEY (id) LABEL Post
      PROPERTIES(content)
  )
  EDGE TABLES (
    personLikesPost
      KEY(idPerson, idPost)
      SOURCE KEY (idPerson) REFERENCES Person (id)
      DESTINATION KEY (idPost) REFERENCES POST (id)
      LABEL Likes NO PROPERTIES,
    personKnowsPerson
      KEY(idPerson1, idPerson2)
      SOURCE KEY (idPerson1) REFERENCES Person (id)
      DESTINATION KEY (idPerson2) REFERENCES Person (id)
      LABEL Knows NO PROPERTIES
  );

insert into Person values (1, 'John', 'Doe',23, '{"key1":"value1","key2":"value2"}');
insert into Person values (2, 'Scott', 'Tiger', 25, '{"key1":"value3","key2":"value4"}');
insert into Person values (3, 'Max', 'Power', 27, '{"key1":"value5","key2":"value6"}');
insert into Person values (4, 'Jane', 'Doe', 22, '{"key1":"value7","key2":"value8"}');
insert into Person (id, Firstname, age) values (5, 'Hans', 23);
insert into Person (id, Firstname, age) values (6, 'Franz', 24);

INSERT INTO Post VALUES (10, 'Lorem ipsum...');
INSERT INTO Post VALUES (11, 'Nulla facilisi...');
INSERT INTO Post VALUES (12, 'Vestibulum eget ..');
INSERT INTO Post VALUES (13, 'Sed fermentum...');
INSERT INTO Post VALUES (14, 'Fusce at ...');
INSERT INTO Post VALUES (15, 'Pellentesque sit ...');
INSERT INTO Post VALUES (16, 'Integer...');
INSERT INTO Post VALUES (17, 'Curabitur luctus ...');
INSERT INTO Post VALUES (18, 'Nam in ...');
INSERT INTO Post VALUES (19, 'Etiam ac ...');

insert into personKnowsPerson values (1, 2);
insert into personKnowsPerson values (2, 3);
insert into personKnowsPerson values (3, 4);
insert into personKnowsPerson values (4, 5);
insert into personKnowsPerson values (5, 6);
insert into personKnowsPerson values (6, 2);
insert into personKnowsPerson values (5, 3);

INSERT INTO personLikesPost VALUES (1, 10);
INSERT INTO personLikesPost VALUES (1, 11);
INSERT INTO personLikesPost VALUES (1, 12);
INSERT INTO personLikesPost VALUES (2, 10);
INSERT INTO personLikesPost VALUES (2, 13);
INSERT INTO personLikesPost VALUES (2, 14);
INSERT INTO personLikesPost VALUES (3, 11);
INSERT INTO personLikesPost VALUES (3, 15);
INSERT INTO personLikesPost VALUES (3, 16);
INSERT INTO personLikesPost VALUES (4, 12);
INSERT INTO personLikesPost VALUES (4, 17);
INSERT INTO personLikesPost VALUES (4, 18);
INSERT INTO personLikesPost VALUES (5, 13);
INSERT INTO personLikesPost VALUES (5, 14);
INSERT INTO personLikesPost VALUES (5, 19);
INSERT INTO personLikesPost VALUES (6, 15);
INSERT INTO personLikesPost VALUES (6, 16);
INSERT INTO personLikesPost VALUES (6, 17);
INSERT INTO personLikesPost VALUES (1, 18);
INSERT INTO personLikesPost VALUES (2, 19);

commit;

Ejemplo: coincidencia de vértices sin etiquetas

Petición de datos: Find all the people IDs

SELECT person_id
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (v IS "PERSON")
    COLUMNS (VERTEX_ID(v) AS person_id))

Ejemplo: coincidencia de bordes sin etiquetas

Petición de datos: Find all the edge IDs

SELECT edge_id
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (v1) -[e]-> (v2)
    COLUMNS (EDGE_ID(e) AS edge_id))

Ejemplo: coincidencia de bordes con etiquetas

Petición de datos: Find all the knows relationship IDs

SELECT knows_id
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (p1 IS "PERSON") -[e IS "KNOWS"]-> (p2 IS "PERSON")
    COLUMNS (EDGE_ID(e) AS knows_id))

Ejemplo: coincidencia de patrones de ruta de acceso que incluyen uno o varios saltos

Petición de datos: List all people who know someone who liked the post 'Sed fermentum...'

SELECT person_id, person_firstname, person_lastname
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (p1 IS "PERSON") -[e1 IS "KNOWS"]-> (p2 IS "PERSON") -[e2 IS "LIKES"]-> (post IS "POST")
    WHERE UPPER(post."CONTENT") = UPPER('Sed fermentum...')
    COLUMNS (VERTEX_ID(p1) AS person_id, p1."FIRSTNAME" AS person_firstname, p1."LASTNAME" AS person_lastname))

Ejemplo: acceso a propiedades de vértice y perímetro

Petición de datos: Find first name and last name of all people

SELECT first_name, last_name
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (p IS "PERSON")
    COLUMNS (p."FIRSTNAME" AS first_name, p."LASTNAME" AS last_name))

Ejemplo: filtrado de datos

Petición de datos: Find post contents liked by John Doe

SELECT post_content
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (p IS "PERSON") -[e IS "LIKES"]-> (post IS "POST")
    WHERE UPPER(p."FIRSTNAME") = UPPER('John') AND UPPER(p."LASTNAME") = UPPER('Doe')
    COLUMNS (post."CONTENT" AS post_content))

Ejemplo: funciones y expresiones

Petición de datos: Show all people (full name) and display their key1 value from jsonProp property

SELECT person_fullname, json_key1
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (p IS "PERSON")
    COLUMNS (
	(p."FIRSTNAME" || ' ' || p."LASTNAME") AS person_fullname,
	JSON_QUERY(p."JSONPROP", '$.key1') AS json_key1
    )
)

Ejemplo: ordenación de datos

Petición de datos: Find friends of Scott Tiger ordered by their last name

SELECT friend_firstname, friend_lastname
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (p IS "PERSON") -[e IS "KNOWS"]-> (f IS "PERSON")
    WHERE UPPER(p."FIRSTNAME") = UPPER('Scott') AND UPPER(p."LASTNAME") = UPPER('Tiger')
    COLUMNS (f."FIRSTNAME" AS friend_firstname, f."LASTNAME" AS friend_lastname)
)
ORDER BY friend_lastname

Ejemplo: limitación de filas

Petición de datos: Find all people ordered by first name. Skip one result and return 2 results only

SELECT person_firstname
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (p IS "PERSON")
    COLUMNS (p."FIRSTNAME" AS person_firstname))
ORDER BY person_firstname
OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY

Consultas no admitidas

Para las siguientes consultas, determinados LLM generan NL2SQL válido, pero el SQL resultante utiliza funciones que aún no están soportadas en Oracle AI Database 26ai.

Ejemplo: consultas que requieren que no coincidan con un determinado patrón

Petición de datos: Find people that do not know Scott.

La subconsulta EXISTS no está soportada.

SELECT person_id, first_name, last_name
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (p1 IS "PERSON")
    WHERE NOT EXISTS (
	SELECT 1
	FROM GRAPH_TABLE("ADB_USER"."PERSONGRAPH"
	    MATCH (p2 IS "PERSON") -[e IS "PERSONKNOWSPERSON"]-> (p3 IS "PERSON"
)
	    WHERE p2."ID" = p1."ID" AND UPPER(p3."FIRSTNAME") = UPPER('Scott')
	    COLUMNS (1 AS dummy_value))
    )
    COLUMNS (p1."ID" AS person_id, p1."FIRSTNAME" AS first_name, p1."LASTNAME" A
S last_name))

Ejemplo: consultas que necesitan coincidir opcionalmente con un determinado patrón

Petición de datos: Show all people and how many posts they have liked (show people even if they have not liked a post).

No se admite la coincidencia OPTIONAL.

SELECT person_id, person_firstname, person_lastname, liked_post_ids
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
MATCH (p is "PERSON") OPTIONAL MATCH (p) -[l is "PERSONLIKESPOST"]-> (post is "POST")
COLUMNS(
    VERTEX_ID(p) as person_id,
    p."FIRSTNAME" as person_firstname,
    p."LASTNAME" as person_lastname,
    JSON_ARRAYAGG(VERTEX_ID(post)) as liked_post_ids
))

Ejemplo: patrones de ruta recursiva sin enlazar

Petición de datos: Find all people that Scott can reach.

Las consultas que utilizan cuantificadores no enlazados no están soportadas.

SELECT person_id, person_firstname, person_lastname
FROM GRAPH_TABLE("ADB_USER"."PERSONGRAPH"
    MATCH (src IS "PERSON") -[e IS "PERSONKNOWSPERSON"]->* (dst IS "PERSON")
    WHERE src."FIRSTNAME" = 'Scott'
    COLUMNS (
	VERTEX_ID(dst) AS person_id,
	dst."FIRSTNAME" AS person_firstname,
	dst."LASTNAME" AS person_lastname
    )
)

Consultas intermitentes

Se ha demostrado que los LLM tienen dificultades al traducir consultas que requieren más de un operador GRAPH_TABLE. A continuación se muestran algunos ejemplos:

Petición de datos: Show people who have liked all the same posts as Hans

SELECT person_id, person_name
FROM GRAPH_TABLE("PERSON_GRAPH"
  MATCH (hans is "PERSON") -[likes_hans is "PERSONLIKESPOST"]-> (post is "POST"),
	(other_person is "PERSON") -[likes_other is "PERSONLIKESPOST"]-> (post)
  WHERE hans."FIRSTNAME" = 'Hans'
  COLUMNS (VERTEX_ID(other_person) as person_id, other_person."FIRSTNAME" AS person_name)
)
WHERE NOT EXISTS (
  SELECT 1
  FROM GRAPH_TABLE("PERSONGRAPH"
    MATCH (hans is "PERSON") -[likes_hans is "PERSONLIKESPOST"]-> (post is "POST")
    WHERE hans."FIRSTNAME" = 'Hans'
    COLUMNS (VERTEX_ID(post) as post_id)
  ) hans_posts
  LEFT JOIN GRAPH_TABLE("PERSONGRAPH"
    MATCH (other_person is "PERSON") -[likes_other is "PERSONLIKESPOST"]-> (post
 is "POST")
    COLUMNS (VERTEX_ID(post) as post_id)
  ) other_posts
  ON hans_posts.post_id = other_posts.post_id
  WHERE other_posts.post_id IS NULL
)

Ejemplo: coincidencia de patrones de ruta recursiva con límites definidos.

Petición de datos: Find all names of the people that can be reached in a 1 to 3 edge path

SELECT person_name
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (start_person IS "PERSON") -[e IS "KNOWS"]->{1,3} (end_person IS "PERSON")
    COLUMNS (end_person."FIRSTNAME" AS person_name))

Ejemplo: filtrado de datos para nodos a lo largo de una ruta recursiva

Petición de datos: Find all names of the people that can be reached in a 1 to 3 edge path where each person is younger than the next one

SELECT person_name
FROM GRAPH_TABLE("ADB_USER"."PERSON_GRAPH"
    MATCH (start_person IS "PERSON") ((v1 IS "PERSON") -[e IS "KNOWS"]-> (v2 IS"PERSON") WHERE v1."AGE" < v2."AGE"){1,3} (end_person IS "PERSON")
    COLUMNS (end_person."FIRSTNAME" AS person_name))

Ejemplo: agrupación y agregación

Los LLM a menudo tienen dificultades para traducir consultas que requieren agrupación y agregación. Un error común es colocar agregaciones en la cláusula COLUMNS en lugar de en la cláusula SELECT.

Petición de datos: Find the average number of posts liked by all the users

SELECT AVG(COUNT(post)) AS average_liked_count
FROM GRAPH_TABLE("PERSON_GRAPH"
MATCH (p IS "PERSON") -[e IS "PERSONLIKESPOST"]-> (post IS "POST")
COLUMNS (VERTEX_ID(p) AS person, VERTEX_ID(post) AS post))
GROUP BY person;

Ejemplo: Mejora de la Generación de Consultas SQL

Estos ejemplos muestran cómo los comentarios, las anotaciones, la clave ajena y las restricciones de integridad referencial en las tablas y columnas de la base de datos pueden mejorar la generación de consultas SQL a partir de peticiones de datos en lenguaje natural.

Ejemplo: Mejora de la Generación de SQL con Comentarios de Tabla y Columna

Si tiene comentarios de tabla y columna en las tablas de la base de datos, active el parámetro "comments":"true" en la función DBMS_CLOUD_AI.CREATE_PROFILE para recuperar comentarios de nivel de tabla y de columna. Los comentarios se agregan a los metadatos del LLM para una mejor generación de SQL.

-- Adding comments to table 1, table 2, and table 3. Table 1 has 3 columns, table 2 has 7 columns, table 3 has 2 columns.

-- TABLE1
COMMENT ON TABLE table1 IS 'Contains movies, movie titles and the year it was released';
COMMENT ON COLUMN table1.c1 IS 'movie ids. Use this column to join to other tables';
COMMENT ON COLUMN table1.c2 IS 'movie titles';
COMMENT ON COLUMN table1.c3 IS 'year the movie was released';
-- TABLE2
COMMENT ON TABLE table2 IS 'transactions for movie views - also known as streams';
COMMENT ON COLUMN table2.c1 IS 'day the movie was streamed';
COMMENT ON COLUMN table2.c2 IS 'genre ids. Use this column to join to other tables';
COMMENT ON COLUMN table2.c3 IS 'movie ids. Use this column to join to other tables';
COMMENT ON COLUMN table2.c4 IS 'customer ids. Use this column to join to other tables';
COMMENT ON COLUMN table2.c5 IS 'device used to stream, watch or view the movie';
COMMENT ON COLUMN table2.c6 IS 'sales from the movie';
COMMENT ON COLUMN table2.c7 IS 'number of views, watched, streamed';

-- TABLE3
COMMENT ON TABLE table3 IS 'Contains the genres';
COMMENT ON COLUMN table3.c1 IS 'genre id. use this column to join to other tables';
COMMENT ON COLUMN table3.c2 IS 'name of the genre';


BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name => 'myprofile',
    attributes =>
        '{"provider": "azure",
          "azure_resource_name": "my_resource",
          "azure_deployment_name": "my_deployment",
          "credential_name": "my_credential",
          "comments":"true",
          "object_list": [
            {"owner": "moviestream", "name": "table1"},
            {"owner": "moviestream", "name": "table2"},
            {"owner": " moviestream", "name": "table3"}
          ]
          }'
    );

    DBMS_CLOUD_AI.SET_PROFILE(
        profile_name => 'myprofile'
    );

END;
/
--Prompts
select ai what are our total views;
RESPONSE
-------------------------------------------------
TOTAL_VIEWS
-----------
   97890562
select ai showsql what are our total views;
RESPONSE
-------------------------------------------------------------------------
SELECT SUM(QUANTITY_SOLD) AS total_views
FROM "moviestream"."table"
select ai what are our total views broken out by device;
DEVICE                     TOTAL_VIEWS
-------------------------- -----------
mac                           14719238
iphone                        20793516
ipad                          15890590
pc                            14715169
galaxy                        10587343
pixel                         10593551
lenovo                         5294239
fire                           5296916

8 rows selected.
select ai showsql what are our total views broken out by device;
RESPONSE
---------------------------------------------------------------------------------------
SELECT DEVICE, COUNT(*) AS TOTAL_VIEWS
FROM "moviestream"."table"
GROUP BY DEVICE

Ejemplo: Mejora de la Generación de Consultas SQL con Anotaciones de Tabla y Columna

En este ejemplo se muestra la integración de anotaciones en Select AI, aplicable en Oracle Database 23ai. Las anotaciones se agregan a los metadatos que se envían al LLM.

Si tiene una tabla con anotaciones en el esquema, active "annotations":"true" en la función DBMS_CLOUD_AI.CREATE_PROFILE para indicar a Select AI que agregue anotaciones a los metadatos.

--
-- Annotations
--

CREATE TABLE emp2 (
    empno NUMBER,
    ename VARCHAR2(50) ANNOTATIONS (display 'lastname'),
    salary NUMBER ANNOTATIONS ("person_salary", "column_hidden"),
    deptno NUMBER ANNOTATIONS (display 'department')
)ANNOTATIONS (requires_audit 'yes', version '1.0', owner 'HR Organization');
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
   profile_name => 'GOOGLE_ANNOTATIONS',
   attributes   => '{"provider": "google",
      "credential_name": "GOOGLE_CRED",
      "object_list": [{"owner": "ADB_USER", "name": "emp2"}],
      "annotations" : "true"
      }');
END;
/
EXEC DBMS_CLOUD_AI.SET_PROFILE('GOOGLE_ANNOTATIONS');

Ejemplo: Mejora de la Generación de Consultas SQL con Restricciones de Clave Ajena y Clave Referencial

En este ejemplo, se muestra la capacidad del LLM para generar condiciones JOIN precisas mediante la recuperación de las restricciones de clave ajena y clave referencial en los metadatos del LLM. Las restricciones de clave ajena y clave referencial proporcionan datos de relación estructurada entre las tablas y el LLM.

Active "constraints":"true" en la función DBMS_CLOUD_AI.CREATE_PROFILE para que Select AI recupere la clave ajena y la clave referencial.

--
-- Referential Constraints
--
CREATE TABLE dept_test (
    deptno NUMBER PRIMARY KEY,
    dname VARCHAR2(50)
);
CREATE TABLE emp3 (
    empno NUMBER PRIMARY KEY,
    ename VARCHAR2(50),
    salary NUMBER,
    deptno NUMBER,
    CONSTRAINT emp_dept_fk FOREIGN KEY (deptno) REFERENCES dept_test(deptno)
);
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name=>'GOOGLE_CONSTRAINTS',
    attribues   =>'{"provider": "google",
      "credential_name": "GOOGLE_CRED",
      "object_list": [{"owner": "ADB_USER", "name": "dept_test"},
                      {"owner": "ADB_USER", "name": "emp3"}],
      "constraints" : "true"
      }');
END;
/
EXEC DBMS_CLOUD_AI.SET_PROFILE('GOOGLE_CONSTRAINTS');

Ejemplo: detección automática de metadatos de tablas relevantes

En estos ejemplos se muestra cómo Select AI detecta automáticamente las tablas relevantes y envía metadatos solo para las tablas específicas relevantes para la consulta en Oracle Database 23ai. Para activar esta función, defina object_list_mode en automated. Esto crea automáticamente un índice vectorial denominado <profile_name>_OBJECT_LIST_VECINDEX. El índice vectorial se inicializa con atributos y valores por defecto, como refresh_rate, similarity_threshold y match_limit. Puede modificar algunos de los atributos mediante DBMS_CLOUD_AI.UPDATE_VECTOR_INDEX. Consulte Procedimiento UPDATE_VECTOR_INDEX para obtener más información.

Un perfil está configurado para utilizar object_list para especificar el esquema o los objetos del esquema, mientras que el otro no especifica object_list. Sin embargo, se espera la misma construcción SQL.

Revise los requisitos previos para Select AI para proporcionar acceso al paquete DBMS_CLOUD_AI y proporcionar acceso de red al proveedor de AI.

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name=>'OCI_AUTO',
    attributes=>'{"provider": "oci",
      "credential_name": "GENAI_CRED",
      "object_list": [{"owner": "SH"}],
      "oci_compartment_id": "ocid1.compartment.oc1..aaaa...",
      "model" : "meta.llama-3.3-70b-instruct"
      }');
END;
/
EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_AUTO');
select ai showsql how many customers in San Francisco are married;
RESPONSE
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT COUNT(DISTINCT c."CUST_ID") AS "NUMBER_OF_CUSTOMERS"
FROM "SH"."CUSTOMERS" c
WHERE UPPER(c."CUST_CITY") = UPPER('San Francisco')
AND UPPER(c."CUST_MARITAL_STATUS") = UPPER('married')

En el siguiente ejemplo se compara el mismo escenario sin utilizar object_list. Si no especifica object_list, Select AI selecciona automáticamente todos los objetos disponibles para el esquema actual.

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name=>'OCI_AUTO1',
    attributes=>'{"provider": "oci",
      "credential_name": "GENAI_CRED",
      "oci_compartment_id": "ocid1.compartment.oc1..aaaa...",
      "object_list_mode": "automated",
      "model" : "meta.llama-3.3-70b-instruct"
      }');
END;
/
EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_AUTO1');
select ai showsql how many customers in San Francisco are married?;
RESPONSE
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT COUNT(c."CUST_ID") AS "Number_of_Customers"
FROM "SH"."CUSTOMERS" c
WHERE UPPER(c."CUST_CITY") = UPPER('San Francisco')
AND UPPER(c."CUST_MARITAL_STATUS") = UPPER('Married')

Ejemplo: Seleccionar resumen de IA

En estos ejemplos se muestra cómo utilizar la acción summarize y la función DBMS_CLOUD_AI.SUMMARIZE. Además, personalice la generación de resumen para el contenido mediante la función.

Ejemplo: Uso de la Acción Resumir en la Línea de Comandos SQL

En el siguiente ejemplo, se utiliza SUMMARIZE como acción Seleccionar AI. Utilice SELECT AI SUMMARIZE <TEXT> en la línea de comandos SQL para generar un resumen del texto de entrada.

SELECT AI SUMMARIZE
Like countless other people around the globe, I stream music, and like more than six hundred million of them I mainly use Spotify. Streaming currently accounts for about eighty per cent of the American recording industry's revenue, and in recent years Spotify's health is often consulted as a measure for the health of the music business over all. Last spring, the International
Federation of the Phonographic Industry reported global revenues of $28.6 billion, making for the ninth straight year of growth. All of this was unimaginable in the two-thousands, when the major record labels appeared poorly equipped to deal with piracy and the so-called death of physical media. On the consumer side, the story looks even rosier. Adjusted for inflation, a ... (skipped 1000 rows in the middle)
Pelly writes of some artists, in search of viral fame, who surreptitiously use social media to effectively beta test melodies and motifs, basically putting together songs via crowdsourcing. Artists have always fretted about the pressure to conform, but the data-driven, music-as-content era feels different. "You are a Spotify employee at that point," Daniel Lopatin, who makes abstract electronic music as Oneohtrix Point Never, told Pelly. "If your art practice is so ingrained in the brutal reality that Spotify has outlined for all of us, then what is the music that you're not making? What does the music you're not making sound like?" Listeners might wonder something similar. What does the music we're not hearing sound like?;
RESPONSE
------------------------------------------------------------------------------
The music streaming industry, led by Spotify, has revolutionized the way people consume music, with streaming accounting for 80% of the American recording industry's revenue. However, this shift has also complicated the lives of artists, who struggle to survive in a hyper-abundant present where music is often valued for its convenience rather than its artistic merit.
Spotify's algorithms prioritize popularity and profitability over artistic diversity, leading to a homogenization of music and a devaluation of the labor that goes into creating it. Meanwhile, the company's executives reap enormous profits, with CEO Daniel Ek's net worth rivaling that of the wealthiest musicians. As music critic Liz Pelly argues, the streaming economy raises important questions about autonomy, creativity, and the value of art
in a world where everything is readily available and easily accessible.

Consejo: en SQL*Plus, una comilla simple (') se trata como un delimitador de cadena. Si el texto contiene comillas simples, escape la comilla duplicándola (' a '') o delimite el texto mediante el mecanismo de comillas q'[]'. Si el texto contiene comillas dobles vacías (""), delimite el texto mediante el mecanismo q'[]'. Por ejemplo:

SELECT AI SUMMARIZE q'[this's a text]';

Ejemplo: Uso del Procedimiento DBMS_CLOUD_AI.SUMMARIZE para Generar un Resumen

Estos ejemplos muestran la generación de un resumen mediante el uso de diferentes parámetros del procedimiento DBMS_CLOUD_AI.SUMMARIZE.

Puede generar un resumen a partir de más de 3000 palabras almacenadas en un almacenamiento de objetos de OCI especificando el enlace de almacenamiento de objetos como parámetro location_uri y las credenciales de su cuenta en la nube como credential_name mediante DBMS_CLOUD_AI.SUMMARIZE

SELECT DBMS_CLOUD_AI.SUMMARIZE(
                location_uri => 'https://objectstorage.ca-toronto-1.oraclecloud.com/n/' ||
                    'namespace-string/b/bucketname/o/data_folder/' ||
                    'summary/test_4000_words.txt',
                credential_name => 'STORE_CRED',
                profile_name => 'GENAI')
from DUAL;

Otra forma de generar un resumen a partir de un texto almacenado en un almacenamiento de objetos de OCI es mediante el parámetro content para llamar al procedimiento DBMS_CLOUD.GET_OBJECT.

SELECT DBMS_CLOUD_AI.SUMMARIZE(
                content => TO_CLOB(
                            DBMS_CLOUD.GET_OBJECT(
                                credential_name => 'STORE_CRED',
                                location_uri => 'https://objectstorage.ca-toronto-1.oraclecloud.com/n/' ||
                    'namespace-string/b/bucketname/o/data_folder/' ||
                    'summary/test_4000_words.txt')),
                profile_name => 'GENAI'>)
from DUAL;

Ejemplo: generación de un resumen mediante la especificación de peticiones de datos de usuario, palabras mínimas y palabras máximas

El siguiente ejemplo muestra cómo generar un resumen de un texto de más de 3000 palabras especificando los siguientes parámetros:

SELECT DBMS_CLOUD_AI.SUMMARIZE(
                content => TO_CLOB(
                             DBMS_CLOUD.GET_OBJECT(
                             credential_name =>'STORE_CRED',
                             location_uri =>'https://objectstorage.ca-toronto-1.oraclecloud.com/n/' ||
                                   'namespace-string/b/bucketname/o/data_folder/' ||
                                   'summary/test_4000_words.txt')),
                profile_name    => 'GENAI',
                user_prompt     => 'The summary should start with ''The summary of ' ||
                                   'the article is: ''',
                params          => '{"min_words":50,"max_words":100}')
As response FROM dual;
RESPONSE
--------------------------------------------------------------------------------
The summary of the article is: The music streaming industry, led by Spotify, has revolutionized the way people consume music, with streaming accounting for about eighty per cent of the American recording industry's revenue. However, this shift has also raised concerns about the impact on artists, with many struggling to make a living due to low royalty rates and the dominance of playlists. The article explores the history of music streaming, from the early days of Napster to the current landscape, and how it has changed the way people listen to music. It also delves into the issues of autonomy and creativity in the music industry, with some artists feeling pressured to conform to certain styles or formulas to succeed on platforms like Spotify. The article cites examples of artists who have spoken out against the streaming economy, including Taylor Swift and Neil Young, and discusses the rise of alternative platforms like Bandcamp and Nina. Ultimately, the article suggests that the streaming economy has created a perverse vision for art, where music is valued for its ability to be ignored rather than appreciated, and that this has significant implications for the future of music and creativity. With the rise of AI-generated music and the increasing importance of data-driven decision making in the music industry, the article asks what the m
usic we're not hearing sounds like, and what the consequences of this shift will be for artists and listeners alike. The article concludes by highlighting the need for a more nuanced understanding of the music industry and the impact of streaming on artists and listeners, and for alternative models that prioritize creativity and autonomy over profit and convenience.

Ejemplo: Generación de un Resumen Especificando Petición de Datos de Usuario, Máximo de Palabras y Estilo de Resumen

El siguiente ejemplo muestra cómo generar un resumen de un texto de más de 12000 palabras especificando los siguientes parámetros:

SELECT DBMS_CLOUD_AI.SUMMARIZE(
                location_uri    => 'https://objectstorage.ca-toronto-1.' ||
                                   'oraclecloud.com/n/namespace-string/b/' ||
                                   '/bucketname/o/data_folder/' ||
                                   'summary/dreams.txt',
                credential_name => 'STORE_CRED',
                profile_name    => 'GENAI',
                user_prompt     => 'The summary should start with ''The summary of ' ||
                                   'the article is: ''',
                params          => '{"max_words":100, "summary_style":"list"}')
As response FROM dual;
RESPONSE
--------------------------------------------------------------------------------
The summary of the article is:
- The book "Dreams" by Henri Bergson explores the concept of dreams and their significance in understanding human consciousness.
- Bergson argues that dreams are not just random thoughts, but rather a way for our unconscious mind to process and consolidate memories.
- He suggests that dreams are a result of the relaxation of our mental faculties, which allows our unconscious mind to freely associate and create new connections between memories.
- The book also discusses the role of sensations, such as visual and auditory impressions, in shaping our dreams.
- Bergson's theory of dreams is compared to other theories, including those of Freud and Jung, and is seen as a unique and insightful contribution to the field of psychology.
- The book concludes by highlighting the importance of studying dreams in order to gain a deeper understanding of human consciousness and the workings of the mind.

Ejemplo: generación de un resumen de un libro

En este ejemplo, se muestra la transferencia de un archivo de 35,66 MiB como entrada para generar un resumen. La función DBMS_CLOUD_AI.SUMMARIZE utiliza un método de acotación iterativo para procesar los fragmentos. Consulte Select AI Terminology para obtener más información.

SELECT DBMS_CLOUD_AI.SUMMARIZE(
       location_uri    => 'https://objectstorage.ca-toronto-1.oraclecloud.com/n/namespace-string/b/' ||
                          'bucketname/o/data_folder/summary/Descartes_An_Intellectual_Biography.pdf',
       credential_name => 'STORE_CRED',
       profile_name    => 'GENAI',
       params          =>  '{"chunk_processing_method":"iterative_refinement"}')
AS response FROM dual;
RESPONSE
--------------------------------------------------------------------------------
Stephen Gaukroger's intellectual biography of Rene Descartes provides a detailed  examination of the philosopher's crucial role in shaping modern thought, placing him within the cultural, religious, and scientific context of the early seventeenth century. It traces Descartes' intellectual journey from his education at La Fleche, where he rejected Aristotelian logic, to his influential interactions with figures like Isaac Beeckman, which shaped his mechanistic worldview evident in works like his hydrostatics manuscript and *Compendium Musicae*. The biography underscores Descartes' dual commitment to philosophy and science, highlighting his social status among the gentry, mathematical innovations such as solving the Pappus problem through algebraic geometry, and his epistemology based on clear and distinct ideas. It explores his mechanistic explanations of bodily functions, challenging traditional soul-body distinctions, and his extensive natural philosophy in texts like *Le Monde* and *L'Homme*. Gaukroger also delves into Descartes' cosmological theories, including the vortex theory and laws of motion linked to divine immutability, as well as his nuanced perspectives on animal cognition versus human consciousness. Central to the narrative is Descartes' use of hyperbolic doubt to combat skepticism and establish metaphysical foundations through the *cogito*, alongside his classification of ideas and theological proofs of God's existence. The complex relationship between his natural philosophy and metaphysics, especially in defining motion as a mode, and his innovative approach to the passions in *Passions of the Soul*, rejecting Stoic views for a mind-body union, are key themes. This portrayal captures Descartes' struggle with traditional paradigms during a transformative era, emphasizing his enduring impact on p
hilosophy and science.

Ejemplo: Seleccionar traducción de IA

En estos ejemplos se muestra cómo puede utilizar la capacidad translate.

Para utilizar la función Seleccionar traducción de IA, debe tener los permisos de política de IAM adecuados para acceder a los servicios de Oracle Cloud Infrastructure Language.

Otorgue el permiso para utilizar el recurso ai-service-language-family en la política de IAM. Una sentencia de política de ejemplo para otorgar permiso a un grupo de usuarios en un compartimento específico es:

allow group <your group name> to use ai-service-language-family in compartment <your_compartment>

Un grupo dinámico identifica recursos como bases de datos o funciones mediante la coincidencia de sus OCID o etiquetas, mientras que un grupo de usuarios contiene usuarios individuales de IAM.

Utilizar un grupo dinámico cuando la política se aplique a recursos de OCI y utilizar un grupo de usuarios cuando la política se aplique a usuarios humanos. Para obtener más información sobre los pasos para crear grupos dinámicos y de usuarios, consulte Gestión de grupos Dymanic.

Consulte Políticas de idioma para obtener más información.

Ejemplo: Uso de la Acción Translate en la Línea de Comandos SQL

En el siguiente ejemplo se muestra el uso de la acción translate en la línea de comandos SQL.

Nota: El perfil de AI debe especificar el idioma de destino. Esta capacidad solo está soportada para el proveedor OCI.

--Create an AI profile with language parameters
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
      profile_name =>'GENAI_NEW',
      attributes   =>'{"provider": "oci",
        "credential_name": "GENAI_CRED",
		"target_language": "french",
		"object_list": [{"owner": "SH", "name": "customers"},
                        {"owner": "SH", "name": "countries"},
                        {"owner": "SH", "name": "supplementary_demographics"},
                        {"owner": "SH", "name": "profits"},
                        {"owner": "SH", "name": "promotions"},
                        {"owner": "SH", "name": "products"}]
       }');
END;
/
exec DBMS_CLOUD_AI.SET_PROFILE('GENAI_NEW');
select ai translate I need to translate this;
RESPONSE
---------------------
Je dois traduire ceci

Ejemplo: uso de conversión en la función DBMS_CLOUD_AI.GENERATE

Los siguientes ejemplos muestran el uso de translate como una acción Select AI dentro de la función DBMS_CLOUD_AI.GENERATE. Consulte GENERATE Function para obtener más información.

Nota: El perfil AI puede omitir la especificación del parámetro de idioma de destino si se transfiere como atributo en DBMS_CLOUD_AI.GENERATE.

La acción translate se proporciona en la función DBMS_CLOUD_AI.GENERATE junto con target_language y source_language. En este ejemplo, se utiliza la traducción de IA generativa. El texto de entrada this is a document en inglés (source_language: "en") se traduce al francés (target_language: "fr").

SELECT DBMS_CLOUD_AI.GENERATE('select ai translate text to be translated')
          FROM dual;

      DECLARE
         l_attributes  clob := '{"target_language": "fr", "source_language": "en"}';
         output clob;
      BEGIN
         output := DBMS_CLOUD_AI.GENERATE(
                        prompt            => 'this is a document',
                        profile_name      => 'oci_translate',
                        action            => 'translate',
                        attributes        => l_attributes
                     );

Ejemplo: uso de la función DBMS_CLOUD_AI.TRANSLATE para traducción

En este ejemplo, se llama a la función DBMS_CLOUD_AI.TRANSLATE para utilizar la traducción de IA generativa y se convierte el texto de entrada del inglés (source_language) al francés (target_language) mediante el perfil de IA especificado.

Consulte Función TRANSLATE para obtener más información.

BEGIN
   output_text := DBMS_CLOUD_AI.TRANSLATE(
   profile_name    => 'GENAI_NEW'
   text            => 'text to be translated',
   source_language => 'English',
   target_language => 'French');
END;
/

Ejemplo: visualización de idiomas admitidos para un proveedor

Consulte la vista AI_TRANSLATION_LANGUAGES para ver una lista de los idiomas que soporta el proveedor de IA. Consulte la vista AI_TRANSLATION_LANGUAGES para obtener más información.

SELECT* FROM AI_TRANSLATION_LANGUAGES;
LANGUAGE_NAME        LANGUAGE_CODE        PROVIDER
-------------------- -------------------- ---------------
ARABIC               ar                   OCI
CROATIAN             hr                   OCI
CZECH                cs                   OCI
DANISH               da                   OCI
GERMAN               de                   OCI
GREEK                el                   OCI
ENGLISH              en                   OCI
SPANISH              es                   OCI
FINNISH              fi                   OCI
FRENCH               fr                   OCI
FRENCH CANADA        fr-CA                OCI
HEBREW               he                   OCI
HUNGARIAN            hu                   OCI
ITALIAN              it                   OCI

Contenido relacionado