Puede integrar MongoDB con LangChain para realizar Búsqueda híbrida. En este tutorial, completarás los siguientes pasos:
Configura el entorno.
Utiliza MongoDB como almacén vectorial.
Cree una búsqueda vectorial MongoDB y un índice de búsqueda MongoDB en sus datos.
Ejecutar consultas de búsqueda híbridas.
Pase los resultados de la consulta a su Tubería RAG.
Trabaje con una versión ejecutable de este tutorial como Cuaderno de Python.
Requisitos previos
Para completar este tutorial, debes tener lo siguiente:
Uno de los siguientes tipos de clúster de MongoDB:
Un clúster de Atlas que ejecuta la versión 6.0.11, 7.0.2 o posterior de MongoDB. Asegúrese de que su dirección IP esté incluida en la lista de acceso de su proyecto Atlas.
Una implementación local de Atlas creada usando Atlas CLI. Para obtener más información, consulta Crear una Implementación local de Atlas.
Un clúster de MongoDB Community o Enterprise con Search y Vector Search instalados.
Una clave API de Voyage AI. Para crear una clave API, consulta Claves API de modelos.
Una llave de API de OpenAI. Debes tener una cuenta de OpenAI con créditos disponibles para las solicitudes de API. Para obtener más información sobre cómo registrar una cuenta de OpenAI, consulta el sitio web de la API de OpenAI.
Un entorno para ejecutar cuadernos interactivos de Python como Colab.
Nota
Consulte los requisitos del paquete langchain-voyageai para asegurarse de que está utilizando una versión de Python compatible.
Configurar el entorno
Configura el entorno para este tutorial. Crea un cuaderno interactivo de Python guardando un archivo con el .ipynb Extensión. Este cuaderno te permite ejecutar fragmentos de código Python individualmente y lo usarás para ejecutar el código en este tutorial.
Para configurar el entorno de su portátil:
Establecer variables de entorno.
Ejecute el siguiente código para configurar las variables de entorno de este tutorial. Proporcione sus claves API y la cadena de conexión del clúster de MongoDB.
import os os.environ["VOYAGE_API_KEY"] = "<voyage-api-key>" os.environ["OPENAI_API_KEY"] = "<openai-api-key>" MONGODB_URI = "<connection-string>"
Nota
Se debe sustituir <connection-string> por la cadena de conexión del clúster Atlas o de la implementación local de Atlas.
Su cadena de conexión debe usar el siguiente formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Para obtener más información,consulte Conectarse a un clúster a través de bibliotecas de cliente.
Su cadena de conexión debe usar el siguiente formato:
mongodb://localhost:<port-number>/?directConnection=true
Para obtener más información, consulta Cadenas de conexión.
Utilice MongoDB como almacén de vectores
Debe usar MongoDB como almacén vectorial para sus datos. Puede instanciar un almacén vectorial usando una colección existente en MongoDB.
Cargue los datos de muestra.
Si aún no lo ha hecho, complete los pasos para cargar datos de muestra en su clúster.
Nota
Si desea utilizar sus propios datos, consulte Introducción a LangChain o Cómo crear incrustaciones vectoriales para aprender a ingerir incrustaciones vectoriales en Atlas.
Instanciar el almacén de vectores.
Pegue y ejecute el siguiente código en su notebook para crear una instancia de almacén de vectores llamada vector_store desde el espacio de nombres sample_mflix.embedded_movies en Atlas. Este código utiliza el método from_connection_string para crear el almacén de vectores MongoDBAtlasVectorSearch y especifica los siguientes parámetros:
La cadena de conexión de su clúster MongoDB.
El modelo de incrustación
voyage-3-largede Voyage AI para convertir texto en incrustaciones vectoriales.sample_mflix.embedded moviescomo el espacio de nombres a utilizar.plotcomo el campo que contiene el texto.plot_embedding_voyage_3_largecomo el campo que contiene las incrustaciones.dotProductcomo la función de puntuación de relevancia.
from langchain_mongodb import MongoDBAtlasVectorSearch from langchain_voyageai import VoyageAIEmbeddings # Create the vector store vector_store = MongoDBAtlasVectorSearch.from_connection_string( connection_string = MONGODB_URI, embedding = VoyageAIEmbeddings(model = "voyage-3-large", output_dimension = 2048), namespace = "sample_mflix.embedded_movies", text_key = "plot", embedding_key = "plot_embedding_voyage_3_large", relevance_score_fn = "dotProduct" )
Crear los índices
Para habilitar consultas de búsqueda híbridas en su almacén de vectores, cree un índice de MongoDB Vector Search y uno de MongoDB Search en la colección. Puede crear los índices utilizando los métodos auxiliares de LangChain o el método del controlador de PyMongo:
Crea el índice de búsqueda vectorial de MongoDB.
Ejecute el siguiente código para crear un índice de búsqueda vectorial que indexe el plot_embedding_voyage_3_large campo en la colección.
# Use helper method to create the vector search index vector_store.create_vector_search_index( dimensions = 2048 # The dimensions of the vector embeddings to be indexed )
Crea el índice de MongoDB Search.
Ejecute el siguiente código en su cuaderno para crear un índice de búsqueda que indexe el plot campo en la colección.
from langchain_mongodb.index import create_fulltext_search_index from pymongo import MongoClient # Connect to your cluster client = MongoClient(MONGODB_URI) # Use helper method to create the search index create_fulltext_search_index( collection = client["sample_mflix"]["embedded_movies"], field = "plot", index_name = "search_index" )
Crea el índice de búsqueda vectorial de MongoDB.
Ejecute el siguiente código para crear un índice de búsqueda vectorial que indexe el plot_embedding_voyage_3_large campo en la colección.
from pymongo import MongoClient from pymongo.operations import SearchIndexModel # Connect to your cluster client = MongoClient(MONGODB_URI) collection = client["sample_mflix"]["embedded_movies"] # Create your vector search index model, then create the index vector_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "plot_embedding_voyage_3_large", "numDimensions": 2048, "similarity": "dotProduct" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=vector_index_model)
Crea el índice de MongoDB Search.
Ejecute el siguiente código para crear un índice de búsqueda que indexe el plot campo en la colección.
1 # Create your search index model, then create the search index 2 search_index_model = SearchIndexModel( 3 definition={ 4 "mappings": { 5 "dynamic": False, 6 "fields": { 7 "plot": { 8 "type": "string" 9 } 10 } 11 } 12 }, 13 name="search_index" 14 ) 15 collection.create_search_index(model=search_index_model)
Los índices deberían tardar aproximadamente un minuto en generarse. Mientras se generan, se encuentran en un estado de sincronización inicial. Una vez que terminan de generarse, puede empezar a consultar los datos de su colección.
Ejecutar una consulta de búsqueda híbrida
Una vez que MongoDB construya sus índices, podrá ejecutar consultas de búsqueda híbridas en sus datos. El siguiente código utiliza el MongoDBAtlasHybridSearchRetriever recuperador para realizar una búsqueda híbrida de la "time travel" cadena. También especifica los siguientes parámetros:
vectorstore:El nombre de la instancia del almacén de vectores.search_index_name:El nombre del índice de búsqueda de MongoDB.top_k:El número de documentos a devolver.fulltext_penalty:La penalización por búsqueda de texto completo.Cuanto menor sea la penalización, mayor será la puntuación de búsqueda de texto completo.
vector_penalty:La penalización por búsqueda vectorial.Cuanto menor sea la penalización, mayor será la puntuación de búsqueda vectorial.
El recuperador devuelve una lista de documentos ordenados según la suma de la puntuación de búsqueda de texto completo y la puntuación de búsqueda vectorial. El resultado final del ejemplo de código incluye el título, la trama y las diferentes puntuaciones de cada documento.
Para obtener más información sobre los resultados de consultas de búsqueda híbridas, consulte Acerca de la consulta.
from langchain_mongodb.retrievers.hybrid_search import MongoDBAtlasHybridSearchRetriever # Initialize the retriever retriever = MongoDBAtlasHybridSearchRetriever( vectorstore = vector_store, search_index_name = "search_index", top_k = 5, fulltext_penalty = 50, vector_penalty = 50, post_filter=[ { "$project": { "plot_embedding": 0, "plot_embedding_voyage_3_large": 0 } } ]) # Define your query query = "time travel" # Print results documents = retriever.invoke(query) for doc in documents: print("Title: " + doc.metadata["title"]) print("Plot: " + doc.page_content) print("Search score: {}".format(doc.metadata["fulltext_score"])) print("Vector Search score: {}".format(doc.metadata["vector_score"])) print("Total score: {}\n".format(doc.metadata["fulltext_score"] + doc.metadata["vector_score"]))
Title: Timecop Plot: An officer for a security agency that regulates time travel, must fend for his life against a shady politician who has a tie to his past. Search score: 0.019230769230769232 Vector Search score: 0.018518518518518517 Total score: 0.03774928774928775 Title: A.P.E.X. Plot: A time-travel experiment in which a robot probe is sent from the year 2073 to the year 1973 goes terribly wrong thrusting one of the project scientists, a man named Nicholas Sinclair into a... Search score: 0.018518518518518517 Vector Search score: 0.018867924528301886 Total score: 0.0373864430468204 Title: About Time Plot: At the age of 21, Tim discovers he can travel in time and change what happens and has happened in his own life. His decision to make his world a better place by getting a girlfriend turns out not to be as easy as you might think. Search score: 0 Vector Search score: 0.0196078431372549 Total score: 0.0196078431372549 Title: The Time Traveler's Wife Plot: A romantic drama about a Chicago librarian with a gene that causes him to involuntarily time travel, and the complications it creates for his marriage. Search score: 0.0196078431372549 Vector Search score: 0 Total score: 0.0196078431372549 Title: Retroactive Plot: A psychiatrist makes multiple trips through time to save a woman that was murdered by her brutal husband. Search score: 0 Vector Search score: 0.019230769230769232 Total score: 0.019230769230769232
Pasar resultados a una canalización RAG
Puedes pasar los resultados de tu búsqueda híbrida a tu pipeline RAG para generar respuestas sobre los documentos recuperados. El código de muestra hace lo siguiente:
Define una plantilla de solicitud de LangChain para indicar al LLM que utilice los documentos recuperados como contexto para su consulta. LangChain pasa estos documentos a la
{context}variable de entrada y su consulta a la{query}variable.Construye una cadena que especifica lo siguiente:
El recuperador de búsqueda híbrido que usted definió para recuperar documentos relevantes.
La plantilla de aviso que usted definió.
Un LLM de OpenAI para generar una respuesta contextual. Por defecto, este es el modelo
gpt-3.5-turbo.
Solicita a la cadena una consulta de ejemplo y devuelve la respuesta. La respuesta generada puede 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: Can you recommend some movies about {query}? """ prompt = PromptTemplate.from_template(template) model = ChatOpenAI() # Construct a chain to answer questions on your data chain = ( {"context": retriever, "query": RunnablePassthrough()} | prompt | model | StrOutputParser() ) # Prompt the chain query = "time travel" answer = chain.invoke(query) print(answer)
Certainly! Here are some movies about time travel from the context provided: 1. **Timecop (1994)** Genre: Action, Crime, Sci-Fi Plot: A law enforcement officer working for the Time Enforcement Commission battles a shady politician with a personal tie to his past. IMDb Rating: 5.8 2. **A.P.E.X. (1994)** Genre: Action, Sci-Fi Plot: A time-travel experiment gone wrong thrusts a scientist into an alternate timeline plagued by killer robots. IMDb Rating: 4.3 3. **About Time (2013)** Genre: Drama, Fantasy, Romance Plot: A young man discovers he can time travel and uses this ability to improve his life, especially his love life, but learns the limitations and challenges of his gift. IMDb Rating: 7.8 4. **The Time Traveler's Wife (2009)** Genre: Drama, Fantasy, Romance Plot: A Chicago librarian with a gene causing him to involuntarily time travel struggles with its impact on his romantic relationship and marriage. IMDb Rating: 7.1 5. **Retroactive (1997)** Genre: Action, Crime, Drama Plot: A woman accidentally time-travels to prevent a violent event, but her attempts to fix the situation lead to worsening consequences due to repeated time cycles. IMDb Rating: 6.3 Each movie covers time travel with unique perspectives, from action-packed adventures to romantic dramas.