Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Menu Docs
Página inicial do Docs
/ /

Adicionar memória de longo prazo aos agentes LangGraph.js com o MongoDB Atlas

Você pode integrar o MongoDB ao LangGraph.js para adicionar memória de longo prazo aos seus agentes, além da memória de curto prazo obtida no MongoDB LangGraph Checkpointer.

Esta página baseia-se nos conceitos dos seguintes tutoriais:

Use esta página para saber como:

  • Entenda a memória de curto prazo e a de longo prazo no LangGraph.

  • Configure um armazenamento de memória de longo prazo apoiado MongoDB para LangGraph.js.

  • Persista e recupere dados específicos do usuário em threads e sessões.

  • Combine a memória de longo prazo com as incorporações do MongoDB Vector Search e Voyage AI com as incorporações AutoEmbeddings para recuperação semântica.

Observação

Os exemplos nesta página usam sintaxe de estilo TypeScript. Você pode adaptá-las para JavaScript simples removendo as anotações de tipo.

O LangGraph fornece dois mecanismos de memória complementares:

Usa um checkpointer para persistir o estado de um único thread (conversa) em todas as solicitações. Na integração do MongoDB , isso é tratado pelo MongoDB LangGraph CheckpointerMongoDBSaver (). Isso habilita recursos como viagem no tempo, revisão de humanos no loop e tolerância a falhas em uma determinada conversa.

Usa uma abstração de armazenamento para manter os dados entre threads, não apenas em uma única conversa. Ideal para armazenar dados que devem sobreviver entre as sessões e entre os agentes.

Com a Loja MongoDB para LangGraph.js, você pode:

  • Implemente a interface BaseStore no JavaScript/TypeScript com MongoDB como backend.

  • Use a API de armazenamento padrão (get, put, delete, search) da LangGraph.

  • Armazene documentosJSON em namespaces hierárquicos (por [userId, "memories"] exemplo,).

  • Execute pesquisa semântica e filtragem de metadados em seus dados armazenados, com o suporte das incorporações do MongoDB Vector Search e Voyage AI com o AutoEmbeddings.

Antes de começar, certifique-se de ter o seguinte:

Você deve estar familiarizado e, idealmente, ter concluído:

Instale as dependências principais usadas no tutorial Crie um agente de IA, além do 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

O pacote @langchain/langgraph-checkpoint-mongodb inclui o checkpointer e o MongoDB Store para memória de longo prazo.

As Lojas LangGraph implementam a BaseStore interface com operações get putcomo,, delete e search para documentos JSON em namespaces hierárquicos.

Reutilize a configuração do cliente MongoDB do seu servidor de agente LangGraph.js existente .

// 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!");
}

Crie um módulo que exporte um MongoDBStore configurado para memória de longo prazo.

// 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;
}

Esse armazenamento persiste dados entre threads e sessões, digitados por namespaces hierárquicos como [userId, "memories"] ou [userId, "preferences"].

A memória de longo prazo funciona melhor quando você modela fatores estáveis sobre seus usuários ou domínio.

Padrões comuns incluem:

  • Perfis de usuário — função, experiência, equipe, localização. Preferências persistentes (por exemplo, tom, idioma, nível de produto).

  • Restrições e políticas – Alergias, restrições de conformidade, limites de orçamento.

  • Resumos do histórico de interações - Resumos de alto nível de sessões anteriores. Decisões que devem ser levadas adiante (por exemplo, "o usuário prefere o MongoDB Atlas ao autogerenciado").

Você pode armazená-los como documentos JSON simples ou como documentos com incorporações para pesquisa semântica.

A API da loja MongoDB suporta as seguintes operações:

  • put - armazenar ou atualizar um valor.

  • get - recuperar um valor por namespace e chave.

  • delete - remover um valor.

  • search - recuperar valores por similaridade vetorial e/ou filtros de metadados.

