Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
TypeScriptchevron-right

Crie um JavaScript AI agente de com langGraph.js e MongoDB

Jesse Hall15 min read • Published Sep 18, 2024 • Updated Sep 18, 2024
Node.jsAtlasPesquisa vetorialTypeScriptJavaScript
APLICATIVO COMPLETO
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Como programador web, construir inteligência artificial em seus aplicativos web pode parecer tentador. Como alguém com zero background em tecnologias AI/ML, eu entenda totalmente. No início, soou tão estrangeiro para me. Mas logo me fisgou quando vi como é fácil!
Neste tutorial, vamos mergulhar no interessante mundo dos agentes de AI no JavaScript. Confie em nós, não é tão apasionador quanto parece! Vamos construir algo muito legal usando LangGraph.js e MongoDB.
Então, qual é o grande negócio com os agentes de AI ? E não, não o agente Smith. Imagine ter um assistente inteligente que não apenas entenda o que você está dizendo, mas também se lembre de suas conversas anteriores e possa até mesmo utilizar uma série de "ferramentas" para procurar informações adicionais, processar dados e muito mais. Bem legal, não é?
Acesse LangGraph.js — seu novo melhor amigo quando se trata de criar agentes de AI . Veja o que o torna tão legal:
  1. Ele pode lidar com coisas complexas: Quer que sua AI tome decisões ou repita tarefas? O LangGraph.js protege você com seus loops e recursos de ramificação.
  2. Tem uma ótima memória: não há mais "Ops, tinha me contado do que estamos falando." O LangGraph.js salva o estado do seu aplicativo após cada etapa.
  3. Funciona bem com humanos: você pode adicionar facilmente entradas humanos aos seus fluxos de trabalho de AI para monitorar e alterar a abordagem do agente.
  4. É super rápido: com o suporte de streaming, você obtém resultados instantâneos. chega de ficar girando os dedões esperando por respostas.
Estas funcionalidades fazem do LangGraph.js a escolha ideal para desenvolver agentes de AI sofisticados que podem manter o contexto e lidar com interações complexas. E, é claro, o LangGraph.js se encaixa perfeitamente no LangChain.js, facilitando a integração com outras ferramentas e bibliotecas de AI .
Ao integrar o LangGraph.js ao MongoDB, podemos criar agentes de AI que não apenas processam e geram linguagem, mas também armazenam e recuperam informações de forma eficiente. Essa combinação é particularmente poderosa para criar aplicativos que exigem conversas sensíveis ao contexto e tomada de decisão baseada em dados.
Essa dupla dinâmica é perfeita para criar aplicativos que precisam ter conversas significativas e tomar decisões inteligentes com base em dados. É como criar seu próprio JARVIS, sem as exibições holográficas sofisticadas (por enquanto, pelo menos).
Neste tutorial, criaremos um agente de AI que poderá ajudar com queries relacionadas a RH usando um banco de dados de informações de funcionários. Nosso agente poderá:
  1. Inicie novas conversas e continue as existentes.
  2. Procure informações de funcionários usando o MongoDB Atlas Vector Search.
  3. Persistir o estado de conversação (checkpoints do LangGraph) no MongoDB.
Vamos começar configurando nosso projeto!
Se você é um aluno visual, assista à versão em vídeo deste tutorial!

Definindo o projeto

Pré-requisitos

Antes de começarmos, verifique se você tem o seguinte:
  • Node.js e npm instalados
  • Uma conta gratuita do MongoDB Atlas
Enquanto estamos usando o OpenAI para incorporações e o Athropic para conversas, você pode substituí-los facilmente para usar qualquer combinação LLM de sua escolha.

Inicialização do projeto

