Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / /

Execute pesquisa híbrida com integração langChain

Nesta página

  • Pré-requisitos
  • Configurar o ambiente
  • Use o Atlas como um Vector Store
  • Criar os índices
  • Executar uma query de pesquisa híbrida
  • Passe resultados para um pipeline RAG

Você pode integrar o Atlas Vector Search com o LangChain para executar apesquisa híbrida. Neste tutorial, você conclui as seguintes etapas:

  1. Configure o ambiente.

  2. Utilize o Atlas como um armazenamento de vetor.

  3. Crie um índice do Atlas Vector Search e do Atlas Search em seus dados.

  4. Execute queries de pesquisa híbridas.

  5. Passe os resultados da query para o seu pipelineRAG .

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.

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:

1

Execute o seguinte comando no seu notebook:

pip install --upgrade --quiet langchain langchain-community langchain-core langchain-mongodb langchain-openai pymongo pypdf
2

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

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.

1

Caso ainda não tenha feito isso, complete as etapas para carregar dados de amostra em seu Atlas cluster.

2

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"
)

Dica

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:

1

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
)
2

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"
)
1

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)
2

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
2search_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)
15collection.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.

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

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.

Voltar

Começar