🚀 Prueba Zilliz Cloud, el Milvus completamente gestionado, gratis—¡experimenta un rendimiento 10 veces más rápido! Prueba Ahora>>

milvus-logo
LFAI

HomeBlogsPresentación de la integración de PyMilvus con los modelos de incrustación

Presentación de la integración de PyMilvus con los modelos de incrustación

  • Engineering
June 05, 2024
Stephen Batifol

Milvus es una base de datos vectorial de código abierto diseñada específicamente para aplicaciones de IA. Ya sea que esté trabajando en aprendizaje automático, aprendizaje profundo o cualquier otro proyecto relacionado con la IA, Milvus ofrece una manera robusta y eficiente de manejar datos vectoriales a gran escala.

Ahora, con la integración del módulo de modelos en PyMilvus, el SDK de Python para Milvus, es aún más fácil añadir modelos de Embedding y Reranking. Esta integración simplifica la transformación de sus datos en vectores de búsqueda o la reordenación de los resultados para obtener resultados más precisos, como en la Generación Aumentada de Recuperación (RAG).

En este blog, revisaremos los modelos de incrustación densa, los modelos de incrustación dispersa y los reordenadores y demostraremos cómo utilizarlos en la práctica utilizando Milvus Lite, una versión ligera de Milvus que puede ejecutarse localmente en sus aplicaciones Python.

Incrustaciones densas frente a dispersas

Antes de explicarle cómo utilizar nuestras integraciones, veamos dos categorías principales de incrustaciones vectoriales.

Las incrustaciones vectoriales generalmente se dividen en dos categorías principales: Incrustaciones densas e incrustaciones dispersas.

  • Las incrustaciones densas son vectores de alta dimensión en los que la mayoría o todos los elementos son distintos de cero, lo que los hace ideales para codificar la semántica del texto o el significado difuso.

  • Las incrustaciones dispersas son vectores de alta dimensión con muchos elementos nulos, más adecuados para codificar conceptos exactos o adyacentes.

Milvus admite ambos tipos de incrustaciones y ofrece búsqueda híbrida. La búsqueda híbrida le permite realizar búsquedas en varios campos vectoriales dentro de la misma colección. Estos vectores pueden representar diferentes facetas de los datos, utilizar diversos modelos de incrustación o emplear distintos métodos de procesamiento de datos, combinando los resultados mediante reordenadores.

Cómo utilizar nuestras integraciones de incrustación y reclasificación

En las siguientes secciones, mostraremos tres ejemplos prácticos de uso de nuestras integraciones para generar incrustaciones y realizar búsquedas vectoriales.

Ejemplo 1: Utilizar la función de incrustación predeterminada para generar vectores densos

Debe instalar el cliente pymilvus con el paquete model para utilizar las funciones de incrustación y reordenación con Milvus.

pip install "pymilvus[model]"

Este paso instalará Milvus Lite, permitiéndole ejecutar Milvus localmente dentro de su aplicación Python. También incluye el subpaquete model, que incluye todas las utilidades para Embedding y reranking.

El subpaquete de modelos admite varios modelos de incrustación, incluidos los de OpenAI, Sentence Transformers, BGE-M3, BM25, SPLADE y los modelos preentrenados de Jina AI.

Este ejemplo utiliza el modelo DefaultEmbeddingFunction, basado en el modelo all-MiniLM-L6-v2 Sentence Transformer para simplificar. El modelo ocupa unos 70 MB y se descargará durante el primer uso:

from pymilvus import model

# This will download "all-MiniLM-L6-v2", a lightweight model.
ef = model.DefaultEmbeddingFunction()

# Data from which embeddings are to be generated
docs = [
   "Artificial intelligence was founded as an academic discipline in 1956.",
   "Alan Turing was the first person to conduct substantial research in AI.",
   "Born in Maida Vale, London, Turing was raised in southern England.",
]

embeddings = ef.encode_documents(docs)

print("Embeddings:", embeddings)
# Print dimension and shape of embeddings
print("Dim:", ef.dim, embeddings[0].shape)

El resultado esperado debería ser algo parecido a lo siguiente:

Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
      -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
       2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
...
      -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
      -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
     dtype=float32)]
Dim: 384 (384,)

Ejemplo 2: Generar vectores dispersos utilizando el modelo BM25

BM25 es un método bien conocido que utiliza frecuencias de aparición de palabras para determinar la relevancia entre consultas y documentos. En este ejemplo, mostraremos cómo utilizar BM25EmbeddingFunction para generar incrustaciones dispersas para consultas y documentos.

En BM25, es importante calcular las estadísticas de los documentos para obtener la IDF (Inverse Document Frequency), que puede representar los patrones de los documentos. El IDF mide cuánta información proporciona una palabra, si es común o rara en todos los documentos.

from pymilvus.model.sparse import BM25EmbeddingFunction

# 1. Prepare a small corpus to search
docs = [
   "Artificial intelligence was founded as an academic discipline in 1956.",
   "Alan Turing was the first person to conduct substantial research in AI.",
   "Born in Maida Vale, London, Turing was raised in southern England.",
]
query = "Where was Turing born?"
bm25_ef = BM25EmbeddingFunction()

# 2. Fit the corpus to get BM25 model parameters on your documents.
bm25_ef.fit(docs)

# 3. Store the fitted parameters to expedite future processing.
bm25_ef.save("bm25_params.json")

# 4. Load the saved params
new_bm25_ef = BM25EmbeddingFunction()
new_bm25_ef.load("bm25_params.json")

docs_embeddings = new_bm25_ef.encode_documents(docs)
query_embeddings = new_bm25_ef.encode_queries([query])
print("Dim:", new_bm25_ef.dim, list(docs_embeddings)[0].shape)

Ejemplo 3: Utilización de un ReRanker

El objetivo de un sistema de búsqueda es encontrar los resultados más relevantes de forma rápida y eficaz. Tradicionalmente, se han utilizado métodos como BM25 o TF-IDF para clasificar los resultados de la búsqueda basándose en la coincidencia de palabras clave. Los métodos más recientes, como la similitud coseno-incrustada, son sencillos, pero a veces no tienen en cuenta las sutilezas del lenguaje y, sobre todo, la interacción entre los documentos y la intención de la consulta.

Aquí es donde ayuda el uso de un re-ranker. Un re-ranker es un modelo avanzado de IA que toma el conjunto inicial de resultados de una búsqueda -a menudo proporcionado por una búsqueda basada en incrustaciones/tokens- y los reevalúa para asegurarse de que se ajustan mejor a la intención del usuario. Va más allá de la coincidencia superficial de términos para considerar la interacción más profunda entre la consulta de búsqueda y el contenido de los documentos.

Para este ejemplo, utilizaremos el Jina AI Reranker.

from pymilvus.model.reranker import JinaRerankFunction

jina_api_key = "<YOUR_JINA_API_KEY>"

rf = JinaRerankFunction("jina-reranker-v1-base-en", jina_api_key)

query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"

documents = [
   "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
   "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
   "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
   "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
]

results = rf(query, documents)

for result in results:
   print(f"Index: {result.index}")
   print(f"Score: {result.score:.6f}")
   print(f"Text: {result.text}\n")

El resultado esperado es similar al siguiente:

Index: 1
Score: 0.937096
Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.

Index: 3
Score: 0.354210
Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.

Index: 0
Score: 0.349866
Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.

Index: 2
Score: 0.272896
Text: In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.

¡Síguenos en GitHub y únete a nuestro Discord!

Si te ha gustado esta entrada de blog, ¡considera incluir a Milvus en GitHub, y no dudes en unirte a nuestro Discord! 💙

Like the article? Spread the word

Sigue Leyendo