localaiforum
Iniciar sesión
Guía › Trabajo con modelos

Prompts y plantillas de chat

Todo mensaje que envías se envuelve en marcado antes de que el modelo
lo vea. La plantilla de chat convierte tus mensajes etiquetados por rol
en una sola cadena plana de tokens, y el modelo fue entrenado para leer
esa cadena exacta — no tus objetos API tan ordenados. Acierta con el
sobre y un modelo instruct de 3B se comporta; equivócate y un modelo de
70B emite sopa de palabras.

El sobre: un chat, tres dialectos

Tu API expone roles: system, user, assistant. El modelo ve tokens
especiales. La misma conversación de dos mensajes, renderizada de tres
maneras.

ChatML — modelos de la familia Qwen y ajustes del linaje Hermes:

<|im_start|>system
You are a concise assistant.<|im_end|>
<|im_start|>user
Summarize this file.<|im_end|>
<|im_start|>assistant

Estilo Llama 2 — marcadores de sistema anidados dentro de la primera
instrucción:

<s>[INST] <<SYS>>You are a concise assistant.<</SYS>>

Summarize this file. [/INST] The file implements a tokenizer... </s>

Estilo Gemma — no hay rol de sistema; las instrucciones viajan en el
primer turno de usuario, y el asistente se llama model:

<bos><start_of_turn>user
You are a concise assistant.

Summarize this file.<end_of_turn>
<start_of_turn>model

La misma conversación, tres sobres incompatibles. Un modelo entrenado
con ChatML no «descifra» la marcación Llama — trata la marcación ajena
como texto ordinario y responde en la misma moneda.

Los motores leen la plantilla del archivo del modelo

Los metadatos GGUF incrustan una chat_template (un fragmento Jinja).
llama.cpp, Ollama, LM Studio y Open WebUI la leen y renderizan tus
mensajes automáticamente, y por eso el chat funciona nada más abrir con un
GGUF como es debido. Dos trampas clásicas: el endpoint de completación en
crudo (/completion) se salta la plantilla y le entrega al modelo texto
pelado — usa el endpoint de chat; y un GGUF puede llegar con la plantilla
ausente o equivocada — pasa una explícita (--chat-template en llama.cpp,
un Modelfile en Ollama) o toma otra cuantización del mismo modelo de una
fuente que lo clavó.

Síntomas de una plantilla equivocada

  • Respuesta vacía instantánea — el prompt renderizado ya parece una
    conversación terminada, así que el modelo emite EOS de inmediato.
  • Fuga de roles — la salida se lee user: claro que sí! assistant:
    — el modelo imita el sobre en vez de responder.
  • Basura — sopa de palabras de modelo base desde un modelo que
    chateaba bien hace una hora, porque cambiaste de archivo sin cambiar de
    plantilla.

Para diagnosticar, vuelca el prompt renderizado — el servidor de llama.cpp
lo registra en detalle, OLLAMA_DEBUG=1 lo muestra en Ollama. Luego
arregla la plantilla o el archivo: resolución de
problemas
.

Prompts de sistema y precedencia

El rol de sistema fija comportamiento persistente: persona, idioma,
formato de salida, postura de seguridad. Es contexto, no firmware — una
conversación larga puede diluirlo, y los modelos pequeños lo ponderan
menos de lo que esperas. Dos reglas prácticas: pon todo lo crítico
(idioma, contrato de formato, restricciones duras) en el prompt de
sistema y reprodúcelo en el mensaje final del usuario; las
instrucciones más cercanas a la generación ganan.

Zero-shot vs few-shot

El zero-shot pide; el few-shot muestra. Extraer campos estructurados de
informes de bugs con un modelo 3B, zero-shot — «Extrae el título, el
componente y la severidad como JSON» — produce JSON válido y con claves
consistentes unas dos tercias partes de las veces, con nombres de clave
que derivan (severity en un turno, priority en el siguiente).

Few-shot: mismo modelo, dos ejemplos resueltos, tercer informe dejado
abierto:

Report: "Login button does nothing on Safari 17."
{"title": "Login button unresponsive", "component": "auth", "severity": "medium"}

Report: "App crashes when uploading 4K video."
{"title": "Crash on 4K upload", "component": "upload", "severity": "high"}

Report: "Dark mode makes settings text unreadable."

Los ejemplos cargan con el contrato de formato, así que el sampler elige
contenido en vez de inventar esquema. En esta clase de tarea la tasa de
fallo de formato suele caer de ~30% a unos pocos por ciento. Dos o tres
ejemplos son el punto de inflexión de la curva; más allá, pagas tokens de
contexto. Para esquemas estrictos, sáltate las adivinanzas del todo:
salida estructurada.

Patrones que sobreviven a los modelos pequeños

Patrón Por qué funciona
Una tarea por prompt Las tareas compiten por la atención; las perdedoras se caen
Formato de salida explícito («JSON con claves a, b, c») Vuelve el formato una elección casi determinista
Pasos numerados («1) localizar 2) explicar 3) parchear») La cadena se queda en rieles en vez de divagar
Ejemplos sobre descripciones Los modelos imitan mejor de lo que obedecen prosa
Metainstrucciones cortas Cada regla extra diluye a todas las demás

En medio del contexto es donde mueren las instrucciones

La atención es más fuerte al principio y al final del prompt — el efecto
«perderse en el medio», estable entre familias de modelos. Colocación
práctica: objetivo y contrato de formato arriba, el documento a procesar
abajo, y para documentos largos una repetición de una línea tras la
carga. La posición es tan crítica como el contenido — y cada turno extra
de contexto cuesta memoria: caché KV.

Secuencias de parada

La generación termina cuando el modelo emite su token EOS — la plantilla
define cuál es. Las secuencias de parada extra (el parámetro stop del
servidor llama.cpp y las APIs compatibles con OpenAI) truncan en una
cadena: útil cuando un modelo hablador empieza a escribir tu siguiente
turno de usuario. Elige paradas que solo puedan significar «turno
terminado» (\n<|im_start|> en modelos ChatML), nunca cadenas que
ocurran dentro de respuestas legítimas — un salto de línea pelado
recortará código multilínea en mitad de un bloque.

La brevedad vence a la verbosidad por debajo de ~7B

Los modelos instruct pequeños siguen mejor una instrucción de 40 palabras
que una rúbrica de 400: su atención limitada se reparte sobre lo que les
entregues. La estructura y los ejemplos sustituyen a las reglas en prosa.
Guárdale los prompts-ensayo a los modelos grandes; son los únicos que
leen cada línea.

Plantillas de fragmento reutilizables

Extracción:

Extract from the text below: person names, dates, money amounts.
Return a JSON array, one object per item, keys: name, date, amount.
No prose before or after the JSON.
Text: {text}

Resumen:

Summarize in exactly 3 bullet points, each under 15 words,
for someone who skipped the meeting. Most important decision first.
Text: {text}

Revisión de código:

Review the diff below. List at most 5 findings, ordered by severity.
Format each as: [severity] file:line — problem — suggested fix.
Skip praise and summary. Diff: {diff}

Relacionados: tokens · salida estructurada · parámetros del motor · resolución de problemas