**ChatPromptTemplate** permite reutilizar prompts con variables dinámicas y la notación abreviada de roles
```typescript
import { ChatPromptTemplate } from "@langchain/core/prompts";
const template = ChatPromptTemplate.fromMessages([
["system", "Eres un experto en {topic}"], // ← shorthand de SystemMessage
["human", "{question}"] // ← shorthand de HumanMessage
]);
const prompt = await template.invoke({
topic: "JavaScript",
question: "¿Qué es async/await?"
});
const response = await model.invoke(prompt);
```
💡 Los templates son útiles para reutilización, testing y separar prompts de la lógica. Pero para casos simples, puedes usar mensajes directamente.