신경 검색

Neural-Cherche는 특정 데이터 세트에서 Splade, Colbert 및 Sparseembed와 같은 신경 검색 모델을 미세 조정하도록 설계된 라이브러리입니다. Neural-Cherche는 또한 미세 조정 된 리트리버 또는 랭커에서 효율적인 추론을 실행하는 클래스를 제공합니다. Neural-Cherche는 오프라인 및 온라인 설정에서 신경 검색 모델을 미세 조정하고 활용하기위한 간단하고 효과적인 방법을 제공하는 것을 목표로합니다. 또한 사용자는 중복 계산을 방지하기 위해 모든 계산 내장을 저장할 수 있습니다.
Neural-Cherche는 CPU, GPU 및 MPS 장치와 호환됩니다. 우리는 모든 문장 변압기에서 미리 훈련 된 체크 포인트에서 Colbert를 미세 조정할 수 있습니다. Splade와 Sparseembed는 미세 조정하기가 더 까다 롭고 MLM 미리 훈련 된 모델이 필요합니다.
우리는 다음을 사용하여 신경-쉐체를 설치할 수 있습니다.
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" ),
]그리고 신경-차체를 사용하여 문장 변압기에서 미리 훈련 된 체크 포인트에서 Colbert를 미세 조정하는 방법은 다음과 같습니다.
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 리트리버 및 ColBERT Ranker를 제공하여 리트리버의 출력을 다시 주문하는 데 사용할 수 있습니다. 자세한 내용은 문서를 참조하십시오.
우리는 신경-차체를 위해 특별히 설계된 미리 훈련 된 체크 포인트를 제공합니다 : Raphaelsty/Neural-Cherche-Sparse-embed 및 Raphaelsty/Neural-Cherche-Colbert. 이러한 체크 포인트는 MS-Marco 데이터 세트의 하위 집합에서 미세 조정되며 특정 데이터 세트에서 미세 조정되는 이점이 있습니다. 특정 언어에 맞게 문장 변압기에서 미리 훈련 된 체크 포인트에서 Colbert를 미세 조정할 수 있습니다. MLM 기반 체크 포인트를 사용하여 Sparseembed를 미세 조정해야합니다.
| 과학 데이터 세트 | ||||
|---|---|---|---|---|
| 모델 | 포옹 페이스 체크 포인트 | NDCG@10 | @10 | @1 |
| TFIDF | - | 0,62 | 0,86 | 0,50 |
| BM25 | - | 0,69 | 0,92 | 0,56 |
| 드문 드문 | Raphaelsty/Neural-Cherche-Sparse-embed | 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 리트리버 + Colbert Ranker | Raphaelsty/Neural-Cherche-Colbert | 0,71 | 0,94 | 0,59 |
| BM25 리트리버 + Colbert Ranker | Raphaelsty/Neural-Cherche-Colbert | 0,72 | 0,95 | 0,59 |
Splade : Thibault Formal, Benjamin Piwowarski, Stéphane Clinchant, Sigir 2021에 의해 저술 한 첫 번째 단계 순위에 대한 희소 어휘 및 확장 모델 .
Splade V2 : Thibault Formal, Carlos Lassance, Benjamin Piwowarski, Stéphane Clinchant, Sigir 2022에 의해 저술 한 정보 검색을위한 희소 어휘 및 확장 모델 .
Sparseembed : Weize Kong, Jeffrey M. Dudek, Cheng Li, Mingyang Zhang 및 Mike Bendersky, Sigir 2023이 저술 한 검색을위한 상황에 맞는 묘사를 가진 희소 어휘 표현 학습 .
COLBERT : OMAR KHATTAB, MATEI ZAHARIA, SIGIR 2020에 대한 BERT에 대한 상황에 맞는 늦은 상호 작용을 통한 효율적이고 효과적인 통과 검색 .
이 Python 라이브러리는 MIT 오픈 소스 라이센스에 따라 라이센스가 부여되며 Splade 모델은 저자에 의해서만 비상업적으로 라이센스가 부여됩니다. Sparseembed와 Colbert는 상업용 사용을 포함하여 완전히 오픈 소스입니다.