Los parámetros de configuración de modelos locales en Ollama
En el post anterior hablamos sobre cómo utilizar Ollama; ahora veremos con mayor detalle los parámetros de configuración de modelos locales. La personalización no solo nos permite aprovechar mejor nuestro hardware, sino también adaptar los modelos a usos específicos. Entiendo que la extensión de artículos teóricos puede hacerse tediosa, pero el resultado final compensará la lectura.
Por supuesto, a menos que tengas un hardware muy potente, nunca podrás lograr los resultados que se obtienen con las versiones de pago de los grandes modelos comerciales. Pero, con un hardware normal y un poco de práctica, se pueden lograr resultados razonables sin gastar dinero ni sacrificar privacidad.
Los parámetros de configuración de modelos locales
Estos parámetros controlan cómo el modelo seleccionará el siguiente token durante el proceso de inferencia. Es decir, no modifican la base de conocimientos del modelo, sino la aleatoriedad del proceso de generación.
Temperature
La temperatura es un número de punto flotante entre 0.0 y 2.0 que determina el grado de aleatoriedad en la selección del siguiente token que generará el modelo.
Efecto:
- Temperature = 0.0 o muy baja (0.1-0.3): el modelo selecciona el token con mayor probabilidad. Genera una salida previsible, consistente y conservadora. Es la temperatura que debemos usar si queremos conseguir respuestas basadas en hechos, generar código o extraer datos de documentos.
- Temperature = 0.7-1.0: más equilibrada. Se logra cierta variabilidad sin sacrificar coherencia. Suelen ser los valores que se manejan para conversaciones de chat general.
- Temperature > 1.0 (1.2-2.0): es la configuración con la que se logra mayor aleatoriedad. Aquí los tokens con baja probabilidad tienen mayor oportunidad de ser seleccionados. La salida es más creativa y diversa, aunque se corre el riesgo de obtener respuestas incoherentes o alucinaciones.
num_ctx
Es el número máximo de tokens que el modelo procesará en una sola inferencia. Esto incluye el prompt del sistema, el historial de conversación, nuestro prompt y la respuesta que genera el modelo.
Este parámetro determina:
- Cuánta información puede manejar el modelo a la vez.
- El consumo de memoria.
- Cuánta, qué y cuándo se elimina información antigua cuando se alcanza el límite de tokens.
Los valores más comunes son 2048, 4096, 8192, 16384 o 32768. Al aumentar este valor se pueden mantener conversaciones más largas o analizar documentos extensos, con el costo de una reducción en la velocidad de inferencia y un mayor uso de memoria.
top_p
Pone un límite a la cantidad de tokens que el modelo tiene en cuenta para su análisis. Solo se considera el grupo de tokens cuya probabilidad acumulada alcanza o supera el valor de p. El rango va entre 0.0 y 1.0.
El funcionamiento es el siguiente:
- Se ordenan los tokens por probabilidad, de mayor a menor.
- Las probabilidades se van sumando hasta alcanzar el límite de p.
- Solo los tokens que entran en ese grupo se usarán en la inferencia.
Al asignarle a top_p un valor de 0.1, solo se considerarán los tokens más probables, lo que dará como resultado una salida muy conservadora. A medida que el valor se acerca a 0.9 se obtiene mayor diversidad. Con el máximo de 1.0 se garantiza que el modelo considere todos los tokens.
top_k
Selecciona una cantidad k de los tokens más probables.
Si k es igual a 1, se selecciona el token más probable.
Si k es igual a 0, se desactiva el filtro y se seleccionan todos los tokens.
repeat_penalty
Determina la posibilidad de que tokens ya seleccionados vuelvan a aparecer. Si el valor asignado es 1.0, el modelo se comportará de forma estándar. Con un valor entre 1.1 y 1.2 solo se eliminarán las repeticiones obvias, sin que el usuario note cambios perceptibles en el funcionamiento del modelo. Con valores mayores a 1.5, el texto puede resultar incoherente o la selección de sinónimos poco adecuada. Este parámetro es ideal para combatir la tendencia de los modelos a la repetición.
num_predict
Determina el número máximo de tokens que el modelo generará en una respuesta antes de detenerse.
En la práctica:
- Limita la longitud de la respuesta generada. Si se supera el límite, la respuesta queda cortada.
- El modelo se detendrá si detecta un token de fin de secuencia antes de alcanzar el límite.
- Establecer num_predict = -1 hace que el modelo se detenga solo cuando se detecte el token de fin de secuencia o se alcance el límite del contexto.
- Al establecer num_predict entre 100-500 se generarán respuestas sencillas y cortas.
- Si num_predict se ubica en el rango entre 1000-2000, se lograrán respuestas detalladas manteniendo el control.
En esta tabla podemos ver el impacto en nuestro hardware del uso de los parámetros que ya vimos y de otros que veremos en el próximo artículo.
| Parámetro | Función | Impacto en RAM | Impacto en CPU | Impacto en VRAM | Impacto en velocidad | Comentario |
|---|---|---|---|---|---|---|
| FROM | Modelo en que se basa el utilizado. | Muy alto | Muy alto | Muy alto | Dependerá del tamaño del modelo. | Optar por el modelo más pequeño que sirva para la tarea. |
| PARAMETER num_ctx | Tamaño de la ventana de contexto. | Muy alto | Bajo | Muy alto | Cuanto más grande sea la ventana, menor será la velocidad. | 2048-8192 son suficientes para la mayoría de los usos. |
| PARAMETER num_predict | Cantidad máxima de tokens que debe generar el modelo. | Muy bajo | Bajo | Muy bajo | Solo influye sobre el tiempo total de generación. | Se recomienda configurar según la longitud de la respuesta que se espera. |
| PARAMETER temperature | Controla la creatividad del modelo. | No afecta | No afecta | No afecta | No afecta | El hardware no es relevante. |
| PARAMETER top_k | Limita la cantidad de tokens considerados. | No impacta | Poco relevante | No impacta | No se nota. | Establecerlo entre 20-50 suele ser adecuado para la mayoría de los casos. |
| PARAMETER top_p | Muestreo probabilístico. | No afecta | No afecta | No afecta | No afecta | No altera el rendimiento. |
| PARAMETER min_p | Descarta los tokens menos probables. | No tiene efecto | No tiene efecto | No tiene efecto | No tiene efecto | Puede afectar la calidad del resultado. |
| PARAMETER repeat_penalty | Reduce las repeticiones. | No afecta | No afecta | No afecta | No afecta | El hardware no cambia nada. |
| PARAMETER repeat_last_n | Tokens utilizados para detectar repeticiones. | Poco impacto | Poco impacto | Bajo impacto | No se nota | Establecerlo en 512 suele bastar para un uso normal. |
| PARAMETER mirostat | Activa el algoritmo Mirostat. | No impacta | Impacto bajo | No impacto | Mínima reducción | Solo es útil si se necesita controlar la entropía. |
| PARAMETER mirostat_eta | Velocidad de aprendizaje de Mirostat. | No hay impacto | No hay impacto | No hay impacto | No hay impacto. | No importa el hardware. |
| PARAMETER mirostat_tau | Objetivo de entropía. | No hay impacto | No hay impacto | No hay impacto | No hay impacto. | Solo afecta el comportamiento del modelo. |
| PARAMETER seed | Semilla del generador aleatorio. | No hay impacto | No hay impacto | No hay impacto | Sin impacto. | Ideal si queremos obtener resultados reproducibles. |
| PARAMETER stop | Secuencias de finalización de la generación. | No impacta | No impacta | No impacta | No impacta. | No hay consumo adicional de recursos. |
| TEMPLATE | Plantilla que usa el modelo para construir el prompt. | Es bajo | No hay impacto | Es bajo | Puede consumir algunos de los tokens del contexto. | Es conveniente evitar plantillas innecesariamente largas. |
| SYSTEM | Mensaje permanente de sistema. | Es bajo | No hay impacto | Es bajo | Ocupa parte del contexto. | Se recomienda mantenerlo corto. |
| ADAPTER | Carga uno o varios modelos LoRA. | Bajo | Muy bajo | Es bajo | Provoca una ligera disminución. | Consume memoria adicional. |
| LICENSE | Información de licencia. | No hay impacto | No hay impacto | No hay impacto | No hay impacto. | Solo tiene fines informativos. |
| MESSAGE | Conversaciones de ejemplo incluidas en el modelo. | Es bajo | Es muy bajo | Es muy bajo | Consume parte de la ventana de contexto. | Solo utilizar si es necesario. |

