Puede integrar MongoDB con LangChain para crear IA generativa y Aplicaciones RAG. Esta página ofrece una descripción general de la integración de LangChain con MongoDB y Python, así como de los diferentes componentes que puede usar en sus aplicaciones.
Nota
Para obtener una lista completa de componentes y métodos, consulte Referencia API.
Para la integración de JavaScript, consulte Cadena LangChain JS/TS.
Instalación y configuración
Para utilizar MongoDB Vector Search con LangChain, primero debe instalar el langchain-mongodb paquete:
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 incrustación:
Incorporación manual: genere vectores de incorporación en el lado del cliente con un modelo de incorporación que usted especifique.
Incrustaciones automatizadas: MongoDB incrusta texto en el servidor sin necesidad de generarlo manualmente. Para obtener más información, consulte Incrustaciones automatizadas.
Importante
La incrustación automatizada está disponible como función de vista previa solo para MongoDB Community Edition v8.2 y versiones posteriores. Esta función y la documentación correspondiente pueden cambiar en cualquier momento durante el periodo de vista previa. Para obtener más información, consulte Funciones de vista previa.
Parameter | Necesidad | Descripción |
|---|---|---|
| Requerido | Especifique la cadena de conexión para su clúster de MongoDB. Para obtener más información, consulte Conectarse a un clúster mediante bibliotecas de cliente 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 usar 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 vectorial, se puede usar la instancia del almacén vectorial como un recuperador para hacer queries de los datos usando MongoDB 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)
Recuperador de texto completo
MongoDBAtlasFullTextSearchRetriever es un recuperador que realiza búsquedas de texto completo mediante MongoDB Search. Específicamente, utiliza el algoritmo estándar BM25 de Lucene .
Este recuperador requiere un índice de MongoDB Search.
Uso
from langchain_mongodb.retrievers.full_text_search import MongoDBAtlasFullTextSearchRetriever # 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)
Recuperador de búsqueda híbrida
MongoDBAtlasHybridSearchRetriever es un recuperador que combina los resultados de la búsqueda vectorial y de texto completo mediante el algoritmo de Fusión de Rangos Recíprocos (RRF). Para aprender más, se puede consultar Cómo realizar una búsqueda híbrida.
Este recuperador requiere un almacén de vectores existente, un índice de MongoDB Vector Search y un índice de MongoDB 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 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
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>, # MongoDB cluster 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)
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 MongoDB 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"))
GraphRAG
GraphRAG es un enfoque alternativo al RAG tradicional que estructura los datos como un grafo de conocimiento de entidades y sus relaciones en lugar de como incrustaciones vectoriales. Mientras que el RAG basado en vectores encuentra documentos que son semánticamente similares al query, GraphRAG encuentra entidades conectadas al query y recorre las relaciones en el grafo para recuperar 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 import MongoDBGraphStore from langchain_openai import ChatOpenAI # 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 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)
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 = "<database-name>", # Database to store the cache collection_name = "<collection-name>" # 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 una caché semántica que utiliza la MongoDB Vector Search para recuperar las indicaciones almacenadas en caché. Este componente requiere un índice de MongoDB 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>", # MongoDB cluster URI database_name = "<database-name>", # Database to store the cache collection_name = "<collection-name>" # Collection to store the cache ))
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=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 = []
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 = "<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()
Historial de chat
MongoDBChatMessageHistory es un componente que le permite almacenar y gestionar historiales de mensajes de chat en una base de datos de MongoDB. Puede guardar tanto los mensajes generados por el usuario como los generados por la IA asociados a un identificador de sesión único. Esto es útil para aplicaciones que requieren el seguimiento de 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 = "<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')]
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 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)
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.storage import MongoDBByteStore # Instantiate the MongoDBByteStore mongodb_store = MongoDBByteStore( connection_string = "<connection-string>", # MongoDB cluster 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"])
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.