Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

Agrega memoria a largo plazo a los agentes de LangGraph.js con MongoDB Atlas

Puede integrar MongoDB con LangGraph.js para agregar memoria a largo plazo a sus agentes, además de la memoria a corto plazo que obtiene del MongoDB LangGraph Checkpointer.

Esta página se basa en los conceptos de los siguientes tutoriales:

Usa esta página para aprender a:

  • Comprende la memoria a corto plazo en contraste con la memoria a largo plazo en LangGraph.

  • Configura un almacenamiento de memoria a largo plazo respaldado por MongoDB para LangGraph.js.

  • Persiste y recupera datos específicos del usuario entre diferentes hilos y sesiones.

  • Combina la memoria a largo plazo con MongoDB Vector Search y las incrustaciones de Voyage IA con AutoEmbeddings para una recuperación semántica.

Nota

Los ejemplos en esta página usan una sintaxis de estilo TypeScript. Puedes adaptarlos para JavaScript puro removiendo las anotaciones de tipo.

LangGraph proporciona dos mecanismos de memoria complementarios:

Utiliza un checkpointer para mantener el estado de un solo hilo (conversación) a través de las solicitudes. En la integración de MongoDB, esto es gestionado por MongoDB LangGraph Checkpointer (MongoDBSaver). Esto habilita funcionalidades como el viaje en el tiempo, la revisión con intervención humana y la tolerancia a fallas en una conversación determinada.

Utiliza una abstracción de almacenar para persistir datos a través de hilos, no solo dentro de una sola conversación. Ideal para almacenar datos que deben sobrevivir tanto entre sesiones como entre agentes.

Con el MongoDB Store para LangGraph.js, puedes:

  • Implementar la interfaz BaseStore en JavaScript/TypeScript con MongoDB como backend.

  • Utiliza la API estándar de la tienda (get, put, delete, search) de LangGraph.

  • Almacena documentos JSON en espacios de nombres jerárquicos (por ejemplo, [userId, "memories"]).

  • Realiza búsqueda semántica y filtrado de metadatos sobre tus datos almacenados, respaldados por MongoDB búsqueda vectorial y incrustaciones Voyage AI con AutoEmbeddings.

Antes de comenzar, asegúrate de tener lo siguiente:

Debes estar familiarizado y preferiblemente haber completado:

Instala las dependencias principales usadas en el tutorial Crear un agente IA, además del módulo MongoDB Store para LangGraph.js.

npm init -y
# Core LangChain / LangGraph / MongoDB dependencies
npm i --legacy-peer-deps \
langchain \
@langchain/langgraph \
@langchain/mongodb \
@langchain/community \
@langchain/langgraph-checkpoint-mongodb \
dotenv \
express \
mongodb \
zod

El paquete @langchain/langgraph-checkpoint-mongodb incluye tanto el checkpointer como el MongoDB Store para la memoria a largo plazo.

Las tiendas de LangGraph implementan la interfaz BaseStore con operaciones como get, put, delete y search para documentos JSON bajo namespace jerárquicos.

Vuelve a utilizar la configuración del cliente de MongoDB desde tu actual servidor de agentes LangGraph.js.

// mongodb-client.ts
import { MongoClient } from "mongodb";
import "dotenv/config";
export const client = new MongoClient(process.env.MONGODB_URI as string);
export async function connectClient() {
await client.connect();
await client.db("admin").command({ ping: 1 });
console.log("Pinged your deployment. You successfully connected to MongoDB!");
}

Crea un módulo que exporte un MongoDBStore configurado para la memoria a largo plazo.

// long-term-store.ts
import type { MongoClient } from "mongodb";
import { MongoDBStore } from "@langchain/langgraph-checkpoint-mongodb";
const DB_NAME = "hr_database";
const COLLECTION_NAME = "long_term_memory";
export function createMongoDBStore(client: MongoClient) {
const store = new MongoDBStore({
client,
dbName: DB_NAME,
collectionName: COLLECTION_NAME,
});
return store;
}

Este almacén persiste datos a través de hilos y sesiones, basado en claves por espacios de nombres jerárquicos como [userId, "memories"] o [userId, "preferences"].

La memoria a largo plazo funciona mejor cuando modelas hechos estables sobre tus usuarios o el dominio.

Los patrones comunes incluyen:

  • Perfiles de usuario: rol, antigüedad, equipo y ubicación. Preferencias persistentes (por ejemplo, tono, idioma, nivel de producto).

  • Restricciones y políticas: Alergias, restricciones de cumplimiento, límites presupuestarios.

  • Resúmenes del historial de interacciones: resúmenes de alto nivel de sesiones anteriores. Decisiones que deben mantenerse en el tiempo (por ejemplo, "el usuario prefiere MongoDB Atlas sobre lo autogestionado").