Se preferir acompanhar o código, você pode clonar o repositório do Github.
Nossa estrutura base do projeto ficará assim:
1├── .env
2├── index.ts
3├── agent.ts
4├── seed-database.ts
5├── package.json
6├── tsconfig.json
Inicialize um novo projeto Node.js com Typescript e instale as dependências necessárias:
1npm init -y
2npm i -D typescript ts-node @types/express @types/node
3npx tsc --init
4npm i langchain @langchain/langgraph @langchain/mongodb @langchain/langgraph-checkpoint-mongodb @langchain/anthropic dotenv express mongodb zod
Crie um arquivo.env na raiz do seu projeto e adicione suas chaves OpenAI e API antrófica, bem como sua connection string do MongoDB Atlas:
1OPENAI_API_KEY=your-openai-api-key
2ANTHROPIC_API_KEY=your-anthropic-api-key
3MONGODB_ATLAS_URI=your-mongodb-atlas-connection-string

Configurando o MongoDB

Antes de fazer qualquer coisa, precisamos criar alguns dados sintéticos para trabalhar. Usaremos esses dados para semear nosso banco de dados MongoDB.
Usaremos oMongoDB Atlas como nosso serviço de banco de dados. Crie um cluster no MongoDB Atlas e obtenha sua connection string.

Conectando-se ao banco de dados

Crie um arquivoindex.ts na raiz do seu projeto. Estabeleceremos uma conexão com o MongoDB usando o driver MongoDB:
1import { MongoClient } from "mongodb";
2import 'dotenv/config';
3
4const client = new MongoClient(process.env.MONGODB_ATLAS_URI as string);
5
6async function startServer() {
7 try {
8 await client.connect();
9 await client.db("admin").command({ ping: 1 });
10 console.log("Pinged your deployment. You successfully connected to MongoDB!");
11
12 // ... rest of the server setup
13 } catch (error) {
14 console.error("Error connecting to MongoDB:", error);
15 process.exit(1);
16 }
17}
18
19startServer();
Inicie o servidor executando npx ts-node index.ts em seu terminal. Se você vir a mensagem "Pinged your deployment. You conectou com sucesso ao MongoDB?" você está pronto para Go.

Semeando o banco de dados

