Menu Docs
Página inicial do Docs
/ /

Execute a recuperação de documentos pai com MongoDB e LangChain

Você pode integrar o MongoDB Vector Search ao LangChain para realizara recuperação de documento principais . Neste tutorial, você conclui as seguintes etapas:

  1. Configure o ambiente.

  2. Prepare os dados.

  3. Instancie o recuperador de documentos principais.

  4. Crie o índice do MongoDB Vector Search .

  5. Utilize o recuperador em um pipeline de RAG.

Trabalhe com uma versão executável deste tutorial como um bloco de anotações Python.

Recuperação de documentos principais é uma técnica que envolve dividir documentos grandes em partes menores. Nesta técnica, você consulta os fragmentos menores antes de retornar o documento completo para o LLM. Isso pode melhorar as respostas de seus agentes RAG e dos aplicativos, permitindo pesquisas mais detalhadas em partes menores, enquanto fornece aos LLMs o contexto completo do documento.

A recuperação de um documento pai com o MongoDB permite armazenar documentos pai e filho em uma única coleção, o que oferece suporte a uma recuperação eficiente ao precisar apenas calcular e indexar as incorporações dos documentos filho.

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

  • Um dos seguintes tipos de cluster MongoDB :

    • Um cluster do Atlas executando MongoDB versão 6.0.11, 7.0.2 ou posterior. Garanta que seu endereço IP esteja incluído na lista de acessodo 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.

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

import os
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.

Cole e execute o seguinte código no seu notebook para carregar e particionar um PDF de amostra que contém um relatório de ganhos do MongoDB recente.

Este código utiliza um divisor de texto para dividir os dados do PDF em documentos pai menores. Ele especifica o tamanho da parte (número de caracteres) e a sobreposição da parte (número de caracteres sobrepostos entre partes consecutivas) para cada documento.

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
# Load the PDF
loader = PyPDFLoader("https://investors.mongodb.com/node/12881/pdf")
data = loader.load()
# Chunk into parent documents
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=20)
docs = parent_splitter.split_documents(data)
# Print a document
docs[0]
Document(metadata={'source': 'https://investors.mongodb.com/node/12881/pdf', 'page': 0, 'page_label': '1'}, page_content='MongoDB, Inc. Announces Third Quarter Fiscal 2025 Financial Results\nDecember 9, 2024\nThird Quarter Fiscal 2025 Total Revenue of $529.4 million, up 22% Year-over-Year\nContinued Strong Customer Growth with Over 52,600 Customers as of October 31, 2024\nMongoDB Atlas Revenue up 26% Year-over-Year; 68% of Total Q3 Revenue\nNEW YORK , Dec. 9, 2024 /PRNewswire/ -- MongoDB, Inc. (NASDAQ: MDB) today announced its financial results for the third quarter ended October\n31, 2024.\n\xa0\n \xa0\n"MongoDB\'s third quarter results were significantly ahead of expectations on the top and bottom line, driven by better-than-expected EA performance\nand 26% Atlas revenue growth.\xa0 We continue to see success winning new business due to the superiority of MongoDB\'s developer data platform in\naddressing a wide variety of mission-critical use cases," said Dev Ittycheria, President and Chief Executive Officer of MongoDB .\n"We continue to invest in our legacy app modernization and AI offerings as our document model and distributed architecture are exceptionally well\nsuited for customers looking to build highly-performant, modern applications.\xa0 MongoDB is in a great position to be a central pillar of the emerging AI\ntech stack and benefit from the next wave of application development in the years ahead."\nThird Quarter Fiscal 2025 Financial Highlights\nRevenue: Total revenue was $529.4 million for the third quarter of fiscal 2025, an increase of 22% year-over-year.\nSubscription revenue was $512.2 million, an increase of 22% year-over-year, and services revenue was $17.2 million, an\nincrease of 18% year-over-year.\nGross Profit: Gross profit was $394.0 million for the third quarter of fiscal 2025, representing a 74% gross margin\ncompared to 75% in the year-ago period. Non-GAAP gross profit was $405.7 million, representing a 77% non-GAAP gross\nmargin, consistent with a non-GAAP gross margin of 77% in the year-ago period.')

Nesta seção, você instancia o recuperador de documento pai e o usa para alimentar dados no MongoDB.

MongoDBAtlasParentDocumentRetriever divide documentos pai em documentos filho menores, incorpora os documentos filho e, em seguida, ingere documentos pai e filho na mesma coleção no MongoDB. Sob o capô, este retriever cria o seguinte:

  • Uma instância de MongoDBAtlasVectorSearch, um armazenamento vetorial que lida com queries de pesquisa vetorial para os documentos filho.

  • Uma instância de MongoDBDocStore, um repositório de documentos que gerencia o armazenamento e a recuperação dos documentos pai.