Puede almacenar estos bien como documentos sencillos JSON o como documentos con incrustaciones para búsqueda semántica.

La API de Store de MongoDB admite las siguientes operaciones:

  • put - almacenar o actualizar un valor.

  • get - recuperar un valor por namespace y clave.

  • delete - remover un valor.

  • search - recuperar valores mediante similitud de vectores y/o filtros de metadatos.

Los tipos exactos de TypeScript pueden diferir, pero el siguiente código demuestra un patrón de uso típico en LangGraph.js:

// memory-api.ts
import type { MongoDBStore } from "@langchain/langgraph-checkpoint-mongodb";
type MemoryValue = {
type: "profile" | "preference" | "fact";
data: Record<string, unknown>;
updatedAt: string;
};
export async function putUserMemory(
store: MongoDBStore,
userId: string,
key: string,
value: MemoryValue
) {
await store.put(
[userId, "memories"],
key,
value
);
}
export async function getUserMemories(
store: MongoDBStore,
userId: string,
key: string
) {
const result = await store.get(
[userId, "memories"],
key
);
return result;
}

Esta sección asume que ya tienes un flujo de trabajo de agentes similar al descrito en Crea un agente de IA con LangGraph.js y MongoDB Atlas, que incluye:

  • Una anotación de GraphState con un campo messages.

  • Un nodo de herramienta que llama a MongoDB búsqueda vectorial utilizando incrustaciones de Voyage IA.

  • Un nodo de modelo de chat que decide si llamar a herramientas o responder directamente.

  • Un register MongoDBSaver para la memoria a corto plazo.

Actualiza tu función callAgent para aceptar un store junto con el cliente de MongoDB:

// agent-with-long-term-memory.ts
import { ChatOpenAI } from "@langchain/openai";
import {
AIMessage,
BaseMessage,
HumanMessage,
} from "@langchain/core/messages";
import {
ChatPromptTemplate,
MessagesPlaceholder,
} from "@langchain/core/prompts";
import { StateGraph, Annotation } from "@langchain/langgraph";
import { tool } from "@langchain/core/tools";
import { ToolNode } from "@langchain/langgraph/prebuilt";
import { MongoDBSaver } from "@langchain/langgraph-checkpoint-mongodb";
import type { MongoClient } from "mongodb";
import type { MongoDBStore } from "@langchain/langgraph-checkpoint-mongodb";
import { putUserMemory, getUserMemories } from "./memory-api";
export async function callAgent(
client: MongoClient,
store: MongoDBStore,
query: string,
threadId: string,
userId: string,
) {
const dbName = "hr_database";
const db = client.db(dbName);
const collection = db.collection("employees");
// 1. Retrieve long-term memories for the user
const existingMemories = await getUserMemories(store, userId, "last_response");
// 2. Define graph state
const GraphState = Annotation.Root({
messages: Annotation<BaseMessage[]>({
reducer: (x, y) => x.concat(y),
}),
userId: Annotation<string>(),
memories: Annotation<unknown | null>(),
});
// 3. Define tools (for example, MongoDB Vector Search retriever)
const employeeLookupTool = tool(/* ...reuse from Build an AI Agent tutorial... */);
const tools = [employeeLookupTool];
const toolNode = new ToolNode<typeof GraphState.State>(tools);
// 4. Configure the chat model
const model = new ChatOpenAI({
model: "gpt-5.4-mini",
}).bindTools(tools);
// 5. Define the model node
async function callModel(state: typeof GraphState.State) {
const prompt = ChatPromptTemplate.fromMessages([
"system",
`You are a helpful HR chatbot agent.
Use the provided tools and long-term memories to answer questions.
Long-term memories (if any) are in the "memories" field.`,
new MessagesPlaceholder("messages"),
]);
const formatted = await prompt.formatMessages({
messages: state.messages,
});
const result = await model.invoke(formatted);
return { messages: [result] };
}
// 6. Define routing logic
function shouldContinue(state: typeof GraphState.State) {
const messages = state.messages;
const lastMessage = messages[messages.length - 1] as AIMessage;
if (lastMessage.tool_calls?.length) {
return "tools";
}
return "__end__";
}
// 7. Build the workflow
const workflow = new StateGraph(GraphState)
.addNode("agent", callModel)
.addNode("tools", toolNode)
.addEdge("__start__", "agent")
.addConditionalEdges("agent", shouldContinue)
.addEdge("tools", "agent");
// 8. Configure short-term memory (checkpointer)
const checkpointer = new MongoDBSaver({ client, dbName });
const app = workflow.compile({
checkpointer,
store,
});
// 9. Invoke the graph with both short-term and long-term memory
const finalState = await app.invoke(
{
messages: [new HumanMessage(query)],
userId,
memories: existingMemories,
},
{
recursionLimit: 15,
configurable: { thread_id: threadId },
},
);
const last = finalState.messages[finalState.messages.length - 1];
const content = last.content;
// 10. Optionally, update long-term memory with new facts
await putUserMemory(store, userId, "last_response", {
type: "fact",
data: { content },
updatedAt: new Date().toISOString(),
});
return content;
}

