Você pode integrar o MongoDB ao LangChain para realizar a pesquisa híbrida. Neste tutorial, você conclui as seguintes etapas:
Configure o ambiente.
Use o MongoDB como um armazenamento de vetores.
Crie um índice do MongoDB Vector Search e do MongoDB Search em seus dados.
Execute queries de pesquisa híbridas.
Passe os resultados da query para o seu pipelineRAG .
Trabalhe com uma versão executável deste tutorial como um bloco de anotações Python.
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 6.0.11 do MongoDB, 7.0.2, ou posterior. Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas.
Um sistema local do Atlas criado utilizando o Atlas CLI. Para saber mais, consulte Criar uma implantação de Atlas local.
Um cluster MongoDB Community ou Enterprise com Search e Vector Search instalados.
Uma chave de API da Voyage AI. Para criar uma conta e uma chave de API, consulte o site da Voyage AI.
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.
Observação
Verifique os requisitos do pacote langchain-voyageai para garantir que você esteja usando uma versão compatível do Python.
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 variáveis de ambiente.
Execute o seguinte código para definir as variáveis de ambiente para este tutorial. Forneça suas chaves de API e a string de conexão do MongoDB cluster.
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
Para saber mais, consulte Conectar a um cluster via drivers.
Sua string de conexão deve usar o seguinte formato:
mongodb://localhost:<port-number>/?directConnection=true
Para saber mais, consulte Connection strings.
Use o MongoDB como um armazenamento de vetores
Você deve usar o MongoDB como um armazenamento de vetor para seus dados. Você pode instanciar um armazenamento de vetor usando uma coleção existente no MongoDB.
Carregue os dados de amostra.
Caso ainda não tenha feito isso, complete as etapas para carregar dados de amostra em seu cluster.
Observação
Se você deseja usar seus próprios dados, veja Introdução ao LangChain ou Como criar incorporações vetoriais para aprender como ingerir incorporações vetoriais no Atlas.
Instancie o armazenamento de vetores.
Cole e execute o código a seguir em seu bloco de anotações para criar uma instância de armazenamento de vetor chamada vector_store a partir do namespace sample_mflix.embedded_movies no Atlas. Este código utiliza o método from_connection_string para criar o armazenamento de vetores do MongoDBAtlasVectorSearch e especifica os seguintes parâmetros:
A string de conexão do cluster MongoDB .
O modelo de incorporação
voyage-3-largeda Voyage AI para converter texto em incorporações vetoriais.sample_mflix.embedded moviescomo o namespace a ser usado.plotcomo o campo que contém o texto.plot_embedding_voyage_3_largecomo o campo que contém as incorporações.dotProductcomo a função de pontuação de relevância.
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" )
Criar os índices
Para habilitar queries de pesquisa híbrida em seu armazenamento de vetores, crie um índice do MongoDB Vector Search e do MongoDB Search na coleção. Você pode criar os índices usando os métodos assistente do LangChain ou o método do driver PyMongo:
Crie o índice do MongoDB Vector Search .
Execute o seguinte código para criar um índice de pesquisa vetorial que indexa o plot_embedding_voyage_3_large campo na coleção.
# 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 )
Crie o índice de pesquisa do MongoDB .
Execute o seguinte código em seu bloco de anotações para criar um índice de pesquisa que indexe o plot campo na coleção.
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" )
Crie o índice do MongoDB Vector Search .
Execute o seguinte código para criar um índice de pesquisa vetorial que indexa o plot_embedding_voyage_3_large campo na coleção.
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)
Crie o índice de pesquisa do MongoDB .
Execute o seguinte código para criar um índice de pesquisa que indexa o plot campo na coleção.
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)
Os índices devem levar cerca de um minuto para serem criados. Enquanto são criados, os índices estão em um estado de sincronização inicial. Quando terminarem de criar, você poderá começar a consultar os dados em sua coleção.
Executar uma query de pesquisa híbrida
Depois que o MongoDB criar seus índices, você poderá executar queries de pesquisa híbrida em seus dados. O código a seguir usa o MongoDBAtlasHybridSearchRetriever recuperador para executar uma pesquisa híbrida para a string "time travel". Ela também especifica os seguintes parâmetros:
vectorstore: o nome da instância do armazenamento de vetores.search_index_name: o nome do índice do MongoDB Search.top_k: o número de documentos a retornar.fulltext_penalty: A multa para a pesquisa de texto completo.Quanto menor a pena, maior a pontuação da pesquisa de texto completo.
vector_penalty: A multa para a pesquisa vetorial.Quanto menor a pena, maior a pontuação de pesquisa vetorial.
O recuperador retorna uma lista de documentos classificados pela soma da pontuação da pesquisa de texto completo e da pontuação da pesquisa vetorial. A saída final do exemplo de código inclui o título, o gráfico e as diferentes pontuações para cada documento.
Para saber mais sobre os resultados da query de pesquisa híbrida, consulte Sobre a query.
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
Passe resultados para um pipeline RAG
Você pode passar seus resultados de pesquisa híbrida para seu pipeline RAG para gerar respostas nos documentos recuperados. O código de amostra faz o seguinte:
Define um modelo de prompt do LangChain para instruir o LLM a usar os documentos 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 recuperador de pesquisa híbrida que você definiu para recuperar documentos 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: 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.