Notice: La función wp_enqueue_script ha sido llamada de forma incorrecta. Los scripts y estilos no se deberían registrar o poner en cola hasta que se carguen los ganchos wp_enqueue_scripts, admin_enqueue_scripts y login_enqueue_scripts. Este aviso ha sido activado por la gestión de nfd_wpnavbar_setting. Por favor, ve depuración en WordPress para más información. (Este mensaje fue añadido en la versión 3.3.0). in /home1/spotsail/public_html/martra/wp-includes/functions.php on line 6078
Montamos un sistema NL2SQL con Azure OpenAI Studio. – Pere Martra
No se han encontrado widgets en la barra lateral

En el artículo anterior, aprendimos a montar un prompt que era capaz de generar órdenes SQL desde peticiones realizadas en lenguaje natural por parte del Usuario.

Ahora veremos como utilizar Azure OpenAI Studio para crear un punto de inferencia al que podamos llamar y crear las órdenes SQL.

Aunque posiblemente si estáis leyendo estas líneas ya cumpláis los requisitos, os recuerdo que es necesario disponer de:

  • Una suscripción a Azure. Es gratuita y si la dais de alta por primera vez vendrá con unos créditos gratuitos. Crear subscripción Azure.
  • Acceso a los recursos de OpenAI. Por ahora Microsoft aún los mantiene bajo petición. Pero se han rebajado mucho los requisitos y el tiempo de espera. El formulario da más miedo de lo que debería. Yo pedi acceso usando el mail de un dominio que tengo registrado, he indicado que quería información para hacer un curso. Me dieron acceso casi de inmediato. Pedir acceso a Azure OpenAI Studio.

Lo más posible es que en breve desaparezca la necesidad de pedir acceso, así que, yo probaría igualmente, aunque no hayáis tramitado el permiso.

Configurando Azure OpenAI Studio.

Podemos acceder directamente desde el portal de azure: https://portal.azure.com/#home

Una vez dentro en servicios tenemos que seleccionar Azure AI Services.

Entramos en Azure OpenAI Account.

En esta pantalla tenemos que escoger la Suscripción. Si tenéis una de estudiante, lo más posible es que no funcione. Cread otra.

Como resource-group, yo crearía uno nuevo. Ponedle el nombre que queráis. Es tan solo una agrupación lógica que mantendrá todos los recursos bajo un mismo grupo. De esta forma eliminando el grupo elimináis todos los recursos creados, sin afectar a ningún otro recurso. Ya que se trata de tan solo un proyecto temporal, es bueno eliminarlo para que no conlleve ningún coste.

En Region, yo escogería la más cercana a vuestra zona. Azure tan solo os muestra las regiones que tienen los OpenAI Services disponibles.

En Name un nombre único para el proyecto.

En Pricing Tier, escoged Standard S0. Posiblemente, sea la única opción que tengáis.

Con esto ya podemos pulsar el botón Review+Create, os mostrará los datos, los validáis, y ya podemos empezar a disfrutar.

La configuración tarda unos pocos minutos, al finalizar no saldrá una pantalla parecida a esta:

Pulsamos sobre Go to Resource.

Ahora ya podemos crear un nuevo despliegue de un modelo desde la sección Model Deployments. Tan solo tenemos que darle un nombre y escoger el modelo: GTP-3.5-Turbo.

En unos pocos segundos Azure OpenAI Studio preparará el despliegue del modelo.

En el apartado de PlayGround, seleccionamos Chat, y ya podemos empezar a informar nuestro prompt.

El prompt lo hemos creado siguiendo el paper ‘How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings.

create table employees(
        ID_Usr INT primary key,
        name VARCHAR);
    /*3 example rows
    select * from employees limit 3;
    ID_Usr    name
    1344      George StPierre
    2122      Jon jones
    1265      Anderson Silva
    */

    create table salary(
        ID_Usr INT,
        year DATE,
        salary FLOAT,
        foreign key (ID_Usr) references employees(ID_Usr));
    /*3 example rows
    select * from salary limit 3
    ID_Usr    date          salary
    1344      01/01/2023    61000
    1344      01/01/2022    60000
    1265      01/01/2023    55000
    */

    create table studies(
        ID_study INT,
        ID_Usr INT,
        educational_level INT,  /* 5=phd, 4=Master, 3=Bachelor */
        Institution VARCHAR,
        Years DATE,
        Speciality VARCHAR,
        primary key (ID_study, ID_Usr),
        foreign key(ID_Usr) references employees (ID_Usr));
    /*3 example rows
    select * from studies limit 3
    ID_Study ID_Usr educational_level Institution    Years       Speciality
    2782     1344   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing
    2334     1344   5                 MIT            01/01/2023  Phd. Data Science.
    2782     2122   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing
    */

