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
Produtoschevron-right
MongoDBchevron-right

Habilite a IA generativa e os cursos de pesquisa semântica em seu banco de dados com o MongoDB Atlas e o OpenAI

Viraj Thakrar8 min read • Published Sep 09, 2024 • Updated Sep 09, 2024
IAPythonMongoDB
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Alguns recursos mencionados abaixo serão descontinuados em 30, 2025 de setembro. Saiba mais.

Objetivo

Nosso objetivo neste tutorial é aproveitar os LLMs de código aberto disponíveis e populares no mercado e adicionar os recursos e a potência desses LLMs no mesmo banco de dados de sua carga de trabalho operacional (ou, em outras palavras, primária).

Overview

A criação de um modelo de linguagem grande (LLM) não é um processo de um ou dois dias. Pode levar anos para construir um modelo ajustado e otimizado. A boa notícia é que já temos muitos LLMs disponíveis no mercado, incluindo BERT, GPT-3, GPT-4, Hugging Face e Claude, e podemos fazer bom uso deles de diferentes maneiras.
Os LLMs fornecem representações vetoriais de dados de texto, capturando relações semânticas e compreendendo o contexto da linguagem. Essas representações vetoriais podem ser aproveitadas para várias tarefas, incluindo pesquisa vetorial, para encontrar itens de texto semelhantes ou relevantes em conjuntos de dados.
As representações vetoriais de dados de texto podem ser usadas na captura de semelhanças semânticas, pesquisa e recuperação, recuperação de documentos, sistemas de recomendação, agrupamento e categorização de textos e detecção de anomalias.
Neste artigo, exploraremos o recurso semântica do Atlas Search com representações vetoriais de dados de texto com um caso de uso do mundo real. Usaremos o conjunto de dados de amostra do Airbnb do MongoDBno qual tentaremos encontrar uma sala de nossa escolha dando um prompt sincronizado.
Usaremos o MongoDB Atlas como uma plataforma de dados, onde teremos nosso conjunto de dados de amostra (uma carga de trabalho operacional) do Airbnb e habilitaremos recursos de pesquisa e pesquisa vetorial sobre ele.

O que é pesquisa semântica?

O Semantic Atlas Search é uma técnica de recuperação de informações que melhora a experiência do usuário no Atlas Search por meio da compreensão da intenção ou do significado por trás das queries e do conteúdo. Semântica O Atlas Search concentra-se no contexto e na semântica, em vez da correspondência exata de palavras, como faria o Atlas Search tradicional. Saiba mais sobre a semântica Atlas Search e como ela difere do Google Atlas Search e da Atlas Search baseada em texto.

O que é pesquisa vetorial?

A pesquisa vetorial é uma técnica usada para sistemas de recuperação e recomendações de informações para encontrar itens semelhantes a itens de query ou vetores. Os itens de dados são representados como vetores de alta dimensão e a similaridade entre os itens é calculada com base nas propriedades matemáticas desses vetores. Essa é uma abordagem muito útil e comumente usada na recomendação de conteúdo, recuperação de imagens e pesquisa de documentos.
O Atlas Vector Search permite pesquisar em dados não estruturados. Você pode armazenar incorporações vetoriais geradas por modelos populares de aprendizado de máquina, como OpenAI e Hugging Face, utilizando-os para pesquisa semântica e experiências de usuário personalizadas, criando RAGs e muitos outros casos de uso.

Caso de uso em tempo real

