Want to Become a Sponsor? Contact Us Now!🎉

langchain-tutorials
Utilizando LangChain con Qdrant para Búsqueda Avanzada de Vectores

Utilizando LangChain con Qdrant para Búsqueda Avanzada de Vectores

Published on

Presentando Qdrant: Un Motor de Búsqueda de Similitud de Vectores para LangChain

En el mundo de la modelización del lenguaje y las aplicaciones basadas en texto, la capacidad de buscar y recuperar vectores similares de manera eficiente es crucial. Ya sea para encontrar documentos relevantes, coincidir con las consultas de los usuarios o realizar coincidencias basadas en la semántica, contar con un motor de búsqueda de similitud de vectores potente y conveniente puede mejorar en gran medida las capacidades de las aplicaciones. Ahí es donde entra Qdrant.

Qdrant es un motor de búsqueda de similitud de vectores que proporciona un servicio listo para producción con una API conveniente para almacenar, buscar y gestionar vectores con carga adicional. Está diseñado para manejar búsquedas de vectores a gran escala de manera eficiente y ofrece amplias capacidades de filtrado para necesidades de coincidencia avanzada. Qdrant es especialmente útil para aplicaciones que requieren coincidencia basada en redes neuronales o semántica, búsqueda facetada y más.

Resumen del Artículo

  • Qdrant es un motor de búsqueda de similitud de vectores que proporciona un servicio listo para producción con una API conveniente para almacenar, buscar y gestionar vectores con carga adicional.
  • Ofrece amplias capacidades de filtrado y es adecuado para aplicaciones que requieren necesidades de coincidencia avanzada.
  • Qdrant se puede utilizar como un recuperador en LangChain para búsquedas de similitud de coseno o búsquedas de Maximal Marginal Relevance (MMR).
<AdComponent />

Instalando el Cliente de Qdrant y Configurando la Clave de la API de OpenAI

Para utilizar Qdrant en LangChain, el primer paso es instalar el paquete qdrant-client, que proporciona las bibliotecas de cliente necesarias para interactuar con Qdrant. Puedes instalarlo utilizando el siguiente comando:

%pip install --upgrade --quiet qdrant-client

A continuación, debes configurar la Clave de la API de OpenAI, que es necesaria para realizar búsquedas de similitud utilizando las incrustaciones de OpenAI. Puedes configurar la Clave de la API utilizando los módulos getpass y os en Python:

import getpass
import os
 
os.environ["OPENAI_API_KEY"] = getpass.getpass("Clave de la API de OpenAI:")

Carga y División de Documentos en LangChain

Una vez instalado el cliente de Qdrant y configurada la Clave de la API de OpenAI, puedes comenzar a cargar y dividir tus documentos en LangChain. Para hacer esto, puedes utilizar la clase TextLoader proporcionada por el módulo comunitario de LangChain para cargar tus documentos.

from langchain_community.document_loaders import TextLoader
 
loader = TextLoader("/ruta/a/tus/documentos.txt")
documents = loader.load()

Después de cargar los documentos, puedes dividirlos en partes más pequeñas utilizando la clase CharacterTextSplitter proporcionada por el módulo de divisores de texto de LangChain. Esto puede ser útil cuando se trata de documentos grandes o cuando deseas realizar búsquedas en partes específicas del texto.

from langchain_text_splitters import CharacterTextSplitter
 
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

Conexión a Qdrant en Diferentes Modos

Una vez que tus documentos están cargados y divididos, puedes conectarte a Qdrant en diferentes modos según tus necesidades de implementación. Qdrant admite múltiples opciones de implementación, incluido el modo local, la implementación en un servidor local o Qdrant Cloud.

Modo Local con Almacenamiento en Memoria

En el modo local, puedes ejecutar Qdrant sin un servidor y mantener los datos solo en memoria. Este modo es útil para experimentación y pruebas rápidas. Para conectarte a Qdrant en modo local con almacenamiento en memoria, puedes utilizar el método Qdrant.from_documents y especificar el 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="mis_documentos")

Modo Local con Almacenamiento en Disco

Si deseas persistir los datos en disco en el modo local, puedes especificar una ruta donde se almacenarán los datos de Qdrant. Esto puede ser útil cuando se trata de conjuntos de datos más grandes o cuando necesitas preservar los datos entre sesiones. Para conectarte a Qdrant en modo local con almacenamiento en disco, puedes utilizar el método Qdrant.from_documents y especificar el parámetro path.

qdrant = Qdrant.from_documents(docs, embeddings, path="/tmp/local_qdrant", collection_name="mis_documentos")

Implementación en un Servidor Local

Para implementaciones a mayor escala, puedes conectarte a una instancia de Qdrant que se ejecuta localmente con un contenedor Docker o una implementación de Kubernetes. Para conectarte a Qdrant en una implementación de servidor local, debes especificar la URL de la instancia de Qdrant y configurar el parámetro prefer_grpc en True para obtener un mejor rendimiento.

url = "<---url de qdrant aquí --->"
qdrant = Qdrant.from_documents(docs, embeddings, url=url, prefer_grpc=True, collection_name="mis_documentos")

Qdrant Cloud

Si prefieres un clúster de Qdrant completamente administrado, puedes configurar una cuenta de Qdrant Cloud y conectarte al clúster utilizando la URL y la clave de API proporcionadas. Esta opción ofrece una solución escalable y segura para implementar Qdrant. Para conectarte a Qdrant en Qdrant Cloud, debes especificar la URL y la clave de API en el método Qdrant.from_documents.

url = "<---url del clúster de qdrant cloud aquí --->"
api_key = "<---clave de api aquí--->"
qdrant = Qdrant.from_documents(docs, embeddings, url=url, prefer_grpc=True, api_key=api_key, collection_name="mis_documentos")

En la siguiente sección, exploraremos cómo realizar búsquedas de similitud en la colección de Qdrant y obtener los puntajes de similitud de los resultados de búsqueda.

Continuará...

langchain Qdrant

Conexión a Qdrant en diferentes modos

Qdrant ofrece diferentes modos de conexión según sus necesidades. Ya sea que desee ejecutar Qdrant localmente o implementarlo en las instalaciones o en la nube, existen opciones disponibles para satisfacer sus necesidades.

Modo local con almacenamiento en memoria

En el modo local, puede ejecutar Qdrant sin necesidad de un servidor Qdrant. Esto es útil para fines de prueba y depuración o cuando solo necesita almacenar una pequeña cantidad de vectores. En este modo, los embeddings se mantienen totalmente en memoria y se perderán cuando el cliente sea destruido.

Para conectarse a Qdrant en modo local con almacenamiento en memoria, puede usar el siguiente 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 con almacenamiento en disco

Si prefiere persistir los vectores en disco en modo local, puede especificar una ruta donde se almacenarán los vectores. Esto le permite reutilizar los vectores entre ejecuciones y evitar partir de cero cada vez.

Para conectarse a Qdrant en modo local con almacenamiento en disco, puede usar el siguiente 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="/ruta/a/almacenamiento", collection_name="my_collection"
)

Implementación del servidor local

Si elige implementar Qdrant en las instalaciones, ya sea utilizando un contenedor Docker o una implementación Kubernetes con el gráfico Helm oficial, deberá proporcionar la URL del servicio Qdrant.

Para conectarse a Qdrant en una implementación del servidor local, puede usar el siguiente 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

Si prefiere utilizar Qdrant Cloud, puede conectarse proporcionando la URL y la clave de API correspondiente.

Para conectarse a Qdrant en Qdrant Cloud, puede usar el siguiente 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"
)

Al utilizar estos diferentes modos de conexión, puede integrar fácilmente Qdrant en sus aplicaciones de LangChain y aprovechar sus poderosas capacidades de búsqueda de similitud de vectores.

Realización de búsquedas de similitud en la colección de Qdrant

Una vez que se haya conectado a una colección de Qdrant, puede realizar búsquedas de similitud en los vectores almacenados en la colección. Esto le permite encontrar vectores que son similares a un vector de consulta dado.

Para realizar una búsqueda de similitud, debe proporcionar un vector de consulta y especificar el número de vecinos más cercanos que desea recuperar. Qdrant devolverá los vecinos más cercanos junto con sus puntajes de similitud.

Aquí hay un ejemplo de cómo realizar una búsqueda de similitud utilizando Qdrant:

# Vector de consulta
vector_consulta = [0.1, 0.2, 0.3, 0.4, 0.5]
 
# Número de vecinos más cercanos a recuperar
k = 5
 
# Realizar búsqueda de similitud
resultados = qdrant.search(vector_consulta, k)

El objeto resultados contendrá los vecinos más cercanos y sus puntajes de similitud. Luego puede utilizar esta información para procesar y analizar aún más los resultados.

Utilización de las extensas capacidades de filtrado de Qdrant

Qdrant proporciona extensas capacidades de filtrado que le permiten refinar los resultados de búsqueda en función de criterios específicos. Puede filtrar los resultados de búsqueda especificando condiciones en los atributos de los vectores o en los atributos de los datos asociados con los vectores.

Aquí hay algunos ejemplos de cómo usar las capacidades de filtrado de Qdrant en LangChain:

Filtrar por atributos de vector

# Filtrar por un valor de atributo específico
resultados = qdrant.search(vector_consulta, k, filter={"vector_attributes": {"nombre_atributo": "valor_atributo"}})
 
# Filtrar por un rango de valores de atributo
resultados = qdrant.search(vector_consulta, k, filter={"vector_attributes": {"nombre_atributo": {"gte": 10, "lte": 20}}})

Filtrar por atributos de datos

# Filtrar por un valor de atributo de datos específico
resultados = qdrant.search(vector_consulta, k, filter={"payload_attributes": {"nombre_atributo": "valor_atributo"}})
 
# Filtrar por un rango de valores de atributo de datos
resultados = qdrant.search(vector_consulta, k, filter={"payload_attributes": {"nombre_atributo": {"gte": 10, "lte": 20}}})

Estas capacidades de filtrado le permiten reducir fácilmente los resultados de búsqueda y recuperar los vectores que cumplen con sus criterios específicos.

Recuperación de resultados diversos con la búsqueda de máxima relevancia marginal (MMR)

Además de realizar búsquedas de similitud, Qdrant también ofrece la capacidad de recuperar resultados diversos utilizando el método de búsqueda de máxima relevancia marginal (MMR). La búsqueda de MMR tiene como objetivo encontrar un conjunto de documentos que sean relevantes y diversos, proporcionando una representación más completa del espacio de búsqueda. Para realizar una búsqueda MMR, debes proporcionar un vector de consulta, el número de vecinos más cercanos a recuperar y un parámetro de diversidad que controla la compensación entre relevancia y diversidad.

Aquí tienes un ejemplo de cómo realizar una búsqueda MMR usando Qdrant:

# Vector de consulta
query_vector = [0.1, 0.2, 0.3, 0.4, 0.5]
 
# Número de vecinos más cercanos a recuperar
k = 5
 
# Parámetro de diversidad
lambda_param = 0.5
 
# Realizar búsqueda MMR
results = qdrant.mmr_search(query_vector, k, lambda_param)

El objeto results contendrá el conjunto diverso de vecinos más cercanos y sus puntuaciones de similitud. Al ajustar el parámetro de diversidad, puedes controlar el equilibrio entre relevancia y diversidad en los resultados de búsqueda.

Usar Qdrant como recuperador en LangChain

Qdrant se puede utilizar como recuperador en LangChain tanto para búsquedas de similitud coseno como para búsquedas MMR. Al integrar Qdrant en tus aplicaciones de LangChain, puedes aprovechar sus potentes capacidades de búsqueda de similitud vectorial para mejorar el rendimiento y la precisión de la recuperación.

Para utilizar Qdrant como recuperador para búsquedas de similitud coseno, puedes utilizar el siguiente código:

from langchain.retrievers import QdrantRetriever
 
recuperador = QdrantRetriever(qdrant)
results = recuperador.retrieve_cosine(query_vector, k)

Para utilizar Qdrant como recuperador para búsquedas MMR, puedes utilizar el siguiente código:

from langchain.retrievers import QdrantRetriever
 
recuperador = QdrantRetriever(qdrant)
results = recuperador.retrieve_mmr(query_vector, k, lambda_param)

Al utilizar Qdrant como recuperador en LangChain, puedes incorporar fácilmente la funcionalidad de búsqueda de similitud vectorial en tus aplicaciones basadas en modelos de lenguaje.

Conclusión

En este artículo, hemos explorado cómo conectar con Qdrant en diferentes modos, realizar búsquedas de similitud en colecciones de Qdrant, utilizar las amplias capacidades de filtrado de Qdrant, recuperar resultados diversos utilizando la búsqueda MMR y utilizar Qdrant como recuperador en LangChain. Al integrar Qdrant en tus aplicaciones de LangChain, puedes aprovechar su potente motor de búsqueda de similitud vectorial para mejorar el rendimiento y la precisión de la recuperación.