Menu Docs
Página inicial do Docs
/ /

Comece com a integração do MongoDB LangChain

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:

  1. Configure o ambiente.

  2. Armazene dados personalizados no MongoDB.

  3. Crie um índice do MongoDB Vector Search em seus dados.

  4. Execute as seguintes query de pesquisa vetorial:

    • Pesquisa semântica.

    • Pesquisar semântica com pontuação.

    • Pesquisa semântica com pré-filtragem de metadados.

  5. 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.

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.

Para concluir este tutorial, você deve ter o seguinte:

  • Um dos seguintes tipos de cluster MongoDB :

  • 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.

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:

1

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
2

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.

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.

1

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')
2

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 campo embedding.

  • 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.

Dica

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 campo embedding contém as incorporações criadas usando o modelo de incorporação voyage-3-large do Voyage AI. A definição de índice especifica 1024 dimensões vetoriais e mede a similaridade usando cosine.

  • 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.

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 ao 3.

  • 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.

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 documentos 10 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 documentos 10 mais relevantes.

    • score_threshold para usar somente documentos com uma pontuação de relevância acima de 0.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 campo page_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')]

Siga este tutorial em vídeo para aprender mais sobre pesquisa semântica e RAG com LangChain e MongoDB.

Duração: 8 Minutos

Voltar

LangChain

Nesta página