El correcto uso de los parámetros en un modelo de Inteligencia Artificial
Aunque sea aburrido de leer, dedico tanto tiempo al correcto uso de los parámetros en un modelo porque son los que hacen la diferencia entre un resultado correcto, original y creativo, y uno repetitivo o lleno de alucinaciones al que solo le falta el cartel luminoso de «Hecho con Inteligencia Artificial» para que sea más obvio de dónde salió.
A riesgo de sonar como uno de los IA bros que pululan por las redes sociales, voy a decir que la mayoría de la gente no es capaz de aprovechar todo el potencial de los modelos de Inteligencia Artificial. Saber hacerlo nos puede ahorrar fortunas en el pago de modelos externos o hardware costoso.
Quienes se limitan al uso de las modalidades gratuitas de servicios como ChatGPT o Claude a través de su interfaz web, suelen desconocer estos parámetros ya que no hay controles específicos para estableccerlos y deben indicarse en el promt. Sin embargo, plataformas multimodelos como Replicate, que incluye algunos modelos gratis, aunque es de pago, pueden manipularse en forma gráfica. En Ollama deberemos modificar el modelfile o mandar instrucciones vía API. El modelo no hará caso de instrucciones de este tipo incluídas en el promt. Explicaré esto más adelante.
El correcto uso de los parámetros en un modelo
En el último post que publiqué podrán ver una tabla con la lista de los parámetros de generación de los modelos de Ollama y cuáles implican un uso intensivo de hardware. Esto es importante porque un equipo relativamente modesto puede verse afectado. Nos quedaron afuera algunos parámetros de los que nos vamos a ocupar ahora.
repeat_last_n
Determina cuántos tokens debe buscar hacia atrás el modelo en la ventana de conversación para aplicar el control de repetición (parámetro repeat_penalty que expliqué en el artículo anterior).
Algunos ejemplos:
- Con repeat_last_n = 64, que es el valor por defecto en muchos motores de inferencia, el modelo buscará la repetición de tokens que se haya registrado en los últimos tokens registrados o leídos.
- Con repeat_last_n = -1, el modelo lo hará con toda la ventana de contexto (parámetro num_ctx, también explicado antes) para aplicar la penalización.
- Con repeat_last_n = 0, desactivamos completamente la penalización por repetición.
La correcta determinación de este parámetro evita que el motor de inferencia elimine palabras cuya repetición es inevitable, como artículos o nexos coordinantes, por lo que el rango ideal para este parámetro es dejarlo entre 64 y 128.
El algoritmo mirostat
El algoritmo mirostat es una alternativa al uso de los parámetros temperature, top_p y top_k previamente explicados en posts anteriores. Se diferencia de estos en que no aplica un valor fijo al proceso de inferencia, sino que adecúa la distribución de probabilidad a un valor constante para mantener el nivel de perplejidad. Para explicar este concepto, imaginate que tienes un perro (si es que no lo tienes).
Lo habitual es que, cuando vuelvas a tu casa, tu perro venga a saludarte moviendo el rabo. Aunque tampoco es imposible que algún día no lo haga porque:
a) Está enfermo.
b) Alguien dejó la puerta abierta y se escapó.
c) Encontró algo más interesante que hacer, como comerse el filete que te olvidaste de guardar.
Lo que no va a pasar, a menos que estés soñando, es que encuentres a tu perro sentado en tu sillón preferido viendo el partido mientras se fuma tu cigarro y se toma tu whisky. Lo que determina el nivel de perplejidad es si el modelo tendrá en cuenta cómo actuar frente a los resultados menos probables.
mirostat
Se encarga de activar o desactivar el algoritmo. Hay 3 valores posibles:
- 0: Desactiva el algoritmo.
- 1: Activa la versión original.
- 2: Activa la nueva versión, que es más eficiente en el uso de los recursos de hardware.
mirostat_tau
Define el nivel de perplejidad que debería intentar mantener el algoritmo. Trabaja en el rango de 1.0 a 20.0, siendo el valor más común 5.0.
Estos son algunos ejemplos:
- Cuando se aplica un valor bajo, como 0.05, el resultado será una respuesta estable al precio de una reacción lenta si el modelo empieza a alucinar.
- Cuando se aplica un valor superior a 0.5, el modelo reaccionará rápidamente a cambios en el contexto, pero al precio de comportarse de manera errática.
El algoritmo mirostat es especialmente útil cuando se trabaja con libros o artículos extensos, ya que impide caer en extremos como repeticiones o divagaciones.
seed
Es el valor inicial que se va a utilizar para poner en marcha el generador de números aleatorios del motor de inferencia. Como expliqué anteriormente, los grandes modelos de lenguaje se basan en el azar para seleccionar tokens estableciendo probabilidades. Estableciendo un valor para el parámetro seed, conseguimos que se utilice la misma secuencia de números aleatorios cada vez que trabajemos con el modelo.
Este parámetro es útil para probar prompts. Si se le asigna un valor de 32 o 64 bits alto, el mismo prompt, manteniendo el resto de los parámetros constantes, generará el mismo resultado. Por lo tanto, un resultado mejor solo podrá ser consecuencia de una mejora en el prompt que se le indica al modelo. En cambio, si se le asigna el valor -1 o se desactiva, la generación se basará en el reloj del sistema.
Aunque los usuarios de la interfaz por defecto de servicios como ChatGPT o Claude no ofrecen esta opción, plataformas más avanzadas si brindan controles para modificar parámetros de comportamiento del modelo. EN el caso de Ollama podemos hacer lo mismo modificando el archivo modelfile.stop
Casi no es necesario explicar este concepto, ya que su uso es obvio. Define cuáles serán las cadenas de texto o tokens que, cuando se generan por el sistema, detendrán de manera inmediata el proceso de inferencia. Cuando el modelo detecta alguna coincidencia con lo establecido en el parámetro, el motor detiene la ejecución mostrando el resultado generado, previa depuración de los tokens de parada.
Establecer indicaciones para este parámetro es útil para:
- Evitar alucinaciones: por ejemplo, que el modelo usurpe el rol del usuario tratando de anticipar cuál será la siguiente pregunta que haremos.
- Forzar formatos estructurados: por ejemplo, si la respuesta esperada es una página web, estableciendo como cadena de parada evitaremos que agregue texto que no tiene nada que ver con el código de la página, ya que esta suele ser la etiqueta con la que se cierra la mayoría del código HTML.
- Trabajo por etapas: esto es muy útil, por ejemplo, para evitar el recalentamiento del hardware. Si determinamos que el motor se detenga al encontrar cadenas como «———–» o «#####», se tomará un descanso cuando llegue a ellas.
En el próximo artículo veremos cómo utilizar un modelo con parámetros personalizados lo que nos permitirá ahorrar tokens al ingresar promts o tiempo para encontrar el quennos permita lograr el resultado buscad

