Observação
Este tutorial usa a biblioteca Python da LangChain. Para um tutorial que usa a biblioteca JavaScript, consulte Comece a usar a integração LangChain JavaScript/Typescript.
Você pode integrar o MongoDB Vector Search ao LangChain para criar aplicativos LLM e implementar a geração aumentada de recuperação (RAG). Este tutorial demonstra como começar a usar o MongoDB Vector Search com o LangChain para realizar a pesquisa semântica em seus dados e criar uma implementação de RAG. Especificamente, você executa as seguintes ações:
Configure o ambiente.
Armazene dados personalizados no MongoDB.
Crie um índice do MongoDB Vector Search em seus dados.
Execute as seguintes query de pesquisa vetorial:
Pesquisa semântica.
Pesquisar semântica com pontuação.
Pesquisa semântica com pré-filtragem de metadados.
Implemente o RAG usando o MongoDB Vector Search para responder a perguntas sobre seus dados.
Trabalhe com uma versão executável deste tutorial como um notebook Python.
Plano de fundo
LangChain é uma estrutura de código aberto que simplifica a criação de aplicativos LLM por meio do uso de "cadeias". As cadeias são componentes específicos do LangChain que podem ser combinados para uma variedade de casos de uso de IA, incluindo RAG.
Ao integrar o MongoDB Vector Search com o LangChain, você pode usar o MongoDB como um banco de dados vetorial e usar o MongoDB Vector Search para implementar RAG, recuperando documentos semanticamente semelhantes de seus dados. Para saber mais sobre RAG, consulte Geração Aumentada de Recuperação (RAG) com MongoDB.
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte:
Um dos seguintes tipos de cluster MongoDB :
Um cluster do Atlas executando a versão 6.0.11 do MongoDB, 7.0.2, ou posterior. Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas.
Um sistema local do Atlas criado utilizando o Atlas CLI. Para saber mais, consulte Criar uma implantação de Atlas local.
Um cluster MongoDB Community ou Enterprise com Search e Vector Search instalados.
Uma chave de API da Voyage AI. Para criar uma conta e uma chave de API, consulte o site da Voyage AI.
Uma chave de API da OpenAI. Você deve ter uma conta da OpenAI com créditos disponíveis para solicitações de API. Para aprender mais sobre como registrar uma conta OpenAI, consulte o website de API OpenAI.
Um ambiente para executar blocos de anotações interativos do Python, como o CoLab.
Configurar o ambiente
Configure o ambiente para este tutorial. Crie um bloco de anotações Python interativo salvando um arquivo com a extensão .ipynb
. Este bloco de anotações permite que você execute trechos de código Python individualmente, e você o usará para executar o código neste tutorial.
Para configurar seu ambiente de bloco de anotações:
Instalar e importar dependências.
Execute o seguinte comando:
pip install --quiet --upgrade langchain langchain-community langchain-core langchain-mongodb langchain-voyageai langchain-openai pymongo pypdf
Em seguida, execute o seguinte código para importar os pacotes necessários:
import os, pymongo, pprint from langchain_community.document_loaders import PyPDFLoader from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain_mongodb import MongoDBAtlasVectorSearch from langchain_voyageai import VoyageAIEmbeddings from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from langchain.text_splitter import RecursiveCharacterTextSplitter from pymongo import MongoClient from pymongo.operations import SearchIndexModel
Defina as variáveis de ambiente.
Execute o código a seguir, substituindo os espaços reservados pelos seguintes valores:
Sua chave de API do Voyage AI e OpenAI.
A string de conexão do cluster MongoDB .
os.environ["VOYAGE_API_KEY"] = "<voyage-api-key>" os.environ["OPENAI_API_KEY"] = "<openai-api-key>" MONGODB_URI = "<connection-string>"
Observação
Substitua <connection-string>
pela string de conexão do seu cluster do Atlas ou da implantação local do Atlas.
Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Para saber mais, consulte Conectar a um cluster via drivers.
Sua string de conexão deve usar o seguinte formato:
mongodb://localhost:<port-number>/?directConnection=true
Para saber mais, consulte Connection strings.
Use o MongoDB como um armazenamento de vetores
Em seguida, carregue dados personalizados no MongoDB e instancie seu cluster MongoDB como um banco de dados vetorial , também chamado de armazenamento vetorial. Copie e cole os seguintes trechos de código em seu bloco de anotações.
Carregue os dados de amostra.
Para este tutorial, você usa um documento PDF acessível ao público sobre um relatório de rendimentos recente do MongoDB como fonte de dados para seu armazenamento de vetores.
Para carregar os dados de amostra, execute o seguinte trecho de código. Ele faz o seguinte:
Recupera o PDF a partir da URL especificada e carrega os dados de texto brutos.
Usa um divisor de texto para divisão os dados em documentos menores.
Especifica os parâmetros de parte, que determinam o número de caracteres em cada documento e o número de caracteres que devem se sobrepor entre dois documentos consecutivos.
# Load the PDF loader = PyPDFLoader("https://investors.mongodb.com/node/13176/pdf") data = loader.load() # Split PDF into documents text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20) docs = text_splitter.split_documents(data) # Print the first document docs[0]
Document(metadata={'producer': 'West Corporation using ABCpdf', 'creator': 'PyPDF', 'creationdate': '2025-03-05T21:06:26+00:00', 'title': 'MongoDB, Inc. Announces Fourth Quarter and Full Year Fiscal 2025 Financial Results', 'source': 'https://investors.mongodb.com/node/13176/pdf', 'total_pages': 9, 'page': 0, 'page_label': '1'}, page_content='MongoDB, Inc. Announces Fourth Quarter and Full Year Fiscal 2025 Financial Results\nMarch 5, 2025\nFourth Quarter Fiscal 2025 Total Revenue of $548.4 million, up 20% Year-over-Year')
Instancie o armazenamento de vetores.
Execute o código a seguir para criar uma instância de armazenamento vetorial chamada vector_store
a partir dos exemplos de documento. Este trecho especifica o seguinte:
A string de conexão do seu cluster MongoDB .
langchain_db.test
como o namespace MongoDB para armazenar os documentos.O modelo de incorporação
voyage-3-large
da Voyage AI. para converter o texto em incorporações vetoriais para o campoembedding
.vector_index
como o índice a ser usado para consultar o armazenamento de vetores.
# Instantiate the vector store using your MongoDB connection string vector_store = MongoDBAtlasVectorSearch.from_connection_string( connection_string = MONGODB_URI, namespace = "langchain_db.test", embedding = VoyageAIEmbeddings(model="voyage-3-large"), index_name = "vector_index" ) # Add documents to the vector store vector_store.add_documents(documents=docs)
Depois de executar o código de amostra, se estiver usando o Atlas, poderá verificar suas incorporações vetoriais navegando até o namespace langchain_db.test
na interface do usuário do Atlas.
Crie o índice de Vector Search do MongoDB
Para habilitar consultas de pesquisa de vetor em seu armazenamento de vetor, crie um índice do MongoDB Vector Search na coleção langchain_db.test
usando o método de assistente LangChain ou o método de driver PyMongo.
Execute o seguinte código no seu notebook para o seu método preferido. A definição de índice especifica a indexação dos seguintes campos:
embedding
campo como o tipo de vetor. O campoembedding
contém as incorporações criadas usando o modelo de incorporaçãovoyage-3-large
do Voyage AI. A definição de índice especifica1024
dimensões vetoriais e mede a similaridade usandocosine
.page_label
campo como o tipo de filtro para pré-filtrar dados pelo número da página no PDF.
# Use helper method to create the vector search index vector_store.create_vector_search_index( dimensions = 1024, # The number of vector dimensions to index filters = [ "page_label" ] )
# Connect to your cluster client = MongoClient(MONGODB_URI) collection = client["langchain_db"]["test"] # Create your vector search index model, then create the index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1024, "similarity": "cosine" }, { "type": "filter", "path": "page_label" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=search_index_model)
O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.
Executar queries no Vector Search
Depois que o MongoDB criar seu índice, execute consultas de pesquisa vetorial em seus dados. Os exemplos a seguir demonstram várias queries que você pode executar em seus dados vetorizados.
A query a seguir usa o método similarity_search
para executar uma pesquisa semântica básica para a string MongoDB acquisition
. Retorna uma lista de documentos classificados por relevância.
query = "MongoDB acquisition" results = vector_store.similarity_search(query) pprint.pprint(results)
[Document(id='67f0259b8bb2babc06924409', metadata={ ... }, page_content='SOURCE MongoDB, Inc.'), Document(id='67f0259b8bb2babc0692432f', metadata={ ... }, page_content='MongoDB platform. In fiscal year 2026 we expect to see stable consumption growth in Atlas, our main growth driver," said Dev Ittycheria, President\nand Chief Executive Officer of MongoDB .'), Document(id='67f0259b8bb2babc06924355', metadata={ ... }, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), Document(id='67f0259b8bb2babc069243a6', metadata={ ... }, page_content="MongoDB's unified, intelligent data platform was built to power the next generation of applications, and MongoDB is the most widely available, globally")]
A query a seguir usa o método similarity_search_with_score
para realizar uma pesquisa semântica para a string MongoDB acquisition
e especifica o parâmetro k
para limitar o número de documentos a serem retornados a 3
.
Observação
O parâmetro k
neste exemplo se refere à opção do método similarity_search_with_score
, não à opção do operador knnBeta de mesmo nome.
Ele retorna os três documentos mais relevantes e uma pontuação de relevância entre 0
e 1
.
query = "MongoDB acquisition" results = vector_store.similarity_search_with_score( query = query, k = 3 ) pprint.pprint(results)
[(Document(id='67f0259b8bb2babc06924409', metadata={ ... }, page_content='SOURCE MongoDB, Inc.'), 0.8193451166152954), (Document(id='67f0259b8bb2babc0692432f', metadata={ ... }, page_content='MongoDB platform. In fiscal year 2026 we expect to see stable consumption growth in Atlas, our main growth driver," said Dev Ittycheria, President\nand Chief Executive Officer of MongoDB .'), 0.7815237045288086), (Document(id='67f0259b8bb2babc06924355', metadata={ ... }, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), 0.7788857221603394)]
Você pode pré-filtrar seus dados usando uma expressão de correspondência MQL que compara o campo indexado com outro valor em sua coleção. Você deve indexar todos os campos de metadados pelos quais deseja filtrar como o tipo filter
. Para saber mais, consulte Como indexar campos para pesquisa vetorial.
Observação
Você especificou o campo page_label
como um filtro quando criou o índice para este tutorial.
A query a seguir usa o método similarity_search_with_score
para executar uma pesquisa semântica para a string MongoDB acquisition
. Ele também especifica o seguinte:
O parâmetro
k
para limitar o número de documentos para retornar ao3
.Um pré-filtro no campo
page_label
que usa o operador$eq
para corresponder aos documentos que aparecem somente na página 2 .
Ele retorna os três documentos mais relevantes da página 2 e uma pontuação de relevância entre 0
e 1
.
query = "MongoDB acquisition" results = vector_store.similarity_search_with_score( query = query, k = 3, pre_filter = { "page_label": { "$eq": 2 } } ) pprint.pprint(results)
[(Document(id='67f0259b8bb2babc06924355', metadata={ ... 'page_label': '2'}, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), 0.7788857221603394), (Document(id='67f0259b8bb2babc06924351', metadata={ ... 'page_label': '2'}, page_content='Measures."\nFourth Quarter Fiscal 2025 and Recent Business Highlights\nMongoDB acquired Voyage AI, a pioneer in state-of-the-art embedding and reranking models that power next-generation'), 0.7606035470962524), (Document(id='67f0259b8bb2babc06924354', metadata={ ... 'page_label': '2'}, page_content='data.\nMongoDB completed the redemption of 2026 Convertible Notes, eliminating all debt from the balance sheet. Additionally, in'), 0.7583936452865601)]
Dica
Para obter uma lista completa dos métodos de pesquisa semântica, consulte a referência da API.
Responda a perguntas sobre seus dados
Esta seção demonstra como implementar RAG em seu aplicação com o MongoDB Vector Search e o LangChain. Agora que você usou a Vector Search do MongoDB para recuperar documentos semanticamente semelhantes, execute os seguintes exemplos de código para solicitar que o LLM responda a perguntas com base nesses documentos.
Este exemplo faz o seguinte:
Instancia o MongoDB Vector Search como um recuperador para fazer query de documentos semelhantes, incluindo o parâmetro
k
opcional para pesquisar somente os documentos10
mais relevantes.
Define um modelo de prompt do LangChain para instruir o LLM a usar esses documentos como contexto para sua query. O LangChain passa esses documentos para a variável de entrada
{context}
e sua query para a variável{question}
.Constrói uma cadeia que especifica o seguinte:
MongoDB Vector Search como o recuperador para pesquisar documentos a serem usados como contexto.
O modelo de prompt que você definiu.
O modelo de bate-papo
gpt-4o
da OpenAI para gerar uma resposta sensível ao contexto.
Aciona a cadeia com uma query de amostra.
Retorna a resposta do LLM e os documentos usados como contexto. A resposta gerada pode variar.
# Instantiate MongoDB Vector Search as a retriever retriever = vector_store.as_retriever( search_type = "similarity", search_kwargs = { "k": 10 } ) # Define a prompt template template = """ Use the following pieces of context to answer the question at the end. {context} Question: {question} """ prompt = PromptTemplate.from_template(template) model = ChatOpenAI(model="gpt-4o") # Construct a chain to answer questions on your data chain = ( { "context": retriever, "question": RunnablePassthrough()} | prompt | model | StrOutputParser() ) # Prompt the chain question = "What was MongoDB's latest acquisition?" answer = chain.invoke(question) print("Question: " + question) print("Answer: " + answer) # Return source documents documents = retriever.invoke(question) print("\nSource documents:") pprint.pprint(documents)
Question: What was MongoDB's latest acquisition? Answer: MongoDB's latest acquisition was Voyage AI, a pioneer in state-of-the-art embedding and reranking models. Source documents: [Document(id='67f0259b8bb2babc06924409', metadata={'_id': '67f0259b8bb2babc06924409', ... 'page_label': '9'}, page_content='SOURCE MongoDB, Inc.'), Document(id='67f0259b8bb2babc06924351', metadata={'_id': '67f0259b8bb2babc06924351', ... 'page_label': '2'}, page_content='Measures."\nFourth Quarter Fiscal 2025 and Recent Business Highlights\nMongoDB acquired Voyage AI, a pioneer in state-of-the-art embedding and reranking models that power next-generation'), Document(id='67f0259b8bb2babc0692432f', metadata={'_id': '67f0259b8bb2babc0692432f', ... 'page_label': '1'}, page_content='MongoDB platform. In fiscal year 2026 we expect to see stable consumption growth in Atlas, our main growth driver," said Dev Ittycheria, President\nand Chief Executive Officer of MongoDB .'), Document(id='67f0259b8bb2babc06924355', metadata={'_id': '67f0259b8bb2babc06924355', ... 'page_label': '2'}, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), Document(id='67f0259b8bb2babc069243a6', metadata={'_id': '67f0259b8bb2babc069243a6', ... 'page_label': '4'}, page_content="MongoDB's unified, intelligent data platform was built to power the next generation of applications, and MongoDB is the most widely available, globally"), Document(id='67f0259b8bb2babc06924329', metadata={'_id': '67f0259b8bb2babc06924329', ... 'page_label': '1'}, page_content='MongoDB, Inc. Announces Fourth Quarter and Full Year Fiscal 2025 Financial Results\nMarch 5, 2025\nFourth Quarter Fiscal 2025 Total Revenue of $548.4 million, up 20% Year-over-Year'), Document(id='67f0259b8bb2babc069243a7', metadata={'_id': '67f0259b8bb2babc069243a7', ... 'page_label': '4'}, page_content='distributed database on the market. With integrated capabilities for operational data, search, real-time analytics, and AI-powered retrieval, MongoDB'), Document(id='67f0259b8bb2babc069243a5', metadata={'_id': '67f0259b8bb2babc069243a5', ... 'page_label': '4'}, page_content="Headquartered in New York, MongoDB's mission is to empower innovators to create, transform, and disrupt industries with software and data."), Document(id='67f0259b8bb2babc06924354', metadata={'_id': '67f0259b8bb2babc06924354', ... 'page_label': '2'}, page_content='data.\nMongoDB completed the redemption of 2026 Convertible Notes, eliminating all debt from the balance sheet. Additionally, in'), Document(id='67f0259b8bb2babc069243a9', metadata={'_id': '67f0259b8bb2babc069243a9', ... 'page_label': '4'}, page_content='50,000 customers across almost every industry—including 70% of the Fortune 100—rely on MongoDB for their most important applications. To learn\nmore, visit mongodb.com .\nInvestor Relations')]
Este exemplo faz o seguinte:
Instancia o MongoDB Vector Search como um retriever para fazer query de documentos semelhantes, incluindo os seguintes parâmetros opcionais:
k
para pesquisar somente os documentos10
mais relevantes.score_threshold
para usar somente documentos com uma pontuação de relevância acima de0.75
.Observação
Esse parâmetro refere-se a uma pontuação de relevância que o Langchain usa para normalizar seus resultados, e não à pontuação de relevância usada nas queries do MongoDB Search. Para usar as pontuações do MongoDB Search em sua implementação do RAG, defina um recuperador personalizado que use o método
similarity_search_with_score
e filtre pela pontuação do MongoDB Search.pre_filter
para filtrar no campopage_label
os documentos que aparecem somente na página 2.
Define um modelo de prompt do LangChain para instruir o LLM a usar esses documentos como contexto para sua query. O LangChain passa esses documentos para a variável de entrada
{context}
e sua query para a variável{question}
.Constrói uma cadeia que especifica o seguinte:
MongoDB Vector Search como o recuperador para pesquisar documentos a serem usados como contexto.
O modelo de prompt que você definiu.
O modelo de bate-papo
gpt-4o
da OpenAI para gerar uma resposta sensível ao contexto.
Aciona a cadeia com uma query de amostra.
Retorna a resposta do LLM e os documentos usados como contexto. A resposta gerada pode variar.
# Instantiate MongoDB Vector Search as a retriever retriever = vector_store.as_retriever( search_type = "similarity", search_kwargs = { "k": 10, "score_threshold": 0.75, "pre_filter": { "page_label": { "$eq": 2 } } } ) # Define a prompt template template = """ Use the following pieces of context to answer the question at the end. {context} Question: {question} """ prompt = PromptTemplate.from_template(template) model = ChatOpenAI(model="gpt-4o") # Construct a chain to answer questions on your data chain = ( { "context": retriever, "question": RunnablePassthrough()} | prompt | model | StrOutputParser() ) # Prompt the chain question = "What was MongoDB's latest acquisition?" answer = rag_chain.invoke(question) print("Question: " + question) print("Answer: " + answer) # Return source documents documents = retriever.invoke(question) print("\nSource documents:") pprint.pprint(documents)
Question: What was MongoDB's latest acquisition? Answer: MongoDB's latest acquisition was Voyage AI, a pioneer in state-of-the-art embedding and reranking models. Source documents: [Document(id='67f0259b8bb2babc06924351', metadata={'_id': '67f0259b8bb2babc06924351', ... 'page_label': '2'}, page_content='Measures."\nFourth Quarter Fiscal 2025 and Recent Business Highlights\nMongoDB acquired Voyage AI, a pioneer in state-of-the-art embedding and reranking models that power next-generation'), Document(id='67f0259b8bb2babc06924355', metadata={'_id': '67f0259b8bb2babc06924355', ... 'page_label': '2'}, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), Document(id='67f0259b8bb2babc06924354', metadata={'_id': '67f0259b8bb2babc06924354', ... 'page_label': '2'}, page_content='data.\nMongoDB completed the redemption of 2026 Convertible Notes, eliminating all debt from the balance sheet. Additionally, in'), Document(id='67f0259b8bb2babc06924358', metadata={'_id': '67f0259b8bb2babc06924358', ... 'page_label': '2'}, page_content='Lombard Odier, a Swiss private bank, partnered with MongoDB to migrate and modernize its legacy banking technology'), Document(id='67f0259b8bb2babc06924352', metadata={'_id': '67f0259b8bb2babc06924352', ... 'page_label': '2'}, page_content="AI applications. Integrating Voyage AI's technology with MongoDB will enable organizations to easily build trustworthy,"), Document(id='67f0259b8bb2babc0692435a', metadata={'_id': '67f0259b8bb2babc0692435a', ... 'page_label': '2'}, page_content='applications from a legacy relational database to MongoDB 20 times faster than previous migrations.\nFirst Quarter and Full Year Fiscal 2026 Guidance'), Document(id='67f0259b8bb2babc06924356', metadata={'_id': '67f0259b8bb2babc06924356', ... 'page_label': '2'}, page_content='For the third consecutive year, MongoDB was named a Leader in the 2024 Gartner® Magic Quadrant™ for Cloud'), Document(id='67f0259b8bb2babc0692434d', metadata={'_id': '67f0259b8bb2babc0692434d', ... 'page_label': '2'}, page_content='compared to $121.5 million of cash from operations in the year-ago period. MongoDB used $29.6 million of cash in capital'), Document(id='67f0259b8bb2babc0692434c', metadata={'_id': '67f0259b8bb2babc0692434c', ... 'page_label': '2'}, page_content='Cash Flow: During the year ended January 31, 2025, MongoDB generated $150.2 million of cash from operations,'), Document(id='67f0259b8bb2babc06924364', metadata={'_id': '67f0259b8bb2babc06924364', ... 'page_label': '2'}, page_content='MongoDB will host a conference call today, March 5, 2025, at 5:00 p.m. (Eastern Time) to discuss its financial results and business outlook. A live')]
Aprenda assistindo
Siga este tutorial em vídeo para aprender mais sobre pesquisa semântica e RAG com LangChain e MongoDB.
Duração: 8 Minutos