Para preencher seu banco de dados com dados sintéticos de funcionários, vamos criar um scriptseed-database.ts . Esse script gera registros realistas de funcionários usando o modelo GPT da OpenAI e os armazena no MongoDB junto com suas incorporações vetoriais.
Primeiro, importamos as dependências necessárias. Estamos usando o LangChain para funcionalidades relacionadas a IA, MongoDB para operações de banco de dados e MongoDB para validação de esquema.
1import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
2import { StructuredOutputParser } from "@langchain/core/output_parsers";
3import { MongoClient } from "mongodb";
4import { MongoDBAtlasVectorSearch } from "@langchain/mongodb";
5import { z } from "zod";
6import "dotenv/config";
Em seguida, vamos configurar nosso cliente MongoDB e a instância do ChartOpenAI:
1const client = new MongoClient(process.env.MONGODB_ATLAS_URI as string);
2
3const llm = new ChatOpenAI({
4 modelName: "gpt-4o-mini",
5 temperature: 0.7,
6});
Aqui, criamos um cliente MongoDB usando a string de conexão de nossas variáveis de ambiente. Também inicializamos uma instância do chatOpenAI com um modelo e uma configuração de temperatura específicos.
Agora, vamos definir nosso esquema de funcionários usando o Sod:
1const EmployeeSchema = z.object({
2 employee_id: z.string(),
3 first_name: z.string(),
4 last_name: z.string(),
5 date_of_birth: z.string(),
6 address: z.object({
7 street: z.string(),
8 city: z.string(),
9 state: z.string(),
10 postal_code: z.string(),
11 country: z.string(),
12 }),
13 contact_details: z.object({
14 email: z.string().email(),
15 phone_number: z.string(),
16 }),
17 job_details: z.object({
18 job_title: z.string(),
19 department: z.string(),
20 hire_date: z.string(),
21 employment_type: z.string(),
22 salary: z.number(),
23 currency: z.string(),
24 }),
25 work_location: z.object({
26 nearest_office: z.string(),
27 is_remote: z.boolean(),
28 }),
29 reporting_manager: z.string().nullable(),
30 skills: z.array(z.string()),
31 performance_reviews: z.array(
32 z.object({
33 review_date: z.string(),
34 rating: z.number(),
35 comments: z.string(),
36 })
37 ),
38 benefits: z.object({
39 health_insurance: z.string(),
40 retirement_plan: z.string(),
41 paid_time_off: z.number(),
42 }),
43 emergency_contact: z.object({
44 name: z.string(),
45 relationship: z.string(),
46 phone_number: z.string(),
47 }),
48 notes: z.string(),
49});
50
51type Employee = z.infer<typeof EmployeeSchema>;
52
53const parser = StructuredOutputParser.fromZodSchema(z.array(EmployeeSchema));
Talvez esse esquema seja detalhado demais, mas ele mostra o poder do que podemos fazer com os LLMs. No que diz respeito ao LLM, este é um caminho para o campo.
Esse esquema define a estrutura dos dados de nossos funcionários. Usamos o Sod para garantir a segurança de tipo e criar um analisador que nos ajudará a gerar dados estruturados a partir da saída da AI.
Isso realmente muda o jogo. Agora podemos usar esse esquema para gerar dados que são realistas e consistentes.
Em seguida, vamos implementar a função para gerar dados sintéticos:
1async function generateSyntheticData(): Promise<Employee[]> {
2 const prompt = `You are a helpful assistant that generates employee data. Generate 10 fictional employee records. Each record should include the following fields: employee_id, first_name, last_name, date_of_birth, address, contact_details, job_details, work_location, reporting_manager, skills, performance_reviews, benefits, emergency_contact, notes. Ensure variety in the data and realistic values.
3
4 ${parser.getFormatInstructions()}`;
5
6 console.log("Generating synthetic data...");
7
8 const response = await llm.invoke(prompt);
9 return parser.parse(response.content as string);
10}
Essa função usa a instânciaChatOpenAI junto com alguma engenharia de prompt para gerar dados sintéticos de funcionários com base em nosso esquema.
Agora, vamos criar uma função para gerar um resumo de cada funcionário:
1async function createEmployeeSummary(employee: Employee): Promise<string> {
2 return new Promise((resolve) => {
3 const jobDetails = `${employee.job_details.job_title} in ${employee.job_details.department}`;
4 const skills = employee.skills.join(", ");
5 const performanceReviews = employee.performance_reviews
6 .map(
7 (review) =>
8 `Rated ${review.rating} on ${review.review_date}: ${review.comments}`
9 )
10 .join(" ");
11 const basicInfo = `${employee.first_name} ${employee.last_name}, born on ${employee.date_of_birth}`;
12 const workLocation = `Works at ${employee.work_location.nearest_office}, Remote: ${employee.work_location.is_remote}`;
13 const notes = employee.notes;
14
15 const summary = `${basicInfo}. Job: ${jobDetails}. Skills: ${skills}. Reviews: ${performanceReviews}. Location: ${workLocation}. Notes: ${notes}`;
16
17 resolve(summary);
18 });
19}
Essa função pega um objeto funcionário e cria um resumo conciso de suas informações usando os vários metadados criados pelo LLM. Usaremos esse resumo para criar incorporações para cada funcionário.
Finalmente, vamos implementar a função principal para popular o banco de dados:
1async function seedDatabase(): Promise<void> {
2 try {
3 await client.connect();
4 await client.db("admin").command({ ping: 1 });
5 console.log("Pinged your deployment. You successfully connected to MongoDB!");
6
7 const db = client.db("hr_database");
8 const collection = db.collection("employees");
9
10 await collection.deleteMany({});
11
12 const syntheticData = await generateSyntheticData();
13
14 const recordsWithSummaries = await Promise.all(
15 syntheticData.map(async (record) => ({
16 pageContent: await createEmployeeSummary(record),
17 metadata: {...record},
18 }))
19 );
20
21 for (const record of recordsWithSummaries) {
22 await MongoDBAtlasVectorSearch.fromDocuments(
23 [record],
24 new OpenAIEmbeddings(),
25 {
26 collection,
27 indexName: "vector_index",
28 textKey: "embedding_text",
29 embeddingKey: "embedding",
30 }
31 );
32
33 console.log("Successfully processed & saved record:", record.metadata.employee_id);
34 }
35
36 console.log("Database seeding completed");
37
38 } catch (error) {
39 console.error("Error seeding database:", error);
40 } finally {
41 await client.close();
42 }
43}
44
45seedDatabase().catch(console.error);
Esta função se conecta ao banco de dados MongoDB , gera dados sintéticos, cria resumos para cada funcionário e, em seguida, armazena os dados no banco de dados usando o MongoDB Atlas Vector Search. Ele também lida com o registro de erros e garante que a conexão do banco de dados seja fechada quando a operação for concluída.
Para semear o banco de dados, execute o seguinte comando:
1npx ts-node seed-database.ts
Este script cria uma coleção de registros de funcionários no hr_database.
Go para o painel do MongoDB Atlas e confira os dados que foram gerados. É realmente surpreendente! Você encontrará a mesma estrutura do esquema que definimos anteriormente, junto com o resumo e as incorporações vetoriais para o resumo.
Em seguida, precisamos configurar um índice vetorial para Atlas Search de similaridade, que usaremos mais tarde em nosso agente de AI .

