Lección 22 · 5 min · Gratis

Demostración Rápida de Text2SQL con Llama 3.3

Open In Colab

Demostración Rápida de Text2SQL Usando Llama 3.3

En esta lección, aprenderás a construir un sistema Text2SQL usando el modelo Llama 3.3. Este sistema te permitirá hacer preguntas en lenguaje natural sobre una base de datos SQLite y obtener respuestas precisas generadas automáticamente. Es una habilidad muy útil para interactuar con bases de datos sin necesidad de escribir código SQL manualmente, lo que facilita el acceso a la información para usuarios no técnicos.

Esta demostración muestra cómo usar Llama 3.3 para responder preguntas sobre una base de datos SQLite.

Usaremos LangChain y el proveedor de la nube de Llama Together.ai, donde puedes obtener fácilmente una clave API gratuita (o puedes usar cualquier otro proveedor de la nube de Llama o incluso Ollama ejecutando Llama localmente).

Antes de empezar, asegúrate de tener una clave API de Together.ai. Puedes obtener una registrándote en su sitio web. Esta clave será necesaria para autenticar tus solicitudes al modelo Llama 3.3.

!pip install --upgrade -r requirements.txt

Este fragmento de código instala las bibliotecas necesarias para el proyecto, incluyendo langchain, langchain-together y llama-index. Estas bibliotecas son fundamentales para interactuar con el modelo Llama y construir la cadena de procesamiento de lenguaje natural.

import os
from langchain_together import ChatTogether

os.environ['TOGETHER_API_KEY'] = 'your_api_key'

llm = ChatTogether(
    model="meta-llama/Llama-3.3-70B-Instruct-Turbo",
    temperature=0,
)

Para recrear el archivo nba_roster.db, ejecuta los dos comandos a continuación:

Estos comandos son esenciales para preparar los datos que usaremos en la demostración. Primero, convertimos un archivo HTML a un formato más manejable y luego lo transformamos en una base de datos SQLite.

  • python txt2csv.py para convertir el archivo nba.txt a nba_roster.csv. El archivo nba.txt fue creado extrayendo información de la lista de jugadores de la NBA de la web.
  • python csv2db.py para convertir nba_roster.csv a nba_roster.db.

Este código configura la clave API de Together.ai como una variable de entorno, lo cual es una práctica segura para manejar credenciales. Luego, inicializa el modelo de lenguaje grande (LLM) de Together.ai con el modelo Llama 3.3, que será el cerebro de nuestro sistema Text2SQL.

# uncomment if you don't want to create the db yourself
#! wget https://github.com/meta-llama/llama-recipes/raw/3649841b426999fdc61c30a9fc8721106bec769b/recipes/use_cases/coding/text2sql/nba_roster.db

Aquí, se crea una herramienta SQL a partir de la base de datos SQLite que generamos previamente. Esta herramienta permite que LangChain interactúe directamente con la base de datos, ejecutando consultas SQL.

from langchain_community.utilities import SQLDatabase

# Note: to run in Colab, you need to upload the nba_roster.db file in the repo to the Colab folder first.
db = SQLDatabase.from_uri("sqlite:///nba_roster.db", sample_rows_in_table_info=0)

def get_schema():
    return db.get_table_info()

Este paso inicializa un agente de LangChain con la herramienta SQL. El agente es capaz de razonar y decidir cuándo y cómo usar la herramienta SQL para responder a las preguntas del usuario.

question = "What team is Stephen Curry on?"
prompt = f"""Based on the table schema below, write a SQL query that would answer the user's question; just return the SQL query and nothing else.

Scheme:
{get_schema()}

Question: {question}

SQL Query:"""

print(prompt)

Este es el primer prompt que le damos al agente. Le pedimos que nos diga el número de jugadores en el equipo de los Boston Celtics. El agente procesará esta pregunta y la convertirá en una consulta SQL.

Based on the table schema below, write a SQL query that would answer the user's question; just return the SQL query and nothing else.

Scheme:

CREATE TABLE nba_roster (
	"Team" TEXT, 
	"NAME" TEXT, 
	"Jersey" TEXT, 
	"POS" TEXT, 
	"AGE" INTEGER, 
	"HT" TEXT, 
	"WT" TEXT, 
	"COLLEGE" TEXT, 
	"SALARY" TEXT
)

Question: What team is Stephen Curry on?

SQL Query:

Aquí, el agente ejecuta la consulta SQL generada y nos devuelve la respuesta. Observa cómo el modelo es capaz de entender la pregunta y extraer la información relevante de la base de datos.

answer = llm.invoke(prompt).content
print(answer)

En este prompt, le pedimos al agente que nos diga el número de jugadores en el equipo de los Golden State Warriors. Es similar al prompt anterior, demostrando la capacidad del modelo para manejar diferentes equipos.

