Execute pesquisa híbrida com integração langChain
Nesta página
Você pode integrar o Atlas Vector Search com o LangChain para executar apesquisa híbrida. Neste tutorial, você conclui as seguintes etapas:
Configure o ambiente.
Utilize o Atlas como um armazenamento de vetor.
Crie um índice do Atlas Vector Search e do Atlas Search em seus dados.
Execute queries de pesquisa híbridas.
Passe os resultados da query para o seu pipelineRAG .
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte:
Um cluster do Atlas executando o MongoDB versão 6.0.11, 7.0.2, ou posterior.
Uma chave de API OpenAI. Você deve ter uma conta OpenAI paga com créditos disponíveis para solicitações de API.
Um ambiente para executar notebooks Python interativos, como o Colab.
Observação
Se estiver usando o Colab, certifique-se de que o endereço IP da sessão do notebook esteja incluído na lista de acesso do projeto Atlas.
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:
Definir variáveis ambientais.
Execute o seguinte código para definir as variáveis ambientais para este tutorial. Forneça sua chave de API OpenAI e a string de conexão SRVdo Atlas cluster quando solicitado.
import getpass, os os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:") ATLAS_CONNECTION_STRING = getpass.getpass("MongoDB Atlas SRV Connection String:")
Observação
Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Use o Atlas como um Vector Store
Você deve utilizar o Atlas como um armazenamento de vetor para seus dados. Você pode instanciar um armazenamento de vetor usando uma coleção existente no Atlas.
Carregue os dados de amostra.
Caso ainda não tenha feito isso, complete as etapas para carregar dados de amostra em seu Atlas cluster.
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 Atlas cluster.
Um modelo de incorporação OpenAI como o modelo usado para converter texto em incorporações vetoriais. Por padrão, este modelo é
text-embedding-ada-002
.sample_mflix.embedded movies
como o namespace a ser usado.plot
como o campo que contém o texto.plot_embedding
como o campo que contém as incorporações.dotProduct
como a função de pontuação de relevância.
from langchain_mongodb import MongoDBAtlasVectorSearch from langchain_openai import OpenAIEmbeddings # Create the vector store vector_store = MongoDBAtlasVectorSearch.from_connection_string( connection_string = ATLAS_CONNECTION_STRING, embedding = OpenAIEmbeddings(disallowed_special=()), namespace = "sample_mflix.embedded_movies", text_key = "plot", embedding_key = "plot_embedding", relevance_score_fn = "dotProduct" )
Criar os índices
Observação
Para criar índices do Atlas Vector Search ou do Atlas Search , é necessário ter Project Data Access Admin
acesso ou superior ao projeto Atlas .
Para habilitar queries de pesquisa híbrida em seu armazenamento de vetores, crie um índice do Atlas Vector Search e do Atlas Search na coleção. Você pode criar os índices usando os métodos assistente do LangChain ou o método do driver PyMongo:
Criar o índice do Atlas Vector Search.
Execute o seguinte código para criar um índice de índice de pesquisa vetorial que indexa o plot_embedding
campo na coleção.
# Use helper method to create the vector search index vector_store.create_vector_search_index( dimensions = 1536 )
Crie o índice Atlas Search .
Execute o seguinte código em seu bloco de anotações para criar um índice de índice de plot
pesquisa o campo na coleção.
from langchain_mongodb.index import create_fulltext_search_index from pymongo import MongoClient # Connect to your cluster client = MongoClient(ATLAS_CONNECTION_STRING) # Use helper method to create the search index create_fulltext_search_index( collection = client["sample_mflix"]["embedded_movies"], field = "plot", index_name = "search_index" )
Criar o índice do Atlas Vector Search.
Execute o seguinte código para criar um índice de índice de pesquisa vetorial que indexa o plot_embedding
campo na coleção.
from pymongo import MongoClient from pymongo.operations import SearchIndexModel # Connect to your cluster client = MongoClient(ATLAS_CONNECTION_STRING) 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", "numDimensions": 1536, "similarity": "dotProduct" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=vector_index_model)
Crie o índice Atlas Search .
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)
O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.
Executar uma query de pesquisa híbrida
Depois que o Atlas criar seus índices, você poderá executar consultas de pesquisa híbrida em seus dados. O código a seguir usa o MongoDBAtlasHybridSearchRetriever
recuperador para realizar 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 Atlas 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 ) # 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.01818181818181818 Total score: 0.03741258741258741 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: Thrill Seekers Plot: A reporter, learning of time travelers visiting 20th century disasters, tries to change the history they know by averting upcoming disasters. Search score: 0 Vector Search score: 0.0196078431372549 Total score: 0.0196078431372549 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.019230769230769232 Total score: 0.019230769230769232 Title: My iz budushchego Plot: My iz budushchego, or We Are from the Future, is a movie about time travel. Four 21st century treasure seekers are transported back into the middle of a WWII battle in Russia. The movie's ... Search score: 0.018867924528301886 Vector Search score: 0 Total score: 0.018867924528301886
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
{context}
variável de entrada e sua query para a{query}
variável.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
gpt-3.5-turbo
modelo.
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)
Based on the pieces of context provided, here are some movies about time travel that you may find interesting: 1. "Timecop" (1994) - A movie about a cop who is part of a law enforcement agency that regulates time travel, seeking justice and dealing with personal loss. 2. "The Time Traveler's Wife" (2009) - A romantic drama about a man with the ability to time travel involuntarily and the impact it has on his relationship with his wife. 3. "Thrill Seekers" (1999) - A movie about two reporters trying to prevent disasters by tracking down a time traveler witnessing major catastrophes. 4. "About Time" (2013) - A film about a man who discovers he can travel through time and uses this ability to improve his life and relationships. 5. "My iz budushchego" (2008) - A Russian movie where four treasure seekers from the 21st century are transported back to a WWII battle, exploring themes of action, drama, fantasy, and romance. These movies offer a variety of perspectives on time travel and its impact on individuals and society.