Você pode integrar o MongoDB Vector Search ao LangChain para realizar a recuperação de documento principais. Neste tutorial, você conclui as seguintes etapas:
Configure o ambiente.
Prepare os dados.
Instancie o recuperador de documentos principais.
Crie o índice do MongoDB Vector Search .
Utilize o recuperador em um pipeline de RAG.
Plano de fundo
Recuperação de documentos principais é uma técnica que envolve dividir documentos grandes em partes menores. Com essa técnica, você consulta as partes menores antes de retornar o documento principal 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.
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 do MongoDB 6.0.11, 7.0.2, ou posterior. Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas.
Uma implantação local do Atlas criada usando Python e Docker. Instale
atlas-local-lib-py(pip install atlas-local-lib-py) para criar e gerenciar implantações locais programaticamente. Para saber mais, consulte o repositório atlas-local-lib-py.A MongoDB Community cluster with Search and Vector Search installed.
A Voyage AI API key. To create an API key, see Manage Voyage AI Model API Keys.
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:
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 .
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
IMPORTANTE: certifique-se de que a string de conexão inclua as credenciais do usuário de banco de dados. Para aprender mais sobre como localizar sua string de conexão, consulte Conectar-se a um cluster por meio de bibliotecas de clientes.
Sua string de conexão deve usar o seguinte formato:
mongodb://localhost:<port-number>/?directConnection=true
Para saber mais, consulte Connection strings.
Prepare os dados
Paste and run the following code in your notebook to load and chunk a sample PDF that contains a recent MongoDB earnings report.
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_splitters 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]
Instancie o retriever
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.
Instancie o retriever.
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_nameecollection_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 }, )
Ingerir os dados
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)
(Opcional) Verifique seus documentos.
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>" }
Crie o índice de Vector Search do MongoDB
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)
The index should take about one minute to build. While it builds, the index is in an initial sync state. When it finishes building, you can start querying the data in your collection.
Utilize o retriever no seu pipeline RAG
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:
Execute uma consulta de pesquisa vetorial.
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")
Para saber mais sobre exemplos de queries de pesquisa vetorial com LangChain, consulte Executar queries de pesquisa vetorial.
Crie e execute um pipeline RAG.
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.
Aprenda assistindo
Acompanhe este vídeo sobre a recuperação de documento principais com LangChain e MongoDB.
Duração: 27 minutos