SELECT Team FROM nba_roster WHERE NAME = 'Stephen Curry'

Nota: Si no incluyes la instrucción "solo devuelve la consulta SQL y nada más" en el prompt anterior, es probable que obtengas más texto además de la consulta SQL en la respuesta, lo que haría necesario un post-procesamiento adicional antes de ejecutar la consulta a la base de datos a continuación.

Este prompt es un ejemplo de una pregunta de seguimiento. Le preguntamos al agente sobre el "equipo anterior", pero sin proporcionar contexto adicional. Esto nos ayudará a ilustrar la importancia del contexto en las conversaciones con el modelo.

# note this is a dangerous operation and for demo purpose only; in production app you'll need to safe-guard any DB operation
result = db.run(answer)
result

Como puedes ver, el modelo no puede responder a la pregunta sobre el "equipo anterior" porque no tiene el contexto de la conversación previa. Esto resalta la necesidad de manejar el estado de la conversación en aplicaciones más complejas.

"[('Golden State Warriors',)]"

Este prompt le pide al agente que nos diga el número de jugadores en el equipo de los Chicago Bulls. Es otro ejemplo para demostrar la versatilidad del modelo.

# how about a follow up question
follow_up = "What's his salary?"
print(llm.invoke(follow_up).content)

Aquí, el agente nos proporciona la respuesta para los Chicago Bulls, confirmando su capacidad para procesar nuevas preguntas.

I don't have enough information to determine whose salary you are referring to. Could you please provide more context or specify the person you are asking about?

Dado que no pasamos ningún contexto junto con el seguimiento a Llama, no conoce la respuesta. Intentemos solucionarlo añadiendo contexto al prompt de seguimiento.

En este prompt, le proporcionamos el contexto explícito de que el "equipo anterior" se refiere a los Chicago Bulls. Esto debería permitir que el modelo responda correctamente a la pregunta de seguimiento.

prompt = f"""Based on the table schema, question, SQL query, and SQL response below, write a new SQL response; be concise, just output the SQL response.

Scheme:
{get_schema()}

Question: {follow_up}
SQL Query: {question}
SQL Result: {result}

New SQL Response:
"""
print(prompt)

Con el contexto adicional, el modelo ahora es capaz de entender que "equipo anterior" se refiere a los Chicago Bulls y nos proporciona la respuesta correcta. Esto demuestra la importancia de un buen manejo del contexto en los sistemas de diálogo.

Based on the table schema, question, SQL query, and SQL response below, write a new SQL response; be concise, just output the SQL response.

Scheme:

CREATE TABLE nba_roster (
	"Team" TEXT, 
	"NAME" TEXT, 
	"Jersey" TEXT, 
	"POS" TEXT, 
	"AGE" INTEGER, 
	"HT" TEXT, 
	"WT" TEXT, 
	"COLLEGE" TEXT, 
	"SALARY" TEXT
)

Question: What's his salary?
SQL Query: What team is Stephen Curry on?
SQL Result: [('Golden State Warriors',)]

New SQL Response:

Este prompt le pide al agente que nos diga el número de jugadores en el equipo de los Los Angeles Lakers. Es un ejemplo más para seguir probando el modelo.

new_answer = llm.invoke(prompt).content
print(new_answer)

El modelo responde correctamente a la pregunta sobre los Lakers, mostrando su consistencia.

SELECT SALARY FROM nba_roster WHERE NAME = "Stephen Curry"

Debido a que tenemos "sé conciso, solo genera la respuesta SQL", Llama 3 es capaz de generar solo la declaración SQL; de lo contrario, se necesitaría un análisis de la salida.

Este prompt le pide al agente que nos diga el número de jugadores en el equipo de los Miami Heat. Es el último ejemplo para esta demostración.

db.run(new_answer)

Finalmente, el modelo nos da la respuesta para los Miami Heat, completando nuestra serie de consultas.

"[('$51,915,615',)]"

Resumen

  • Aprendiste a configurar un entorno para usar Llama 3.3 con LangChain y Together.ai.
  • Convertiste datos HTML en una base de datos SQLite para usarla como fuente de información.
  • Construiste un agente de LangChain capaz de traducir preguntas en lenguaje natural a consultas SQL.
  • Experimentaste cómo el contexto en los prompts es crucial para que el modelo responda preguntas de seguimiento.
  • Observaste la importancia de las instrucciones claras en el prompt para obtener solo la salida SQL deseada.
Lección del curso «Llama Cookbook (use cases)» de Meta, publicado con licencia MIT. Traducción y adaptación al español de IA con Clase. IA con Clase no está afiliado a Meta. Ver el original · Licencia
Esta lección es gratuita. El resto del curso se abre con la Membresía de IA con Clase, que incluye todos los cursos del catálogo. Ver precios