Configurando o índice do MongoDB Atlas Vector Search

Para configurar o índice vetorial, siga as etapas descritas em nossa documentaçãoComo indexar campos para o Vector Atlas Search.
Certifique-se de nomear seu índice "vector_index " e selecionar a coleçãoemployees. Esta é a definição JSON para o índice:
1{
2 "fields": [
3 {
4 "numDimensions": 1536,
5 "path": "embedding",
6 "similarity": "cosine",
7 "type": "vector"
8 }
9 ]
10}

Construindo o agente de AI com LangGraph.js

Agora que configuramos nosso banco de dados, vamos criar nosso agente de AI usando LangGraph.js. Definiremos a estrutura do agente, implementaremos ferramentas para pesquisa de funcionários e definiremos o fluxo da conversa.

Estrutura do agente

Vamos criar um novo arquivo para definir o agente chamado agent.ts. Aqui estão os principais componentes:
1import { OpenAIEmbeddings } from "@langchain/openai";
2import { ChatAnthropic } from "@langchain/anthropic";
3import { AIMessage, BaseMessage, HumanMessage } from "@langchain/core/messages";
4import { ChatPromptTemplate, MessagesPlaceholder } from "@langchain/core/prompts";
5import { StateGraph } from "@langchain/langgraph";
6import { Annotation } from "@langchain/langgraph";
7import { tool } from "@langchain/core/tools";
8import { ToolNode } from "@langchain/langgraph/prebuilt";
9import { MongoDBSaver } from "@langchain/langgraph-checkpoint-mongodb";
10import { MongoDBAtlasVectorSearch } from "@langchain/mongodb";
11import { MongoClient } from "mongodb";
12import { z } from "zod";
13import "dotenv/config";
Esta é a lista completa de importações para o agente. É uma mistura de bibliotecas MongoDB, LangChain, MongoDB e MongoDB.
Para usar este código em nosso aplicativo, configuraremos uma função que será exportada deste arquivo. Também começaremos definindo a conexão e a coleta do MongoDB:
1export async function callAgent(client: MongoClient, query: string, thread_id: string) {
2 // Define the MongoDB database and collection
3 const dbName = "hr_database";
4 const db = client.db(dbName);
5 const collection = db.collection("employees");
6
7 // ... (We'll add the rest of the code here)
8}

Definir o estado do agente

Em seguida, usaremos o StateGraph e Annotationdo LangGraph para definir o estado do nosso agente. Isso nos ajudará a gerenciar o estado da conversa e acompanhar o histórico da conversa.
1const GraphState = Annotation.Root({
2 messages: Annotation<BaseMessage[]>({
3 reducer: (x, y) => x.concat(y),
4 }),
5});
O GraphState controla as mensagens de conversa.

Implementação de ferramentas

Implementaremos uma ferramenta de pesquisa de funcionários que usa o MongoDB Atlas Vector Search:
1const employeeLookupTool = tool(
2 async ({ query, n = 10 }) => {
3 console.log("Employee lookup tool called");
4
5 const dbConfig = {
6 collection: collection,
7 indexName: "vector_index",
8 textKey: "embedding_text",
9 embeddingKey: "embedding",
10 };
11
12 const vectorStore = new MongoDBAtlasVectorSearch(
13 new OpenAIEmbeddings(),
14 dbConfig
15 );
16
17 const result = await vectorStore.similaritySearchWithScore(query, n);
18 return JSON.stringify(result);
19 },
20 {
21 name: "employee_lookup",
22 description: "Gathers employee details from the HR database",
23 schema: z.object({
24 query: z.string().describe("The search query"),
25 n: z.number().optional().default(10).describe("Number of results to return"),
26 }),
27 }
28);
Esta ferramenta usa o MongoDB Atlas Vector Search para encontrar informações relevantes do funcionário com base na query. Retorna uma lista de funcionários com seus detalhes.
A ferramenta aproveita incorporações vetoriais para executar a Atlas Search semântica. Essa abordagem permite que o agente entenda a intenção por trás da query e recupere informações relevantes adequadamente.
O parâmetron permite a você personalizar o número de resultados retornados, com um padrão de 10. Essa flexibilidade permite que os usuários recuperem mais ou menos resultados com base em suas necessidades específicas.

Criando o nó de ferramentas

Agora, definiremos nossas ferramentas e criaremos um toolNode para gerenciar as ferramentas e sua execução. Neste exemplo, estamos utilizando apenas uma única ferramenta, mas você pode adicionar mais ferramentas conforme necessário.
1const tools = [employeeLookupTool];
2
3// We can extract the state typing via `GraphState.State`
4const toolNode = new ToolNode<typeof GraphState.State>(tools);

Definindo nosso modelo de chat

Usaremos o modeloChatAnthropic da LangChain.js para nosso modelo de bate-papo e o vincularemos a nossas ferramentas.
Novamente, você pode alterar isso para qualquer outro modelo LLM que queira usar.
1const model = new ChatAnthropic({
2 model: "claude-3-5-sonnet-20240620",
3 temperature: 0,
4}).bindTools(tools);

Definir a função que chama o modelo

Alguma engenharia de Go entrará nessa função, que é nosso principal ponto de entrada para o agente.
1async function callModel(state: typeof GraphState.State) {
2 const prompt = ChatPromptTemplate.fromMessages([
3 [
4 "system",
5 `You are a helpful AI assistant, collaborating with other assistants. Use the provided tools to progress towards answering the question. If you are unable to fully answer, that's OK, another assistant with different tools will help where you left off. Execute what you can to make progress. If you or any of the other assistants have the final answer or deliverable, prefix your response with FINAL ANSWER so the team knows to stop. You have access to the following tools: {tool_names}.\n{system_message}\nCurrent time: {time}.`,
6 ],
7 new MessagesPlaceholder("messages"),
8 ]);
9
10 const formattedPrompt = await prompt.formatMessages({
11 system_message: "You are helpful HR Chatbot Agent.",
12 time: new Date().toISOString(),
13 tool_names: tools.map((tool) => tool.name).join(", "),
14 messages: state.messages,
15 });
16
17 const result = await model.invoke(formattedPrompt);
18
19 return { messages: [result] };
20}
A funçãocallModel é responsável por formatar o prompt, invocar o modelo e retornar o resultado. Ele pega o estado atual da conversa e o usa para formatar o prompt. Em seguida, invoca o modelo e retorna o resultado. O resultado é uma array de mensagens, que é o que o GraphState espera. Em seguida, oGraphState atualizará o estado com as novas mensagens. Este é um exemplo simples, mas pode ser estendido para lidar com conversas mais complexas.

Ajudando o agente a decidir quando sair

Em seguida, definiremos uma função que decide se o agente deve chamar uma ferramenta ou parar e responder ao usuário.
1function shouldContinue(state: typeof GraphState.State) {
2 const messages = state.messages;
3 const lastMessage = messages[messages.length - 1] as AIMessage;
4
5 // If the LLM makes a tool call, then we route to the "tools" node
6 if (lastMessage.tool_calls?.length) {
7 return "tools";
8 }
9 // Otherwise, we stop (reply to the user)
10 return "__end__";
11}
A funçãoshouldContinue pega a última mensagem do estado e verifica se tem uma chamada de ferramenta. Em caso afirmativo, retorna "tools", que serão manipuladas pelo tools . Caso contrário, retorna "end", que será tratado peloend .

Definindo o fluxo da conversa

Usaremos o LangGraph para definir nosso fluxo de conversa:
1const workflow = new StateGraph(GraphState)
2 .addNode("agent", callModel)
3 .addNode("tools", toolNode)
4 .addEdge("__start__", "agent")
5 .addConditionalEdges("agent", shouldContinue)
6 .addEdge("tools", "agent");
Isso configura um simples vai-e-vem entre o agente e suas ferramentas. Vamos detalhar o fluxo de trabalho:
  1. A conversa começa com o nó "agente".
  2. O agente processa a entrada do usuário e decide se deseja usar uma ferramenta ou encerrar a conversa.
  3. Se uma ferramenta for necessária, o controle é passado para o nó "tools", onde a ferramenta selecionada é executada.
  4. O resultado da ferramenta é enviado de volta para o nó do "agente".
  5. O agente interpreta a saída da ferramenta e formula uma resposta ou decide sobre a próxima ação.
  6. Esse ciclo continua até que o agente determine que nenhuma ação adicional é necessária (shouldContinue retorna "final").
Esse fluxo de trabalho permite conversas flexíveis e dinâmicas, onde o agente pode usar várias ferramentas em sequência, se necessário, para atender à solicitação do usuário. A estrutura doStateGraph garante que a conversa mantenha o contexto e possa lidar com interações complexas e em várias etapas de forma eficiente.

Adicionando memória ao agente

Usaremos o salva-vidas de ponto de verificaçãoMongoDBSaver da LangGraph para adicionar memória ao nosso agente.
1const checkpointer = new MongoDBSaver({ client, dbName });
2
3const app = workflow.compile({ checkpointer });
Isso salvará o estado da conversa em um banco de dados MongoDB. Também compilaremos o gráfico e incluiremos o MongoDB checkpointer para criar um aplicativo que possa ser executado.

Executando o agente

Por fim, executaremos o agente:
1const finalState = await app.invoke(
2 {
3 messages: [new HumanMessage(query)],
4 },
5 { recursionLimit: 15, configurable: { thread_id: thread_id } }
6);
7
8console.log(finalState.messages[finalState.messages.length - 1].content);
9
10return finalState.messages[finalState.messages.length - 1].content;
Isso executará o agente e retornará a resposta final. Aqui está um resumo do que está ocorrendo:
  1. Invocamos o fluxo de trabalho compilado (app.invoke()) com o estado inicial contendo a query do usuário.
  2. O recursionLimit está configurado para 15 para evitar loops infinitos.
  3. Passamos um thread_id nas opções configuráveis, o que permite a persistência da conversa em várias interações.
  4. O fluxo de trabalho é executado por seus nós (agente e ferramentas) até que um estado final seja atingido.
  5. Extraímos a última mensagem do estado final, que contém a resposta final do agente.
  6. Esta resposta final é registrada no console e retornada da função.

Criar o servidor Express.js

Agora, vamos configurar um servidor Express.js para expor nosso agente de AI por meio de pontos de conexão de API . Faremos isso no arquivoindex.ts:
1import 'dotenv/config';
2import express, { Express, Request, Response } from "express";
3import { MongoClient } from "mongodb";
4import { callAgent } from './agent';
5
6const app: Express = express();
7app.use(express.json());
8
9// Initialize MongoDB client
10const client = new MongoClient(process.env.MONGODB_ATLAS_URI as string);
11
12async function startServer() {
13 try {
14 await client.connect();
15 await client.db("admin").command({ ping: 1 });
16 console.log("Pinged your deployment. You successfully connected to MongoDB!");
17
18 app.get('/', (req: Request, res: Response) => {
19 res.send('LangGraph Agent Server');
20 });
21
22 app.post('/chat', async (req: Request, res: Response) => {
23 const initialMessage = req.body.message;
24 const threadId = Date.now().toString();
25 try {
26 const response = await callAgent(client, initialMessage, threadId);
27 res.json({ threadId, response });
28 } catch (error) {
29 console.error('Error starting conversation:', error);
30 res.status(500).json({ error: 'Internal server error' });
31 }
32 });
33
34 app.post('/chat/:threadId', async (req: Request, res: Response) => {
35 const { threadId } = req.params;
36 const { message } = req.body;
37 try {
38 const response = await callAgent(client, message, threadId);
39 res.json({ response });
40 } catch (error) {
41 console.error('Error in chat:', error);
42 res.status(500).json({ error: 'Internal server error' });
43 }
44 });
45
46 const PORT = process.env.PORT || 3000;
47 app.listen(PORT, () => {
48 console.log(`Server running on port ${PORT}`);
49 });
50 } catch (error) {
51 console.error('Error connecting to MongoDB:', error);
52 process.exit(1);
53 }
54}
55
56startServer();
Isso configura dois endpoints principais:
  • /chat para iniciar uma nova conversa
  • /chat/:threadId para continuar uma conversa existente
O endpoint/chat lida com a mensagem inicial e inicia uma nova conversa. Ele gera um ID de thread exclusivo para cada conversa e o passa para a funçãocallAgent.
O endpoint/chat/:threadId lida com mensagens subsequentes em uma conversa existente. Ele passa o ID do tópico para a funçãocallAgent para continuar a conversa.

Testando o agente de AI

Agora que temos nosso servidor configurado, podemos testar nosso agente de AI :
  1. Inicie o servidor.
1npx ts-node index.ts
2. Use uma ferramenta como cURL ou Postman para enviar solicitações para o endpoint/chat com a mensagem inicial.
1curl -X POST -H "Content-Type: application/json" -d '{"message": "Build a team to make an iOS app, and tell me the talent gaps."}' http://localhost:3000/chat
Isso iniciará uma nova conversa e retornará a resposta do agente. Aqui está um exemplo de resposta:
1{
2 "threadId": "1695905400000",
3 "response": "Now that we have gathered information about potential team members, let's analyze the results and build a team for the iOS app development project. I'll also identify any talent gaps we may have.
4
5 FINAL ANSWER:
6
7 Based on the employee information we've gathered, here's the proposed team for building an iOS app, along with identified talent gaps:
8
9 1. iOS Developer:
10 - We don't have a dedicated iOS developer in our search results. This is a significant talent gap that needs to be addressed.
11
12 2. UI/UX Designer:
13 - Linda Green (Employee ID: E003)
14 Skills: Adobe Photoshop, Illustrator, UX/UI Design
15 Strengths: Outstanding creativity and design skills, always meets deadlines with high-quality work
16 Note: Part-time employee, works remotely
17
18 3. Frontend Developer:
19 - Isabella Lopez (Employee ID: E009)
20 Skills: JavaScript, HTML, CSS
21 Strengths: Great attention to detail and coding skills, enthusiastic about new technologies and frameworks
22 Note: While not an iOS developer, her frontend skills could be valuable for the app's web components or for learning iOS development
23
24 4. Project Manager:
25 - James Brown (Employee ID: E004)
26 Skills: Agile, Scrum, Leadership
27 Strengths: Excellent leadership and team management skills, highly experienced in project management
28
29 5. Backend Developer:
30 - Alice Johnson (Employee ID: E001)
31 Skills: Java, Python, SQL
32 Strengths: Strong team player with excellent problem-solving skills, meets project deadlines
33
34 Talent Gaps and Recommendations:
35
36 1. iOS Developer: This is the most critical gap. We need to either:
37 a) Hire a dedicated iOS developer with experience in Swift and Xcode.
38 b) Provide intensive iOS development training to Isabella Lopez or Alice Johnson, leveraging their existing programming skills.
39
40 2. Mobile-specific UI/UX Design: While Linda Green has UX/UI design skills, we should ensure she has experience with mobile app design, specifically for iOS. If not, consider providing additional training or hiring a specialist in iOS app design.
41
42 3. iOS-specific Project Management: James Brown should familiarize himself with iOS app development lifecycle and any specific methodologies used in mobile app projects.
43
44 4. Quality Assurance: We don't have a dedicated QA specialist for mobile apps. Consider either hiring one or training an existing team member in iOS app testing.
45
46 5. DevOps for iOS: Ensure that one of the team members (possibly Alice Johnson) can handle the iOS app deployment process, including working with the App Store and managing continuous integration/continuous deployment (CI/CD) for iOS apps.
47
48 6. Full-time UI/UX Designer: Since Linda Green is part-time, consider either increasing her hours or hiring an additional full-time UI/UX designer to ensure consistent availability throughout the project.
49
50 To address these gaps, the company should consider a combination of hiring new talent, providing specialized training to existing employees, and possibly engaging freelancers or consultants for specific iOS development needs. This will ensure a well-rounded team capable of successfully developing and launching an iOS app."
  1. O servidor deve responder com a mensagem do agente. Você pode continuar a conversa enviando mensagens adicionais para o endpoint/chat/:threadId .
1curl -X POST -H "Content-Type: application/json" -d '{"message": "What are the talent gaps?"}' http://localhost:3000/chat/<threadId>
Parabéns! Você criou com sucesso um agente de AI usando LangGraph.js e MongoDB.

Conclusão

Aqui está; criamos um agente de AI sofisticado com a ajuda do LangGraph.js e do MongoDB! Esse agente pode manter uma conversa, lembrar do que está sendo conversado, procurar informações sobre funcionários e dar uma resposta inteligente a perguntas relacionadas ao RH.
A combinação de LangGraph.js para controle de fluxo de conversação e MongoDB para armazenar e recuperar memória oferece um ótimo caminho a seguir para você construir alguns aplicativos de AI incríveis. Este exemplo pode ser coberto com ferramentas adicionais, fluxos de conversa mais sofisticados ou conectores para outras fontes de dados, como imagens, áudio e vídeo.
O LangGraph é uma ferramenta poderosa que pode aprimorar o desenvolvimento de agentes de AI . Se você já está familiarizado com Node.js e MongoDB, você tem uma base sólida para criar agentes de AI sofisticados, capazes de lidar com diversas tarefas durante as interações. Ao aproveitar essas tecnologias juntas, você pode construir sistemas inteligentes que fornecem recomendações e insights valiosos.
Se você tiver alguma dúvida ou precisar de ajuda, consulte os fóruns da comunidadeMongoDB .
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Introdução ao Deno 2.0 e MongoDB


Oct 22, 2024 | 13 min read
Artigo

O custo de não conhecer o MongoDB


Nov 11, 2024 | 23 min read
Tutorial

GraphQL APIs instantâneas para MongoDB com Grafbase


Oct 12, 2023 | 7 min read
Tutorial

Como implementar o MongoDB Atlas com o AWS CDK no TypeScript


Jan 23, 2024 | 5 min read
Sumário