viernes, 27 de octubre de 2023

Utilizando Select AI para generar sentencias SQL a través de indicaciones de Lenguaje Natural - con código del laboratorio.

La combinación de modelos de lenguaje grande (LLM) de IA generativa con Oracle SQL le permite describir lo que desea ( intención declarativa ) y dejar que la base de datos genere la consulta SQL relevante para su esquema. Algunos LLM pueden ser buenos para generar SQL, pero poder ejecutar ese SQL en su base de datos es otra cuestión. Select AI permite generar SQL que es específico para la base de datos.


Código del laboratorio.

select credential_name,
       username,
       enabled
from   user_credentials
order by credential_name;

select dbms_cloud.get_metadata(
         credential_name => 'OPENAI_CRED',
         object_uri      => 'api.openai.com') as metadata
from dual;

select table_name from dba_tables where owner='SH'

select * from sh.sales;

select sum(amount_sold) from sh.sales
where time_id < '01/01/00'

BEGIN  
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
         host => 'api.openai.com',
         ace  => xs$ace_type(privilege_list => xs$name_list('http'),
                             principal_name => 'ADMIN',
                             principal_type => xs_acl.ptype_db)
   );
END;
/

BEGIN  
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
         host => 'api.openai.com',
         ace  => xs$ace_type(privilege_list => xs$name_list('http'),
                             principal_name => 'SH',
                             principal_type => xs_acl.ptype_db)
   );
END;
/

BEGIN

 DBMS_CLOUD.DROP_CREDENTIAL (
   credential_name  => 'OPENAI_CRED');
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'OPENAI_CRED',
    username => 'ronald.vargas.quesada@gmail.com',
    password => 'sk-Vvtj**************bkFJKOxqW*******DXYHD1bG' );
END;
/


