Visión general de la incrustación
La incrustación es un concepto de aprendizaje automático para mapear datos en un espacio de alta dimensión, donde los datos de semántica similar se colocan cerca unos de otros. Al tratarse normalmente de una red neuronal profunda de BERT u otras familias de transformadores, el modelo de incrustación puede representar eficazmente la semántica de texto, imágenes y otros tipos de datos con una serie de números conocidos como vectores. Una característica clave de estos modelos es que la distancia matemática entre vectores en el espacio de alta dimensión puede indicar la similitud de la semántica del texto o las imágenes originales. Esta propiedad abre muchas aplicaciones de recuperación de información, como los motores de búsqueda web como Google y Bing, la búsqueda de productos y las recomendaciones en sitios de comercio electrónico, y el paradigma recientemente popular de la Generación Aumentada de Recuperación (RAG) en la IA generativa.
Existen dos categorías principales de incrustaciones, cada una de las cuales produce un tipo diferente de vector:
Incrustación densa: La mayoría de los modelos de incrustación representan la información como un vector de coma flotante de cientos a miles de dimensiones. Los resultados se denominan vectores "densos", ya que la mayoría de las dimensiones tienen valores distintos de cero. Por ejemplo, el popular modelo de incrustación de código abierto BAAI/bge-base-en-v1.5 genera vectores de 768 números en coma flotante (vector flotante de 768 dimensiones).
Incrustación dispersa: Por el contrario, los vectores de salida de las incrustaciones dispersas tienen en su mayoría dimensiones cero, es decir, vectores "dispersos". Estos vectores suelen tener dimensiones mucho mayores (decenas de miles o más), lo que viene determinado por el tamaño del vocabulario de tokens. Los vectores dispersos pueden generarse mediante redes neuronales profundas o análisis estadísticos de corpus de texto. Debido a su interpretabilidad y a su mejor capacidad de generalización fuera del dominio, los desarrolladores adoptan cada vez más las incrustaciones dispersas como complemento de las incrustaciones densas.
Milvus es una base de datos vectorial diseñada para la gestión, el almacenamiento y la recuperación de datos vectoriales. Gracias a la integración de los principales modelos de incrustación y reordenación, puede transformar fácilmente el texto original en vectores susceptibles de búsqueda o reordenar los resultados utilizando potentes modelos para obtener resultados más precisos para la GAR. Esta integración simplifica la transformación del texto y elimina la necesidad de componentes adicionales de incrustación o renumeración, agilizando así el desarrollo y la validación de la GAR.
Para crear incrustaciones en acción, consulte Uso del modelo de PyMilvus para generar incrustaciones de texto.
Función de incrustación | Tipo | API o de código abierto |
---|---|---|
openai | Denso | API |
transformador de frases | Denso | Fuente abierta |
bm25 | Sparse | Fuente abierta |
Splade | Sparse | Fuente abierta |
bge-m3 | Híbrido | Fuente abierta |
voyageai | Denso | API |
jina | Densa | API |
cohere | Denso | API |
Instructor | Denso | Fuente abierta |
Mistral AI | Denso | API |
Nomic | Denso | API |
mGTE | Híbrido | Fuente abierta |
Ejemplo 1: Utilizar la función de incrustación por defecto para generar vectores densos
Para utilizar las funciones de incrustación con Milvus, primero instale la biblioteca cliente PyMilvus con el subpaquete model
que envuelve todas las utilidades para la generación de incrustaciones.
pip install "pymilvus[model]"
El subpaquete model
soporta varios modelos de incrustación, desde OpenAI, Sentence Transformers, BGE M3, BM25, hasta modelos preentrenados SPLADE. Para simplificar, este ejemplo utiliza DefaultEmbeddingFunction
, que es un modelo de transformador de frases MiniLM-L6-v2. El modelo ocupa unos 70 MB y se descargará la primera vez que se utilice:
from pymilvus import model
# This will download "all-MiniLM-L6-v2", a light weight 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
print("Embeddings:", embeddings)
# Print dimension and shape of embeddings
print("Dim:", ef.dim, embeddings[0].shape)
El resultado esperado es similar al 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 densos y dispersos en una llamada con el modelo BGE M3
En este ejemplo, utilizamos el modelo híbrido BGE M3 para incrustar texto en vectores densos y dispersos y utilizarlos para recuperar documentos relevantes. Los pasos generales son los siguientes
Incrustar el texto como vectores densos y dispersos utilizando el modelo BGE-M3;
Crear una colección Milvus para almacenar los vectores densos y dispersos;
Insertar los datos en Milvus;
Buscar e inspeccionar el resultado.
En primer lugar, necesitamos instalar las dependencias necesarias.
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections,
)
Utilizar BGE M3 para codificar los documentos y las consultas para la recuperación de la incrustación.
# 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 = "Who started AI research?"
# BGE-M3 model can embed texts as dense and sparse vectors.
# It is included in the optional `model` module in pymilvus, to install it,
# simply run "pip install pymilvus[model]".
bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
docs_embeddings = bge_m3_ef(docs)
query_embeddings = bge_m3_ef([query])
Ejemplo 3: Generar vectores dispersos utilizando el modelo BM25
BM25 es un método muy 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 tanto para consultas como para documentos.
Primero, importe la clase BM25EmbeddingFunction.
from pymilvus.model.sparse import BM25EmbeddingFunction
En BM25, es importante calcular las estadísticas en sus documentos para obtener el IDF (Inverse Document Frequency), que puede representar el patrón en sus documentos. El IDF es una medida de la cantidad de información que proporciona una palabra, es decir, si es común o rara en todos los documentos.
# 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 disk 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)
El resultado esperado es similar al siguiente:
Dim: 21 (1, 21)