Panoramica sui reranker
Nel campo del recupero delle informazioni e dell'intelligenza artificiale generativa, un reranker è uno strumento essenziale che ottimizza l'ordine dei risultati delle ricerche iniziali. I reranker si differenziano dai tradizionali modelli di embedding perché prendono in input una query e un documento e restituiscono direttamente un punteggio di somiglianza, anziché un embedding. Questo punteggio indica la rilevanza tra la query e il documento in ingresso.
I rechercher sono spesso impiegati dopo il primo stadio di recupero, tipicamente effettuato tramite tecniche vettoriali di Approximate Nearest Neighbor (ANN). Sebbene le ricerche ANN siano efficienti nel reperire un ampio insieme di risultati potenzialmente rilevanti, non sempre riescono a dare priorità ai risultati in termini di effettiva vicinanza semantica alla query. In questo caso, rerankers viene utilizzato per ottimizzare l'ordine dei risultati utilizzando analisi contestuali più approfondite, spesso sfruttando modelli avanzati di apprendimento automatico come BERT o altri modelli basati su Transformer. In questo modo, rerankers può migliorare notevolmente l'accuratezza e la pertinenza dei risultati finali presentati all'utente.
La libreria di modelli PyMilvus integra funzioni di rerank per ottimizzare l'ordine dei risultati restituiti dalle ricerche iniziali. Dopo aver recuperato gli incorporamenti più vicini da Milvus, è possibile sfruttare questi strumenti di reranking per affinare i risultati della ricerca e migliorare la precisione dei risultati.
Funzione di reranking | API o Open-sourced |
---|---|
BGE | Open-sourced |
Codificatore incrociato | In licenza libera |
Viaggio | API |
Cohere | API |
Jina AI | API |
Prima di utilizzare i reranker open-source, assicurarsi di scaricare e installare tutte le dipendenze e i modelli necessari.
Per i reranker basati su API, ottenere una chiave API dal fornitore e impostarla nelle variabili d'ambiente o negli argomenti appropriati.
Esempio 1: utilizzare la funzione rerank di BGE per classificare i documenti in base a una query
In questo esempio, dimostriamo come classificare i risultati di una ricerca utilizzando il reranker di BGE in base a una query specifica.
Per utilizzare un reranker con la libreria di modelli PyMilvus, è necessario installare la libreria di modelli PyMilvus e il sottopacchetto dei modelli, che contiene tutte le utility di reranking necessarie:
pip install pymilvus[model]
# or pip install "pymilvus[model]" for zsh.
Per utilizzare il reranker BGE, importare prima la classe BGERerankFunction
:
from pymilvus.model.reranker import BGERerankFunction
Quindi, creare un'istanza di BGERerankFunction
per il reranking:
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'
)
Per classificare i documenti in base a una query, utilizzare il codice seguente:
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)
Il risultato atteso è simile al seguente:
[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)]
Esempio 2: Utilizzare un reranker per migliorare la rilevanza dei risultati di ricerca
In questa guida, esploreremo come utilizzare il metodo search()
in PyMilvus per condurre ricerche di similarità e come migliorare la rilevanza dei risultati della ricerca utilizzando un reranker. La dimostrazione utilizzerà il seguente set di dati:
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.'}
]
Componenti del dataset:
doc_id
: Identificatore univoco per ogni documento.doc_vector
: Embeddings vettoriali che rappresentano il documento. Per una guida alla generazione di embeddings, fare riferimento a Embeddings.doc_text
: Contenuto testuale del documento.
Preparazione
Prima di avviare una ricerca di somiglianza, è necessario stabilire una connessione con Milvus, creare una raccolta e preparare e inserire i dati in tale raccolta. Il seguente frammento di codice illustra queste fasi preliminari.
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]}
Eseguire una ricerca per similarità
Dopo l'inserimento dei dati, è possibile eseguire una ricerca di similarità con il metodo 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"]}')
Il risultato atteso è simile al seguente:
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.
Utilizzare un reranker per migliorare i risultati della ricerca
Quindi, migliorare la rilevanza dei risultati della ricerca con una fase di reranking. In questo esempio, usiamo CrossEncoderRerankFunction
costruito in PyMilvus per rerankare i risultati per migliorare l'accuratezza.
# 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}')
Il risultato atteso è simile al seguente:
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.