البحث العصبي

Neural-Cherche هي مكتبة مصممة لضبط نماذج البحث العصبي مثل Splade و Colbert و sparseembed على مجموعة بيانات معينة. توفر Neural-Cherche أيضًا دروسًا لتشغيل الاستدلال الفعال على مسترد أو رابطة تم ضبطها. تهدف Neural-Cherche إلى تقديم طريقة واضحة وفعالة لضبط نماذج البحث العصبية واستخدامها في كل من الإعدادات غير المتصلة بالإنترنت والإنترنت. كما أنه يمكّن المستخدمين من حفظ جميع التضمينات المحسوبة لمنع الحسابات الزائدة.
تتوافق العصبي-شيرش مع أجهزة وحدة المعالجة المركزية و GPU و MPS. يمكننا ضبط كولبيرت من أي نقطة تفتيش محول الجملة مسبقًا. Splade و sparseembed أكثر صعوبة في ضبطها وتحتاج إلى طراز MLM تم تدريبه مسبقًا.
يمكننا تثبيت Neural-Cherche باستخدام:
pip install neural-cherche
إذا كنا نخطط لتقييم نموذجنا أثناء تثبيت التدريب:
pip install "neural-cherche[eval]"
الوثائق الكاملة متوفرة هنا.
يجب أن تصنع مجموعة بيانات التدريب الخاصة بك من ثلاثية (anchor, positive, negative) حيث المرساة عبارة عن استعلام ، إيجابي هو وثيقة مرتبطة مباشرة بالمرساة والسلبية هي وثيقة غير ذات صلة بالمرساة.
X = [
( "anchor 1" , "positive 1" , "negative 1" ),
( "anchor 2" , "positive 2" , "negative 2" ),
( "anchor 3" , "positive 3" , "negative 3" ),
]وإليك كيفية ضبط كولبيرت من نقطة تفتيش محول الجملة قبل التدريب باستخدام العصبي-شيركي:
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" )فيما يلي كيفية استخدام نموذج Colbert الذي تم ضبطه لإعادة تشغيل المستندات:
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 ,
)الآن يمكننا استرداد المستندات باستخدام النموذج الذي تم ضبطه:
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 SparseEmbed ، و SPLADE ، و TFIDF ، و BM25 Retriever و ColBERT Ranker والذي يمكن استخدامه لإعادة ترتيب الإخراج من المسترد. لمزيد من المعلومات ، يرجى الرجوع إلى الوثائق.
نحن نقدم نقاط تفتيش تدرب مسبقًا مصممة خصيصًا للـ Neural-Cherche: Raphaelsty/Neural-Cherche-sparse و Raphaelsty/Neural-Cherche-Colbert. يتم ضبط نقاط التفتيش هذه على مجموعة فرعية من مجموعة بيانات MS-Marco وستستفيد من ضبطها على مجموعة البيانات المحددة. يمكنك ضبط كولبيرت من أي نقطة تفتيش محول جملة مسبقًا من أجل تناسب لغتك المحددة. يجب عليك استخدام نقطة فحص قائمة على MLM لضبط sparseembed.
| مجموعة بيانات Scifact | ||||
|---|---|---|---|---|
| نموذج | نقطة تفتيش عناق | NDCG@10 | يضرب@10 | يضرب@1 |
| TFIDF | - | 0،62 | 0،86 | 0،50 |
| BM25 | - | 0،69 | 0،92 | 0،56 |
| sparseembed | Raphaelsty/Neural-Cherche-sparse | 0،62 | 0،87 | 0،48 |
| محول الجملة | محولات الجملة/All-MPNET-Base-V2 | 0،66 | 0،89 | 0،53 |
| كولبيرت | 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: نموذج معجمي وتوسيع متناثر لتصنيف المرحلة الأولى من تأليف Thibault الرسمي ، Benjamin Piwowarski ، Stéphane Clinchant ، Sigir 2021.
Splade V2: نموذج معجمي وتوسيع متناثر لاسترجاع المعلومات الذي تم تأليفه بواسطة Thibault الرسمي ، كارلوس Lassance ، Benjamin Piwowarski ، Stéphane Clinchant ، Sigir 2022.
sparseembed: تعلم التمثيل المعجمي المتفرق مع التضمينات السياقية لاسترجاع تأليف من قبل Weize Kong و Jeffrey M. Dudek و Cheng Li و Mingyang Zhang و Mike Bendersky ، Sigir 2023.
كولبيرت: البحث الفعال والفعال في الممر عبر التفاعل المتأخر السياق على BERT من تأليف عمر خاتاب ، ماتي زاهاريا ، سيجير 2020.
تم ترخيص مكتبة Python هذه بموجب ترخيص MIT مفتوح المصدر ، ويتم ترخيص نموذج Splade باعتباره غير تجاري فقط من قبل المؤلفين. Sparseembed و Colbert مفتوحان بالكامل بما في ذلك الاستخدام التجاري.