Temos um conjunto de dados do Airbnb que contém uma boa descrição escrita para cada uma das propriedades. Permitiremos que os usuários Express sua escolha de localização em palavras - por exemplo, "Nice cozy, comfy room near beach," "3 bedroom studio apartment for couples near beach," "Studio with nice city view," etc. - e o banco de dados retornará os resultados relevantes com base na frase e nas palavras-chave adicionadas.
O que ele fará nos bastidores é fazer uma chamada de API para o LLM que estamos usando (OpenAI) e obter as incorporações vetoriais para a pesquisa/solicitação que passamos/consultamos (como fazemos na interface do ChatGPT). Em seguida, ele retornará as incorporações vetoriais e poderemos pesquisar com essas incorporações em nosso conjunto de dados operacional, o que permitirá que nosso banco de dados retorne resultados semânticos/contextuais.
Com apenas alguns cliques e com o poder dos LLMs existentes e muito avançados, podemos oferecer a melhor experiência de pesquisa ao usuário usando nosso conjunto de dados operacionais existente.

Configuração inicial

  • Cadastre-se na API OpenAI e obtenha a chave de API.
  • Cadastre-se no MongoDB Atlas, se ainda não o fez.
  • Crie um banco de dados chamado sample_airbnb e adicione um único registro fictício na coleção chamada listagensAndReviews.
  • Use uma máquina com a versão mais recente do Python (3.11.1 foi usado ao preparar este artigo) e o driver PyMongo instalado (a versão mais recente - 4.6.1 foi usado enquanto preparação deste artigo).
Neste ponto, supondo que a configuração inicial esteja concluída, vamos pular direto para as etapas de integração.

Etapas de integração

  • Crie um trigger para adicionar/atualizar incorporações vetoriais.
  • Crie uma variável para armazenar credenciais OpenAI. (Usaremos isso para recuperação no código do trigger.)
  • Crie um índice Atlas Search .
  • Carregue/insira seus dados.
  • Consultar o banco de dados.
Seguiremos cada uma das etapas de integração mencionadas acima com as instruções úteis abaixo para que você possa encontrar as telas relevantes enquanto a executa e possa configurar facilmente seu próprio ambiente.

Criar um trigger para adicionar/atualizar incorporações de vetor

No menu esquerdo do seu Atlas cluster, clique em Triggers.
(Navegue até a página Triggers no menu esquerdo)
Clique em Adicionar Trigger, que estará visível no canto superior direito da página de triggers.
(Adicionar botão de trigger na página Acionadores)
Selecione as opções apropriadas na páginaAdicionar trigger, conforme mostrado abaixo.
(Adicionar parte do formulário trigger 1)
 (Adicione o trigger da parte 2 para preencher os detalhes da origem do trigger)
 (Adicione parte do trigger 3 para adicionar código do trigger dentro da função)
É aqui que o código de trigger precisa ser mostrado na próxima etapa.
Adicione o código a seguir na área de função, visível na Etapa 3 acima, para adicionar/atualizar incorporações vetoriais para documentos que serão acionados quando um novo documento for criado ou um documento existente for atualizado.
1exports = async function(changeEvent) {
2 // Get the full document from the change event.
3 const doc = changeEvent.fullDocument;
4
5 // Define the OpenAI API url and key.
6 const url = 'https://api.openai.com/v1/embeddings';
7 // Use the name you gave the value of your API key in the "Values" utility inside of App Services
8 const openai_key = context.values.get("openAI_value");
9 try {
10 console.log(`Processing document with id: ${doc._id}`);
11
12 // Call OpenAI API to get the embeddings.
13 let response = await context.http.post({
14 url: url,
15 headers: {
16 'Authorization': [`Bearer ${openai_key}`],
17 'Content-Type': ['application/json']
18 },
19 body: JSON.stringify({
20 // The field inside your document that contains the data to embed, here it is the "plot" field from the sample movie data.
21 input: doc.description,
22 model: "text-embedding-3-small"
23 })
24 });
25
26 // Parse the JSON response
27 let responseData = EJSON.parse(response.body.text());
28
29 // Check the response status.
30 if(response.statusCode === 200) {
31 console.log("Successfully received embedding.");
32
33 const embedding = responseData.data[0].embedding;
34
35 // Use the name of your MongoDB Atlas Cluster
36 const collection = context.services.get("AtlasSearch").db("sample_airbnb").collection("listingsAndReviews");
37
38 // Update the document in MongoDB.
39 const result = await collection.updateOne(
40 { _id: doc._id },
41 // The name of the new field you'd like to contain your embeddings.
42 { $set: { description_embedding: embedding }}
43 );
44
45 if(result.modifiedCount === 1) {
46 console.log("Successfully updated the document.");
47 } else {
48 console.log("Failed to update the document.");
49 }
50 } else {
51 console.log(`Failed to receive embedding. Status code: ${response.statusCode}`);
52 }
53
54 } catch(err) {
55 console.error(err);
56 }
57};
Neste ponto, com o bloco de código e configuração acima que fizemos, ele será acionado quando um(s) documento(s) for(em) atualizado(s) ou inserido(s) na collectionlistAndReviews do nossobanco de dados sample_airbnb . Este bloco de código chamará a API OpenAI, buscará os embeddings do campo body e armazenará os resultados nocampo description_embedding da collectionlistAndReviews .
Agora que configuramos um trigger, vamos criar variáveis para armazenar as credenciais da OpenAI na próxima etapa.

