Visión general de los rerankers
En el ámbito de la recuperación de información y la IA generativa, un reordenador es una herramienta esencial que optimiza el orden de los resultados de las búsquedas iniciales. Los rerankers se diferencian de los modelos de incrustación tradicionales en que toman una consulta y un documento como entrada y devuelven directamente una puntuación de similitud en lugar de incrustaciones. Esta puntuación indica la relevancia entre la consulta y el documento.
Los reordenadores suelen emplearse después de la primera fase de recuperación, que suele realizarse mediante técnicas vectoriales de Vecino más Cercano Aproximado (RNA). Aunque las búsquedas RNA son eficaces a la hora de obtener un amplio conjunto de resultados potencialmente relevantes, es posible que no siempre prioricen los resultados en función de su proximidad semántica real a la consulta. En este caso, rerankers se utiliza para optimizar el orden de los resultados mediante análisis contextuales más profundos, a menudo aprovechando modelos avanzados de aprendizaje automático como BERT u otros modelos basados en Transformer. De este modo, los rerankers pueden mejorar drásticamente la precisión y relevancia de los resultados finales presentados al usuario.
La biblioteca de modelos PyMilvus integra funciones rerank para optimizar el orden de los resultados devueltos a partir de las búsquedas iniciales. Después de recuperar las incrustaciones más cercanas de Milvus, puede aprovechar estas herramientas de reranking para refinar los resultados de la búsqueda y mejorar la precisión de los resultados de la búsqueda.
Función de renumeración | API o de código abierto |
---|---|
BGE | Fuente abierta |
Codificador cruzado | Fuente abierta |
Viaje | API |
Cohere | API |
Jina AI | API |
Antes de utilizar los rerankers de código abierto, asegúrese de descargar e instalar todas las dependencias y modelos necesarios.
Para los rerankers basados en API, obtenga una clave de API del proveedor y establézcala en las variables de entorno o argumentos adecuados.
Ejemplo 1: Uso de la función rerank de BGE para clasificar documentos según una consulta
En este ejemplo, demostramos cómo clasificar los resultados de búsqueda utilizando el reranker de BGE en función de una consulta específica.
Para utilizar un reordenador con la biblioteca de modelos PyMilvus, instale la biblioteca de modelos PyMilvus junto con el subpaquete de modelos que contiene todas las utilidades de reordenación necesarias:
pip install pymilvus[model]
# or pip install "pymilvus[model]" for zsh.
Para utilizar el reranker BGE, importa primero la clase BGERerankFunction
:
from pymilvus.model.reranker import BGERerankFunction
A continuación, cree una instancia de BGERerankFunction
para el reordenamiento:
bge_rf = BGERerankFunction(
model_name="BAAI/bge-reranker-v2-m3", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
)
Para jerarquizar documentos a partir de una consulta, utilice el código siguiente:
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."
]
bge_rf(query, documents)
El resultado esperado es similar al siguiente:
[RerankResult(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.", score=0.9911615761470803, index=1),
RerankResult(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.", score=0.0326971950177779, index=0),
RerankResult(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.', score=0.006514905766152258, index=3),
RerankResult(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.', score=0.0042116724917325935, index=2)]
Ejemplo 2: Utilizar un reranker para mejorar la relevancia de los resultados de búsqueda
En esta guía, exploraremos cómo utilizar el método search()
en PyMilvus para realizar búsquedas de similitud, y cómo mejorar la relevancia de los resultados de la búsqueda utilizando un reranker. Nuestra demostración utilizará el siguiente conjunto de datos:
entities = [
{'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_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."},
{'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_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."},
{'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_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.'},
{'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_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.'}
]
Componentes del conjunto de datos:
doc_id
: Identificador único para cada documento.doc_vector
: Incrustaciones vectoriales que representan el documento. Para más información sobre la generación de incrustaciones, consulte Incrustaciones.doc_text
: Contenido textual del documento.
Preparativos
Antes de iniciar una búsqueda de similitudes, debe establecer una conexión con Milvus, crear una colección y preparar e insertar datos en esa colección. El siguiente fragmento de código ilustra estos pasos preliminares.
from pymilvus import MilvusClient, DataType
client = MilvusClient(
uri="http://10.102.6.214:19530" # replace with your own Milvus server address
)
client.drop_collection('test_collection')
# define schema
schema = client.create_schema(auto_id=False, enabel_dynamic_field=True)
schema.add_field(field_name="doc_id", datatype=DataType.INT64, is_primary=True, description="document id")
schema.add_field(field_name="doc_vector", datatype=DataType.FLOAT_VECTOR, dim=384, description="document vector")
schema.add_field(field_name="doc_text", datatype=DataType.VARCHAR, max_length=65535, description="document text")
# define index params
index_params = client.prepare_index_params()
index_params.add_index(field_name="doc_vector", index_type="IVF_FLAT", metric_type="IP", params={"nlist": 128})
# create collection
client.create_collection(collection_name="test_collection", schema=schema, index_params=index_params)
# insert data into collection
client.insert(collection_name="test_collection", data=entities)
# Output:
# {'insert_count': 4, 'ids': [0, 1, 2, 3]}
Realizar una búsqueda de similitudes
Después de insertar los datos, realice búsquedas de similitud utilizando el método search
.
# search results based on our query
res = client.search(
collection_name="test_collection",
data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector
limit=3,
output_fields=["doc_id", "doc_text"]
)
for i in res[0]:
print(f'distance: {i["distance"]}')
print(f'doc_text: {i["entity"]["doc_text"]}')
El resultado esperado es similar al siguiente:
distance: 0.7235960960388184
doc_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.
distance: 0.6269873976707458
doc_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.
distance: 0.5340118408203125
doc_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.
Utilizar un reranker para mejorar los resultados de la búsqueda
A continuación, mejore la relevancia de los resultados de la búsqueda con un paso de reranking. En este ejemplo, utilizamos CrossEncoderRerankFunction
integrado en PyMilvus para reordenar los resultados y mejorar la precisión.
# use reranker to rerank search results
from pymilvus.model.reranker import CrossEncoderRerankFunction
ce_rf = CrossEncoderRerankFunction(
model_name="cross-encoder/ms-marco-MiniLM-L-6-v2", # Specify the model name.
device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
)
reranked_results = ce_rf(
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."
],
top_k=3
)
# print the reranked results
for result in reranked_results:
print(f'score: {result.score}')
print(f'doc_text: {result.text}')
El resultado esperado es similar al siguiente:
score: 6.250532627105713
doc_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.
score: -2.9546022415161133
doc_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.
score: -4.771512031555176
doc_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.