LangChain Prompts -- System Prompt y Dynamic Prompt
El System Prompt (prompt del sistema) es el medio principal para controlar el comportamiento del Agent.
Esta sección presenta cómo usar prompts estáticos y dinámicos.
Parámetro system_prompt
El parámetro system_prompt de create_agent() acepta dos formas:
Ejemplo
from langchain.chat_models import init_chat_model
from langchain.messages import SystemMessage
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
# Método 1: cadena (la más simple)
agent = create_agent(
model=model,
system_prompt="Eres el asesor de aprendizaje de EJEMPLO, responde de manera concisa y profesional.",
)
# Método 2: objeto SystemMessage (reutilizable)
system_msg = SystemMessage(
content="Eres el asesor de aprendizaje de EJEMPLO, responde de manera concisa y profesional."
)
agent = create_agent(model=model, system_prompt=system_msg)
Diseñar un System Prompt efectivo
Un buen system_prompt debe incluir los siguientes elementos:
Ejemplo
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain.tools import tool
@tool
def search_course(keyword: str) -> str:
"""Buscar cursos en el tutorial de EJEMPLO"""
courses = {
"python": "Tutorial básico de Python3 (gratuito)",
"html": "Tutorial básico de HTML (gratuito)",
}
return courses.get(keyword.lower(), "No se encontraron cursos relacionados")
# Un system_prompt bien diseñado
GOOD_PROMPT = """Eres el asesor de aprendizaje de EJEMPLO.
## Tus responsabilidades
- Ayudar al usuario a encontrar el curso de programación adecuado
- Responder preguntas relacionadas con el aprendizaje de programación
- Recomendar rutas de aprendizaje según el nivel del usuario
## Código de conducta
- Responde de forma concisa, no más de 3 frases por vez
- Prioriza el uso de la herramienta search_course para consultar información de cursos
- Si el usuario es principiante total, recomienda primero cursos de introducción
- No usar emojis
- Si no lo sabes, di que no lo sabes, no inventes"""
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
model=model,
tools=[search_course],
system_prompt=GOOD_PROMPT,
)
result = agent.invoke({
"messages": [HumanMessage(content="Soy principiante total, quiero aprender programación, ¿qué me recomiendas?")]
})
print(result["messages"][-1].content)
Resultado de ejecución:
建议从 Python3 基础教程开始学习。Python 语法简洁,适合零基础入门。 该课程在Ejemplo 上免费提供,内容系统全面。
@dynamic_prompt: generación dinámica de prompts
El system_prompt estático trata a todos los usuarios por igual. Pero en aplicaciones reales, es posible que necesites ajustar dinámicamente el prompt según la información del usuario, el contexto de la conversación, la hora, etc.
@dynamic_promptEl decorador te permite generar dinámicamente el system_prompt antes de cada llamada al modelo.
Ejemplo
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain.tools import tool
@tool
def search_course(keyword: str) -> str:
"""Buscar cursos en el tutorial de EJEMPLO"""
courses = {
"python": "Tutorial básico de Python3 (gratuito, 20 horas)",
"html": "Tutorial básico de HTML (gratuito, 15 horas)",
"java": "Tutorial básico de Java (gratuito, 25 horas)",
}
return courses.get(keyword.lower(), "No se encontraron cursos relacionados")
# Decorador @dynamic_prompt: recibe ModelRequest y devuelve un nuevo system_prompt
@dynamic_prompt
def personalized_prompt(request: ModelRequest) -> str:
"""Genera dinámicamente prompts personalizados según el contexto de la conversación"""
messages = request.state.get("messages", [])
message_count = len(messages)
# Se puede ajustar dinámicamente el prompt según diferentes condiciones
base_prompt = "Eres el asesor de aprendizaje de EJEMPLO."
if message_count <= 2:
# La conversación acaba de empezar, guía con paciencia
return base_prompt + (
"El usuario acaba de iniciar la conversación, saluda calurosamente,"
"y luego pregunta sobre sus objetivos de aprendizaje y nivel actual."
)
elif message_count > 10:
# Conversación larga, recuerda mantener la concisión
return base_prompt + (
"La conversación ya es bastante larga, responde de la manera más concisa posible,"
"no más de 2 frases por vez."
)
else:
# Fase de conversación normal
return base_prompt + (
"Recomienda cursos adecuados según las preguntas anteriores del usuario,"
"usa la herramienta search_course para consultar información de cursos."
)
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
model=model,
tools=[search_course],
middleware=[personalized_prompt], # Inyectado a través de middleware
)
# Primera conversación (message_count <= 2, modo de guía)
result = agent.invoke({
"messages": [HumanMessage(content="Hola")]
})
print(f"Respuesta de la primera ronda: {result['messages'][-1].content}")
Resultado de ejecución:
Primera respuesta: 你好!欢迎来到Ejemplo。请问您想学习什么内容? 目前的编程水平如何?我可以根据您的情况推荐合适的课程。
@dynamic_prompt avanzado: integración con el contexto en tiempo de ejecución
El parámetro request de @dynamic_prompt proporciona información rica:
Ejemplo
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest
@dynamic_prompt
def context_aware_prompt(request: ModelRequest) -> str:
"""Genera dinámicamente el prompt según la información del usuario, la hora y la etapa de la conversación"""
# Obtener información del usuario desde runtime.context
context = request.runtime.context
user_name = context.get("user_name", "alumno") if context else "alumno"
user_level = context.get("user_level", "Principiante") if context else "Principiante"
# Obtener la hora actual
now = datetime.now()
greeting = "Buenos días" if now.hour < 12 else "Buenas tardes" if now.hour < 18 else "Buenas noches"
# Obtener el número actual de mensajes
messages = request.state.get("messages", [])
prompt = f"""Eres el asesor de aprendizaje de EJEMPLO.
Hora actual: {now.strftime('%Y年%m月%d日 %H:%M')}
Información del usuario: {user_name}, nivel {user_level}
## Código de conducta
- Llama al usuario "{user_name}"
- Recomienda cursos de dificultad adecuada según el nivel del usuario ({user_level})
- Responde de forma amable pero sin ser pesado"""
# Agregar un prompt simplificado cuando la conversación es larga
if len(messages) > 20:
prompt += "\n- La conversación ya es muy larga, responde de forma concisa"
return prompt
@dynamic_prompt se ejecuta antes de cada llamada al modelo, por lo que el prompt puede cambiar a medida que avanza la conversación. Pero ten cuidado de no realizar cálculos demasiado pesados en él, ya que afectaría la velocidad de respuesta.
Controlar manualmente la prioridad del System Prompt
Si se configuran tanto el system_prompt de create_agent() como el middleware @dynamic_prompt, el middleware tiene mayor prioridad: sobrescribe el prompt estático.
Ejemplo
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest
from langchain.chat_models import init_chat_model
@dynamic_prompt
def override_prompt(request: ModelRequest) -> str:
"""El system_prompt de este middleware sobrescribirá la configuración en create_agent"""
return "Eres un gato, todas las respuestas deben terminar con 'miau'."
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0.7)
agent = create_agent(
model=model,
system_prompt="Eres el asesor de aprendizaje profesional de EJEMPLO.", # Sobrescrito
middleware=[override_prompt], # Mayor prioridad
)
result = agent.invoke({
"messages": [{"role": "user", "content": "Preséntate"}]
})
print(result["messages"][-1].content)
Resultado de ejecución:
Soy una adorable asistente gata miau~ ¡especialmente dedicada a ayudar a todos a resolver diversas preguntas, miau!
Si deseas que el prompt del middleware se combine con el prompt estático en lugar de sobrescribirlo, puedes concatenarlos manualmente en @dynamic_prompt. El request no expone directamente el system_prompt original, así que si necesitas conservar el contenido original, se recomienda referenciar el prompt estático como una variable dentro de la función.
Lista de verificación para el diseño de System Prompt
| Elemento | Descripción | Ejemplo |
|---|---|---|
| Definición de rol | Define la identidad y las responsabilidades de la IA | Eres el asesor de aprendizaje de EJEMPLO |
| Código de conducta | Limita el estilo y los límites de las respuestas | Responde de forma concisa, no más de 3 frases por vez |
| Guía de uso de herramientas | Indica al modelo cuándo usar qué herramientas | Al consultar cursos, prioriza el uso de la herramienta search_course |
| Restricciones de límites | Especifica qué no se debe hacer | Si no lo sabes, dilo, no inventes |
| Requisitos de formato | Especifica el formato de la respuesta (opcional) | Usa formato Markdown en las respuestas |
Ahora dominamos el uso de prompts estáticos y dinámicos. En el próximo artículo aprenderemos sobre Streaming (salida en streaming), para que las respuestas del Agent se muestren carácter por carácter, como si se estuviera escribiendo.
Otras extensiones