1YB0kHew5jpGh3qbecuEdDQ

Tabla de contenidos

Retrocediendo un paso

Existen varios elementos clave emergentes en el ámbito de la IA Generativa con gran interés actual y futuro:

  1. Investigación profunda
  2. Codificación
  3. Orquestación multimodelo en aplicaciones de agencia
  4. Bucle de retroalimentación de datos con evaluaciones

Tanto NVIDIA como OpenAI han puesto un énfasis significativo en los bucles de retroalimentación de datos (a menudo llamados volantes de inercia de datos) como una forma de impulsar la mejora continua de la IA.

NVIDIA describe el ciclo de datos como un ciclo de automejora donde los datos de las interacciones o procesos de IA se utilizan continuamente para refinar los modelos, lo que genera un mejor rendimiento con el tiempo.

Han destacado su papel en los agentes de IA, donde los ciclos de retroalimentación en tiempo real automatizan las mejoras al convertir las interacciones en inteligencia.

Se podría argumentar que las evaluaciones (evaluaciones de modelos de IA, como benchmarks, pruebas de seguridad o evaluaciones de rendimiento) son un subconjunto del ciclo de datos.
Y creo que el uso de las evaluaciones se generalizará…

En el marco del ciclo de datos, las evaluaciones no son independientes; son un paso integral que genera información.

Las evaluaciones facilitan el ciclo de autorreforzamiento. Sin evaluaciones, el ciclo de datos carece de la fase de medición necesaria para identificar mejoras o regresiones.

image 8

Evaluaciones de modelos

Ayer publiqué un artículo sobre un cuaderno reciente de OpenAI sobre un ciclo de retroalimentación de datos para la mejora continua.

Sinceramente, era un poco complicado, así que quería encontrar un ejemplo lo más sencillo posible.

El siguiente ejemplo muestra cómo se puede utilizar un pequeño conjunto de datos de prueba (50 líneas) para validar el rendimiento del modelo y también el indicador utilizado para las aplicaciones.

Algunas consideraciones

Obviamente, una implementación en producción será más compleja, ya que los datos de evaluación provienen de las interacciones del usuario. Además, con mucho más ruido, el proceso de detección de la señal en el ruido deberá ser robusto.

Además, en un entorno de producción, las evaluaciones se ejecutarán en más modelos, más datos de evaluación y, muy probablemente, en una o más indicaciones.

La evaluación no solo sirve para evaluar la aplicación, sino también para detectar desviaciones o degradaciones en ella.

Y también para probar los resultados de los ajustes.

La siguiente aplicación, que puede pegar y ejecutar en un notebook de Colab, contiene ejemplos de un mensaje para el desarrollador y un mensaje de usuario con el texto de un ticket de soporte.

from openai import OpenAI
from google.colab import userdata

# Fetch the API key from Colab's Secrets Manager
# Make sure you have added your OpenAI API key to the Secrets Manager with the name 'OPENAI_API_KEY'
client = OpenAI(api_key=userdata.get('OPENAI_API_KEY'))

instructions = """
You are an expert in categorizing IT support tickets. Given the support
ticket below, categorize the request into one of "Hardware", "Software",
or "Other". Respond with only one of those words.
"""

ticket = "My monitor won't turn on - help!"

completion = client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "developer", "content": instructions},
{"role": "user", "content": ticket}
]
)

print(completion.choices[0].message.content)

También en el notebook de Colab, puedes ejecutar este código para configurar la evaluación. Estoy ejecutando el código desde Colab, pero el resultado final se puede ver y examinar en la consola de OpenAI.

Verás dos valores clave definidos a continuación:

  • data_source_config: Un esquema para los datos de prueba que usarás junto con la evaluación.
  • testing_criteria: Los evaluadores que determinan si el resultado del modelo es correcto.
from openai import OpenAI
from google.colab import userdata

# Fetch the API key from Colab's Secrets Manager
# Make sure you have added your OpenAI API key to the Secrets Manager with the name 'OPENAI_API_KEY'
client = OpenAI(api_key=userdata.get('OPENAI_API_KEY'))


eval_obj = client.evals.create(
name="IT Ticket Categorization",
data_source_config={
"type": "custom",
"item_schema": {
"type": "object",
"properties": {
"ticket_text": {"type": "string"},
"correct_label": {"type": "string"},
},
"required": ["ticket_text", "correct_label"],
},
"include_sample_schema": True,
},
testing_criteria=[
{
"type": "string_check",
"name": "Match output to human label",
"input": "{{ sample.output_text }}",
"operation": "eq",
"reference": "{{ item.correct_label }}",
}
],
)

