Anserini est une boîte à outils pour la recherche de recherche d'informations reproductibles. En nous appuyant sur Lucene, nous visons à combler le fossé entre la recherche universitaire en matière de recherche d'informations et la pratique de la création d'applications de recherche réelles. Entre autres objectifs, nos efforts visent à être à l'opposé de cela.* Anserini est issu d'une étude de reproductibilité de divers moteurs de récupération open source en 2016 (Lin et al., ECIR 2016). Voir Yang et al. (SIGIR 2017) et Yang et al. (JDIQ 2018) pour un aperçu.
❗ Anserini a été mis à niveau du JDK 11 vers le JDK 21 au commit 272565
(03/04/2024), ce qui correspond à la sortie de la v0.35.0.
Anserini est emballé dans un fatjar autonome, qui constitue également le moyen le plus simple de démarrer. En supposant que Java soit déjà installé, récupérez le fatjar :
wget https://repo1.maven.org/maven2/io/anserini/anserini/0.38.0/anserini-0.38.0-fatjar.jar
Les commandes suivantes généreront une exécution SPLADE++ ED avec les requêtes de développement (codées en ONNX) sur le corpus de passage MS MARCO :
java -cp anserini-0.38.0-fatjar.jar io.anserini.search.SearchCollection
-index msmarco-v1-passage.splade-pp-ed
-topics msmarco-v1-passage.dev
-encoder SpladePlusPlusEnsembleDistil
-output run.msmarco-v1-passage-dev.splade-pp-ed-onnx.txt
-impact -pretokenized
Pour évaluer :
java -cp anserini-0.38.0-fatjar.jar trec_eval -c -M 10 -m recip_rank msmarco-passage.dev-subset run.msmarco-v1-passage-dev.splade-pp-ed-onnx.txt
Voir les instructions détaillées pour la version fatjar actuelle d'Anserini (v0.38.0) pour reproduire des expériences de régression sur les corpus MS MARCO V2.1 pour TREC 2024 RAG, sur MS MARCO V1 Passage et sur BEIR, le tout directement à partir du fatjar !
En outre, Anserini est livré avec une application Web intégrée pour les requêtes interactives ainsi qu'une API REST qui peut être utilisée par d'autres applications. Consultez notre documentation ici.
La plupart des fonctionnalités d'Anserini sont exposées dans l'interface Pyserini Python. Si vous êtes plus à l'aise avec Python, commencez par là, même si Anserini constitue un élément constitutif important de Pyserini, il vaut donc la peine d'en apprendre davantage sur Anserini.
Vous aurez besoin de Java 21 et de Maven 3.9+ pour créer Anserini. Clonez notre dépôt avec l'option --recurse-submodules
pour vous assurer que le sous-module eval/
est également cloné (vous pouvez également utiliser git submodule update --init
). Ensuite, construisez en utilisant Maven :
mvn clean package
Le répertoire tools/
, qui contient des outils d'évaluation et d'autres scripts, est en fait ce dépôt, intégré en tant que sous-module Git (afin qu'il puisse être partagé entre des projets associés). Construisez comme suit (vous pourriez recevoir des avertissements, mais vous pouvez les ignorer) :
cd tools/eval && tar xvfz trec_eval.9.0.4.tar.gz && cd trec_eval.9.0.4 && make && cd ../../..
cd tools/eval/ndeval && make && cd ../../..
Avec cela, vous devriez être prêt à partir. Le parcours d'intégration d'Anserini commence ici !
Si vous utilisez Windows, veuillez utiliser WSL2 pour créer Anserini. Veuillez vous référer au document d'installation de WSL2 pour installer WSL2 si vous ne l'avez pas déjà fait.
Notez que sous Windows sans WSL2, les tests peuvent échouer en raison de problèmes d'encodage, voir #1466. Une solution de contournement simple consiste à ignorer les tests en ajoutant -Dmaven.test.skip=true
à la commande mvn
ci-dessus. Voir #1121 pour des discussions supplémentaires sur le débogage des erreurs de build Windows.
Anserini est conçu pour prendre en charge des expériences de bout en bout sur diverses collections de tests IR standard, prêtes à l'emploi. Chacune de ces régressions de bout en bout part du corpus brut, crée l'index nécessaire, effectue des exécutions de récupération et génère des résultats d'évaluation. Voir les pages individuelles pour plus de détails.
développeur | DL19 | DL20 | |
---|---|---|---|
Clairsemé sans surveillance | |||
Lignes de base de Lucene BoW | ? | ? | ? |
BM25 quantifié | ? | ? | ? |
Lignes de base WordPièce (pré-tokenisées) | ? | ? | ? |
Lignes de base de WordPièce (Huggingface) | ? | ? | ? |
Lignes de base WordPièce + Lucene BoW | ? | ? | ? |
doc2query | ? | ||
doc2query-T5 | ? | ? | ? |
Appris clairsemés (famille uniCOIL) | |||
uniCOIL noexp | ? | ? | ? |
uniCOIL avec doc2query-T5 | ? | ? | ? |
uniCOIL avec TILDE | ? | ||
Appris clairsemés (autres) | |||
Impact profond | ? | ||
SPLADEv2 | ? | ||
SPLADE++ CoCondenser-EnsembleDistil | ? | ? | ? |
SPLADE++ CoCondenser-SelfDistil | ? | ? | ? |
Appris denses (indices HNSW) | |||
cosDPR-distil | complet:? | complet:? | complet:? |
BGE-base-fr-v1.5 | complet:? | complet:? | complet:? |
OpenAI Ada2 | complet:? int8 : ? | complet:? int8 : ? | complet:? int8 : ? |
Cohérer l'anglais v3.0 | complet:? int8 : ? | complet:? int8 : ? | complet:? int8 : ? |
Appris Dense (index plats) | |||
cosDPR-distil | complet:? | complet:? | complet:? |
BGE-base-fr-v1.5 | complet:? | complet:? | complet:? |
OpenAI Ada2 | complet:? int8 :?️ | complet:? int8 : ? | complet:? int8 : ? |
Cohérer l'anglais v3.0 | complet:? int8 : ? | complet:? int8 : ? | complet:? int8 : ? |
Appris dense (inversé; expérimental) | |||
cosDPR-distil avec "faux mots" | ? | ? | ? |
cosDPR-distil avec "LexLSH" | ? | ? | ? |
Clé:
Corpus | Taille | Somme de contrôle |
---|---|---|
BM25 quantifié | 1,2 Go | 0a623e2c97ac6b7e814bf1323a97b435 |
uniCOIL (noexp) | 2,7 Go | f17ddd8c7c00ff121c3c3b147d2e17d8 |
uniCOIL (d2q-T5) | 3,4 Go | 78eef752c78c8691f7d61600ceed306f |
uniCOIL (TILDE) | 3,9 Go | 12a9c289d94e32fd63a7d39c9677d75c |
Impact profond | 3,6 Go | 73843885b503af3c8b3ee62e5f5a9900 |
SPLADEv2 | 9,9 Go | b5d126f5d9a8e1b3ef3f5cb0ba651725 |
SPLADE++ CoCondenser-EnsembleDistil | 4,2 Go | e489133bdc54ee1e7c62a32aa582bc77 |
SPLADE++ CoCondenser-SelfDistil | 4,8 Go | cb7e264222f2bf2221dd2c9d28190be1 |
cosDPR-distil | 57 Go | e20ffbc8b5e7f760af31298aefeaebbd |
BGE-base-fr-v1.5 | 59 Go | 353d2c9e72e858897ad479cca4ea0db1 |
OpenAI-ada2 | 109 Go | a4d843d522ff3a3af7edbee789a63402 |
Cohérer embed-english-v3.0 | 38 Go | 06a6e38a0522850c6aa504db7b2617f5 |
développeur | DL19 | DL20 | |
---|---|---|---|
Lexical non supervisé, Doc complet * | |||
Lignes de base de Lucene BoW | + | + | + |
Lignes de base WordPièce (pré-tokenisées) | + | + | + |
Lignes de base de WordPièce (tokenizer Huggingface) | + | + | + |
Lignes de base WordPièce + Lucene BoW | + | + | + |
doc2query-T5 | + | + | + |
Doc lexical non supervisé, segmenté * | |||
Lignes de base de Lucene BoW | + | + | + |
Lignes de base WordPièce (pré-tokenisées) | + | + | + |
Lignes de base WordPièce + Lucene BoW | + | + | + |
doc2query-T5 | + | + | + |
Lexical clairsemé appris | |||
uniCOIL noexp | ✓ | ✓ | ✓ |
uniCOIL avec doc2query-T5 | ✓ | ✓ | ✓ |
Corpus | Taille | Somme de contrôle |
---|---|---|
Document MS MARCO V1 : uniCOIL (noexp) | 11 Go | 11b226e1cacd9c8ae0a660fd14cdd710 |
Document MS MARCO V1 : uniCOIL (d2q-T5) | 19 Go | 6a00e2c0c375cb1e52c83ae5ac377ebb |
développeur | DL21 | DL22 | DL23 | |
---|---|---|---|---|
Lexical non supervisé, Corpus original | ||||
lignes de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Corpus lexical non supervisé et augmenté | ||||
lignes de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Lexical clairsemé appris | ||||
uniCOIL noexp zéro tir | ✓ | ✓ | ✓ | ✓ |
uniCOIL avec zéro-shot doc2query-T5 | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil (requêtes mises en cache) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil (ONNX) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil (requêtes mises en cache) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil (ONNX) | ✓ | ✓ | ✓ | ✓ |
Corpus | Taille | Somme de contrôle |
---|---|---|
uniCOIL (noexp) | 24 Go | d9cc1ed3049746e68a2c91bf90e5212d |
uniCOIL (d2q-T5) | 41 Go | 1949a00bfd5e1f1a230a04bbc1f01539 |
SPLADE++ CoCondenser-EnsembleDistil | 66 Go | 2cdb2adc259b8fa6caf666b20ebdc0e8 |
SPLADE++ CoCondenser-SelfDistil | 76 Go | 061930dd615c7c807323ea7fc7957877 |
développeur | DL21 | DL22 | DL23 | |
---|---|---|---|---|
Lexical non supervisé, Doc complet | ||||
lignes de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Doc lexical non supervisé et segmenté | ||||
lignes de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Lexical clairsemé appris | ||||
uniCOIL noexp zéro tir | ✓ | ✓ | ✓ | ✓ |
uniCOIL avec zéro-shot doc2query-T5 | ✓ | ✓ | ✓ | ✓ |
Corpus | Taille | Somme de contrôle |
---|---|---|
Document MS MARCO V2 : uniCOIL (noexp) | 55 Go | 97ba262c497164de1054f357caea0c63 |
Document MS MARCO V2 : uniCOIL (d2q-T5) | 72 Go | c5639748c2cbad0152e10b0ebde3b804 |
Les corpus MS MARCO V2.1 sont dérivés des corpus V2 pour le TREC 2024 RAG Track. Les expériences ci-dessous capturent des sujets et des qrels initialement destinés aux corpus V2, mais ont été « projetés » sur les corpus V2.1.
développeur | DL21 | DL22 | DL23 | Développeur RAGgy | |
---|---|---|---|---|---|
Lexical non supervisé, Doc complet | |||||
lignes de base | + | + | + | + | + |
Doc lexical non supervisé et segmenté | |||||
lignes de base | + | + | + | + | + |
Clé:
bert-base-uncased
), requêtes par mots clés (?)Voir les instructions sous le tableau pour savoir comment reproduire les résultats d'un modèle sur tous les corpus BEIR "en une seule fois".
Corpus | F1 | F2 | MF | U1 | S1 | BGE (plat) | BGE (HNSW) |
---|---|---|---|---|---|---|---|
TREC-COVID | ? | ? | ? | ? | ? | complet:? | complet:? |
BioASQ | ? | ? | ? | ? | ? | complet:? | complet:? |
NFCcorpus | ? | ? | ? | ? | ? | complet:? | complet:? |
QN | ? | ? | ? | ? | ? | complet:? | complet:? |
HotpotQA | ? | ? | ? | ? | ? | complet:? | complet:? |
FiQA-2018 | ? | ? | ? | ? | ? | complet:? | complet:? |
Signal-1M(RT) | ? | ? | ? | ? | ? | complet:? | complet:? |
TREC-ACTUALITÉS | ? | ? | ? | ? | ? | complet:? | complet:? |
Robuste04 | ? | ? | ? | ? | ? | complet:? | complet:? |
ArguAna | ? | ? | ? | ? | ? | complet:? | complet:? |
Touche2020 | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Android | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-anglais | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Gaming | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Gis | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Mathematica | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Physique | ? | ? | ? | ? | ? | complet:? | complet:? |
Programmeurs CQADupStack | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Statistiques | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Tex | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Unix | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Webmasters | ? | ? | ? | ? | ? | complet:? | complet:? |
CQADupStack-Wordpress | ? | ? | ? | ? | ? | complet:? | complet:? |
Quora | ? | ? | ? | ? | ? | complet:? | complet:? |
DBPedia | ? | ? | ? | ? | ? | complet:? | complet:? |
SCIDOCS | ? | ? | ? | ? | ? | complet:? | complet:? |
FIÈVRE | ? | ? | ? | ? | ? | complet:? | complet:? |
Climat-FIÈVRE | ? | ? | ? | ? | ? | complet:? | complet:? |
SciFact | ? | ? | ? | ? | ? | complet:? | complet:? |
Pour reproduire les résultats SPLADE++ CoCondenser-EnsembleDistil, commencez par télécharger la collection :
wget https://rgw.cs.uwaterloo.ca/pyserini/data/beir-v1.0.0-splade-pp-ed.tar -P collections/
tar xvf collections/beir-v1.0.0-splade-pp-ed.tar -C collections/
L'archive tar fait 42 Go et a la somme de contrôle MD5 9c7de5b444a788c9e74c340bf833173b
. Une fois que vous avez décompressé les données, les commandes suivantes parcourront tous les corpus BEIR et exécuteront les régressions :
MODEL= " splade-pp-ed " ; CORPORA=(trec-covid bioasq nfcorpus nq hotpotqa fiqa signal1m trec-news robust04 arguana webis-touche2020 cqadupstack-android cqadupstack-english cqadupstack-gaming cqadupstack-gis cqadupstack-mathematica cqadupstack-physics cqadupstack-programmers cqadupstack-stats cqadupstack-tex cqadupstack-unix cqadupstack-webmasters cqadupstack-wordpress quora dbpedia-entity scidocs fever climate-fever scifact) ; for c in " ${CORPORA[@]} "
do
echo " Running $c ... "
python src/main/python/run_regression.py --index --verify --search --regression beir-v1.0.0- ${c} . ${MODEL} .onnx > logs/log.beir-v1.0.0- ${c} - ${MODEL} .onnx 2>&1
done
Vous pouvez vérifier les résultats en examinant les fichiers journaux dans logs/
.
Pour les autres modèles, modifiez les commandes ci-dessus comme suit :
Clé | Corpus | Somme de contrôle | MODEL |
---|---|---|---|
F1 | corpus | faefd5281b662c72ce03d22021e4ff6b | flat |
F2 | corpus-wp | 3cf8f3dcdcadd49362965dd4466e6ff2 | flat-wp |
MF | corpus | faefd5281b662c72ce03d22021e4ff6b | multifield |
U1 | unicoil-noexp | 4fd04d2af816a6637fc12922cccc8a83 | unicoil-noexp |
S1 | splade-pp-ed | 9c7de5b444a788c9e74c340bf833173b | splade-pp-ed |
BGE | bge-base-en-v1.5 | e4e8324ba3da3b46e715297407a24f00 | bge-base-en-v1.5-hnsw |
Le "Corpus" ci-dessus doit être remplacé par le nom complet du fichier beir-v1.0.0-${corpus}.tar
, par exemple beir-v1.0.0-bge-base-en-v1.5.tar
. Les commandes ci-dessus devraient fonctionner avec quelques modifications mineures : vous devrez modifier le paramètre --regression
pour qu'il corresponde au schéma des fichiers de configuration YAML dans src/main/resources/regression/
.
Les expériences décrites ci-dessous ne sont pas associées à des tests de régression rigoureux de bout en bout et offrent donc un niveau de reproductibilité inférieur. Pour la plupart, un copier-coller manuel des commandes dans un shell est nécessaire pour reproduire nos résultats.
Si vous avez trouvé Anserini utile, nous vous demandons simplement de contribuer en retour. Lors de la reproduction des résultats de base sur des collections de tests standard, veuillez nous faire savoir si vous réussissez en nous envoyant une pull request avec une simple note, comme ce qui apparaît en bas de page pour les disques 4 et 5. La reproductibilité est importante. pour nous, et nous aimerions connaître les réussites comme les échecs. Étant donné que la documentation de régression est générée automatiquement, les demandes d'extraction doivent être envoyées sur les modèles bruts. Ensuite, la documentation de régression peut être générée à l'aide du script bin/build.sh
. À votre tour, vous serez reconnu comme contributeur.
Au-delà de cela, il y a toujours des problèmes ouverts pour lesquels nous apprécierions de l'aide !
272565
(8/2/2022) : cette mise à niveau a créé des problèmes de compatibilité ascendante, voir #1952. Anserini détectera automatiquement les index Lucene 8 et désactivera la séparation cohérente pour éviter les erreurs d'exécution. Cependant, le code Lucene 9 exécuté sur les index Lucene 8 peut donner des résultats légèrement différents de ceux du code Lucene 8 exécuté sur les index Lucene 8. Le code Lucene 8 ne s'exécutera pas sur les index Lucene 9. Pyserini a également été mis à niveau et des problèmes similaires s'appliquent : le code Lucene 9 exécuté sur les index Lucene 8 peut donner des résultats légèrement différents du code Lucene 8 exécuté sur les index Lucene 8.17b702d
(11/07/2019) à partir de Java 8. Maven 3.3+ est également requis.75e36f9
(12/06/2019) ; avant cela, la boîte à outils utilise Lucene 7.6. Sur la base d'expériences préliminaires, la latence d'évaluation des requêtes a été considérablement améliorée dans Lucene 8. À la suite de cette mise à niveau, les résultats de toutes les régressions ont légèrement changé. Pour reproduire les anciens résultats de Lucene 7.6, utilisez la v0.5.1. Cette recherche est financée en partie par le Conseil de recherches en sciences naturelles et en génie (CRSNG) du Canada. Le soutien précédent provenait de la National Science Foundation des États-Unis sous IIS-1423002 et CNS-1405688. Les opinions, constatations et conclusions ou recommandations exprimées ne reflètent pas nécessairement les points de vue des sponsors.