Este patrón te permite:

  • Leer la memoria a largo plazo al inicio de cada interacción.

  • Inyecta esos recuerdos en el estado (por ejemplo, como memories o en el prompt del sistema).

  • Actualiza la memoria a largo plazo después de cada interacción basándose en lo que el agente ha aprendido.

Para hacer que la memoria a largo plazo sea buscable por significado, puedes:

  1. Almacene cada memoria como un documento que incluya:

    • Un resumen o descripción de texto.

    • Metadatos estructurados (por ejemplo, userId, type, tags).

    • Un vector de incrustación para la búsqueda semántica.

  2. Configura un índice de MongoDB búsqueda vectorial en el campo embedding de tu colección de memoria.

  3. Utiliza las incrustaciones de Voyage AI o Voyage AutoEmbeddings (a través del API de Embedding y Reranking de Atlas) para generar incrustaciones para cada documento de memoria antes de insertarlo.

  4. Use el método de funcionalidad incorporada search en MongoDBStore, que llama a $vectorSearch en su colección de memoria, opcionalmente combinado con filtros de metadatos como userId y type.

El siguiente código muestra cómo utilizar el método incorporado search en MongoDBStore para encontrar memorias por similitud semántica y filtros de metadatos:

// semantic-memory.ts
import type { MongoDBStore } from "@langchain/langgraph-checkpoint-mongodb";
export async function searchUserMemories(
store: MongoDBStore,
userId: string,
queryText: string,
limit = 5,
) {
const results = await store.search(
[userId, "memories"],
{
query: queryText,
filter: { type: "fact" },
limit,
},
);
return results;
}

El método search acepta un prefijo de namespace y un objeto de opciones con los siguientes campos:

  • query - Una string de texto para la búsqueda semántica. La tienda utiliza MongoDB búsqueda vectorial para encontrar recuerdos que sean semánticamente similares a la query.

  • filter - Un objeto de filtro de metadatos para acotar los resultados (por ejemplo, { type: "fact" }).

  • limit - El número máximo de resultados a devolver (por defecto: 10).

  • offset - El número de resultados a omitir para la paginación (por defecto: 0).

Nota

Con Voyage AutoEmbeddings, puedes delegar la generación de incrustaciones en la API Atlas de incrustación y reranking y usar MongoDB búsqueda vectorial como tu almacenamiento backend. El almacén de memoria a largo plazo de LangGraph.js está diseñado para funcionar con esta experiencia, de modo que puedas combinar la generación automática de incrustaciones con los almacenes de LangGraph y la búsqueda vectorial para obtener una capa unificada de memoria a largo plazo.

Utiliza las siguientes directrices para elegir el mecanismo de memoria adecuado para cada parte de tu aplicación:

Mecanismo
Cuándo usar
Detalles

Memoria a corto plazo (Checkpointer)

Utiliza para el contexto por hilo que solo es relevante dentro de una conversación.

Ideal para razonamiento paso a paso, resultados de llamar a herramientas y estado intermedios. Respaldado por MongoDBSaver tanto en integraciones de Python como de JavaScript.

Memoria a largo plazo (almacén)

Úselo para información entre hilos que deba persistir a lo largo del tiempo.

Ideal para perfiles de usuario, políticas y restricciones, hechos de larga duración y recuperación semántica. Respaldado por la implementación de MongoDB Store de BaseStore en LangGraph.js.

En muchas aplicaciones del mundo real, tú:

  • Utiliza la memoria a corto plazo para mantener la coherencia de la conversación actual.

  • Utiliza la memoria a largo plazo para recordar al usuario y hechos importantes de conversaciones pasadas.

  • Utilice la Búsqueda Vectorial de MongoDB y las incrustaciones de Voyage AI con AutoEmbeddings para buscar recuerdos a nivel semántico al generar respuestas.

  • Siga el tutorial de principio a fin en Crear un agente de IA con LangGraph.js y MongoDB Atlas.

  • Usa esta página como referencia para añadir memoria a largo plazo y búsqueda semántica sobre tu agente existente.

  • Explora la Voyage AI Docs y la API Atlas Embedding y Reranking para obtener más detalles sobre las incrustaciones y los flujos de trabajo de incrustación automática.

MongoDB también proporciona los siguientes recursos para desarrolladores: