A Voyage AI se une ao MongoDB para impulsionar aplicativos de AI mais precisos e confiáveis no Atlas.

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 .

Desenvolvedor do MongoDB
Centro de desenvolvedores do MongoDB
chevron-right
Produtos
chevron-right
Atlas
chevron-right

AI Shop: o poder da LangChain, OpenAI e MongoDB Atlas trabalhando juntos

Pavel Duchovny7 min read • Published Nov 29, 2023 • Updated Sep 18, 2024
Node.jsIAPesquisa vetorialJavaScriptAtlas
APLICATIVO COMPLETO
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Construir aplicativos de AI nos últimos meses fez minha mente correr para lugares diferentes, inspirada principalmente por ideias e novas maneiras de interagir com fontes de informação. Após oito anos no MongoDB, posso ver perfeitamente o potencial do MongoDB quando se trata de alimentar aplicativos de AI. Curiosamente, é a mesma razão fundamental pela qual os usuários escolheram o MongoDB e MongoDB Atlas até a era da AI generativa, e é a flexibilidade do document model.
O uso de dados não estruturados nem sempre é fácil. Os dados produzidos pelos modelos da GenAI são considerados altamente não estruturados. Eles podem vir em diferentes formatos de texto, além de sons, imagens e até vídeos. Os aplicativos são eficientes e criados corretamente quando podem governar e prever com segurança as estruturas de dados e as entradas. Portanto, para criar aplicativos de AI bem-sucedidos, precisamos de um método para transformar dados não estruturados no que chamamos de documentossemiestruturados ou flexíveis.
Uma vez que podemos ajustar nosso fluxo de dados em um padrão flexível, podemos utilizar esses dados com eficiência e fornecer ótimos recursos para nossos usuários.

RAG como uma abordagem fundamental para criar aplicativos de AI

À vista disso, a geração aumentada por recuperação (RAG) surge como uma metodologia fundamental no domínio do desenvolvimento da AI . Essa abordagem sinergiza a recuperação de informações e processos generativos para refinar a qualidade e a relevância dos resultados de AI . Ao aproveitar a flexibilidade do document model inerente ao MongoDB e ao MongoDB Atlas, o RAG pode incorporar dinamicamente uma ampla array de dados não estruturados, transformando-os em um formato semiestruturado mais gerenciável. Isso é particularmente vantajoso ao lidar com os dados variados e, muitas vezes, imprevisíveis produzidos pelos modelos de AI , como saídas textuais, trechos auditórios, conteúdo visual e sequências de vídeo.
A façanha do MongoDB está em sua capacidade de atuar como um backlink robusto para os processos RAG, garantindo que os aplicativos de IA possam não apenas acomodar, mas também crescer com a variedade de fluxos de dados de IA generativos.MongoDB AtlasintegradaAtlas Vector Search​Esse desalinhamento contínuo entre a estrutura de dados e a novidade da IA posiciona o MongoDB como um ativo essencial na era da GenAI, abrindo novos horizontes para desenvolvedores e usuários
Quando conseguimos encaixar nosso fluxo de dados em um padrão flexível, temos o poder de utilizar esses dados de forma eficiente e oferecer ótimos recursos aos nossos usuários.

Instruir para estruturar estruturas de AI não estruturadas

Para demonstrar a capacidade dos modelos Gen AI, como a geração de bate-papo/imagem Open AI, decidiu criar um pequeno aplicativo de mercearia que fornece um catálogo de produtos ao usuário. A busca por supermercados on-line é agora uma parte importante dos hábitos de compras em todo o mundo e aposto que quase todos os leitores já os utilizaram.
No entanto, eu queria levar a experiência do usuário a outro nível, fornecendo um chatbot que antecipasse os requisitos de supermercado dos usuários. Seja a partir de listas predefinidas, trocas de texto casuais ou consultas específicas sobre receitas, como " Preciso cozinhar uma lasanha, o que devo comprar? ".
UI da AI Shop
A pilha que decidi usar é a seguinte:
  • Um cluster MongoDB Atlas para armazenar produtos, categorias e pedidos.
  • Índices de pesquisa do Atlas para potencializar a pesquisa vetorial (pesquisa semântica baseada no significado).
  • Express + LangChain para orquestrar minhas tarefas de AI.
  • API de plataforma OpenAI - GPT4, GPT3.5 como meu mecanismo de AI.
RAG-AI-Sshop
Percebi rapidamente que, em qualquer aplicativo que criarei com AI, quero controlar a forma como minhas entradas são passadas e produzidas pela AI, pelo menos sua estrutura de modelo.
Portanto, na consulta da loja, quero que o usuário forneça uma solicitação e que a AI produza uma lista de possíveis compras.
Como não sei quantos ingredientes existem ou quais são suas categorias e tipos, preciso que o modelo seja flexível o suficiente para descrever a lista de forma que meu aplicativo possa percorrê-la com segurança mais adiante no funil de pesquisa.
A estrutura que decidiu usar é:
1const schema = z.object({
2"shopping_list": z.array(z.object({
3"product": z.string().describe("The name of the product"),
4"quantity": z.number().describe("The quantity of the product"),
5"unit": z.string().optional(),
6"category": z.string().optional(),
7})),
8}).deepPartial();
Além disso, não quero que o AI me forneça ingredientes ou produtos que estejam longe das categorias que estou vendendo em minha loja. Por exemplo, se um usuário solicitar uma bicicleta em um mercado, o AI deverá ter contexto de que não é razoável ter algo para o usuário. Portanto, as categorias relevantes que estão armazenadas no banco de dados devem ser fornecidas como contexto para o modelo.
1 // Initialize OpenAI instance
2 const llm = new OpenAI({
3 openAIApiKey: process.env.OPEN_AI_KEY,
4 modelName: "gpt-4",
5 temperature: 0
6 });
7
8 // Create a structured output parser using the Zod schema
9 const outputParser = StructuredOutputParser.fromZodSchema(schema);
10 const formatInstructions = outputParser.getFormatInstructions();
11
12 // Create a prompt template
13 const prompt = new PromptTemplate({
14 template: "Build a user grocery list in English as best as possible, if all the products does not fit the categories output empty list, however if some does add only those. \n{format_instructions}\n possible category {categories}\n{query}. Don't output the schema just the json of the list",
15 inputVariables: ["query", "categories"],
16 partialVariables: { format_instructions: formatInstructions },
17 });
Aproveitamos a biblioteca LangChain para transformar o esquema em um conjunto de instruções e produzir um prompt de engenharia que consiste nos documentos de categoria que buscamos em nosso banco de dados e nas instruções de extração.
A query do usuário tem um requisito flexível a ser criado por um esquema legível por nosso aplicativo. O restante do código só precisa validar e acessar as listas bem formatadas de produtos fornecidas pelo LLM.
1 // Fetch all categories from the database
2 const categories = await db.collection('categories').find({}, { "_id": 0 }).toArray();
3 const docs = categories.map((category) => category.categoryName);
4
5 // Format the input prompt
6 const input = await prompt.format({
7 query: query,
8 categories: docs
9 });
10
11 // Call the OpenAI model
12 const response = await llm.call(input);
13 const responseDoc = await outputParser.parse(response);
14
15 let shoppingList = responseDoc.shopping_list;
16 // Embed the shopping list
17 shoppingList = await placeEmbeddings(shoppingList);
Aqui está um exemplo de como essa lista pode se parecer: Documento com Embeddings

LLM para incorporações

Uma lista flexível estruturada como essa me permitirá criar incorporações para cada um dos termos considerados relevantes pelo LLM para a entrada do usuário e as categorias que minha loja tem.
Por razões de simplicidade, vou incorporar apenas o nome do produto.
1const placeEmbeddings = async (documents) => {
2
3 const embeddedDocuments = documents.map(async (document) => {
4 const embeddedDocument = await embeddings.embedQuery(document.product);
5 document.embeddings = embeddedDocument;
6 return document;
7 });
8 return Promise.all(embeddedDocuments);
9};
Mas, em aplicativos reais, podemos fornecer os atributos para filtragem de pesquisa de inventário de quantidade ou unidade.
A partir deste ponto, a codificação e a agregação que buscarão três candidatos para cada produto são diretas.
Será uma pesquisa de vetor para cada item conectado em uma união com o próximo item até o final da lista.

Embeddings para agregação

1[ {$vectorSearch: // product 1 (vector 3 alternatives)},
2 { $unionWith : { $search : //product 2...},
3 { $unionWith : { $search : //product 3...}]
Por fim, remodelarei os dados para que cada termo tenha uma array de seus três candidatos para simplificar a codificação do frontend.
1[ { searchTerm : "parmesan" ,
2 Products : [ //parmesan 1, //parmesan 2, // Mascarpone ]},
3 ...
4]
Aqui está o meu código do lado do servidor NodeJS para construir a pesquisa vetorial:
1const aggregationQuery = [
2 { "$vectorSearch": {
3 "index": "default",
4 "queryVector": shoppingList[0].embeddings,
5 "path": "embeddings",
6 "numCandidates": 20,
7 "limit": 3
8 }
9 },
10 { $addFields: { "searchTerm": shoppingList[0].product } },
11 ...shoppingList.slice(1).map((item) => ({
12 $unionWith: {
13 coll: "products",
14 pipeline: [
15 {
16 "$search": {
17 "index": "default",
18 "knnBeta": {
19 "vector": item.embeddings,
20 "path": "embeddings",
21 "k": 20
22 }
23 }
24 },
25 {$limit: 3},
26 { $addFields: { "searchTerm": item.product } }
27 ]
28 }
29 })),
30 { $group: { _id: "$searchTerm", products: { $push: "$$ROOT" } } },
31 { $project: { "_id": 0, "category": "$_id", "products.title": 1, "products.description": 1,"products.emoji" : 1, "products.imageUrl" : 1,"products.price": 1 } }
32 ]

O processo

O processo que apresentamos aqui pode ser aplicado a uma grande quantidade de casos de uso. Vamos repeti-lo de acordo com o gráfico abaixo. RAG-AI-Diagram Nesse contexto, enriquecemos nosso catálogo de produtos com incorporações no título/descrição dos produtos. Também fornecemos as categorias e instruções de estrutura como contexto para projetar nosso prompt. Por fim, encaminhamos o prompt pelo LLM, o que cria uma lista gerenciável que pode ser transformada em respostas e perguntas de acompanhamento.
A incorporação de resultados de LLM pode criar uma cadeia de pesquisas semânticas cujos resultados podem ser direcionados aos LLM ou manipulados de forma inteligente pela estrutura de agregação robusta.
Eventualmente, os dados se tornam argila que podemos moldar e transformar usando poderosos LLMs e combinando-os com pipelines de agregação para adicionar relevância e poder computacional às nossas aplicações.
Para obter o exemplo completo e o tutorial passo a passo para configurar o supermercado de demonstração, use o projeto GitHub.

Resumo

Concluindo, a viagem de integração da AI com o MongoDB mostra o impacto transformativo da combinação de capacidades de AI generativas com o modelo de dados dinâmicos do MongoDB. A flexibilidade do document model do MongoDB acabou sendo a base para gerenciar a natureza imprevisível dos dados gerados por IA, abrindo caminho para aplicativos inovadores que antes eram inconcebíveis. Por meio do uso de esquemas estruturados, pesquisas vetoriais e a avançada estrutura de agregação, os desenvolvedores agora podem criar aplicativos com tecnologia de IA que não apenas entendem e preveem a intenção do usuário, mas também oferecem níveis sem precedentes de personalização e eficiência.
O estudo de caso do aplicativo de supermercado exemplifica a aplicação prática desses conceitos, ilustrando como uma abordagem de dados bem estruturada pode levar a interações de AI mais inteligentes e responsivas. MongoDB se destaca como um parceiro ideal para o desenvolvimento de aplicativos de AI, permitindo que os desenvolvedores estruturem, enriqueçam e aproveitem dados não estruturados de maneiras que abrem novas possibilidades.
À medida que continuamos a explorar a sinergia entre MongoDB e AI, é aparente que o futuro do desenvolvimento de aplicativos está em nossa capacidade de desenvolver técnicas de gerenciamento de dados que possam acompanhar os rápidos progressos da tecnologia de AI. O papel do MongoDB nessa evolução é essencial, pois ele fornece a agilidade e o poder necessários para transformar os desafios dos dados não estruturados em oportunidades de novidade e crescimento na era da GenAI.
Quer continuar a conversa? Encontre-nos na comunidade de desenvolvedores do MongoDB.
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 Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Como fazer semantic search no MongoDB utilizando o Atlas Vector Search


Sep 18, 2024 | 8 min read
Tutorial

Como usar o PyMongo para conectar o MongoDB Atlas ao AWS Lambda


Apr 02, 2024 | 6 min read
Artigo

Atlas do MongoDB para jogos e startups para assistir em 2023


Mar 13, 2025 | 7 min read
Início rápido

Introdução ao desenvolvimento do Atlas Stream Processing


Mar 13, 2025 | 7 min read
Sumário