Usar a Atlas Vector Search do MongoDB com LangChain
Arek Borucki6 min read • Published Sep 18, 2024 • Updated Sep 18, 2024
Avalie esse Tutorial
Os mecanismos de pesquisa vetorial, também chamados de bancos de dados vetoriais, pesquisa semântica (pesquisa semântica) ou pesquisa por cosseno, localizam as entradas mais próximas de uma determinada consulta vetorizada. Enquanto os métodos de pesquisa convencionais dependem de referências de palavras-chave, correspondência lexical e taxa de exibição de palavras, os mecanismos de pesquisa vetorial medem a similaridade com base na distância da dimensão de incorporação. Encontrar dados relacionados agora é pesquisar os vizinhos mais próximos da sua consulta.
As incorporações vetoriais atuam como a representação numérica dos dados e do seu respectivo contexto, preservados em vetores de alta dimensão (densos). Há vários modelos, tanto privados (como os da OpenAI e da Hugging Face) quanto de código aberto (como o FastText), desenvolvidos para gerar essas incorporações. Esses modelos podem ser treinados em milhões de amostras para fornecer resultados mais pertinentes e precisos. Em determinadas situações, os dados numéricos que você coletou ou criou para exibir as características essenciais dos seus documentos podem servir como embeddings. O essencial é ter um mecanismo de pesquisa eficiente, como o MongoDB Atlas.
O MongoDB Atlas é um banco de dados de nuvem completamente gerenciado oferecido na AWS, Azure e GCP.Recentemente, ele incorporou recursos nativos de pesquisa vetorial para dados de documentos do MongoDB. A Atlas Vector Search utiliza o algoritmo Hierarchical Navigable Small Worlds para executar pesquisas semânticas.Como a Atlas Vector Search permite consultas aNN, você pode usá-las para localizar resultados análogos a um produto específico, realizar pesquisas de imagem e muito mais.
As queries do Atlas Vector Search assumem a forma de um estágio de pipeline de agregação e usam o novo operador
$vectorSearch
. O estágio$vectorSearch
realiza uma pesquisa aNN em um vetor no campo especificado. O campo que você pretende pesquisar deve ser indexado com o tipo vector
do Atlas Vector Search. O $vectorSearch
deve ser o primeiro estágio de qualquer pipeline onde ele aparece.O LangChain é uma estrutura personalizada que usa grandes modelos de linguagem (LLM) para simplificar a criação de aplicativos.É uma estrutura de código aberto que ajuda no desenvolvimento de aplicativos com tecnologia de modelos de linguagem, focando principalmente em grandes modelos de linguagem. A estrutura vai além das chamadas de API padrão, pois reconhece dados e é agente, o que facilita as conexões com várias fontes de dados para fornecer experiências mais completas e personalizadas.
Esse recurso melhora a capacidade do aplicativo de interagir com diferentes conjuntos de dados e aprimorar sua funcionalidade com base nos dados obtidos. Por exemplo, um desenvolvedor pode usar LangChain para criar um aplicativo no qual a consulta de um usuário é processada por um grande modelo de linguagem, que em seguida gera uma representação vetorial da consulta. Essa representação vetorial pode ser utilizada para pesquisar dados vetoriais armazenados no MongoDB Atlas utilizando seu recurso de pesquisa vetorial. Os resultados do MongoDB Atlas podem então ser exibidos ao usuário ou processados pelo modelo de linguagem para fornecer respostas mais detalhadas ou personalizadas.
Agora, vamos consolidar todos esses elementos em uma visão arquitetônica.
Com a base teórica traçada, chegou a hora de fazer a transição da compreensão conceitual para a aplicação prática. Vamos nos aprofundar no processo de implementação para ver esses conceitos na prática.
O primeiro passo é criar o índice de pesquisa vetorial. Na IU do Atlas (você também pode usar o Atlas Vector Search com implantações locais do Atlas que você cria com o Atlas CLI), escolher Pesquisar e Criar índice de pesquisa. Visite também a documentação oficial do MongoDB para saber mais.
Em seguida, use o editor JSON para configurar campos do tipo
vector
. Eu nomeei o campo que contém o vetor de incorporação embedding
.1 { 2 "fields": [ 3 { 4 "type": "vector", 5 "path": "embedding", 6 "numDimensions": 1536, 7 "similarity": "cosine" 8 } 9 ] 10 }
Especifique o namespace (banco de dados e coleção) no qual o índice de pesquisa vetorial deve ser criado. Eu escolhi o namespace
langchain.vectorSearch
.O campo
similarity
na definição vetorial especifica a função a ser usada para pesquisar os vizinhos K mais próximos de cima. Os valores podem ser:euclidean
: mede a distância do end-point do vetor quanto à similaridade entre dimensões variadas.cosine
: mede a similaridade angular e independente da magnitude; não adequado para vetores de magnitude zero. Para similaridade de cosseno, recomenda-se normalizar vetores e usar dotProduct.dotProduct
: semelhante a cosine, mas considera a magnitude do vetor, permitindo uma medição eficiente da similaridade com base no ângulo e na magnitude. Normalize o vetor quanto ao comprimento da unidade no tempo de consulta e índice para usá-lo.
Você pode executar pesquisas semânticas no seu cluster do Atlas executando o MongoDB versão 6.0.11 ou posterior. Ele permite o armazenamento de incorporações vetoriais para qualquer tipo de dados, juntamente com outros dados em sua coleção no cluster do Atlas. O Atlas Vector Search aceita incorporações de até 4096 dimensões.
Agora que configuramos a Atlas Vector Search, vamos passar para a configuração do LangChain.
Neste artigo, utilizaremos a OpenAI para gerar incorporações vetoriais. Primeiro, você precisará da chave da API da OpenAI. Crie uma conta e localize sua chave de API secreta nas configurações do usuário.
Para instalar o LangChain, primeiro você precisará atualizar o pip para Python ou npm para JavaScript e, em seguida, usar o respectivo comando de instalação. Estas são as etapas:
Para a versão do Python, use:
1 pip3 install pip --upgrade 2 pip3 install langchain
Também precisaremos de outros módulos Python, como
pymongo
para comunicação com o MongoDB Atlas, openai
para comunicação com a API da OpenAI e pypdf` `and
tiktoken`` para outras funcionalidades.1 pip3 install pymongo openai pypdf tiktoken
Em nosso exercício, usamos um documento PDF de acesso público intitulado "Melhores práticas do MongoDB Atlas" como fonte de dados para criar um espaço vetorial pesquisável por texto. O roteiro Python implementado emprega vários módulos para processar, vetorizar e indexar o conteúdo do documento em uma coleção do MongoDB Atlas.
Para implementá-lo, vamos começar configurando e exportando as variáveis de ambiente. Precisamos da string de conexão do Atlas e da chave da OpenAI API.
1 export OPENAI_API_KEY="xxxxxxxxxxx" 2 export ATLAS_CONNECTION_STRING="mongodb+srv://user:passwd@vectorsearch.abc.mongodb.net/?retryWrites=true"
Em seguida, podemos executar o código fornecido abaixo. Este roteiro extrai um PDF de um URL especificado, segmenta o texto e indexa-o no MongoDB Atlas para pesquisa de texto, utilizando os recursos de incorporação e pesquisa de vetor do LangChain. O código completo pode ser acessado no GitHub.
1 import os 2 from pymongo import MongoClient 3 from langchain.document_loaders import PyPDFLoader 4 from langchain.text_splitter import RecursiveCharacterTextSplitter 5 from langchain.embeddings import OpenAIEmbeddings 6 from langchain_mongodb import MongoDBAtlasVectorSearch 7 8 # Define the URL of the PDF MongoDB Atlas Best Practices document 9 pdf_url = "https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE4HkJP" 10 11 # Retrieve environment variables for sensitive information 12 OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') 13 if not OPENAI_API_KEY: 14 raise ValueError("The OPENAI_API_KEY environment variable is not set.") 15 16 ATLAS_CONNECTION_STRING = os.getenv('ATLAS_CONNECTION_STRING') 17 if not ATLAS_CONNECTION_STRING: 18 raise ValueError("The ATLAS_CONNECTION_STRING environment variable is not set.") 19 20 # Connect to MongoDB Atlas cluster using the connection string 21 cluster = MongoClient(ATLAS_CONNECTION_STRING) 22 23 # Define the MongoDB database and collection names 24 DB_NAME = "langchain" 25 COLLECTION_NAME = "vectorSearch" 26 27 # Connect to the specific collection in the database 28 MONGODB_COLLECTION = cluster[DB_NAME][COLLECTION_NAME] 29 30 # Initialize the PDF loader with the defined URL 31 loader = PyPDFLoader(pdf_url) 32 data = loader.load() 33 34 # Initialize the text splitter 35 text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150) 36 37 # Split the document into manageable segments 38 docs = text_splitter.split_documents(data) 39 40 # Initialize MongoDB Atlas vector search with the document segments 41 vector_search = MongoDBAtlasVectorSearch.from_documents( 42 documents=docs, 43 embedding=OpenAIEmbeddings(), 44 collection=MONGODB_COLLECTION, 45 index_name="default" # Use a predefined index name 46 ) 47 # At this point, 'docs' are split and indexed in MongoDB Atlas, enabling text search capabilities.
Após a conclusão do script, o PDF foi segmentado e suas representações vetoriais agora são armazenadas no namespace
langchain.vectorSearch
no MongoDB Atlas."
MongoDB Atlas auditing
" serve como nossa declaração de pesquisa para iniciar pesquisas de similaridade. Ao utilizar a classe <code><em>OpenAIEmbeddings</em></code>
, geraremos incorporações vetoriais para esta frase. Em seguida, uma pesquisa de similaridade será executada para localizar e extrair os três documentos mais semanticamente relacionados da nossa coleção do MongoDB Atlas que se alinham com a nossa intenção de pesquisa.Na primeira etapa, precisamos criar um objeto
MongoDBAtlasVectorSearch
:1 def create_vector_search(): 2 """ 3 Creates a MongoDBAtlasVectorSearch object using the connection string, database, and collection names, along with the OpenAI embeddings and index configuration. 4 5 :return: MongoDBAtlasVectorSearch object 6 """ 7 vector_search = MongoDBAtlasVectorSearch.from_connection_string( 8 ATLAS_CONNECTION_STRING, 9 f"{DB_NAME}.{COLLECTION_NAME}", 10 OpenAIEmbeddings(), 11 index_name="default" 12 ) 13 return vector_search
Posteriormente, podemos realizar uma pesquisa por similaridade.
1 def perform_similarity_search(query, top_k=3): 2 """ 3 This function performs a similarity search within a MongoDB Atlas collection. It leverages the capabilities of the MongoDB Atlas Search, which under the hood, may use the `$vectorSearch` operator, to find and return the top `k` documents that match the provided query semantically. 4 5 :param query: The search query string. 6 :param top_k: Number of top matches to return. 7 :return: A list of the top `k` matching documents with their similarity scores. 8 """ 9 10 # Get the MongoDBAtlasVectorSearch object 11 vector_search = create_vector_search() 12 13 # Execute the similarity search with the given query 14 results = vector_search.similarity_search_with_score( 15 query=query, 16 k=top_k, 17 ) 18 19 return results 20 21 # Example of calling the function directly 22 search_results = perform_similarity_search("MongoDB Atlas auditing")
A função retorna os documentos mais semanticamente relevantes de uma coleção do MongoDB Atlas que correspondem a uma consulta de pesquisa do Atlas especificada. Quando executado, fornecerá uma lista dos documentos que são mais semelhantes à query "
MongoDB Atlas auditing
". Cada entrada nesta lista inclui o conteúdo do documento que corresponde à Atlas Search juntamente com uma pontuação de similaridade, refletindo o quão próximo cada documento se alinha com a intenção da query. A função retorna as k principais correspondências, que por padrão são definidas como 5, mas podem ser especificadas para qualquer número de principais resultados desejados. Encontre o código no Github.O Atlas Vector Search do MongoDB aprimora os aplicativos de IA ao facilitar a incorporação de dados vetoriais em documentos do MongoDB. Ele simplifica a criação de índices de pesquisa e a execução de pesquisas KNN por meio do estágio de MQL
$vectorSearch
, utilizando o algoritmo Hierarchical Navigable Small Worlds para pesquisas eficientes de vizinhos mais próximos.A colaboração com a LangChain usa essa funcionalidade, contribuindo para recursos de pesquisa semântica mais simplificados e eficazes. Aproveite o potencial da Atlas Vector Search do MongoDB e da LangChain para atender já às suas necessidades de pesquisa semântica!Na próxima postagem do blog, vamos nos aprofundar nos LangChain Templates, um novo conjunto de recursos para aprimorar a funcionalidade da Atlas Vector Search do MongoDB. Além disso, examinaremos a função da geração aumentada de recuperação (RAG) na pesquisa semântica e no desenvolvimento de IA. Não perca a exploração detalhada em nosso próximo artigo!
Alguma dúvida? Comentários? Gostaríamos muito de continuar a conversa no fórum da Comunidade de Desenvolvedores.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.