BEGIN
DBMS_CLOUD_AI.drop_profile(profile_name => 'OPENAI');
  DBMS_CLOUD_AI.create_profile(
      profile_name => 'OPENAI',
      attributes => '{"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;
/

BEGIN
  DBMS_CLOUD_AI.SET_PROFILE(
     profile_name => 'OPENAI'
  );
END;
/


SELECT AI how many customers in San Francisco are married


SELECT AI runsql cuantos clientes en San Francisco están casados

SELECT AI showsql cuantos clientes en San Francisco están casados

SELECT COUNT(*) AS total_clients_married
FROM SH.CUSTOMERS c
WHERE c.CUST_CITY = 'San Francisco'
AND c.CUST_MARITAL_STATUS = 'Married'


select * from sh.products

SELECT AI Cual es el nombre del producto para el id 19

select * from sh.sales

SELECT AI Cual es el monto de ventas del producto id 14 agrupado por el nombre del producto

SELECT AI cual es el cliente que más compras ha realizado

SELECT AI cual es la suma total de compras que ha hecho el cliente Heather Tucker

select sum(amount_sold) from sh.sales
where time_id < '01/01/00'

SELECT AI Cual es el monto en ventas previo al cambio de milenio.

select * from sh.customers

select count(*) from sh.customers

SELECT AI Cuantos clientes nacieron en los 2 años posteriores al fin de la segunda guerra mundial


SELECT AI Cuantos clientes nacieron en los 2 años posteriores al fin de 
la segunda guerra mundial agrupados por año

"Sorry, unfortunately a valid SELECT statement could not be generated for your natural language prompt. Here is some more information to help you further: 

Para responder a esta pregunta, necesitaríamos tener acceso a una tabla que contenga la información de los clientes, incluyendo su fecha de nacimiento. Supongamos que tenemos una tabla llamada "clientes" con las siguientes columnas:

- id_cliente (identificador único del cliente)
- nombre (nombre del cliente)
- fecha_nacimiento (fecha de nacimiento del cliente)

Podemos utilizar la función EXTRACT para extraer el año de la fecha de nacimiento y luego agrupar los resultados por año. La consulta sería la siguiente:

```sql
SELECT EXTRACT(YEAR FROM fecha_nacimiento) AS año, COUNT(*) AS cantidad_clientes
FROM clientes
WHERE EXTRACT(YEAR FROM fecha_nacimiento) BETWEEN 1946 AND 1947
GROUP BY EXTRACT(YEAR FROM fecha_nacimiento)
ORDER BY EXTRACT(YEAR FROM fecha_nacimiento);
```

Esta consulta contará la cantidad de clientes que nacieron entre los años 1946 y 1947, agrupados por año de nacimiento. Los resultados se mostrarán en orden ascendente por año."
Para responder a esta pregunta, necesitaríamos tener acceso a una tabla que 
contenga información sobre los clientes, incluyendo su fecha de nacimiento. 
Supongamos que tenemos una tabla llamada "clientes" con las siguientes columnas:

- id_cliente (identificador único del cliente)
- nombre (nombre del cliente)
- fecha_nacimiento (fecha de nacimiento del cliente)

Podemos utilizar la función EXTRACT para extraer el año de la fecha de nacimiento y 
luego agrupar los resultados por año. La consulta sería la siguiente:

```sql
SELECT EXTRACT(YEAR FROM fecha_nacimiento) AS año, COUNT(*) AS cantidad_clientes
FROM clientes
WHERE EXTRACT(YEAR FROM fecha_nacimiento) BETWEEN 1946 AND 1947
GROUP BY EXTRACT(YEAR FROM fecha_nacimiento)
ORDER BY EXTRACT(YEAR FROM fecha_nacimiento);
```

Esta consulta contará la cantidad de clientes que nacieron entre los años 1946 y 1947, 
agrupados por año de nacimiento. 
Los resultados se mostrarán en orden ascendente por año."

SELECT AI Cuanto fue la suma de ventas realizadas por clientes que nacieron en los 
2 años posteriores al fin de la segunda guerra mundial.

select * from sh.sales
select * from sh.customers


select sum(amount_sold) from sh.sales
where cust_id in (
select cust_id from sh.customers where 
cust_year_of_birth between 1946 and 1947)

select max(cust_year_of_birth) from sh.customers

SELECT AI showsql Cuantos clientes nacieron posterior a la caida del muro de Berlin

select count(cust_year_of_birth) from sh.customers
where cust_year_of_birth > 1989

SELECT AI narrate Cuál es el producto más vendido por los clientes que nacieron 
posterior a la caida del muro de Berlin

SELECT AI showsql
Cuántos clientes nacieron en el año de estreno de la película Volver al futuro I

select count(*) from sh.customers
where cust_year_of_birth = 1985

SELECT AI Cual es el monto de los productos vendidos por aquellos clientes que nacieron
en el mismo año de la publicación del primer video en youtube.

SELECT AI narrate Cual es el monto de los productos vendidos por aquellos clientes que nacieron
en el mismo año de la publicación del primer video en youtube.

select count(*) from sh.customers
where cust_year_of_birth = 2005

SELECT AI Cuantos clientes nacieron en el mismo cuando en que se creó el teléfono celular.


select count(*) from sh.customers
where cust_year_of_birth = 1973

SELECT AI chat
Quien es Larry Ellison el CEO de Oracle

"Sorry, unfortunately a valid SELECT statement could not be generated for your natural language prompt. Here is some more information to help you further: 

Larry Ellison es el cofundador y presidente ejecutivo de Oracle Corporation. Es conocido por ser uno de los empresarios más exitosos en la industria de la tecnología. 
Ellison ha estado al frente de Oracle desde su fundación en 1977 y ha desempeñado un papel fundamental en el crecimiento y éxito de la empresa. Bajo su liderazgo, Oracle se ha convertido en una de las compañías de software más grandes y reconocidas a nivel mundial."



set serveroutput on;
declare
    l_prompt varchar2(4000) := 'Cual es el monto de los productos vendidos por aquellos clientes que nacieron
en el mismo año de la publicación del primer video en youtube.?';
    l_response clob;
    l_profile_name varchar2(100) := 'openai_gpt35';
begin
    l_response := dbms_cloud_ai.generate(
                    prompt          => l_prompt,
                    profile_name    => l_profile_name,
                    action          => 'showsql'                    
                );
    dbms_output.put_line(l_response);
end; 

set serveroutput on;
declare
    l_prompt varchar2(4000) := 'Cual es el monto de los productos vendidos por aquellos clientes que nacieron
en el mismo año de la publicación del primer video en youtube.?';
    l_response clob;
    l_profile_name varchar2(100) := 'OPENAI';
begin
    l_response := dbms_cloud_ai.generate(
                    prompt          => l_prompt,
                    profile_name    => l_profile_name,
                    action          => 'showsql'                    
                );
    dbms_output.put_line(l_response);
end; 

SELECT SUM(s.AMOUNT_SOLD) AS MONTO_VENDIDO
FROM SH.SALES s
JOIN SH.CUSTOMERS c ON s.CUST_ID = c.CUST_ID
WHERE c.CUST_YEAR_OF_BIRTH = EXTRACT(YEAR FROM TO_DATE('23-04-2005', 'DD-MM-YYYY'))


El producto más vendido por los clientes que nacieron posterior a la caída del muro de Berlín es el "Model A3827H Black Image Cartridge", 
con un total de 20 ventas.

No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM

Optimismo para una vida Mejor

Optimismo para una vida Mejor
Noticias buenas que comentar