1

A forma mais rápida de configurar MongoDBAtlasParentDocumentRetriever é utilizar o método from_connection_string. Este código especifica os seguintes parâmetros:

  • connection_string: sua string de conexão do Atlas para conectar ao seu cluster.

  • child_splitter: o divisor de texto a ser utilizado para a divisão dos documentos pai em documentos filho menores.

  • embedding_model: o modelo de incorporação a ser utilizado para incorporar os documentos filhos.

  • database_name e collection_name: o nome do banco de dados e da coleção pelos quais os documentos devem ser ingeridos.

  • Os seguintes parâmetros opcionais para configurar o armazenamento vetorial MongoDBAtlasVectorSearch:

    • text_key: o campo nos documentos que contém o texto a ser incorporado.

    • relevance_score: a pontuação de relevância a ser usada para a consulta de pesquisa vetorial.

    • search_kwargs: quantos documentos filho devem ser recuperados na pesquisa inicial.

from langchain_mongodb.retrievers import MongoDBAtlasParentDocumentRetriever
from langchain_voyageai import VoyageAIEmbeddings
# Define the embedding model to use
embedding_model = VoyageAIEmbeddings(model="voyage-3-large")
# Define the chunking method for the child documents
child_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
# Specify the database and collection name
database_name = "langchain_db"
collection_name = "parent_document"
# Create the parent document retriever
parent_doc_retriever = MongoDBAtlasParentDocumentRetriever.from_connection_string(
connection_string = MONGODB_URI,
child_splitter = child_splitter,
embedding_model = embedding_model,
database_name = database_name,
collection_name = collection_name,
text_key = "page_content",
relevance_score_fn = "dotProduct",
search_kwargs = { "k": 10 },
)

Dica

2

Em seguida, execute o seguinte código para ingerir os documentos no Atlas utilizando o método add_documents do retriever. Ele utiliza os documentos pai como entrada e processa tanto os documentos pai quanto os documentos filho com base na configuração do retriever.

parent_doc_retriever.add_documents(docs)
3

Após executar o código de amostra, você pode visualizar os documentos na IU do Atlas navegando até a coleção langchain_db.parent_document no seu cluster.

Ambos os documentos pai e filho possuem um campo page_content que contém o texto em partes. Os documentos filho também possuem um campo embedding adicional que contém as incorporações vetoriais do texto segmentado, e um campo doc_id que corresponde ao _id do documento pai.

Você pode executar as seguintes consultas na IU do Atlas, substituindo o espaço reservado <id> por uma ID de documento válida:

  • Para ver documentos filho que compartilham o mesmo ID de documento pai:

    { doc_id: "<id>" }
  • Para ver o documento pai desses documentos filhos:

    { _id: "<id>" }

Para habilitar queries de pesquisa vetorial na collection langchain_db.parent_document, você deve criar um índice do MongoDB Vector Search . Você pode usar o método assistente LangChain ou o método driver PyMongo. Execute o seguinte código em seu bloco de anotações para o método de sua preferência:

# Get the vector store instance from the retriever
vector_store = parent_doc_retriever.vectorstore
# Use helper method to create the vector search index
vector_store.create_vector_search_index(
dimensions = 1024 # The number of dimensions to index
)
from pymongo import MongoClient
from pymongo.operations import SearchIndexModel
# Connect to your cluster
client = MongoClient(MONGODB_URI)
collection = client[database_name][collection_name]
# Create your vector search index model, then create the index
vector_index_model = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"path": "embedding",
"numDimensions": 1024,
"similarity": "dotProduct"
}
]
},
name="vector_index",
type="vectorSearch"
)
collection.create_search_index(model=vector_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, você poderá executar consultas de pesquisa vetorial em seus dados e usar o recuperador em seu pipeline RAG. Cole e execute o seguinte código em seu bloco de anotações para implementar um exemplo de pipeline RAG que executa a recuperação do documento principal:

1

Para visualizar os documentos mais relevantes para uma query específica, cole e execute o código a seguir para realizar uma query de pesquisa vetorial de exemplo na coleção. O retriever busca documentos filho relevantes que sejam semanticamente semelhantes à string AI technology e, em seguida, retorna os documentos pai correspondentes aos documentos filho.

parent_doc_retriever.invoke("AI technology")
[Document(metadata={'_id': '492a138c-1309-4791-a0d0-282d34ea1e55', 'source': 'https://investors.mongodb.com/node/12881/pdf', 'page': 1, 'page_label': '2'}, page_content='downturns and/or the effects of rising interest rates, inflation and volatility in the global economy and financial markets on our business and future\noperating results; our potential failure to meet publicly announced guidance or other expectations about our business and future operating results; our\nlimited operating history; our history of losses; failure of our platform to satisfy customer demands; the effects of increased competition; our\ninvestments in new products and our ability to introduce new features, services or enhancements; our ability to effectively expand our sales and\nmarketing organization; our ability to continue to build and maintain credibility with the developer community; our ability to add new customers or\nincrease sales to our existing customers; our ability to maintain, protect, enforce and enhance our intellectual property; the effects of social, ethical and\nregulatory issues relating to the use of new and evolving technologies, such as artificial intelligence, in our offerings or partnerships; the growth and\nexpansion of the market for database products and our ability to penetrate that market; our ability to integrate acquired businesses and technologies\nsuccessfully or achieve the expected benefits of such acquisitions; our ability to maintain the security of our software and adequately address privacy\nconcerns; our ability to manage our growth effectively and successfully recruit and retain additional highly-qualified personnel; and the price volatility of'),
Document(metadata={'_id': 'a937204a-0e85-4827-ac63-124735529d51', 'source': 'https://investors.mongodb.com/node/12881/pdf', 'page': 1, 'page_label': '2'}, page_content='that it obtained the AWS Modernization Competency designation and launched a MongoDB University course focused on\nbuilding AI applications with MongoDB and AWS. At Microsoft Ignite, MongoDB announced new technology integrations for\nAI, data analytics, and automating database deployments across on-premises, cloud, and edge environments.\nLaunched in July 2024, the MongoDB AI Applications Program (MAAP) is designed to help companies unleash the power\nof their data and to take advantage of rapidly advancing AI technologies. We recently announced that Capgemini,\nConfluent, IBM, Unstructured, and QuantumBlack, AI by McKinsey have joined the MAAP ecosystem, offering customers\nadditional integration and solution options.\nExecutive Leadership Update\nMichael Gordon, MongoDB\'s Chief Operating Officer and Chief Financial Officer, will be stepping down at the end of the Company\'s fiscal year on\nJanuary 31, 2025, and afterwards will serve as an advisor to ensure a smooth transition. The Company has commenced an executive search process\nfor a new CFO and will evaluate internal and external candidates.\xa0 Serge Tanjga, MongoDB\'s Senior Vice President of Finance, will serve as interim\nCFO starting February 1st if a permanent successor has not been named by that date.\nDev Ittycheria commented, "On behalf of everyone at MongoDB , I want to thank Michael for everything he has done to contribute to our success in his\nnearly 10 years with the company.\xa0 In Michael\'s time here, MongoDB had a successful IPO, has grown revenue nearly 50x and has successfully\nscaled the business model to generate meaningful operating leverage. Michael has also built out a world-class finance team that I am confident will\ndeliver a smooth transition to a new CFO in the coming months."\nMichael Gordon said, "I am incredibly proud of what we have accomplished as a team in my almost ten years with the company.\xa0 While we have')]

Para saber mais sobre exemplos de queries de pesquisa vetorial com LangChain, consulte Executar queries de pesquisa vetorial.

2

Para criar e executar um pipeline RAG com o retriever de documento pai, cole e execute o código a seguir. Este código faz o seguinte:

  • Define um modelo de prompt do LangChain para instruir o LLM a usar os documentos pai recuperados como contexto para sua query. O LangChain passa esses documentos para a variável de entrada {context} e sua query para a variável {query}.

  • Constrói uma cadeia que especifica o seguinte:

    • O retriever de documentos pai que você configurou para recuperar documentos pai relevantes.

    • O modelo de prompt que você definiu.

    • Um LLM da OpenAI para gerar uma resposta sensível ao contexto. Por padrão, este é o modelo gpt-3.5-turbo.

  • Solicita à cadeia uma consulta de amostra e retorna a resposta. A resposta gerada pode variar.

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
# Define a prompt template
template = """
Use the following pieces of context to answer the question at the end.
{context}
Question: {query}?
"""
prompt = PromptTemplate.from_template(template)
model = ChatOpenAI()
# Construct a chain to answer questions on your data
chain = (
{"context": parent_doc_retriever, "query": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)
# Prompt the chain
query = "In a list, what are MongoDB's latest AI announcements?"
answer = chain.invoke(query)
print(answer)
1. MongoDB obtained the AWS Modernization Competency designation.
2. MongoDB launched a MongoDB University course focused on building AI applications with MongoDB and AWS.
3. MongoDB announced new technology integrations for AI, data analytics, and automating database deployments across various environments.
4. MongoDB launched the MongoDB AI Applications Program (MAAP) to help companies harness the power of data and future AI technologies.
5. Capgemini, Confluent, IBM, Unstructured, and QuantumBlack joined the MAAP ecosystem to offer customers additional integration and solution options.

Acompanhe este vídeo sobre a recuperação de documento principais com LangChain e MongoDB.

Duração: 27 minutos

Voltar

Pesquisa híbrida

Nesta página