Pencarian saraf

Neural-Cherche adalah perpustakaan yang dirancang untuk menyempurnakan model pencarian saraf seperti Splade, Colbert, dan sparseembed pada dataset tertentu. Neural-Cherche juga menyediakan kelas untuk menjalankan inferensi yang efisien pada retriever atau ranker yang disempurnakan. Neural-Cherche bertujuan untuk menawarkan metode yang mudah dan efektif untuk menyempurnakan dan memanfaatkan model pencarian saraf di pengaturan offline dan online. Ini juga memungkinkan pengguna untuk menyimpan semua embeddings yang dihitung untuk mencegah perhitungan yang berlebihan.
Neural-Cherche kompatibel dengan perangkat CPU, GPU dan MPS. Kita dapat menyempurnakan Colbert dari pos pemeriksaan pra-terlatih Transformator Kalimat. Splade dan sparseembed lebih rumit untuk disempurnakan dan membutuhkan model pra-terlatih MLM.
Kami dapat menginstal Neural-Cherche menggunakan:
pip install neural-cherche
Jika kami berencana untuk mengevaluasi model kami saat melatih instalasi:
pip install "neural-cherche[eval]"
Dokumentasi lengkap tersedia di sini.
Dataset pelatihan Anda harus dibuat dari tiga kali lipat (anchor, positive, negative) di mana jangkar adalah kueri, positif adalah dokumen yang secara langsung terkait dengan jangkar dan negatif adalah dokumen yang tidak relevan untuk jangkar.
X = [
( "anchor 1" , "positive 1" , "negative 1" ),
( "anchor 2" , "positive 2" , "negative 2" ),
( "anchor 3" , "positive 3" , "negative 3" ),
]Dan inilah cara menyempurnakan Colbert dari pos pemeriksaan pra-terlatih transformator kalimat menggunakan neural-cherche:
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" )Berikut adalah cara menggunakan model Colbert yang disempurnakan untuk merancang ulang dokumen:
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 ,
)Sekarang kita dapat mengambil dokumen menggunakan model fine-tuned:
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 menyediakan SparseEmbed , SPLADE , TFIDF , BM25 Retriever dan ColBERT Ranker yang dapat digunakan untuk memesan ulang output retriever. Untuk informasi lebih lanjut, silakan merujuk ke dokumentasi.
Kami menyediakan pos pemeriksaan pra-terlatih yang dirancang khusus untuk neural-cherche: Raphaelsty/Neural-Cherche-Sparse-Embed dan Raphaelsty/Neural-Cherche-Colbert. Pos pemeriksaan tersebut disesuaikan dengan subset dari dataset MS-MARCO dan akan mendapat manfaat dari disesuaikan dengan dataset spesifik Anda. Anda dapat menyempurnakan Colbert dari setiap postence transformer pra-terlatih agar sesuai dengan bahasa spesifik Anda. Anda harus menggunakan titik-cek berbasis MLM untuk menyempurnakan sparseembed.
| SCIFACT Dataset | ||||
|---|---|---|---|---|
| model | Huggingface Checkpoint | NDCG@10 | hit@10 | hit@1 |
| Tfidf | - | 0,62 | 0,86 | 0,50 |
| BM25 | - | 0,69 | 0,92 | 0,56 |
| Sparseembed | Raphaelsty/Neural-Cherche-Sparse-Embed | 0,62 | 0,87 | 0,48 |
| Transformator kalimat | Transformer kalimat/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: Model leksikal dan ekspansi yang jarang untuk peringkat tahap pertama yang ditulis oleh Thibault Formal, Benjamin Piwowarski, Stéphane Clinchant, Sigir 2021.
Splade V2: Model leksikal dan ekspansi yang jarang untuk pengambilan informasi yang ditulis oleh Thibault Formal, Carlos Lassance, Benjamin Piwowarski, Stéphane Clinchant, Sigir 2022.
Sparseembed: Belajar representasi leksikal yang jarang dengan embeddings kontekstual untuk pengambilan yang ditulis oleh Weize Kong, Jeffrey M. Dudek, Cheng Li, Mingyang Zhang, dan Mike Bendersky, Sigir 2023.
Colbert: Pencarian bagian yang efisien dan efektif melalui interaksi akhir kontekstual atas Bert yang ditulis oleh Omar Khattab, Matei Zaharia, Sigir 2020.
Perpustakaan Python ini dilisensikan di bawah lisensi open-source MIT, dan model Splade dilisensikan sebagai non-komersial hanya oleh penulis. Sparseembed dan Colbert sepenuhnya open-source termasuk penggunaan komersial.