Crie uma variável para armazenar credenciais OpenAI

Depois de criar o cluster, você verá a guiaApp Services na área superior esquerda, ao lado de Charts.
Clique em App Services. Você verá o trigger que criou na primeira etapa.
(Clique na guia App Services para configurar variáveis de ambiente dentro do valor do trigger)
Clique no trigger presente e ele abrirá uma página na qual você poderá clicar na guiaValues (Valores ) presente no menu à esquerda, conforme mostrado abaixo.
(Clique na aba Valores no painel esquerdo)
Clique em Criar Novo Valor com a variável chamada openAI_value e outra variável chamada openAI_key que vincularemos ao segredo que armazenamos na variávelopenAI_value.
(Chave e valor de duas variáveis dentro do App Services, trigger)
Preparamos nosso serviço de aplicativo para buscar credenciais de API e também adicionamos uma função de trigger que será acionada/executada após a inserção ou atualização de documentos.
Agora, criaremos um Atlas Search, carregaremos os dados de amostra fornecidos pelo MongoDB e executaremos a query do banco de dados.

criar um índice do atlas search

Clique no nome do cluster e, em seguida, na guia de pesquisa na página do cluster.
(clique na aba de pesquisa do Atlas dentro do cluster)
Clique em Criar índice como mostrado abaixo para criar um índice de pesquisa Atlas. (Clique no botão Criar índice do Atlas Search)
Selecione Editor JSON e cole o objeto JSON. (Escolha o editor JSON e adicione a definição do índice)
Adicione uma definição de índice de pesquisa de vetores, conforme mostrado abaixo. (Definição de índice de pesquisa vetorial no editor JSON selecionado da etapa 3)
Criamos o índice de pesquisa do Atlas na etapa acima. Agora, estamos todos prontos para carregar os dados em nosso ambiente preparado. Então, na próxima etapa, vamos carregar dados de amostra.

Carregar/inserir seus dados

Como pré-requisito para esta etapa, precisamos garantir que o cluster esteja instalado e em execução e que a tela esteja visível, conforme mostrado na etapa 1 abaixo. Certifique-se de que a coleção chamada listagensAndReviews seja criada no banco de dadossample_airbnb . Se você ainda não o criou, crie-o alternando para a guia Explorador de Dados .
Podemos carregar o conjunto de dados de amostra da própria opção Atlas cluster, conforme mostrado abaixo.
(Clique em “Load Sample Dataset”)
Depois de carregar os dados, verifique se o campo de incorporação foi adicionado à coleção. (o campodescription_embeding é adicionado automaticamente na inserção com a ajuda do trigger configurado)
Neste ponto, carregamos o conjunto de dados de amostra. Ele deve ter acionado o código que configuramos para ser acionado na inserção ou nas atualizações. Como resultado disso, o campodescription_embedding será adicionado, contendo uma matriz de vetores.
Agora que preparamos tudo, vamos começar a consultar nosso conjunto de dados e ver os resultados empolgantes que obtemos com nosso prompt de usuário. Na próxima seção de consulta do banco de dados, passaremos nosso prompt de usuário de exemplo diretamente para o script Python.

