Utilizando o LangChain com Qdrant para Busca Avançada de Vetores
Published on
Apresentando o Qdrant: Um Motor de Busca de Similaridade de Vetores para o LangChain
No mundo do modelagem de linguagem e aplicativos baseados em texto, a capacidade de buscar e recuperar eficientemente vetores similares é crucial. Seja encontrar documentos relevantes, combinar consultas de usuário ou realizar correspondência baseada em semântica, ter um motor de busca de similaridade de vetores poderoso e conveniente pode melhorar muito as capacidades dos aplicativos. É aí que entra o Qdrant.
O Qdrant é um motor de busca de similaridade de vetores que fornece um serviço pronto para produção com uma API conveniente para armazenar, buscar e gerenciar vetores com dados adicionais. Ele foi projetado para lidar com buscas de vetores em grande escala de forma eficiente e oferece amplas capacidades de filtragem para necessidades avançadas de correspondência. O Qdrant é especialmente útil para aplicativos que requerem correspondência baseada em redes neurais ou semântica, busca com facetas e muito mais.
Resumo do Artigo
- O Qdrant é um motor de busca de similaridade de vetores que fornece um serviço pronto para produção com uma API conveniente para armazenar, buscar e gerenciar vetores com dados adicionais.
- Ele oferece amplas capacidades de filtragem e é adequado para aplicativos que têm necessidades avançadas de correspondência.
- O Qdrant pode ser usado como um recuperador no LangChain para buscas de similaridade cosseno ou buscas de Maximal Marginal Relevance (MMR).
<AdComponent />
Instalando o Cliente Qdrant e Configurando a Chave da API do OpenAI
Para usar o Qdrant no LangChain, o primeiro passo é instalar o pacote qdrant-client
, que fornece as bibliotecas do cliente necessárias para interagir com o Qdrant. Você pode instalá-lo usando o seguinte comando:
%pip install --upgrade --quiet qdrant-client
Em seguida, você precisa configurar a chave da API do OpenAI, que é necessária para realizar buscas de similaridade usando os embeddings do OpenAI. Você pode configurar a chave da API usando os módulos getpass
e os
no Python:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass("Chave da API do OpenAI:")
Carregando e Dividindo Documentos no LangChain
Depois de instalar o cliente Qdrant e configurar a chave da API do OpenAI, você pode começar a carregar e dividir seus documentos no LangChain. Para fazer isso, você pode usar a classe TextLoader
fornecida pelo módulo da comunidade LangChain para carregar seus documentos.
from langchain_community.document_loaders import TextLoader
loader = TextLoader("/caminho/para/seus/documentos.txt")
documents = loader.load()
Após carregar os documentos, você pode dividi-los em partes menores usando a classe CharacterTextSplitter
fornecida pelo módulo de divisão de texto do LangChain. Isso pode ser útil ao lidar com documentos grandes ou quando você deseja realizar buscas em partes específicas do texto.
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter(tamanho_bloco=1000, sobreposição_blocos=0)
docs = text_splitter.split_documents(documents)
Conectando-se ao Qdrant em Modos Diferentes
Depois de carregar e dividir seus documentos, você pode se conectar ao Qdrant em modos diferentes, dependendo das suas necessidades de implantação. O Qdrant suporta várias opções de implantação, incluindo modo local, implantação com servidor local e Qdrant Cloud.
Modo Local com Armazenamento em Memória
No modo local, você pode executar o Qdrant sem um servidor e manter os dados apenas na memória. Esse modo é útil para experimentação rápida e testes. Para se conectar ao Qdrant no modo local com armazenamento em memória, você pode usar o método Qdrant.from_documents
e especificar o parâmetro location
como :memory:
.
from langchain_community.vectorstores import Qdrant
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
qdrant = Qdrant.from_documents(docs, embeddings, location=":memory:", collection_name="meus_documentos")
Modo Local com Armazenamento em Disco
Se você deseja persistir os dados em disco no modo local, pode especificar um caminho onde os dados do Qdrant serão armazenados. Isso pode ser útil ao lidar com conjuntos de dados maiores ou quando você precisa preservar os dados entre sessões. Para se conectar ao Qdrant no modo local com armazenamento em disco, você pode usar o método Qdrant.from_documents
e especificar o parâmetro path
.
qdrant = Qdrant.from_documents(docs, embeddings, path="/tmp/local_qdrant", collection_name="meus_documentos")
Implantação com Servidor Local
Para implantações em maior escala, você pode se conectar a uma instância do Qdrant em execução localmente com um contêiner Docker ou uma implantação do Kubernetes. Para se conectar ao Qdrant na implantação com servidor local, você precisa especificar a URL da instância do Qdrant e definir o parâmetro prefer_grpc
como True
para obter melhor desempenho.
url = "<---url do qdrant aqui--->"
qdrant = Qdrant.from_documents(docs, embeddings, url=url, prefer_grpc=True, collection_name="meus_documentos")
Qdrant Cloud
Se você prefere um cluster Qdrant totalmente gerenciado, pode configurar uma conta no Qdrant Cloud e se conectar ao cluster usando a URL e a chave da API fornecidas. Essa opção oferece uma solução escalável e segura para implantar o Qdrant. Para se conectar ao Qdrant no Qdrant Cloud, você precisa especificar a URL e a chave da API no método Qdrant.from_documents
.
url = "<---url do cluster Qdrant Cloud aqui--->"
api_key = "<---chave da API aqui--->"
qdrant = Qdrant.from_documents(docs, embeddings, url=url, prefer_grpc=True, api_key=api_key, collection_name="meus_documentos")
Na próxima seção, iremos explorar como realizar pesquisas de similaridade na coleção do Qdrant e recuperar pontuações de similaridade para os resultados da pesquisa.
Continua...
Conexão com o Qdrant em diferentes modos
O Qdrant oferece diferentes modos de conexão, dependendo de suas necessidades. Se você deseja executar o Qdrant localmente ou implantá-lo localmente ou na nuvem, existem opções disponíveis para atender às suas necessidades.
Modo local com armazenamento em memória
No modo local, você pode executar o Qdrant sem a necessidade de um servidor Qdrant. Isso é útil para fins de teste e depuração, ou quando você precisa armazenar apenas uma pequena quantidade de vetores. Nesse modo, os embeddings são mantidos totalmente em memória e serão perdidos quando o cliente for destruído.
Para se conectar ao Qdrant no modo local com armazenamento em memória, você pode usar o seguinte código:
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
documents, embeddings, location=":memory:", collection_name="my_collection"
)
Modo local com armazenamento em disco
Se você preferir persistir os vetores em disco no modo local, pode especificar um caminho onde os vetores serão armazenados. Isso permite reutilizar os vetores entre as execuções e evitar começar do zero a cada vez.
Para se conectar ao Qdrant no modo local com armazenamento em disco, você pode usar o seguinte código:
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
documents, embeddings, path="/caminho/para/armazenamento", collection_name="my_collection"
)
Implantação do servidor local
Se você optar por implantar o Qdrant localmente, seja usando um contêiner Docker ou uma implantação Kubernetes com o gráfico Helm oficial, você precisará fornecer a URL do serviço Qdrant.
Para se conectar ao Qdrant em uma implantação de servidor local, você pode usar o seguinte código:
import qdrant_client
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
client = qdrant_client.QdrantClient("<qdrant-url>", api_key="<qdrant-api-key>")
qdrant = Qdrant(client=client, collection_name="my_collection", embeddings=embeddings)
Qdrant Cloud
Se você preferir usar o Qdrant Cloud, pode se conectar a ele fornecendo a URL apropriada e a chave de API.
Para se conectar ao Qdrant no Qdrant Cloud, você pode usar o seguinte código:
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
documents, embeddings, url="<qdrant-url>", api_key="<qdrant-api-key>", collection_name="my_collection"
)
Usando esses diferentes modos de conexão, você pode integrar facilmente o Qdrant às suas aplicações LangChain e aproveitar suas poderosas capacidades de busca de similaridade de vetores.
Realizando pesquisas de similaridade na coleção do Qdrant
Depois de se conectar a uma coleção do Qdrant, você pode realizar pesquisas de similaridade nos vetores armazenados na coleção. Isso permite encontrar vetores semelhantes a um vetor de consulta fornecido.
Para realizar uma pesquisa de similaridade, você precisa fornecer um vetor de consulta e especificar o número de vizinhos mais próximos que deseja recuperar. O Qdrant retornará os vizinhos mais próximos juntamente com suas pontuações de similaridade.
Aqui está um exemplo de como realizar uma pesquisa de similaridade usando o Qdrant:
# Vetor de consulta
query_vector = [0.1, 0.2, 0.3, 0.4, 0.5]
# Número de vizinhos mais próximos a recuperar
k = 5
# Realizar a pesquisa de similaridade
results = qdrant.search(query_vector, k)
O objeto results
conterá os vizinhos mais próximos e suas pontuações de similaridade. Você pode usar essas informações para processar e analisar ainda mais os resultados.
Utilizando as extensas capacidades de filtragem do Qdrant
O Qdrant oferece extensas capacidades de filtragem que permitem refinar os resultados da pesquisa com base em critérios específicos. Você pode filtrar os resultados da pesquisa especificando condições nos atributos de vetor ou nos atributos de carga útil associados aos vetores.
Aqui estão alguns exemplos de como usar as capacidades de filtragem do Qdrant no LangChain:
Filtrar por atributos do vetor
# Filtrar por um valor de atributo específico
results = qdrant.search(query_vector, k, filter={"vector_attributes": {"nome_do_atributo": "valor_do_atributo"}})
# Filtrar por uma faixa de valores de atributo
results = qdrant.search(query_vector, k, filter={"vector_attributes": {"nome_do_atributo": {"gte": 10, "lte": 20}}})
Filtrar por atributos de carga útil
# Filtrar por um valor de atributo de carga útil específico
results = qdrant.search(query_vector, k, filter={"payload_attributes": {"nome_do_atributo": "valor_do_atributo"}})
# Filtrar por uma faixa de valores de atributo de carga útil
results = qdrant.search(query_vector, k, filter={"payload_attributes": {"nome_do_atributo": {"gte": 10, "lte": 20}}})
Essas capacidades de filtragem permitem reduzir facilmente os resultados da pesquisa e recuperar os vetores que atendem aos seus critérios específicos.
Recuperando resultados diversos com a pesquisa de Máxima Relevância Marginal (MMR)
Além de realizar pesquisas de similaridade, o Qdrant também oferece a capacidade de recuperar resultados diversos usando o método de pesquisa de Máxima Relevância Marginal (MMR). A pesquisa de MMR tem como objetivo encontrar um conjunto de documentos que sejam relevantes e diversos, fornecendo uma representação mais abrangente do espaço de pesquisa.
title: Realizando uma pesquisa MMR language: pt
Para realizar uma pesquisa MMR, você precisa fornecer um vetor de consulta, o número de vizinhos mais próximos a serem recuperados e um parâmetro de diversidade que controla o equilíbrio entre relevância e diversidade.
Aqui está um exemplo de como realizar uma pesquisa MMR usando Qdrant:
# Vetor de consulta
query_vector = [0.1, 0.2, 0.3, 0.4, 0.5]
# Número de vizinhos mais próximos a serem recuperados
k = 5
# Parâmetro de diversidade
lambda_param = 0.5
# Realizar pesquisa MMR
results = qdrant.mmr_search(query_vector, k, lambda_param)
O objeto results
conterá o conjunto diversificado de vizinhos mais próximos e suas pontuações de similaridade. Ajustando o parâmetro de diversidade, você pode controlar o equilíbrio entre relevância e diversidade nos resultados da pesquisa.
Usando Qdrant como um Recuperador no LangChain
Qdrant pode ser usado como um recuperador no LangChain tanto para pesquisas de similaridade cosseno quanto para pesquisas MMR. Ao integrar o Qdrant às suas aplicações do LangChain, você pode aproveitar suas poderosas capacidades de pesquisa de similaridade vetorial para aprimorar o desempenho e a precisão da recuperação.
Para usar o Qdrant como um recuperador para pesquisas de similaridade cosseno, você pode usar o seguinte código:
from langchain.retrievers import RecuperadorQdrant
recuperador = RecuperadorQdrant(qdrant)
results = recuperador.recuperar_cosine(query_vector, k)
Para usar o Qdrant como um recuperador para pesquisas MMR, você pode usar o seguinte código:
from langchain.retrievers import RecuperadorQdrant
recuperador = RecuperadorQdrant(qdrant)
results = recuperador.recuperar_mmr(query_vector, k, lambda_param)
Ao utilizar o Qdrant como um recuperador no LangChain, você pode facilmente incorporar funcionalidades de pesquisa de similaridade vetorial em suas aplicações baseadas em modelos de linguagem.
Conclusão
Neste artigo, exploramos como conectar ao Qdrant em diferentes modos, realizar pesquisas de similaridade em coleções do Qdrant, utilizar as extensas capacidades de filtragem do Qdrant, recuperar resultados diversos usando a pesquisa MMR e usar o Qdrant como um recuperador no LangChain. Ao integrar o Qdrant às suas aplicações do LangChain, você pode aproveitar o poderoso mecanismo de pesquisa de similaridade vetorial dele para aprimorar o desempenho e a precisão da recuperação.