Formateo de Prompts del Sistema para un Comportamiento Consistente de Claude
El parámetro system es donde estableces la persona, las restricciones y el formato de salida una vez para toda la conversación, en lugar de repetir las instrucciones en cada turno.
Un prompt del sistema bien estructurado es lo que tiene mayor influencia para obtener un comportamiento consistente y predecible de Claude.
Resumen
El parámetro system es un campo de nivel superior en la solicitud, separado del array messages.
Se aplica a toda la conversación, no solo al primer turno, por lo que es el lugar natural para cualquier cosa que deba mantenerse en todos los intercambios: tono, rol, restricciones y formato de salida.
A diferencia de un turno user, el contenido de system nunca se "responde": Claude lo trata como instrucciones permanentes en lugar de algo a lo que responder directamente.
Dado que se encuentra al principio del prompt renderizado, también es el punto de anclaje para el almacenamiento en caché del prompt: mantenerlo estable e idéntico byte a byte entre solicitudes es lo que hace que el almacenamiento en caché sea efectivo.
Los buenos prompts del sistema son específicos y estructurados, no discursos de ánimo vagos: "sé útil" hace mucho menos que una descripción concreta de la persona, el alcance y el formato.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
import anthropic
client = anthropic.Anthropic()
SYSTEM_PROMPT = """Eres un asistente de soporte al cliente para una plataforma de comercio electrónico.
Persona: profesional, cálido, conciso.
Alcance: solo preguntas sobre el estado del pedido, devoluciones y envíos. Para cualquier otra cosa, di que no puedes ayudar con eso y sugiere contactar a un agente humano.
Formato de salida: oraciones simples, sin encabezados markdown, sin listas con viñetas a menos que el usuario pida una lista."""
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": "¿Dónde está mi pedido #4821?"}],
)
print(response.content[0].text)Cuándo usar esto:
- Cualquier aplicación donde Claude necesite una persona o voz consistente en cada respuesta.
- Cualquier lugar donde necesites que Claude se mantenga dentro de un alcance definido y rechace solicitudes fuera de alcance de manera predecible.
- Salida que el código posterior procesa (estructura similar a JSON, una plantilla fija, reglas de formato específicas).
- Conversaciones de varios turnos, donde repetir instrucciones en cada turno de
usersería un desperdicio e inconsistente.
Ejemplo de Trabajo
import anthropic
client = anthropic.Anthropic()
SYSTEM_PROMPT = """Eres un asistente de clasificación para un rastreador de errores interno.
Persona:
- Directo y técnico. Sin cortesías, sin "estaré encantado de ayudar".
Restricciones:
- Solo clasifica los errores en exactamente una de las siguientes categorías: "crítico", "alto", "medio", "bajo".
- Nunca inventes un nivel de severidad fuera de esa lista.
- Si el informe no tiene suficiente información para clasificar con confianza, haz exactamente una pregunta aclaratoria en lugar de adivinar.
Formato de salida:
- Responde solo con dos líneas:
Severidad: <nivel>
Razón: <una oración>
- No agregues ningún otro texto, encabezado o explicación más allá de esas dos líneas."""
def triage(report: str) -> str:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=256,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": report}],
)
return response.content[0].text
if __name__ == "__main__":
print(triage("El botón de inicio de sesión no hace nada al hacer clic en Safari 17. Funciona bien en Chrome."))
print(triage("Error tipográfico en el pie de página: 'Copyright 2025' debería decir 'Copyright 2026'."))Lo que esto demuestra:
- El prompt del sistema está organizado en secciones claras: Persona, Restricciones, Formato de salida, en lugar de un solo párrafo indiferenciado.
- Las restricciones enumeran explícitamente los valores permitidos ("crítico"/"alto"/"medio"/"bajo"), cerrando la tendencia del modelo a inventar alternativas que suenan plausibles.
- La sección de formato de salida especifica la estructura exacta esperada, lo que es importante cuando el código posterior procesará la respuesta.
triage()reutiliza la misma cadenaSYSTEM_PROMPTfija en cada llamada, manteniendo el comportamiento consistente de una llamada a otra.
Análisis Profundo
Cómo Funciona
systemse renderiza antes quemessagesen el prompt que Claude realmente ve, por eso funciona como contexto permanente en lugar de un turno al que Claude responde directamente.- Se evalúa de nuevo en cada solicitud; no hay memoria parcial de él entre llamadas, por lo que envías el mismo valor cada vez que deseas el mismo comportamiento.
- Claude sigue instrucciones explícitas y estructuradas de manera más confiable que el lenguaje vago o aspiracional: las restricciones concretas vencen a "intenta ser preciso".
- Dado que
systemse encuentra al principio de la solicitud (antes quetoolsen el orden de renderizado, viene después detools, pero antes quemessages), es el ancla natural para el almacenamiento en caché del prompt: una cadenasystemestable e inalterada permite que las solicitudes repetidas reutilicen tokens cacheados en lugar de reprocesar el mismo texto cada vez. - Editar el prompt del sistema a mitad de la conversación es posible, pero cambia el prefijo delante de todo tu historial de mensajes, lo que cambia el comportamiento e invalida cualquier caché construida sobre el prefijo anterior.
Estructuración de un Prompt del Sistema
| Sección | Propósito | Ejemplo |
|---|---|---|
| Persona | Quién actúa Claude y su tono | "Eres un asistente legal formal." |
| Alcance | Con qué Claude debe y no debe ayudar | "Solo responde preguntas sobre el código de este repositorio." |
| Restricciones | Reglas estrictas que la respuesta debe seguir | "Nunca sugieras una severidad fuera de esta lista fija." |
| Formato de salida | La forma exacta de la respuesta | "Responde con JSON válido que coincida con este esquema." |
| Comportamiento de respaldo | Qué hacer cuando la solicitud no encaja | "Si el alcance no está claro, haz una pregunta aclaratoria." |
No todos los prompts necesitan las cinco secciones, pero recurrir a esta estructura evita que escribas un solo bloque de texto difícil de auditar o actualizar.
Notas de Python
# Mantén los prompts del sistema en un solo lugar, no en cadenas en línea dispersas por los puntos de llamada.
# Cargar desde un archivo también facilita la revisión de prompts largos y la comparación en el control de versiones.
from pathlib import Path
SYSTEM_PROMPT = Path("prompts/support_agent.txt").read_text()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": "Hola, necesito ayuda con una devolución."}],
)Tratar un prompt del sistema largo como un activo de texto versionado, en lugar de una cadena en línea, facilita la revisión de cambios y garantiza que se utilice exactamente la misma cadena en cada implementación.
Trampas
- Interpolar valores dinámicos (marcas de tiempo, IDs de usuario, IDs de solicitud) directamente en el prompt del sistema. Esto hace que el prompt sea una cadena diferente en cada solicitud, lo que rompe silenciosamente el almacenamiento en caché del prompt. Solución: mantén
systemfijo y pon el contexto dinámico en un turnouseren su lugar, o en modelos compatibles usa un mensaje del sistema a mitad de la conversación. - Escribir instrucciones vagas y aspiracionales como "sé preciso y útil". El lenguaje vago le da a Claude poco que seguir. Solución: establece restricciones concretas y un formato de salida específico en lugar de un ánimo general.
- Repetir las mismas instrucciones en cada mensaje
useren lugar del prompt del sistema. Esto desperdicia tokens y corre el riesgo de inconsistencia si el texto repetido se desvía entre los puntos de llamada. Solución: mueve todo lo que deba mantenerse durante toda la conversación asystemuna vez. - Asumir que Claude "responderá" al prompt del sistema como un mensaje.
systemno es un turno al que Claude responde; es contexto permanente, así que no esperes una respuesta directa a nada que esté formulado como una pregunta en él. Solución: formula el contenido desystemcomo instrucciones y hechos, no como un mensaje que espera una respuesta. - Cambiar el prompt del sistema entre solicitudes en la misma conversación sin una razón. Hacer esto cambia el comportamiento a mitad de la conversación de maneras que pueden confundir tanto a Claude como a tus usuarios, e invalida cualquier caché de prompt construida sobre el texto anterior. Solución: mantenlo estable durante la vida de una conversación; si realmente necesitas una actualización a mitad de la conversación, consulta la página dedicada a mensajes del sistema a mitad de la conversación.
- Olvidar la sección de formato de salida para respuestas analizadas por máquinas. Sin una especificación de formato explícita, la redacción de Claude puede variar de una ejecución a otra, rompiendo un analizador posterior. Solución: describe siempre la forma exacta esperada cuando el código consumirá la respuesta, o considera salidas estructuradas para garantías estrictas.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Salidas estructuradas (output_config.format) | Necesitas una forma JSON garantizada y analizable en lugar de una respuesta formateada con el mejor esfuerzo | Una respuesta conversacional de formato libre está bien y no necesita validación de esquema estricta |
Instrucciones repetidas en cada turno user | Una instrucción única se aplica solo a una solicitud | La instrucción debe mantenerse durante toda la conversación |
| Mensajes del sistema a mitad de la conversación (controlados por modelo) | Una instrucción necesita cambiar a mitad de una conversación larga sin reconstruir todo el prompt del sistema | La instrucción se conoce de antemano y no cambia durante la conversación |
Preguntas Frecuentes
¿Dónde va el prompt del sistema en la solicitud?
Es un parámetro system de nivel superior en client.messages.create(), separado del array messages, no un mensaje con un rol.
¿Claude responde directamente al prompt del sistema?
No. Se trata como instrucciones permanentes y contexto para toda la conversación, no como un turno al que Claude responde; la respuesta real de Claude se genera en respuesta a los turnos user.
¿Necesito reenviar el prompt del sistema en cada solicitud en una conversación?
Sí. A diferencia de messages, que acumula turnos, system no es acumulativo; pasas el mismo valor en cada llamada para mantener la consistencia del comportamiento.
¿Por qué cambiar el prompt del sistema a mitad de la conversación es importante para el almacenamiento en caché?
El almacenamiento en caché del prompt se basa en un prefijo estable. Dado que system se renderiza cerca del principio del prompt, cualquier cambio en él invalida la caché para todo lo que sigue, forzando un reprocesamiento completo en la siguiente solicitud.
¿Cuál es la mejor manera de estructurar un prompt del sistema largo?
Divídelo en secciones claras: persona, alcance, restricciones, formato de salida y comportamiento de respaldo, en lugar de un solo párrafo indiferenciado. Es más fácil de razonar tanto para ti como para Claude.
¿Las reglas de formato de salida deben ir en el prompt del sistema o en el mensaje del usuario?
Si el formato debe aplicarse a cada respuesta de la conversación, ponlo en system. Si es específico de una solicitud, un turno user está bien; pero repetir las reglas de formato por turno es más propenso a errores que establecerlas una vez.
¿Puede el prompt del sistema hacer que Claude se niegue a responder ciertos temas?
Sí; establecer un alcance explícito y una instrucción de respaldo ("si se pregunta sobre X, di que no puedes ayudar con eso") es una forma fiable de mantener las respuestas dentro de un límite definido.
¿Un prompt del sistema más largo es siempre mejor?
No. La longitud no es el objetivo, la especificidad sí lo es. Un prompt corto y redactado con precisión con restricciones concretas generalmente supera a un prompt largo lleno de ánimos vagos.
¿Puedo cargar el prompt del sistema desde un archivo en lugar de una cadena en línea?
Sí, y es una buena práctica para prompts más largos; mantenerlo como un activo de texto separado y versionado facilita la revisión de cambios y garantiza que se utilice exactamente la misma cadena en cada implementación.
¿Qué sucede si mi prompt del sistema entra en conflicto con algo que pide el usuario?
Claude generalmente sigue las restricciones del prompt del sistema sobre una solicitud de usuario conflictiva, que es exactamente por qué es el lugar correcto para poner reglas estrictas como límites de alcance o valores de salida prohibidos.
¿Existe un formato estricto que Claude requiera para el parámetro `system` en sí?
No; system acepta una cadena simple (o una lista de bloques de texto para uso avanzado como puntos de interrupción de caché); no hay una sintaxis interna requerida, por lo que cualquier estructura de lenguaje natural clara y bien organizada funciona.
Relacionados
- Comprensión de Roles y Turnos en la API de Mensajes - cómo
systemse relaciona con el arraymessages. - Conceptos Básicos de la API de Mensajes - un primer ejemplo que incluye un prompt
system. - Implementación de Mensajes del Sistema a Mitad de Conversación en Claude Opus 4.8 - actualización de instrucciones a mitad de una conversación sin reconstruir
system.
Versiones de Stack: Escrito contra la línea de modelos Claude actual hasta aproximadamente junio de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (el predeterminado) y Claude Haiku 4.5 - y el SDK oficial de Python
anthropic(última versión 0.x). Los nombres de los modelos, las versiones del SDK y los precios cambian rápidamente; verifica los detalles actuales en platform.claude.com/docs antes de confiar en ellos.