Os tipos exatos do TypeScript podem ser diferentes, mas o código a seguir demonstra um padrão de uso típico no 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 seção pressupõe que você já tenha um fluxo de trabalho de agente semelhante ao descrito em Crie um agente de IA com LangGraph.js e MongoDB Atlas, incluindo:

  • Uma anotação GraphState com um campo messages.

  • Um nó de ferramenta que chama a Vector Search do MongoDB usando incorporações da Voyage AI.

  • Um nó de modelo de chat que decide se deseja chamar ferramentas ou responder diretamente.

  • Um checkpointer MongoDBSaver para memória de curto prazo.

Atualize sua função callAgent para aceitar um store junto com o cliente 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;
}

Esse padrão permite:

  • Leia a memória de longo prazo no início de cada interação.

  • Injete essas memória no estado (por exemplo, como memories ou no prompt do sistema).

  • Atualize a memória de longo prazo após cada interação com base no que o agente aprendera.

Para tornar a memória de longo prazo pesquisável por significado, você pode:

  1. Armazene cada memória como um documento que inclui:

    • Um resumo ou descrição de texto.

    • Metadados estruturados (por exemplo, userId, type, tags).

    • Um vetor de incorporação para pesquisa semântica.

  2. Configure um índice MongoDB Vector Search no campo embedding para sua coleção de memória.

  3. Use as incorporações Voyage AI ou o Voyage AutoEmbeddings (por meio da API Atlas Embedding e Reranking) para gerar incorporações para cada documento de memória antes de inseri-lo.

  4. Use o método search interno em MongoDBStore, que chama $vectorSearch em sua coleção de memória, opcionalmente combinado com filtros de metadados como userId e type.

O código a seguir demonstra como usar o método search interno em MongoDBStore para encontrar recordações por similaridade semântica e filtros de metadados:

// 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;
}

O método search aceita um prefixo de namespace e um objeto de opções com os seguintes campos:

  • query - Uma string de texto para pesquisa semântica. O armazenamento usa o MongoDB Vector Search para encontrar memória que sejam semanticamente semelhantes à query.

  • filter - Um objeto de filtro de metadados para restringir resultados (por exemplo, { type: "fact" }).

  • limit - O número máximo de resultados a retornar (padrão: 10).

  • offset - O número de resultados a ignorar para paginação (padrão: 0).

Observação

Com o Voyage AutoEmbeddings, você pode descarregar a geração de incorporação para a API de Incorporação e Reclassificação do Atlas e usar o MongoDB Vector Search como seu backend de armazenamento. O armazenamento de memória de longo prazo LangGraph.js foi projetado para funcionar com essa experiência, para que você possa combinar a geração de incorporação automática com os Armazenamentos LangGraph e o Vector Search para obter uma camada unificada de memória de longo prazo.

Use as diretrizes a seguir para escolher o mecanismo de memória adequado para cada parte do seu aplicação:

Mecanismo
Quando usar
Detalhes

Memória de curto prazo (Checkpointer)

Use para o contexto por thread que só é importante em uma conversa.

Ideal para argumentos passo a passo, resultados de chamadas de ferramentas e estado intermediário. Apoiado por MongoDBSaver em integrações Python e JavaScript.

Memória de longo prazo (armazenamento)

Use para informações entre threads que devem persistir ao longo do tempo.

Ideal para perfis de usuário, políticas e restrições, feitos de longa duração e recuperação semântica. Apoiado pela implementação da MongoDB Store do BaseStore em LangGraph.js.

Em muitos aplicativos do mundo real, você:

  • Use a memória de curto prazo para manter coerente a conversa atual.

  • Use a memória de longo prazo para lembrar o usuário e detalhes importantes de conversas anteriores.

  • Use as incorporações do MongoDB Vector Search e Voyage AI com o AutoEmbeddings para pesquisar memória semanticamente ao gerar respostas.

O MongoDB também fornece os seguintes recursos para desenvolvedores:

Dica

Voltar

Crie um agente de IA