Modelos en LangChain
LangChain ofrece una interfaz unificada para trabajar con distintos tipos de modelos de lenguaje. Entender cómo configurar y usar estos modelos de forma efectiva es fundamental para construir aplicaciones de IA potentes.
🤖 Tipos de modelos
- Modelos de chat: Optimizados para interacciones conversacionales (GPT-4, Claude, Gemini)
- LLMs: Modelos de completado de texto (legado, pero aún soportados)
- Modelos de embeddings: Convierten texto en representaciones vectoriales
Modelos de chat
Los modelos de chat son el tipo más utilizado. Trabajan con mensajes en lugar de texto plano.
Uso básico
Crea un modelo de chat, envía un mensaje de sistema y uno humano, y lee el contenido de la respuesta.
import { ChatOpenAI } from "@langchain/openai";
import { HumanMessage, SystemMessage, AIMessage } from "@langchain/core/messages";
const model = new ChatOpenAI({
modelName: "gpt-4",
temperature: 0.7, // 0 = deterministic, 1 = creative
maxTokens: 1000,
});
// Simple invocation
const response = await model.invoke([
new SystemMessage("You are a helpful assistant."),
new HumanMessage("What is TypeScript?"),
]);
console.log(response.content);
Tipos de mensajes
Usa mensajes de sistema, humanos y de IA para estructurar conversaciones y preservar el contexto.
import {
SystemMessage, // Sets the AI's behavior/role
HumanMessage, // User input
AIMessage, // AI responses (for history)
} from "@langchain/core/messages";
const messages = [
new SystemMessage("You are a senior React developer."),
new HumanMessage("How do I use useEffect?"),
new AIMessage("useEffect is a hook for side effects..."),
new HumanMessage("Can you show me an example?"),
];
const response = await model.invoke(messages);
Configuración del modelo
Ajusta el comportamiento del modelo con temperatura, límites de tokens, reintentos y flags de streaming.
const model = new ChatOpenAI({
modelName: "gpt-4-turbo-preview",
temperature: 0.7, // Creativity (0-1)
maxTokens: 2000, // Max response length
timeout: 60000, // Timeout in ms
maxRetries: 2, // Retry on failure
streaming: true, // Enable streaming
});
Plantillas de prompts
Las plantillas de prompts te ayudan a crear prompts reutilizables y dinámicos con variables.
Plantilla de prompt básica
Las plantillas de prompt te permiten inyectar variables en un string reutilizable.
import { PromptTemplate } from "@langchain/core/prompts";
const template = PromptTemplate.fromTemplate(
"You are a {role}. Answer this question: {question}"
);
const prompt = await template.format({
role: "JavaScript expert",
question: "What are closures?",
});
console.log(prompt);
// "You are a JavaScript expert. Answer this question: What are closures?"
Plantillas de prompt para chat
Los prompts de chat definen mensajes por rol y los formatean en un arreglo listo para enviar.
import { ChatPromptTemplate } from "@langchain/core/prompts";
const chatPrompt = ChatPromptTemplate.fromMessages([
["system", "You are a {specialty} expert. Be concise and helpful."],
["human", "{question}"],
]);
const messages = await chatPrompt.formatMessages({
specialty: "React",
question: "How do I manage state?",
});
const response = await model.invoke(messages);
Marcadores de posición de mensajes
Los placeholders facilitan insertar historial de conversación u otras listas dinámicas de mensajes.
import { ChatPromptTemplate, MessagesPlaceholder } from "@langchain/core/prompts";
const prompt = ChatPromptTemplate.fromMessages([
["system", "You are a helpful assistant."],
new MessagesPlaceholder("history"), // For conversation history
["human", "{input}"],
]);
const messages = await prompt.formatMessages({
history: [
new HumanMessage("Hi, I'm learning React"),
new AIMessage("Great! React is a powerful library."),
],
input: "What should I learn first?",
});
Respuestas en streaming
Habilita streaming para recibir tokens progresivamente y mejorar la latencia percibida.
const model = new ChatOpenAI({
modelName: "gpt-4",
streaming: true,
});
// Stream tokens
const stream = await model.stream([
new HumanMessage("Write a short poem about coding"),
]);
for await (const chunk of stream) {
process.stdout.write(chunk.content);
}
Salida estructurada
Obtén respuestas JSON estructuradas del modelo:
Define un esquema con Zod para validar y parsear la respuesta del modelo de forma fiable.
import { z } from "zod";
// Define the output schema
const responseSchema = z.object({
answer: z.string().describe("The answer to the question"),
confidence: z.number().describe("Confidence score 0-100"),
sources: z.array(z.string()).describe("Related topics"),
});
const structuredModel = model.withStructuredOutput(responseSchema);
const response = await structuredModel.invoke(
"What is the capital of France?"
);
console.log(response);
// { answer: "Paris", confidence: 100, sources: ["Geography", "European capitals"] }
Vincular herramientas a los modelos
Las herramientas permiten que el modelo llame funciones con entradas estructuradas y luego use los resultados en su respuesta.
import { tool } from "@langchain/core/tools";
import { z } from "zod";
// Define a tool
const weatherTool = tool(
async ({ city }) => {
// Simulate API call
return `The weather in ${city} is sunny, 72°F`;
},
{
name: "get_weather",
description: "Get the current weather for a city",
schema: z.object({
city: z.string().describe("The city name"),
}),
}
);
// Bind tool to model
const modelWithTools = model.bindTools([weatherTool]);
const response = await modelWithTools.invoke(
"What's the weather in San Francisco?"
);
💡 Puntos clave
- • Los modelos de chat trabajan con objetos de mensaje (System, Human, AI)
- • La temperatura controla la creatividad vs determinismo
- • Las plantillas de prompt crean prompts reutilizables y dinámicos
- • Usa salida estructurada para respuestas JSON fiables
- • El streaming mejora la UX en respuestas largas
📚 Más recursos
-
Documentación de modelos de chat →
Guía completa para usar modelos de chat.
-
Guía de plantillas de prompt →
Técnicas avanzadas de prompt engineering.