Neuronale Suche

Neural-Cherche ist eine Bibliothek, die neuronale Suchmodelle wie Splade, Colbert und Spärinde in einem bestimmten Datensatz fein abteilen. Neural-Cherche stellt auch Klassen zur Verfügung, um effiziente Schlussfolgerungen für einen fein abgestimmten Retriever oder Ranker zu führen. Neural-Cherche möchte eine einfache und effektive Methode zur Feinabstimmung und Verwendung neuronaler Suchmodelle sowohl in Offline- als auch in Online-Einstellungen anbieten. Außerdem können Benutzer alle berechneten Einbettungen speichern, um redundante Berechnungen zu verhindern.
Neural-Cherche ist mit CPU-, GPU- und MPS-Geräten kompatibel. Wir können Colbert von jedem vorgeschriebenen Kontrollpunkt für Satztransformator ausfeindlich abgeben. Splade und Spärdung sind schwieriger zu feinstimmen und brauchen ein MLM-Vorausgebildeter.
Wir können Neural-Cherche mit:
pip install neural-cherche
Wenn wir vorhaben, unser Modell während der Schulung zu bewerten:
pip install "neural-cherche[eval]"
Die vollständige Dokumentation ist hier verfügbar.
Ihr Trainingsdatensatz muss aus Tripel (anchor, positive, negative) bestehen, bei dem Anker eine Abfrage ist. Positiv ist ein Dokument, das direkt mit dem Anker verbunden ist, und negativ ist ein Dokument, das für den Anker nicht relevant ist.
X = [
( "anchor 1" , "positive 1" , "negative 1" ),
( "anchor 2" , "positive 2" , "negative 2" ),
( "anchor 3" , "positive 3" , "negative 3" ),
]Und hier finden Sie, wie Sie Colbert mit einem vorgeborenen Satztransformator unter Verwendung von Neural-Cherche-Checkpoint feinstimmen können:
import torch
from neural_cherche import models , utils , train
model = models . ColBERT (
model_name_or_path = "raphaelsty/neural-cherche-colbert" ,
device = "cuda" if torch . cuda . is_available () else "cpu" # or mps
)
optimizer = torch . optim . AdamW ( model . parameters (), lr = 3e-6 )
X = [
( "query" , "positive document" , "negative document" ),
( "query" , "positive document" , "negative document" ),
( "query" , "positive document" , "negative document" ),
]
for step , ( anchor , positive , negative ) in enumerate ( utils . iter (
X ,
epochs = 1 , # number of epochs
batch_size = 8 , # number of triples per batch
shuffle = True
)):
loss = train . train_colbert (
model = model ,
optimizer = optimizer ,
anchor = anchor ,
positive = positive ,
negative = negative ,
step = step ,
gradient_accumulation_steps = 50 ,
)
if ( step + 1 ) % 1000 == 0 :
# Save the model every 1000 steps
model . save_pretrained ( "checkpoint" )Hier erfahren Sie, wie Sie das fein abgestimmte Colbert-Modell verwenden, um Dokumente erneut zu beziehen:
import torch
from lenlp import sparse
from neural_cherche import models , rank , retrieve
documents = [
{ "id" : "doc1" , "title" : "Paris" , "text" : "Paris is the capital of France." },
{ "id" : "doc2" , "title" : "Montreal" , "text" : "Montreal is the largest city in Quebec." },
{ "id" : "doc3" , "title" : "Bordeaux" , "text" : "Bordeaux in Southwestern France." },
]
retriever = retrieve . BM25 (
key = "id" ,
on = [ "title" , "text" ],
count_vectorizer = sparse . CountVectorizer (
normalize = True , ngram_range = ( 3 , 5 ), analyzer = "char_wb" , stop_words = []
),
k1 = 1.5 ,
b = 0.75 ,
epsilon = 0.0 ,
)
model = models . ColBERT (
model_name_or_path = "raphaelsty/neural-cherche-colbert" ,
device = "cuda" if torch . cuda . is_available () else "cpu" , # or mps
)
ranker = rank . ColBERT (
key = "id" ,
on = [ "title" , "text" ],
model = model ,
)
documents_embeddings = retriever . encode_documents (
documents = documents ,
)
retriever . add (
documents_embeddings = documents_embeddings ,
)Jetzt können wir Dokumente mit dem Feinabstimmungsmodell abrufen:
queries = [ "Paris" , "Montreal" , "Bordeaux" ]
queries_embeddings = retriever . encode_queries (
queries = queries ,
)
ranker_queries_embeddings = ranker . encode_queries (
queries = queries ,
)
candidates = retriever (
queries_embeddings = queries_embeddings ,
batch_size = 32 ,
k = 100 , # number of documents to retrieve
)
# Compute embeddings of the candidates with the ranker model.
# Note, we could also pre-compute all the embeddings.
ranker_documents_embeddings = ranker . encode_candidates_documents (
candidates = candidates ,
documents = documents ,
batch_size = 32 ,
)
scores = ranker (
queries_embeddings = ranker_queries_embeddings ,
documents_embeddings = ranker_documents_embeddings ,
documents = candidates ,
batch_size = 32 ,
)
scores [[{ 'id' : 0 , 'similarity' : 22.825355529785156 },
{ 'id' : 1 , 'similarity' : 11.201947212219238 },
{ 'id' : 2 , 'similarity' : 10.748161315917969 }],
[{ 'id' : 1 , 'similarity' : 23.21628189086914 },
{ 'id' : 0 , 'similarity' : 9.9658203125 },
{ 'id' : 2 , 'similarity' : 7.308732509613037 }],
[{ 'id' : 1 , 'similarity' : 6.4031805992126465 },
{ 'id' : 0 , 'similarity' : 5.601611137390137 },
{ 'id' : 2 , 'similarity' : 5.599479675292969 }]] Neural-Cherche bietet ein SparseEmbed , eine SPLADE , einen TFIDF , einen BM25 Retriever und einen ColBERT Ranger, mit dem die Ausgabe eines Retrievers neu angeordnet werden kann. Weitere Informationen finden Sie in der Dokumentation.
Wir bieten vorgeschriebene Kontrollpunkte, die speziell für Neural-Cherche entwickelt wurden: Raphaelsty/Neural-Cherche-Sparse-Embed und Raphaelsty/Neural-Cherche-Colbert. Diese Checkpoints sind in einer Teilmenge des MS-Marco-Datensatzes fein abgestimmt und würden davon profitieren, dass Sie in Ihrem spezifischen Datensatz fein abgestimmt werden. Sie können Colbert von jedem vorgeschriebenen Kontrollpunkt für den Satztransformator für Ihre spezifische Sprache feinstimmen. Sie sollten einen MLM-basierten Checkpoint verwenden, um spärlich zu feinstimmen.
| Scifact -Datensatz | ||||
|---|---|---|---|---|
| Modell | Umarmungsface -Checkpoint | NDCG@10 | Hits@10 | Hits@1 |
| Tfidf | - - | 0,62 | 0,86 | 0,50 |
| BM25 | - - | 0,69 | 0,92 | 0,56 |
| Spärlich | Raphaelsty/Neural-Cherche-Sparse-Embed | 0,62 | 0,87 | 0,48 |
| Satztransformator | Satztransformer/All-MPNET-Base-V2 | 0,66 | 0,89 | 0,53 |
| Colbert | Raphaelsty/Neural-Cherche-Colbert | 0,70 | 0,92 | 0,58 |
| TFIDF Retriever + Colbert Ranker | Raphaelsty/Neural-Cherche-Colbert | 0,71 | 0,94 | 0,59 |
| BM25 Retriever + Colbert Ranker | Raphaelsty/Neural-Cherche-Colbert | 0,72 | 0,95 | 0,59 |
Splade: Sparse Lexikal- und Expansionsmodell für das Ranglisten der ersten Stufe, das von Thibault Formal, Benjamin Piwowarski, Stéphane Clinchanch, Sigir 2021 verfasst wurde.
Splade V2: Sparse Lexikal- und Expansionsmodell für Informationsabruf von Thibault Formal, Carlos Lassance, Benjamin Piwowarski, Stéphane Clinchanch, Sigir 2022.
Sparseembed: Lernen spärliche lexikalische Darstellungen mit kontextuellen Einbettungen für das Abrufen von Unheiz Kong, Jeffrey M. Dudek, Cheng Li, Mingyang Zhang und Mike Bendersky, Sigir 2023.
Colbert: Effiziente und effektive Durchgangssuche über kontextualisierte verspätete Interaktion über Bert, die von Omar Khattab, Matei Zaharia, Sigir 2020 verfasst wurde.
Diese Python-Bibliothek ist unter der MIT Open-Source-Lizenz lizenziert und das Splade-Modell wird nur von den Autoren als nicht kommerziell lizenziert. Sparseembed und Colbert sind vollständig Open-Source, einschließlich kommerzieller Nutzung.