Consultar o banco de dados

Como pré-requisito para esta etapa, você precisará de um tempo de execução para o roteiro do Python. Pode ser sua máquina local, uma instância ec2 na AWS, ou você pode usar o AWS Lambda - qualquer que seja a opção mais conveniente. Certifique-se de ter instalado o PyMongo no ambiente de sua escolha. O bloco de código a seguir pode ser escrito em um notebook do Jupyter ou no VSCode e pode ser executado no tempo de execução do Jupyter ou por meio da linha de comando, dependendo da opção escolhida. O bloco de código a seguir demonstra como executar um Atlas Search e recuperar registros do seu banco de dados operacional encontrando incorporações de prompts de usuários recebidos da API OpenAI.
1import pymongo
2import requests
3import pprint
4
5def get_vector_embeddings_from_openai(query):
6 openai_api_url = "https://api.openai.com/v1/embeddings"
7 openai_api_key = "<your-open-ai-api-key>"
8
9 data = {
10 'input': query,
11 'model': "text-embedding-3-small"
12 }
13
14 headers = {
15 'Authorization': 'Bearer {0}'.format(openai_api_key),
16 'Content-Type': 'application/json'
17 }
18
19 response = requests.post(openai_api_url, json=data, headers=headers)
20 embedding = []
21 if response.status_code == 200:
22 embedding = response.json()['data'][0]['embedding']
23 return embedding
24
25def find_similar_documents(embedding):
26 mongo_url = 'mongodb+srv://<username>:<password>@<cluster-url.mongodb.net>/?retryWrites=true&w=majority'
27 client = pymongo.MongoClient(mongo_url)
28 db = client.sample_airbnb
29 collection = db["listingsAndReviews"]
30
31 pipeline = [
32 {
33 "$vectorSearch": {
34 "index": "default",
35 "path": "descriptions_embedding",
36 “queryVector”: “embedding”,
37 “numCandidates”: 150,
38 “limit”: 10
39 }
40 },
41 {
42 "$project": {
43 "_id": 0,
44 "description": 1
45 }
46 }
47 ]
48 documents = collection.aggregate(pipeline)
49 return documents
50
51def main():
52 query = "Best for couples, nearby beach area with cool weather"
53 try:
54 embedding = get_vector_embeddings_from_openai(query)
55 documents = find_similar_documents(embedding)
56 print("Documents")
57 pprint.pprint(list(documents))
58 except Exception as e:
59 print("Error occured: {0}".format(e))
60
61main()

Saída

(Saída do script Python, mostrando resultados de pesquisa vetorial)
Pesquisamos "best for couples, nearby beach area with cool weather " no bloco de código. Confira os resultados interessantes que obtivemos, que são contextual e semanticamente compatíveis e correspondem às expectativas do usuário.
Para resumir, usamos o Atlas Apps Services para configurar os triggers e as chaves de API OpenAI. No código de trigger, escrevemos uma lógica para buscar as incorporações do OpenAI e armazená-las em documentos importados/recém-criados. Com essas etapas, habilitamos os recursos de pesquisa semântica em nosso conjunto de dados de carga de trabalho principal que, neste caso, é o Airbnb.
Se tiver alguma dúvida ou quiser discutir esse ou quaisquer novos casos de uso, pode me procurar no LinkedIn.
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
Início rápido

Java - Change Streams


Oct 01, 2024 | 10 min read
Início rápido

Preparando-se para executar PHP com MongoDB


Aug 29, 2024 | 12 min read
Início rápido

Introdução a pipelines de agregação em Python


Oct 01, 2024 | 14 min read
Início rápido

Início rápido: tipos de dados BSON - ObjectId


Sep 23, 2022 | 3 min read
Sumário