Skip to content

Blog

Introduccion a la Generación Guiada de Texto usando LLMs.

[!NOTE] Este post está inspirado en esta publicación de LinkedIn de Luis Herreros.

[!IMPORTANT] Todo el código desarrollado para escribir este post puedes encontrarlos en este Jupyter Notebook.

Datos

Quise buscar un conjunto de datos fuese incluso desafiante para gpt-4. Así que elegí uno de la biblioteca de evals de OpenAI. Se tratan de datos para la detección de sarcasmos. Un ejemplo de una entrada del conjunto de datos es el siguiente:

{"input": [{"role": "system",
   "content": "Respond with only a 1 or 0 to signify if the user's message includes sarcasm, or not"},
  {"role": "user",
   "content": "thirtysomething scientists unveil doomsday clock of hair loss"}],
 "ideal": "1"}
Así que como calvo aun no asumido, me pareció un conjunto de datos atractivo. En total son casi 30.000 ejemplos. Por razones de costos para la avaluación solo usé 1000 ejemplos al azar (aparte de GPU poor también soy credit card poor :sweat_smile:)

Generación no Guiada

from openai import OpenAI

client = OpenAI()

def generate_response(sample: dict, model: str):
    response = client.chat.completions.create(
        model=model,
        messages=sample['input'],
        temperature=0.0
    )
    return response.choices[0].message.content

Generación Guiada

import enum
from pydantic import BaseModel

class Labels(str, enum.Enum):
    """Enumeration for single-label text classification."""
    SARCASM = "sarcasm"
    NOT_SARCASM = "not_sarcasm"

class SinglePrediction(BaseModel):
    """
    Class for a single class label prediction.
    """
    class_label: Labels
from openai import OpenAI
import instructor

client = instructor.patch(OpenAI())

def classify(sentence: str, model: str):
    """Perform single-label classification on the input text."""
    response = client.chat.completions.create(
        model=model,
        response_model=SinglePrediction,
        temperature=0.0,
        messages=[
            {
                "role": "user",
                "content": f"Classify the following text: {sentence}",
            },
        ],
    )

    response_message = '1' if response.class_label == Labels.SARCASM else '0'
    return response_message

Resultados

El resumen de los experimentos realizados es el siguiente:

sarcasm

Cosas que se pueden inferir del gráfico:

  • Las versiones guiadas de tanto gpt-3.5 como gpt-4 tienen mayor precisión que sus contrapartes no guiadas. En particular la ganancia de guiar a gpt-3.5 es bastante considerable, pasando de un 54.6% a un 64.1% de acierto sin aumentar demasiado los costos.
  • gpt-4, ya sea guiado o no guiado, tiene mayor precisión que gpt-3.5 a cualquier costo dado.
  • El intento de replicar la idea de Luis del mix de modelos no salió tan bien en este caso, pareciera ser mejor usar gpt-4 directamente. Probablemente haya que darle una revisión más profunda.
  • El costo parece aumentar linealmente con la precisión, indicando que los modelos más precisos son más caros de utilizar. Este tipo de análisis es útil para determinar los compromisos entre la precisión y el costo, usar LLMs es caro y por supuesto que el gasto es un factor en discusión al construir productos.

Ideas futuras

  • Por supuesto que para realizar conclusiones más generales deberíamos realizar experimentos sobre otros conjuntos de datos.
  • Como se redacten los prompts incide bastante en el resultado, debería seguir experimentando con distintas estrategias (hay algunas bien ingeniosas como esta)
  • Instructor tiene varios modos de funcionamiento. Sería interesante explorar sus diferencias.
  • Incluir otros tipos de tareas más complejas, por ejemplo la extracción de grafos de conocimiento es algo que me interesa mucho.
  • Me gustaría comparar distintos frameworks para realizar la generación guida, en particular estoy muy interesado en comparar resultados usando Outlines).

Es un trabajo que me entusiasma así que con el paso del tiempo espero construir un verdadero benchmark de generación guiada. Seguiré profundizando en el tema en futuros posts. Cualquier sugerencia es bienvenida.