-Maintain the SQL order simple and efficient as you can, using valid SQL Lite, answer the following questions for the table provided above. 
Question: How Many employes we have with a salary bigger than 50000?
SELECT COUNT(*) AS total_employees
FROM employees e
INNER JOIN salary s ON e.ID_Usr = s.ID_Usr
WHERE s.salary > 50000;
  Question: Return the names of the three people who have had the highest salary increase in the last three years.
SELECT e.name
FROM employees e
JOIN salary s ON e.ID_usr = s.ID_usr
WHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)
GROUP BY e.name
ORDER BY (MAX(s.salary) - MIN(s.salary)) DESC
LIMIT 3;
Question: The name of the best paid employee.

Este es nuestro prompt completo, vamos a tener que dividirlo en partes para situar cada parte en su correspondiente casilla.

En la casilla system Message Pondremos el prompt entero a execpcion de los ejemplos:

create table employees(
        ID_Usr INT primary key,
        name VARCHAR);
    /*3 example rows
    select * from employees limit 3;
    ID_Usr    name
    1344      George StPierre
    2122      Jon jones
    1265      Anderson Silva
    */

    create table salary(
        ID_Usr INT,
        year DATE,
        salary FLOAT,
        foreign key (ID_Usr) references employees(ID_Usr));
    /*3 example rows
    select * from salary limit 3
    ID_Usr    date          salary
    1344      01/01/2023    61000
    1344      01/01/2022    60000
    1265      01/01/2023    55000
    */

    create table studies(
        ID_study INT,
        ID_Usr INT,
        educational_level INT,  /* 5=phd, 4=Master, 3=Bachelor */
        Institution VARCHAR,
        Years DATE,
        Speciality VARCHAR,
        primary key (ID_study, ID_Usr),
        foreign key(ID_Usr) references employees (ID_Usr));
    /*3 example rows
    select * from studies limit 3
    ID_Study ID_Usr educational_level Institution    Years       Speciality
    2782     1344   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing
    2334     1344   5                 MIT            01/01/2023  Phd. Data Science.
    2782     2122   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing
    */

-Maintain the SQL order simple and efficient as you can, using valid SQL Lite, answer the following questions for the table provided above. 

En esta sección le damos la estructura de la base de datos, unos ejemplos de su contenido y las instrucciones para que el modelo genere las ordenes SQL.

Ahora tocaría rellenar la sección Examples con los los ejemplos de nuestro prompy. En el prompt original tenemos dos ejemplos:

Question: How Many employes we have with a salary bigger than 50000?
SELECT COUNT(*) AS total_employees
FROM employees e
INNER JOIN salary s ON e.ID_Usr = s.ID_Usr
WHERE s.salary > 50000;
  Question: Return the names of the three people who have had the highest salary increase in the last three years.
SELECT e.name
FROM employees e
JOIN salary s ON e.ID_usr = s.ID_usr
WHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)
GROUP BY e.name
ORDER BY (MAX(s.salary) - MIN(s.salary)) DESC
LIMIT 3;
Question: The name of the best paid employee.

Como veis hemos creado un ejemplo por cada orden. Esta técnica es conocida como few shot sample y le permite al modelo hacerse una idea de cómo debe responder a las peticiones del usuario. Un número de ejemplos correcto suele estar entre uno y seis, más no tienen un efecto positivo en la respuesta que ofrece el modelo.

Ahora ya podemos empezar a realizar pruebas.

También podemos modificar la configuración de los hyperparametros.

Para generación de código recomiendo usar una Temperature de 0. No hace falta que el modelo sea muy imaginativo con sus respuestas.

A partir de aquí, si las respuestas nos gustan, podemos hacer dos cosas:

  • Exportar la configuración. Nos guardará un fichero que podemos usar para volver a configurar el Playground.
  • Pulsar en Ver Código, donde nos dará un código de ejemplo para llamar a nuestro Modelo.

El Notebook usando el Modelo.

El Notebook lo tenéis disponible en el repositorio del curso de Grandes Modelos de Lenguaje.

https://github.com/peremartra/Large-Language-Model-Notebooks-Course/blob/main/P1-NL2SQL/NL2SQL_OpenAI_Azure.ipynb

Empezamos instalado e importando la librería de OpenAI.

#Install openai
!pip install -q "openai<1.0.0"

import os
import openai

Ahora tenemos que configurar nuestro Acceso a Azure.

#Azure configuration
openai.api_type = "azure"
#Here the inference point that you can get from Azure
openai.api_base = "https://openaicourseperemartra.openai.azure.com/"
openai.api_version = "2023-07-01-preview"

openai.api_key = "your-azure-openai-key"

Informamos del prompt:

context = [ {'role':'system', 'content':"""
    create table employees(
    ID_Usr INT primary key,
    name VARCHAR
);
/* 3 example rows
select * from employees limit 3;
ID_Usr    name
1344      George StPierre
2122      Jon jones
1265      Anderson Silva
*/

create table salary(
    ID_Usr INT,
    year DATE,
    salary FLOAT,
    foreign key (ID_Usr) references employees(ID_Usr)
);
/* 3 example rows
select * from salary limit 3
ID_Usr    date          salary
1344      01/01/2023    61000
1344      01/01/2022    60000
1265      01/01/2023    55000
*/

create table studies(
    ID_study INT,
    ID_Usr INT,
    educational_level INT,  /* 5=phd, 4=Master, 3=Bachelor */
    Institution VARCHAR,
    Years DATE,
    Speciality VARCHAR,
    primary key (ID_study, ID_Usr),
    foreign key(ID_Usr) references employees (ID_Usr)
);
/* 3 example rows
select * from studies limit 3
ID_Study ID_Usr educational_level Institution    Years       Speciality
2782     1344   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing
2334     1344   5                 MIT            01/01/2023  Phd. Data Science.
2782     2122   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing
*/

-Maintain the SQL order simple and efficient as you can, using valid SQL Lite, answer the following questions for the table provided above. 
Question: How Many employees do we have with a salary bigger than 50000?

SELECT COUNT(*) AS total_employees
FROM employees e
INNER JOIN salary s ON e.ID_Usr = s.ID_Usr
WHERE s.salary > 50000;

Question: Return the names of the three people who have had the highest salary increase in the last three years.

SELECT e.name
FROM employees e
JOIN salary s ON e.ID_Usr = s.ID_Usr
WHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)
GROUP BY e.name
ORDER BY (MAX(s.salary) - MIN(s.salary)) DESC
LIMIT 3;

"""} ]

Creo una función para encapsular la llamada al modelo.

#Functio to call the model.
def return_CCRMSQL(user_message, context):

    newcontext = context.copy()
    newcontext.append({'role':'user', 'content':"question: " + user_message})

    response = openai.ChatCompletion.create(
      engine="GPT3NL2SQLSample1Deployment", #Our deployment
      messages = newcontext,
      temperature=0,
      max_tokens=800)

    return (response.choices[0].message["content"])

Ahora ya podemos hacer las pruebas pertinentes y obtener el código SQL para interrogar nuestra base de datos:

context_user = context.copy()
print(return_CCRMSQL("The name of the employee best paid", context_user))
SELECT e.name FROM employees e JOIN salary s ON e.ID_usr = s.ID_usr WHERE s.salary = (SELECT MAX(salary) FROM salary); This query will return the name of the employee with the highest salary.
print(return_CCRMSQL("Return the Institution with a higher average salary", context_user))
SELECT st.Institution, AVG(sa.salary) AS avg_salary FROM studies st JOIN employees e ON st.ID_Usr = e.ID_Usr JOIN salary sa ON e.ID_Usr = sa.ID_Usr GROUP BY st.Institution ORDER BY avg_salary DESC LIMIT 1;

Conclusiones

Cuando ya tenemos claro que prompt utilizar, configurar Azure OpenAI Services y usar los modelos de OpenAI residentes en Azure en lugar del API de OpenAI es una tarea sencilla.

La decisión de usar uno u otro dependerá de las decisiones de nuestra empresa. Los Modelos de OpenAI que se usan a través de Azure Open Services no residen en OpenAI. Es decir, que los datos que les pasamos no salen nunca de nuestra suscripción de Azure, y nunca serán usados para entrenar modelos futuros de OpenAI.

Técnicamente, las diferencias son mínimas y la complejidad es inexistente.

Amazon libera sus cursos de Machine Learning

https://aws.amazon.com/es/training/learning-paths/machine-learning/ Amazon ha decidido ofrecer sus cursos sobre Machine Learning de forma gratuita. Lo único que te pide es que Read more

Instalamos el entorno de IA y creamos un primer proyecto de ML con SciKit-Learn.

Aquí tenemos la primera lección del curso práctico de IA sin prerrequisitos. El vídeo en el que se sustenta la Read more

6 Cursos de ML Agents de UNITY

Los 6 Cursos de ML Agents que más me han gustado, y dos de ellos en español.

QLoRA: entrenar un Gran Modelo de Lenguaje en una GPU de 16 GB.

https://martra.uadla.com/fine-tuning-eficiente-con-lora-entrena-de-forma-optima-los-grandes-modelos-de-lenguaje/ QLoRA es la combinación de 'Q'uantización y LoRA. Lora Nos permite fine-tunear un modelo modificando tan solo una pequeña Read more

Por Martra

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *