Un modelo adivina lo que viene
Un modelo de lenguaje es un programa que escribe adivinando lo que viene después. Tu móvil hace una versión pequeña cuando te propone la siguiente palabra de un mensaje.
Importa porque cualquier función que construyas sobre un modelo hereda esa adivinanza. Cuando entiendes cómo funciona, sus respuestas raras tienen sentido.
Al final de esta lección
Nota
Puedo explicar cómo produce texto un modelo de lenguaje, sin matemáticas.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Modelo | un programa que aprendió patrones de una enorme cantidad de texto |
| Prompt | el texto que envías a un modelo |
| Token | un trozo pequeño de texto, a menudo una palabra o parte de ella |
| Contexto | todo el texto que el modelo ve para una respuesta |
| Temperatura | un ajuste que hace la adivinanza más o menos variada |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un modelo escribe un token cada vez
Un modelo no planea una respuesta entera. Lee tu prompt, adivina el siguiente token, lo añade y vuelve a adivinar.
Repite esto hasta que acaba la respuesta. Cada token se elige con todo el texto escrito hasta ese momento, el contexto.
Ejemplo resuelto: la siguiente palabra
| El texto hasta ahora | Palabra siguiente | Vista de 10 |
|---|---|---|
| El gato duerme en el | sofá | 6 |
| El gato duerme en el | suelo | 3 |
| El gato duerme en el | tejado | 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Pide la siguiente palabra
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const post=(m,t,x)=>fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:[{role:'user',content:m}],max_tokens:t,temperature:x})}).then(r=>r.json());post('Termina la frase con una sola palabra y nada más: El gato duerme en el',12,0.7).then(j=>console.log('Modelo: '+j.choices[0].message.content)).catch(e=>console.log('Muestra grabada (ningún modelo respondió): sofá'))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El mismo prompt puede dar respuestas distintas
El modelo da a cada token posible una probabilidad y luego elige uno. La temperatura decide lo atrevida que es la elección. Con temperatura baja elige casi siempre el token más probable. Con temperatura alta elige más a menudo tokens raros.
Así que un modelo no es una calculadora. Pregunta dos veces y puedes recibir dos respuestas.
Pide el mismo prompt dos veces
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const post=(m,t,x)=>fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:[{role:'user',content:m}],max_tokens:t,temperature:x})}).then(r=>r.json());const s=['sofá','suelo'];(async()=>{for(let i=0;i<2;i++){let t;try{const j=await post('Termina la frase con una sola palabra y nada más: El gato duerme en el',12,1);t='Modelo: '+j.choices[0].message.content}catch(e){t='Muestra grabada (ningún modelo respondió): '+s[i]}console.log('Intento '+(i+1)+': '+t)}})()"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Probable no es lo mismo que verdadero
El modelo aprendió de textos, así que escribe bien lo que suena bien. No puede consultar un dato. Si una frase falsa se parece a una frase probable, puede escribirla con voz tranquila y segura.
Tu trabajo como desarrollador es comprobar lo que importa.
Pregunta algo que no puede saber
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const post=(m,t,x)=>fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:[{role:'user',content:m}],max_tokens:t,temperature:x})}).then(r=>r.json());post('¿Cómo se llama mi gato? Responde con una frase corta.',40,0.7).then(j=>console.log('Modelo: '+j.choices[0].message.content)).catch(e=>console.log('Muestra grabada (ningún modelo respondió): No sé cómo se llama tu gato.'))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que un modelo busca los datos, como un buscador. No es así. Continúa un texto con tokens probables. Fíate de una respuesta solo después de compararla con otra fuente.
Para ir más lejos: un modelo diminuto tuyo
La tarea es un modelo de lenguaje diminuto: una tabla de recuentos y una regla para elegir. Un modelo real sigue la misma idea. Su tabla es mucho mayor, se construye con mucho más texto y mira una parte mucho más amplia del contexto.
Prueba a añadir a la tabla unas palabras y unos recuentos tuyos y mira qué texto escribe.