print(eval_obj)

Y el output, observa el ID de evaluación que se utilizará más adelante…

EvalCreateResponse(
id='eval_68ba8fea13d081918ab1a27b50e7c720',
created_at=1757057002,
data_source_config=EvalCustomDataSourceConfig(
schema_={
'type': 'object',
'properties': {
'item': {
'type': 'object',
'properties': {
'ticket_text': {'type': 'string'},
'correct_label': {'type': 'string'}
},
'required': ['ticket_text', 'correct_label']
},
'sample': {
'type': 'object',
'properties': {
'model': {'type': 'string'},
'choices': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'message': {
'type': 'object',
'properties': {
'role': {
'type': 'string',
'enum': ['assistant']
},
'content': {
'type': ['string', 'array', 'null']
},
'refusal': {
'type': ['boolean', 'null']
},
'tool_calls': {
'type': ['array', 'null'],
'items': {
'type': 'object',
'properties': {
'type': {
'type': 'string',
'enum': ['function']
},
'function': {
'type': 'object',
'properties': {
'name': {'type': 'string'},
'arguments': {'type': 'string'}
},
'required': ['name', 'arguments']
},
'id': {'type': 'string'}
},
'required': ['type', 'function', 'id']
}
},
'function_call': {
'type': ['object', 'null'],
'properties': {
'name': {'type': 'string'},
'arguments': {'type': 'string'}
},
'required': ['name', 'arguments']
}
},
'required': ['role']
},
'finish_reason': {'type': 'string'}
},
'required': ['index', 'message', 'finish_reason']
}
},
'output_text': {'type': 'string'},
'output_json': {'type': 'object'},
'output_tools': {
'type': 'array',
'items': {'type': 'object'}
},
'output_reasoning_summary': {'type': ['string', 'null']},
'output_audio': {'type': ['object', 'null']},
'input_tools': {
'type': 'array',
'items': {'type': 'object'}
}
},
'required': ['model', 'choices']
}
},
'required': ['item', 'sample']
},
type='custom',
max_items=None
),
metadata={},
name='IT Ticket Categorization',
object='eval',
testing_criteria=[
StringCheckGrader(
input='{{ sample.output_text }}',
name='Match output to human label',
operation='eq',
reference='{{ item.correct_label }}',
type='string_check',
id='Match output to human label-95e05f47-088c-4cb2-986c-5efdb8b62683',
inactive_at=None
)
]
)

Desde aquí, si va a la consola de OpenAI y hace clic en Evaluaciones, verá que hay un ID de evaluación con un ID de evaluación.

Aún no se ha realizado ninguna evaluación; la evaluación se acaba de crear.

image 9

He creado mi archivo JSONL de prueba con 50 entradas, aquí están las 5 líneas superiores:

{ "item": { "ticket_text": "My keyboard keys are sticking and not responding properly.", "correct_label": "Hardware" } }
{ "item": { "ticket_text": "The printer is jamming every time I try to print.", "correct_label": "Hardware" } }
{ "item": { "ticket_text": "Laptop battery drains too quickly even when idle.", "correct_label": "Hardware" } }
{ "item": { "ticket_text": "Mouse cursor is freezing on the screen intermittently.", "correct_label": "Hardware" } }
{ "item": { "ticket_text": "External hard drive not detected by the computer.", "correct_label": "Hardware" } }
{ "item": { "ticket_text": "Webcam shows a black screen during video calls.", "correct_label": "Hardware" } }

El código a continuación carga el archivo de datos de prueba a la plataforma OpenAI.

from openai import OpenAI
from google.colab import userdata

# Fetch the API key from Colab's Secrets Manager
# Make sure you have added your OpenAI API key to the Secrets Manager with the name 'OPENAI_API_KEY'
client = OpenAI(api_key=userdata.get('OPENAI_API_KEY'))

file = client.files.create(
file=open("/content/tickets.jsonl", "rb"),
purpose="evals"
)

print(file)

Una vez realizada la carga, se devuelve el texto a continuación. Es importante tener en cuenta el ID devuelto.

FileObject(
id='file-NkWqV53Mnx8u7kMPwLbgdX',
bytes=5029,
created_at=1757057669,
filename='tickets.jsonl',
object='file',
purpose='evals',
status='processed',
expires_at=None,
status_details=None
)

La vista a continuación muestra dónde cargué mi archivo de texto en Colab a la izquierda y cómo lo referencia.

image 10

Con los datos de prueba listos, ejecuto el código a continuación para realizar la evaluación.

Asegúrate de reemplazar YOUR_EVAL_ID y YOUR_FILE_ID con los ID únicos de los archivos de configuración de evaluación y datos de prueba que creaste en los pasos anteriores.

from openai import OpenAI
from google.colab import userdata

# Fetch the API key from Colab's Secrets Manager
# Make sure you have added your OpenAI API key to the Secrets Manager with the name 'OPENAI_API_KEY'
client = OpenAI(api_key=userdata.get('OPENAI_API_KEY'))

run = client.evals.runs.create(
"eval_68ba8fea13d081918ab1a27b50e7c720",
name="Categorization text run",
data_source={
"type": "completions",
"model": "gpt-4.1",
"input_messages": {
"type": "template",
"template": [
{"role": "developer", "content": "You are an expert in categorizing IT support tickets. Given the support ticket below, categorize the request into one of 'Hardware', 'Software', or 'Other'. Respond with only one of those words."},
{"role": "user", "content": "{{ item.ticket_text }}"},
],
},
"source": {"type": "file_id", "id": "file-NkWqV53Mnx8u7kMPwLbgdX"},
},
)

print(run)

Aquí puedes ver cómo se usan los ID en el código para ejecutar la evaluación…

image 11

La respuesta de la API cuando se inicia la evaluación…

RunCreateResponse(
id='evalrun_68ba945519ec819187106cdbe2b981bf',
created_at=1757058133,
data_source=CreateEvalCompletionsRunDataSource(
source=SourceFileID(
id='file-NkWqV53Mnx8u7kMPwLbgdX',
type='file_id'
),
type='completions',
input_messages=InputMessagesTemplate(
template=[
EasyInputMessage(
content=(
"You are an expert in categorizing IT support tickets. "
"Given the support ticket below, categorize the request "
"into one of 'Hardware', 'Software', or 'Other'. "
"Respond with only one of those words."
),
role='developer',
type='message'
),
EasyInputMessage(
content='{{ item.ticket_text }}',
role='user',
type='message'
)
],
type='template'
),
model='gpt-4.1',
sampling_params=None,
modalities=None
),
error=None,
eval_id='eval_68ba8fea13d081918ab1a27b50e7c720',
metadata={},
model='gpt-4.1',
name='Categorization text run',
object='eval.run',
per_model_usage=None,
per_testing_criteria_results=None,
report_url=(
"https://platform.openai.com/evaluations/"
"eval_68ba8fea13d081918ab1a27b50e7c720"
"?project_id=proj_Tm5JzEPMhOUU9Js3CJau8NeR"
"&run_id=evalrun_68ba945519ec819187106cdbe2b981bf"
),
result_counts=ResultCounts(
errored=0,
failed=0,
passed=0,
total=0
),
status='queued',
shared_with_openai=False
)

Abajo, de nuevo en la consola de OpenAI, podrás ver el nombre de mi evaluación, el ID y el estado de Completado.

image 12

Y desde aquí puedes explorar en profundidad la evaluación y ver la respuesta y los resultados por cada elemento de línea.

IA

Este es el proceso de evaluación más básico. Obviamente, las implementaciones de producción serán mucho más complejas y el proceso de anotación de datos también puede ser mucho más avanzado.

En este ejemplo, también utilizamos el marco de IA abierto y el SDK.

Sin embargo, esto dependerá también del marco que se utilice y de los paneles disponibles. El principio sigue siendo el mismo…


Sígueme en LinkedIn 

Chief Evangelist @ Kore.ai | Me apasiona explorar la intersección de la IA y el lenguaje. Desde modelos lingüísticos y agentes de IA hasta aplicaciones agenéticas, marcos de desarrollo y herramientas de productividad centradas en los datos, comparto ideas sobre cómo estas tecnologías están dando forma al futuro.

Cobus Greyling

Por Cobus Greyling

Rasa Hero. NLP / NLU, Chatbots, Voz, UI / UX conversacional, Diseñador CX, Desarrollador, Interfaces de usuario ubicuas.

Deja una respuesta

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