Se puede integrar MongoDB con LangChain para compilar aplicaciones de IA generativa y RAG. Esta página ofrece una visión general de la integración de LangChain MongoDB en Python y los diferentes componentes que se pueden utilizar en las aplicaciones.
EmpezarNota
Para una lista completa de componentes y métodos, consultar Referencia de API.
Para la integración de JavaScript, se puede consultar LangChain JS/TS.
Instalación y configuración
Para utilizar la búsqueda vectorial de MongoDB con LangChain, primero se debe instalar el paquete langchain-mongodb:
pip install langchain-mongodb
Almacenamiento de vectores
MongoDBAtlasVectorSearch es un almacén vectorial que le permite almacenar y recuperar incrustaciones de vectores de una colección en MongoDB. Se puede usar este componente para almacenar incrustaciones de los datos y recuperarlas usando la MongoDB Vector Search.
Este componente requiere un Índice de búsqueda vectorial de MongoDB.
Uso
Atlas admite dos modos de integración:
Incorporación manual: Generar vectores de incorporación en el lado del cliente con un modelo de incorporación que especifiques.
Incrustaciones automatizadas: MongoDB incrusta texto en el servidor sin necesidad de generarlo manualmente. Para obtener más información, consulte Incrustaciones automatizadas.
Parameter | Necesidad | Descripción |
|---|---|---|
| Requerido | Especifique la cadena de conexión para su clúster de MongoDB. Para obtener más información, consulta Conéctate a un clúster mediante Librerías de clientes o Cadenas de conexión. |
| Requerido | Especificar el namespace de MongoDB para almacenar las incrustaciones vectoriales. Por ejemplo, |
| Requerido | El modelo de incrustación que se utilizará. Puede utilizar cualquier modelo de incrustación compatible con LangChain o una |
| Opcional | Nombre del índice de búsqueda vectorial de MongoDB. Se establece por defecto en |
| Opcional | Nombre del campo que contiene el contenido de texto del documento. Se establece por defecto en |
| Opcional | Nombre del campo que almacena el vector de incrustación. Se establece por defecto en |
| Opcional | Función de similitud que se va a usar. Los valores aceptados son |
| Opcional | Número de dimensiones de vectores. Si se establece este valor y no se tiene un índice de búsqueda vectorial en la colección, MongoDB creará el índice. |
| Opcional | Indicador que determina si se debe crear automáticamente el índice vectorial si no existe. Se establece por defecto en |
| Opcional | Tiempo de espera en segundos para que un índice de búsqueda vectorial creado automáticamente esté listo. |
| Opcional | Un diccionario de opciones adicionales para configurar el índice de búsqueda vectorial. |
| Opcional | Parámetros adicionales para pasar al almacenamiento de vectores, como los parámetros específicos de LangChain. |
Retrievers
Los recuperadores de LangChain son componentes que se utilizan para obtener documentos relevantes de los almacenes vectoriales. Se pueden utilizar los recuperadores son una funcionalidad incorporada de LangChain o los siguientes recuperadores de MongoDB para query y recuperar datos de MongoDB.
Recuperador de búsqueda vectorial
Después de instanciar MongoDB como un almacén de vectores, puedes utilizar la instancia de almacén de vectores como un recuperador para consultar tus datos usando MongoDB búsqueda vectorial.
Uso
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch from langchain_voyageai import VoyageAIEmbeddings # Instantiate the vector store vector_store = MongoDBAtlasVectorSearch.from_connection_string( connection_string="<connection-string>", # MongoDB cluster URI namespace="<database-name>.<collection-name>", # Database and collection name embedding=VoyageAIEmbeddings(model="voyage-3-large"), # Embedding model to use index_name="vector_index", # Name of the vector search index ) # 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)
Recuperador de texto completo
MongoDBAtlasFullTextSearchRetriever Es un recuperador que realiza búsquedas de texto completo utilizando MongoDB Search. Específicamente, utiliza el algoritmo estándar BM25 de Lucene.
Este impulsor requiere un MongoDB Search Índice.
Uso
from langchain_mongodb.retrievers.full_text_search import ( MongoDBAtlasFullTextSearchRetriever, ) from pymongo import MongoClient # Connect to your MongoDB 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)
Nota
Recuperador de búsqueda híbrida
MongoDBAtlasHybridSearchRetriever es un recuperador que combina los resultados de búsqueda vectorial y de texto completo mediante el algoritmo de Fusión de Rango Recíproco (RRF). Para obtener más información, consulta Cómo realizar una búsqueda híbrida.
Este recuperador requiere un almacén de vectores existente, un índice de búsqueda vectorial de MongoDB y un índice de MongoDB Search.
Uso
from langchain_mongodb.retrievers.hybrid_search import ( MongoDBAtlasHybridSearchRetriever, ) from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch from langchain_voyageai import VoyageAIEmbeddings # Instantiate the vector store vector_store = MongoDBAtlasVectorSearch.from_connection_string( connection_string="<connection-string>", # MongoDB cluster URI namespace="<database-name>.<collection-name>", # Database and collection name embedding=VoyageAIEmbeddings(model="voyage-3-large"), # Embedding model to use index_name="vector_index", # Name of the vector search index ) # Initialize the retriever retriever = MongoDBAtlasHybridSearchRetriever( vectorstore=vector_store, # Vector store instance search_index_name="<index-name>", # Name of the MongoDB 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)
Parent Document Retriever
MongoDBAtlasParentDocumentRetriever es un recuperador que ejecuta queries en los fragmentos más pequeños y luego devuelve el documento principal más grande al LLM. Este tipo de recuperación se denomina recuperación de documento principal. La recuperación de documentos principales puede mejorar las respuestas de sus agentes y aplicaciones RAG al permitir búsquedas más granulares en fragmentos más pequeños, mientras se proporciona a los LLMel contexto completo del documento principal.
Este recuperador almacena tanto los documentos principales como los documentos secundarios en una única colección de MongoDB, lo que permite una recuperación eficiente al tener que calcular y crear un índice de solo las incrustaciones de los documentos secundarios.
Internamente, este recuperador crea lo siguiente:
Una instancia de MongoDBAtlasVectorSearch para gestionar queries de búsqueda vectorial a los documentos secundarios.
Una instancia de MongoDBDocStore para gestionar el almacenamiento y la recuperación de los documentos principales.
Uso
Establezca text_key en page_content para que el almacén de vectores y el almacén de documentos padre utilicen el mismo nombre de campo para el texto del documento. Sin este parámetro, el recuperador escribe los documentos padre en un campo y los lee de otro, y las consultas fallan con KeyError: 'text'.
from langchain_mongodb.retrievers import MongoDBAtlasParentDocumentRetriever from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_voyageai import VoyageAIEmbeddings retriever = MongoDBAtlasParentDocumentRetriever.from_connection_string( connection_string="<connection-string>", # MongoDB cluster URI embedding_model=VoyageAIEmbeddings( # Embedding model to use model="voyage-3-large" ), 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 text_key="page_content", # Match the key the parent document store uses # 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)
Recuperador de autoquery
MongoDBAtlasSelfQueryRetriever es un recuperador que se hace queries. El recuperador utiliza un LLM para procesar la consulta de búsqueda que se le haga con el fin de identificar posibles filtros de metadatos, forma un query de búsqueda vectorial estructurada con los filtros y luego ejecuta el query para recuperar los documentos más relevantes.
Por ejemplo, con un query como "¿Cuáles son las películas de suspenso después de 2010 con calificaciones superiores a 8?", el sistema de recuperación puede identificar filtros en los campos genre, year y rating y utilizarlos para recuperar documentos que coincidan con el query.
Este recuperador requiere un almacén de vectores existente y un Índice de búsqueda vectorial de MongoDB.
Uso
from langchain_mongodb.retrievers import MongoDBAtlasSelfQueryRetriever from langchain_mongodb import MongoDBAtlasVectorSearch from langchain_classic.chains.query_constructor.schema import AttributeInfo from langchain_voyageai import VoyageAIEmbeddings from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4o", temperature=0) vector_store = MongoDBAtlasVectorSearch.from_connection_string( connection_string="<connection-string>", namespace="langchain_db.movies", embedding=VoyageAIEmbeddings(model="voyage-3-large"), index_name="vector_index", ) # 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}}]}} documents = retriever.invoke("Movies made before 1960 that are rated higher than 8") print(documents)
GraphRAG
GraphRAG es una alternativa a la búsqueda RAG tradicional que estructura los datos como un grafo de conocimiento de entidades y sus relaciones, en lugar de como incrustaciones vectoriales. Mientras que la búsqueda RAG basada en vectores encuentra documentos semánticamente similares a la consulta, GraphRAG encuentra entidades conectadas a la consulta y recorre las relaciones en el grafo para recuperar la información relevante.
Este enfoque es particularmente útil para responder preguntas basadas en relación como "¿Cuál es la conexión entre la empresa A y la empresa B?" o "¿Quién es el administrador de la Persona X?".
MongoDBGraphStore es un componente en la integración de LangChain MongoDB que permite implementar GraphRAG al almacenar entidades (nodos) y sus relaciones (aristas) en una colección de MongoDB. Este componente almacena cada entidad como un documento con campos de relación que hacen referencia a otros documentos en su colección. Ejecutar las queries utilizando la $graphLookup etapa de agregación.
Uso
from langchain_mongodb.graphrag import MongoDBGraphStore from langchain_openai import ChatOpenAI from langchain_core.documents import Document # Initialize the graph store graph_store = MongoDBGraphStore( connection_string="<connection-string>", # MongoDB cluster 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 model="gpt-4o", temperature=0 ), # Other optional parameters... ) # Add documents to the graph docs = [ Document( page_content=( "MongoDB is a document database. " "Dev Ittycheria is the CEO of MongoDB." ) ), Document(page_content="MongoDB Atlas is the cloud platform offered by MongoDB."), ] graph_store.add_documents(docs) # Query the graph query = "Who is the CEO of MongoDB?" answer = graph_store.chat_response(query) print(answer.content)
Cachés de LLM
Las cachés se utilizan para optimizar el rendimiento de los LLM almacenando respuestas repetitivas para queries similares o repetitivas, evitando así tener que volver a calcularlas. MongoDB proporciona las siguientes cachés para las aplicaciones de LangChain.
Caché de MongoDB
MongoDBCache le permite almacenar una caché básica en una colección de MongoDB.
Uso
from langchain_mongodb import MongoDBCache from langchain_core.globals import set_llm_cache set_llm_cache( MongoDBCache( connection_string="<connection-string>", # MongoDB cluster URI database_name="langchain_db", # Database to store the cache collection_name="cache", # Collection to store the cache ) )
Caché semántica
El caché semántico es una forma más avanzada de almacenamiento en caché que recupera las indicaciones almacenadas en caché en función de la similitud semántica entre la entrada del usuario y los resultados almacenados en caché.
MongoDBAtlasSemanticCache es un caché semántico que utiliza MongoDB búsqueda vectorial para recuperar las indicaciones almacenadas en caché. Este componente requiere un Índice de Búsqueda Vectorial de MongoDB.
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(model="voyage-3-large"), # Embedding model connection_string="<connection-string>", # MongoDB cluster URI database_name="langchain_db", # Database to store the cache collection_name="semantic_cache", # Collection to store the cache ) )
Sistema de archivos virtual de DeepAgents
LangChain DeepAgents es un sistema de gestión de agentes diseñado para tareas de larga duración y múltiples pasos. Se encarga de la planificación, la gestión del contexto y la delegación de tareas a subagentes. Este sistema admite un protocolo de backend intercambiable que permite cambiar la ubicación de los archivos de un agente. El paquete langchain-mongodb-deepagents-vfs implementa dicho protocolo: Amazon S3 almacena los archivos, un proveedor de incrustaciones (AWS Bedrock u OpenAI) calcula las incrustaciones, MongoDB Atlas almacena los fragmentos y las incrustaciones, y la clase MongoFilesystemBackend dirige cada operación de archivo al controlador correcto.
Utilice este paquete cuando su agente necesite buscar un gran conjunto de archivos existentes en S3. grep se ejecuta como una única agregación de MongoDB que combina resultados de búsqueda de texto completo y búsqueda vectorial utilizando el algoritmo de fusión de rango recíproco (RRF), por lo que escalará sin cargar cada archivo en su agente para filtrarlos uno por uno. glob y ls gestionan las búsquedas de nombres de archivo y directorios directamente. Cuando un agente llama a read, write, edit, upload_files u download_files, esas llamadas van directamente a S3, donde residen sus archivos. Los archivos agregados por otras herramientas se detectan e indexan automáticamente mediante el observador del backend.
Antes de instalar el paquete, asegúrese de tener:
Una cadena de conexión de MongoDB Atlas
Credenciales de Amazon Web Services (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_DEFAULT_REGION), con una política de IAM que otorga:s3:GetObjects3:PutObject,s3:ListBucketys3:DeleteObjecten su bucket S3bedrock:InvokeModelenamazon.titan-embed-text-v2:0, en la misma región queAWS_DEFAULT_REGION, necesario si utiliza el proveedor de Bedrock por defecto
Su elección de proveedor de incrustación: Bedrock (por defecto, utiliza las credenciales de Amazon Web Services anteriores) o OpenAI (establezca
EMBEDDING_PROVIDER=openaiy proporcione unOPENAI_API_KEY)
Para instalar el paquete, determine si desea que MongoDB genere incrustaciones de búsqueda utilizando AWS Bedrock u OpenAI y ejecute el comando correspondiente:
pip install "langchain-mongodb-deepagents-vfs[bedrock]"
pip install "langchain-mongodb-deepagents-vfs[openai]"
Uso
Instancie MongoFilesystemBackend con el nombre de su bucket S3 y la cadena de conexión de Atlas. El siguiente ejemplo escribe dos archivos en S3 y luego demuestra cada método de búsqueda:
grepbusca en el contenido del archivoglobcoincide con rutas de archivo por patrónlsenumera el contenido de un directorio
from langchain_mongodb_deepagents_vfs import MongoFilesystemBackend # Instantiate the backend backend = MongoFilesystemBackend( s3_bucket_name="<bucket-name>", # S3 bucket that stores your files mongodb_connection_string="<connection-string>", # MongoDB Atlas connection string ) # Write two files to S3: one .txt, one .md, so glob can demonstrate # filtering by extension backend.write("mongodb_vfs/docs/notes.txt", "Our authentication flow uses OAuth 2.0.") backend.write("mongodb_vfs/docs/overview.md", "This directory contains onboarding docs.") # Search for files that mention "authentication flow" # Newly written files can take a few seconds to become searchable result = backend.grep("authentication flow", path="mongodb_vfs/docs/") print("grep matches:") for match in result.matches or []: print(match["path"], match["line"], match["text"]) # Find files that match a glob pattern result = backend.glob("*.txt", path="mongodb_vfs/docs/") print("glob matches:", result.matches) # List the contents of a directory result = backend.ls("mongodb_vfs/docs/") print("ls entries:", result.entries) print("init_errors:", backend.init_errors)
Por defecto, el backend restringe cada operación al prefijo mongodb_vfs/ de su bucket. Pase un valor s3_prefix diferente a MongoFilesystemBackend para cambiar esto, o s3_prefix="" para acceder a todo el bucket.
Nota
Para aprender a conectar este backend a un agente de DeepAgents, consulte la Guía de inicio rápido de DeepAgents.
Kit de herramientas de MongoDB Agent
El MongoDB Agent Toolkit es una colección de herramientas que se puede pasar a un agente LangGraph ReAct para que se pueda interactuar con los recursos de MongoDB.
Herramientas disponibles
Nombre | Descripción |
|---|---|
| Una herramienta para consultar una base de datos MongoDB. |
| Una herramienta para obtener metadatos sobre una base de datos de MongoDB. |
| Una herramienta para obtener los nombres de las colecciones de una base de datos de MongoDB. |
| Una herramienta que llama a un LLM para comprobar si un query de base de datos es correcto. |
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="<database-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(), prompt=system_message) agent.step_timeout = 60 events = agent.stream( {"messages": [("user", test_query)]}, stream_mode="values", ) messages = [] for event in events: messages.extend(event["messages"]) print(messages[-1].content)
Nota
Cargador de Documentos
Cargadores de documentos son herramientas que ayudan a cargar datos para las aplicaciones de LangChain.
MongoDBLoader es un cargador de documentos que devuelve una lista de documentos desde una base de datos de MongoDB.
Uso
from langchain_mongodb.loaders import MongoDBLoader loader = MongoDBLoader.from_connection_string( connection_string="<connection-string>", # MongoDB cluster URI db_name="langchain_db", # Database that contains the collection collection_name="documents", # Collection to load documents from filter_criteria={"category": "ai"}, # Optional document to specify a filter field_names=["title", "summary"], # Optional list of fields to include metadata_names=["category"], # Optional metadata fields to extract ) docs = loader.load()
Nota
Historial de chat
MongoDBChatMessageHistory Es un componente que permite almacenar y gestionar el historial de mensajes de chat en una base de datos MongoDB. Puede guardar tanto mensajes de usuario como mensajes generados por IA, asociados a un identificador de sesión único. Utilice este componente para aplicaciones que registran interacciones a lo largo del tiempo, como los 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>", # MongoDB cluster URI database_name="langchain_db", # Database to store the chat history collection_name="chat_history", # Collection to store the chat history ) chat_message_history.add_user_message("Hello") chat_message_history.add_ai_message("Hi")
print(chat_message_history.messages)
[HumanMessage(content='Hello', additional_kwargs={}, response_metadata={}), AIMessage(content='Hi', additional_kwargs={}, response_metadata={}, tool_calls=[], invalid_tool_calls=[])]
Almacenamiento
Se pueden utilizar los siguientes almacenes de datos personalizados para gestionar y almacenar datos en MongoDB.
Tienda de documentos
MongoDBDocStore es un almacén de clave-valor personalizado que utiliza MongoDB para almacenar y gestionar documentos. Se pueden realizar operaciones CRUD como lo haría en cualquier otra colección de MongoDB.
Uso
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)
Nota
Almacenamiento binario
MongoDBByteStore es un almacén de datos personalizado que utiliza MongoDB para almacenar y gestionar datos binarios, específicamente datos representados en bytes. Se pueden realizar operaciones CRUD con pares clave-valor donde las claves son cadenas y los valores son secuencias de bytes.
Uso
from langchain_community.storage.mongodb import MongoDBByteStore # Instantiate the MongoDBByteStore mongodb_store = MongoDBByteStore( connection_string="<connection-string>", # MongoDB cluster URI db_name="langchain_db", # Name of the database collection_name="byte_store", # 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) # Iterate over keys for key in mongodb_store.yield_keys(): print(key) # Delete keys mongodb_store.mdelete(["key1", "key2"])
[b'hello', b'world'] key1 key2
Nota
Recursos adicionales
Para aprender cómo integrar MongoDB con LangGraph, se puede consultar Integrar MongoDB con LangGraph.
Para cuadernos interactivos de Python, se puede consultar el Repositorio de Docs Notebooks y el Repositorio de Casos de Uso de IA generativa.