Menu Docs
Página inicial do Docs
/ /

Execute pesquisa híbrida com MongoDB e LangChain

Você pode integrar o MongoDB ao LangChain para realizar a pesquisa híbrida. Neste tutorial, você conclui as seguintes etapas:

  1. Configure o ambiente.

  2. Use o MongoDB como um armazenamento de vetores.

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

  4. Execute queries de pesquisa híbridas.

  5. 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.

Para concluir este tutorial, você deve ter o seguinte:

  • Um dos seguintes tipos de cluster MongoDB :

  • 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.

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 --quiet --upgrade langchain langchain-community langchain-core langchain-mongodb langchain-voyageai langchain-openai pymongo pypdf
2

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.

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.

1

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.

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 cluster MongoDB .

  • O modelo de incorporação voyage-3-large da Voyage AI para converter texto em incorporações vetoriais.

  • sample_mflix.embedded movies como o namespace a ser usado.

  • plot como o campo que contém o texto.

  • plot_embedding_voyage_3_large 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_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"
)

Dica

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:

1

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

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

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

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.

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

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.

Voltar

Memória e Cache Semântico

Nesta página