Você pode integrar o Atlas Vector Search com o LangChain para construir aplicativos de IA generativa e RAG. Esta página fornece uma visão geral da integração do LangChain-MongoDB com o Python e os diferentes componentes que você pode usar em seus aplicativos.
Observação
Para obter uma lista completa de componentes e métodos, consulte a referência da API.
Para a integração com JavaScript, veja LangChain JS/TS.
Instalação e configurar
Para usar o Atlas Vector Search com o LangChain, primeiro você deve instalar o pacote langchain-mongodb :
pip install langchain-mongodb
Vector Store
MongoDBAtlasVectorSearch é um armazenamento de vetores que permite armazenar e recuperar incorporações de vetor de uma coleção no Atlas. Você pode usar esse componente para armazenar incorporações dos seus dados e recuperá-las usando o Atlas Vector Search.
Este componente requer um índice do Atlas Vector Search.
Uso
A maneira mais rápida de instanciar seu armazenamento de vetores é usar a string de conexão para seu cluster do Atlas ou implantação local:
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch from langchain_voyageai import VoyageAIEmbeddings # Instantiate the vector store using your MongoDB connection string vector_store = MongoDBAtlasVectorSearch.from_connection_string( connection_string = "<connection-string>", # Atlas cluster or local deployment URI namespace = "<database-name>.<collection-name>", # Database and collection name embedding = VoyageAIEmbeddings(), # Embedding model to use index_name = "vector_index", # Name of the vector search index # Other optional parameters... )
A integração também oferece suporte a outros métodos de instanciação do armazenamento vetorial:
Usando o cliente MongoDB:
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch from langchain_voyageai import VoyageAIEmbeddings from pymongo import MongoClient # Connect to your Atlas cluster or local deployment client = MongoClient("<connection-string>") collection = client["<database-name>"]["<collection-name>"] # Instantiate the vector store vector_store = MongoDBAtlasVectorSearch( collection = collection, # Collection to store embeddings embedding = VoyageAIEmbeddings(), # Embedding model to use index_name = "vector_index" # Name of the vector search index # Other optional parameters... ) De documentos que você criou:
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch from langchain_voyageai import VoyageAIEmbeddings from langchain_core.documents import Document from pymongo import MongoClient # Some documents to embed document_1 = Document(page_content="foo", metadata={"baz": "bar"}) document_2 = Document(page_content="thud", metadata={"bar": "baz"}) docs = [ document_1, document_2 ] # Connect to your Atlas cluster or local deployment client = MongoClient("<connection-string>") collection = client["<database-name>"]["<collection-name>"] # Create the vector store from documents vector_store = MongoDBAtlasVectorSearch.from_documents( documents = docs, # List of documents to embed embedding = VoyageAIEmbeddings(), # Embedding model to use collection = collection, # Collection to store embeddings index_name = "vector_index" # Name of the vector search index # Other optional parameters... )
Parâmetro | necessidade | Descrição | ||
|---|---|---|---|---|
| Obrigatório | Especifique a string de conexão para seu cluster do Atlas ou implantação local do Atlas. Sua string de conexão deve usar o seguinte formato: Certifique-se de que sua string de conexão inclui as credenciais de usuário de banco de dados. Para saber mais sobre como encontrar sua string de conexão, consulte Conectar via drivers. Sua string de conexão deve usar o seguinte formato: | ||
| Obrigatório | Especifique o namespace do MongoDB para o qual armazenar incorporações de vetor. Por exemplo, | ||
| Obrigatório | O modelo de incorporação a ser usado. Você pode usar qualquer modelo de incorporação suportado no LangChain. | ||
| Opcional | Nome do índice de pesquisa vetorial no Atlas. O padrão é | ||
| Opcional | Nome do campo que contém o texto do documento. O padrão é | ||
| Opcional | Nome do campo que armazena o vetor de incorporação. O padrão é | ||
| Opcional | Função de similaridade a utilizar. Os valores aceitos são | ||
| Opcional | Número de dimensões vetoriais. Se você definir esse valor e não tiver um índice de pesquisa vetorial na coleta, o Atlas criará o índice. | ||
| Opcional | Sinalizador que determina se o índice vetorial deve ser criado automaticamente, caso não exista. O padrão é | ||
| Opcional | Tempo limite em segundos para aguardar que um índice de pesquisa vetorial criado automaticamente fique pronto. | ||
| Opcional | Parâmetros adicionais a serem passados para o repositório de vetores, como parâmetros específicos do LangChain. |
Retrievers
Os recuperadores LangChain são componentes que você usa para obter documentos relevantes dos seus armazenamentos de vetor. Você pode usar os recuperadores integrados do LangChain ou os seguintes recuperadores do MongoDB para consultar e recuperar dados do Atlas.
Recuperador de Vector Search
Após instanciar o Atlas como um armazenamento de vetor, você poderá usar a instância do armazenamento de vetor como um recuperador para consultar seus dados usando o Atlas Vector Search.
Uso
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch # Instantiate the vector store vector_store = MongoDBAtlasVectorSearch.from_connection_string( # Vector store arguments... ) # Use the vector store as a retriever retriever = vector_store.as_retriever() # Define your query query = "some search query" # Print results documents = retriever.invoke(query) for doc in documents: print(doc)
Full-Text Retriever
MongoDBAtlasFullTextSearchRetriever é um recuperador que realiza pesquisa de texto completo usando o Atlas Search. Especificamente, ele usa o algoritmo BM25-padrão da Lucene.
Esta recuperação requer um índice do Atlas Search .
Uso
from langchain_mongodb.retrievers.full_text_search import MongoDBAtlasFullTextSearchRetriever # Connect to your Atlas cluster client = MongoClient("<connection-string>") collection = client["<database-name>"]["<collection-name>"] # Initialize the retriever retriever = MongoDBAtlasFullTextSearchRetriever( collection = collection, # MongoDB Collection in Atlas search_field = "<field-name>", # Name of the field to search search_index_name = "<index-name>" # Name of the search index ) # Define your query query = "some search query" # Print results documents = retriever.invoke(query) for doc in documents: print(doc)
Observação
Recuperador de pesquisa híbrido
MongoDBAtlasHybridSearchRetriever é um recuperador que combina pesquisa vetorial e resultados de pesquisa de texto completo usando o algoritmo RRF (Reciprocal Rank Fusion). Para saber mais, consulte Como fazer a pesquisa híbrida.
Este recuperador requer um armazenamento de vetor existente, o índice do Atlas Vector Search e o índice do Atlas Search.
Uso
from langchain_mongodb.retrievers.hybrid_search import MongoDBAtlasHybridSearchRetriever # Initialize the retriever retriever = MongoDBAtlasHybridSearchRetriever( vectorstore = <vector-store>, # Vector store instance search_index_name = "<index-name>", # Name of the Atlas Search index top_k = 5, # Number of documents to return fulltext_penalty = 60.0, # Penalty for full-text search vector_penalty = 60.0 # Penalty for vector search ) # Define your query query = "some search query" # Print results documents = retriever.invoke(query) for doc in documents: print(doc)
Observação
Parent Document Retriever
MongoDBAtlasParentDocumentRetriever é um recuperador que consulta partes menores primeiro e, em seguida, retorna o documento pai maior para o LLM. Esse tipo de recuperação é chamado de recuperação de documento pai. A recuperação de documentos pai pode melhorar as respostas de seus agentes e aplicativos RAG, permitindo pesquisas mais granulares em partes menores, ao mesmo tempo em que fornece às LLMs o contexto completo do documento pai.
Este recuperador armazena tanto os documentos pai quanto os documentos filhos em uma única coleção MongoDB, o que permite uma recuperação eficiente, pois é necessário apenas calcular e indexar as embeddings dos documentos filhos.
Em segundo plano, este recuperador cria o seguinte:
Uma instância de MongoDBAtlasVectorSearch para lidar com queries de pesquisa vetorial nos documentos filhos.
Uma instância de MongoDBDocStore para lidar com o armazenamento e a recuperação dos documentos pai.
Uso
from langchain_mongodb.retrievers.parent_document import ParentDocumentRetriever from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_voyageai import VoyageAIEmbeddings retriever = MongoDBAtlasParentDocumentRetriever.from_connection_string( connection_string = <connection-string>, # Atlas cluster or local deployment URI embedding_model = VoyageAIEmbeddings(), # Embedding model to use child_splitter = RecursiveCharacterTextSplitter(), # Text splitter to use database_name = <database-name>, # Database to store the collection collection_name = <collection-name>, # Collection to store the collection # Additional vector store or parent class arguments... ) # Define your query query = "some search query" # Print results documents = retriever.invoke(query) for doc in documents: print(doc)
Observação
Recuperador auto-query
MongoDBAtlasSelfQueryRetriever é um retriever que se consulta. O recuperador usa um LLM para processar sua query de pesquisa para identificar possíveis filtros de metadados, forma uma query de pesquisa vetorial estruturada com os filtros e, em seguida, executa a query para recuperar os documentos mais relevantes.
Por exemplo, com uma consulta como "O que são filmes de ação depois de 2010 com classificações acima de 8?", O recuperador pode identificar filtros nos campos genre, year e rating e usá-los filtros para recuperar documentos que correspondam à query.
Este recuperador requer um armazenamento de vetor existente e o Índice Atlas Vector Search .
Uso
from langchain_mongodb.retrievers import MongoDBAtlasSelfQueryRetriever from langchain_mongodb import MongoDBAtlasVectorSearch # Given an existing vector store with movies data, define metadata describing the data metadata_field_info = [ AttributeInfo( name="genre", description="The genre of the movie. One of ['science fiction', 'comedy', 'drama', 'thriller', 'romance', 'animated']", type="string", ), AttributeInfo( name="year", description="The year the movie was released", type="integer", ), AttributeInfo( name="rating", description="A 1-10 rating for the movie", type="float" ), ] # Create the retriever from the VectorStore, an LLM and info about the documents retriever = MongoDBAtlasSelfQueryRetriever.from_llm( llm=llm, vectorstore=vector_store, metadata_field_info=metadata_field_info, document_contents="Descriptions of movies", enable_limit=True ) # This example results in the following composite filter sent to $vectorSearch: # {'filter': {'$and': [{'year': {'$lt': 1960}}, {'rating': {'$gt': 8}}]}} print(retriever.invoke("Movies made before 1960 that are rated higher than 8"))
Observação
GraphRAG
GraphRAG é uma abordagem alternativa ao RAG tradicional que estrutura os dados como um grafo de conhecimento de entidades e seus relacionamentos, em vez de como incorporações de vetores. Enquanto o RAG baseado em vetor encontra documentos que são semanticamente semelhantes à consulta, o GraphRAG encontra entidades conectadas à consulta e percorre os relacionamentos no grafo para recuperar informações relevantes.
Essa abordagem é particularmente útil para responder a perguntas baseadas em relacionamento, como "Qual é a conexão entre a Empresa A e a Empresa B?" ou "Quem é o gerente da Pessoa X?".
MongoDBGraphStore é um componente na integração do LangChain com o MongoDB que permite implementar o GraphRAG ao armazenar entidades (nós) e seus relacionamentos (arestas) em uma coleção do MongoDB. Este componente armazena cada entidade como um documento com campos de relacionamento que referenciam outros documentos na sua coleção. Ele executa consultas usando o estágio de agregação $graphLookup.
Uso
from langchain_mongodb import MongoDBGraphStore from langchain_openai import ChatOpenAI # Initialize the graph store graph_store = MongoDBGraphStore( connection_string = "<connection-string>", # Atlas cluster or local deployment URI or local deployment URI database_name = "<database-name>", # Database to store the graph collection_name = "<collection-name>", # Collection to store the graph entity_extraction_model = ChatOpenAI(), # LLM to extract entities from documents (e.g. OpenAI model) # Other optional parameters... ) # Add documents to the graph docs = [...] # Your documents graph_store.add_documents(docs) # Query the graph query = "Who is the CEO of MongoDB?" answer = graph_store.chat_response(query) print(answer.content)
Observação
Caches LLM
Os caches são usados para otimizar o desempenho do LLM, armazenando respostas repetitivas para queries semelhantes ou repetitivas para evitar seu novo cálculo. O MongoDB fornece os seguintes caches para seus aplicativos LangChain.
Cache do MongoDB
MongoDBCache permite armazenar um cache básico no Atlas.
Uso
from langchain_mongodb import MongoDBCache from langchain_core.globals import set_llm_cache set_llm_cache(MongoDBCache( connection_string = "<connection-string>", # Atlas cluster or local deployment URI database_name = "<database-name>", # Database to store the cache collection_name = "<collection-name>" # Collection to store the cache ))
Cache semântico
O cache semântico é uma forma mais avançada de cache que recupera prompts armazenados em cache com base na semelhança semântica entre a entrada do usuário e os resultados armazenados em cache.
MongoDBAtlasSemanticCache é um cache semântico que utiliza o Atlas Vector Search para recuperar os prompts em cache. Este componente requer um índice do Atlas Vector Search.
Uso
from langchain_mongodb import MongoDBAtlasSemanticCache from langchain_core.globals import set_llm_cache from langchain_voyageai import VoyageAIEmbeddings set_llm_cache(MongoDBAtlasSemanticCache( embedding = VoyageAIEmbeddings(), # Embedding model to use connection_string = "<connection-string>", # Atlas cluster or local deployment URI database_name = "<database-name>", # Database to store the cache collection_name = "<collection-name>" # Collection to store the cache ))
Kit de Ferramentas do MongoDB Agent
O MongoDB Agent Toolkit é uma coleção de ferramentas que você pode passar para um LangGraph React Agent para que ele possa interagir com seus recursos do Atlas.
Ferramentas disponíveis
Nome | Descrição |
|---|---|
| Uma ferramenta para query de um banco de dados MongoDB . |
| Uma ferramenta para obter metadados sobre um banco de dados MongoDB . |
| Uma ferramenta para obter os nomes de collection de um banco de dados MongoDB . |
| Uma ferramenta que chama um LLM para verificar se uma consulta ao banco de dados está correta. |
Uso
from langchain_openai import ChatOpenAI from langgraph.prebuilt import create_react_agent from langchain_mongodb.agent_toolkit import ( MONGODB_AGENT_SYSTEM_PROMPT, MongoDBDatabase, MongoDBDatabaseToolkit, ) db_wrapper = MongoDBDatabase.from_connection_string( CONNECTION_STRING, database=DB_NAME ) llm = ChatOpenAI(model="gpt-4o-mini", timeout=60) toolkit = MongoDBDatabaseToolkit(db=db_wrapper, llm=llm) system_message = MONGODB_AGENT_SYSTEM_PROMPT.format(top_k=5) test_query = "Which country's customers spent the most?" agent = create_react_agent(llm, toolkit.get_tools(), state_modifier=system_message) agent.step_timeout = 60 events = agent.stream( {"messages": [("user", test_query)]}, stream_mode="values", ) messages = []
Observação
Carregador de documentos
Os carregadores de documentos são ferramentas que ajudam você a carregar dados para seus aplicativos LangChain.
MongoDBLoader é um carregador de documento que retorna uma lista de documentos de um banco de banco de dados MongoDB .
Uso
from langchain_mongodb.loaders import MongoDBLoader loader = MongoDBLoader.from_connection_string( connection_string = "<connection-string>", # Atlas cluster or local deployment URI db_name = "<database-name>", # Database that contains the collection collection_name = "<collection-name>", # Collection to load documents from filter_criteria = { "field": "value" }, # Optional document to specify a filter field_names = ["<field-name>", "..." ], # Optional list of fields to include in document content metadata_names = ["<metadata-field>", "..."] # Optional metadata fields to extract ) docs = loader.load()
Observação
Histórico de bate-papo
MongoDBChatMessageHistory é um componente que permite armazenar e gerenciar históricos de mensagens de bate-papo em um banco de dados do MongoDB. Ele pode salvar mensagens geradas pelo usuário e pela IA associadas a um identificador de sessão exclusivo. Isso é útil para aplicativos que exigem o rastreamento de interações ao longo do tempo, como chatbots.
Uso
from langchain_mongodb.chat_message_histories import MongoDBChatMessageHistory chat_message_history = MongoDBChatMessageHistory( session_id = "<session-id>", # Unique session identifier connection_string = "<connection-string>", # Atlas cluster or local deployment URI database_name = "<database-name>", # Database to store the chat history collection_name = "<collection-name>" # Collection to store the chat history ) chat_message_history.add_user_message("Hello") chat_message_history.add_ai_message("Hi")
chat_message_history.messages
[HumanMessage(content='Hello'), AIMessage(content='Hi')]
Armazenamento
Você pode usar os seguintes armazenamentos de dados personalizados para gerenciar e armazenar dados no MongoDB.
Armazenamento de documentos
MongoDBDocStore é um armazenamento personalizado de chave-valor que utiliza o MongoDB para armazenar e gerenciar documentos. Você pode executar operações CRUD como faria em qualquer outra coleção do MongoDB.
Uso
from pymongo import MongoClient from langchain_mongodb.docstores import MongoDBDocStore # Replace with your MongoDB connection string and namespace connection_string = "<connection-string>" namespace = "<database-name>.<collection-name>" # Initialize the MongoDBDocStore docstore = MongoDBDocStore.from_connection_string(connection_string, namespace)
Observação
Armazenamento Binário
MongoDBByteStore é um armazenamento de dados personalizado que usa o MongoDB para armazenar e gerenciar dados binários, especificamente dados representados em bytes. Você pode executar operações CRUD com pares de valores-chave em que as chaves são cadeias de caracteres e os valores são sequências de bytes.
Uso
from langchain.storage import MongoDBByteStore # Instantiate the MongoDBByteStore mongodb_store = MongoDBByteStore( connection_string = "<connection-string>", # Atlas cluster or local deployment URI db_name = "<database-name>", # Name of the database collection_name = "<collection-name>" # Name of the collection ) # Set values for keys mongodb_store.mset([("key1", b"hello"), ("key2", b"world")]) # Get values for keys values = mongodb_store.mget(["key1", "key2"]) print(values) # Output: [b'hello', b'world'] # Iterate over keys for key in mongodb_store.yield_keys(): print(key) # Output: key1, key2 # Delete keys mongodb_store.mdelete(["key1", "key2"])
Observação
Recursos adicionais
Para aprender a integrar o Atlas Vector Search com o LangGraph, veja Integrar o MongoDB ao LangGraph.
Para blocos de anotações interativos do Python, consulte Repositório de Cadernos Docs e Repositório de Casos de Uso de IA generativa.