Anserini ist ein Toolkit für die reproduzierbare Informationsbeschaffungsforschung. Indem wir auf Lucene aufbauen, wollen wir die Lücke zwischen akademischer Information-Retrieval-Forschung und der Praxis der Erstellung realer Suchanwendungen schließen. Unsere Bemühungen zielen unter anderem darauf ab, das Gegenteil davon zu sein.* Anserini entstand aus einer Reproduzierbarkeitsstudie verschiedener Open-Source-Retrieval-Engines im Jahr 2016 (Lin et al., ECIR 2016). Siehe Yang et al. (SIGIR 2017) und Yang et al. (JDIQ 2018) für Übersichten.
❗ Anserini wurde beim Commit 272565
(03.04.2024) von JDK 11 auf JDK 21 aktualisiert, was der Veröffentlichung von v0.35.0 entspricht.
Anserini ist in einem eigenständigen Fatjar verpackt, was auch den einfachsten Einstieg bietet. Vorausgesetzt, Sie haben Java bereits installiert, rufen Sie das Fatjar ab:
wget https://repo1.maven.org/maven2/io/anserini/anserini/0.38.0/anserini-0.38.0-fatjar.jar
Die folgenden Befehle generieren einen SPLADE++ ED-Lauf mit den Entwicklungsabfragen (codiert mit ONNX) im MS MARCO-Passagenkorpus:
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
Zur Bewertung:
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
Sehen Sie sich detaillierte Anweisungen für die aktuelle Fatjar-Version von Anserini (v0.38.0) an, um Regressionsexperimente für die MS MARCO V2.1-Korpora für TREC 2024 RAG, für MS MARCO V1 Passage und für BEIR zu reproduzieren, alles direkt aus dem Fatjar!
Außerdem verfügt Anserini über eine integrierte Webanwendung für interaktive Abfragen sowie eine REST-API, die von anderen Anwendungen verwendet werden kann. Schauen Sie sich hier unsere Dokumentation an.
Die meisten Anserini-Funktionen werden in der Pyserini-Python-Schnittstelle verfügbar gemacht. Wenn Sie sich mit Python besser auskennen, beginnen Sie dort, obwohl Anserini einen wichtigen Baustein von Pyserini darstellt und es sich daher weiterhin lohnt, etwas über Anserini zu lernen.
Sie benötigen Java 21 und Maven 3.9+, um Anserini zu erstellen. Klonen Sie unser Repo mit der Option --recurse-submodules
um sicherzustellen, dass das eval/
-Submodul ebenfalls geklont wird (alternativ verwenden Sie git submodule update --init
). Dann erstellen Sie mit Maven:
mvn clean package
Das tools/
-Verzeichnis, das Evaluierungstools und andere Skripte enthält, ist eigentlich dieses Repo, integriert als Git-Submodul (so dass es von verwandten Projekten gemeinsam genutzt werden kann). Erstellen Sie wie folgt (möglicherweise erhalten Sie Warnungen, die Sie aber ignorieren können):
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 ../../..
Damit sollten Sie startklar sein. Der Onboarding-Pfad für Anserini beginnt hier!
Wenn Sie Windows verwenden, verwenden Sie bitte WSL2, um Anserini zu erstellen. Informationen zur Installation von WSL2 finden Sie im WSL2-Installationsdokument, falls Sie dies noch nicht getan haben.
Beachten Sie, dass Tests unter Windows ohne WSL2 aufgrund von Codierungsproblemen möglicherweise fehlschlagen, siehe #1466. Eine einfache Problemumgehung besteht darin, Tests zu überspringen, indem Sie -Dmaven.test.skip=true
zum obigen mvn
-Befehl hinzufügen. Weitere Diskussionen zum Debuggen von Windows-Build-Fehlern finden Sie unter #1121.
Anserini wurde entwickelt, um End-to-End-Experimente mit verschiedenen Standard-IR-Testsammlungen sofort zu unterstützen. Jede dieser End-to-End -Regressionen beginnt mit dem Rohkorpus, erstellt den erforderlichen Index, führt Abrufläufe durch und generiert Auswertungsergebnisse. Einzelheiten finden Sie auf den einzelnen Seiten.
Entwickler | DL19 | DL20 | |
---|---|---|---|
Unbeaufsichtigt Sparse | |||
Lucene BoW-Grundlinien | ? | ? | ? |
Quantisierter BM25 | ? | ? | ? |
WordPiece-Grundlinien (vorab tokenisiert) | ? | ? | ? |
WordPiece-Grundlinien (Huggingface) | ? | ? | ? |
WordPiece + Lucene BoW-Grundlinien | ? | ? | ? |
doc2query | ? | ||
doc2query-T5 | ? | ? | ? |
Learned Sparse (uniCOIL-Familie) | |||
uniCOIL noexp | ? | ? | ? |
uniCOIL mit doc2query-T5 | ? | ? | ? |
uniCOIL mit TILDE | ? | ||
Sparse gelernt (andere) | |||
DeepImpact | ? | ||
SPLADEv2 | ? | ||
SPLADE++ CoCondenser-EnsembleDistil | ? | ? | ? |
SPLADE++ CoCondenser-SelfDistil | ? | ? | ? |
Learned Dense (HNSW-Indizes) | |||
cosDPR-destill | voll:? | voll:? | voll:? |
BGE-base-en-v1.5 | voll:? | voll:? | voll:? |
OpenAI Ada2 | voll:? int8:? | voll:? int8:? | voll:? int8:? |
Cohere Englisch v3.0 | voll:? int8:? | voll:? int8:? | voll:? int8:? |
Gelernte Dichte (flache Indizes) | |||
cosDPR-destill | voll:? | voll:? | voll:? |
BGE-base-en-v1.5 | voll:? | voll:? | voll:? |
OpenAI Ada2 | voll:? int8:?️ | voll:? int8:? | voll:? int8:? |
Cohere Englisch v3.0 | voll:? int8:? | voll:? int8:? | voll:? int8:? |
Gelernte Dichte (Invertiert; experimentell) | |||
cosDPR-destil mit „falschen Worten“ | ? | ? | ? |
cosDPR-Destillation mit „LexLSH“ | ? | ? | ? |
Schlüssel:
Korpora | Größe | Prüfsumme |
---|---|---|
Quantisierter BM25 | 1,2 GB | 0a623e2c97ac6b7e814bf1323a97b435 |
uniCOIL (noexp) | 2,7 GB | f17ddd8c7c00ff121c3c3b147d2e17d8 |
uniCOIL (d2q-T5) | 3,4 GB | 78eef752c78c8691f7d61600ceed306f |
uniCOIL (TILDE) | 3,9 GB | 12a9c289d94e32fd63a7d39c9677d75c |
DeepImpact | 3,6 GB | 73843885b503af3c8b3ee62e5f5a9900 |
SPLADEv2 | 9,9 GB | b5d126f5d9a8e1b3ef3f5cb0ba651725 |
SPLADE++ CoCondenser-EnsembleDistil | 4,2 GB | e489133bdc54ee1e7c62a32aa582bc77 |
SPLADE++ CoCondenser-SelfDistil | 4,8 GB | cb7e264222f2bf2221dd2c9d28190be1 |
cosDPR-destill | 57 GB | e20ffbc8b5e7f760af31298aefeaebbd |
BGE-base-en-v1.5 | 59 GB | 353d2c9e72e858897ad479cca4ea0db1 |
OpenAI-ada2 | 109 GB | a4d843d522ff3a3af7edbee789a63402 |
Cohere embed-english-v3.0 | 38 GB | 06a6e38a0522850c6aa504db7b2617f5 |
Entwickler | DL19 | DL20 | |
---|---|---|---|
Unbeaufsichtigtes Lexikon, vollständiges Dokument * | |||
Lucene BoW-Grundlinien | + | + | + |
WordPiece-Grundlinien (vorab tokenisiert) | + | + | + |
WordPiece-Grundlinien (Huggingface-Tokenizer) | + | + | + |
WordPiece + Lucene BoW-Grundlinien | + | + | + |
doc2query-T5 | + | + | + |
Unbeaufsichtigtes lexikalisches, segmentiertes Dokument * | |||
Lucene BoW-Grundlinien | + | + | + |
WordPiece-Grundlinien (vorab tokenisiert) | + | + | + |
WordPiece + Lucene BoW-Grundlinien | + | + | + |
doc2query-T5 | + | + | + |
Sparse-Lexika gelernt | |||
uniCOIL noexp | ✓ | ✓ | ✓ |
uniCOIL mit doc2query-T5 | ✓ | ✓ | ✓ |
Korpora | Größe | Prüfsumme |
---|---|---|
MS MARCO V1-Dokument: uniCOIL (noexp) | 11 GB | 11b226e1cacd9c8ae0a660fd14cdd710 |
MS MARCO V1 Dokument: uniCOIL (d2q-T5) | 19 GB | 6a00e2c0c375cb1e52c83ae5ac377ebb |
Entwickler | DL21 | DL22 | DL23 | |
---|---|---|---|---|
Unbeaufsichtigtes Lexikon, Originalkorpus | ||||
Grundlinien | + | + | + | + |
doc2query-T5 | + | + | + | + |
Unbeaufsichtigter lexikalischer, erweiterter Korpus | ||||
Grundlinien | + | + | + | + |
doc2query-T5 | + | + | + | + |
Sparse-Lexika gelernt | ||||
uniCOIL noexp Zero-Shot | ✓ | ✓ | ✓ | ✓ |
uniCOIL mit doc2query-T5 Zero-Shot | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil (zwischengespeicherte Abfragen) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil (ONNX) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil (zwischengespeicherte Abfragen) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil (ONNX) | ✓ | ✓ | ✓ | ✓ |
Korpora | Größe | Prüfsumme |
---|---|---|
uniCOIL (noexp) | 24 GB | d9cc1ed3049746e68a2c91bf90e5212d |
uniCOIL (d2q-T5) | 41 GB | 1949a00bfd5e1f1a230a04bbc1f01539 |
SPLADE++ CoCondenser-EnsembleDistil | 66 GB | 2cdb2adc259b8fa6caf666b20ebdc0e8 |
SPLADE++ CoCondenser-SelfDistil | 76 GB | 061930dd615c7c807323ea7fc7957877 |
Entwickler | DL21 | DL22 | DL23 | |
---|---|---|---|---|
Unbeaufsichtigtes Lexikon, vollständiges Dokument | ||||
Grundlinien | + | + | + | + |
doc2query-T5 | + | + | + | + |
Unbeaufsichtigtes lexikalisches, segmentiertes Dokument | ||||
Grundlinien | + | + | + | + |
doc2query-T5 | + | + | + | + |
Sparse-Lexika gelernt | ||||
uniCOIL noexp Zero-Shot | ✓ | ✓ | ✓ | ✓ |
uniCOIL mit doc2query-T5 Zero-Shot | ✓ | ✓ | ✓ | ✓ |
Korpora | Größe | Prüfsumme |
---|---|---|
MS MARCO V2-Dokument: uniCOIL (noexp) | 55 GB | 97ba262c497164de1054f357caea0c63 |
MS MARCO V2 Dokument: uniCOIL (d2q-T5) | 72 GB | c5639748c2cbad0152e10b0ebde3b804 |
Die MS MARCO V2.1-Korpora wurden aus den V2-Korpora für den TREC 2024 RAG Track abgeleitet. Die folgenden Experimente erfassen Themen und QRels, die ursprünglich auf die V2-Korpora abzielten, aber auf die V2.1-Korpora „projiziert“ wurden.
Entwickler | DL21 | DL22 | DL23 | RAGgy-Entwickler | |
---|---|---|---|---|---|
Unbeaufsichtigtes Lexikon, vollständiges Dokument | |||||
Grundlinien | + | + | + | + | + |
Unbeaufsichtigtes lexikalisches, segmentiertes Dokument | |||||
Grundlinien | + | + | + | + | + |
Schlüssel:
bert-base-uncased
Tokenizer), Schlüsselwortabfragen (?)In den Anweisungen unter der Tabelle erfahren Sie, wie Sie die Ergebnisse eines Modells für alle BEIR-Korpora „auf einmal“ reproduzieren.
Korpus | F1 | F2 | MF | U1 | S1 | BGE (flach) | BGE (HNSW) |
---|---|---|---|---|---|---|---|
TREC-COVID | ? | ? | ? | ? | ? | voll:? | voll:? |
BioASQ | ? | ? | ? | ? | ? | voll:? | voll:? |
NFCorpus | ? | ? | ? | ? | ? | voll:? | voll:? |
NQ | ? | ? | ? | ? | ? | voll:? | voll:? |
HotpotQA | ? | ? | ? | ? | ? | voll:? | voll:? |
FiQA-2018 | ? | ? | ? | ? | ? | voll:? | voll:? |
Signal-1M(RT) | ? | ? | ? | ? | ? | voll:? | voll:? |
TREC-NEWS | ? | ? | ? | ? | ? | voll:? | voll:? |
Robust04 | ? | ? | ? | ? | ? | voll:? | voll:? |
ArguAna | ? | ? | ? | ? | ? | voll:? | voll:? |
Touche2020 | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Android | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Englisch | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Gaming | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Gis | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Mathematica | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Physik | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Programmierer | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Statistiken | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Tex | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Unix | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Webmaster | ? | ? | ? | ? | ? | voll:? | voll:? |
CQADupStack-Wordpress | ? | ? | ? | ? | ? | voll:? | voll:? |
Quora | ? | ? | ? | ? | ? | voll:? | voll:? |
DBPedia | ? | ? | ? | ? | ? | voll:? | voll:? |
SCIDOCS | ? | ? | ? | ? | ? | voll:? | voll:? |
FIEBER | ? | ? | ? | ? | ? | voll:? | voll:? |
Klimafieber | ? | ? | ? | ? | ? | voll:? | voll:? |
SciFact | ? | ? | ? | ? | ? | voll:? | voll:? |
Um die SPLADE++ CoCondenser-EnsembleDistil-Ergebnisse zu reproduzieren, laden Sie zunächst die Sammlung herunter:
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/
Der Tarball ist 42 GB groß und hat die MD5-Prüfsumme 9c7de5b444a788c9e74c340bf833173b
. Sobald Sie die Daten entpackt haben, durchlaufen die folgenden Befehle alle BEIR-Korpora und führen die Regressionen aus:
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
Sie können die Ergebnisse überprüfen, indem Sie die Protokolldateien in logs/
untersuchen.
Für die anderen Modelle ändern Sie die obigen Befehle wie folgt:
Schlüssel | Korpus | Prüfsumme | 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 |
Das obige „Korpus“ sollte durch den vollständigen Dateinamen beir-v1.0.0-${corpus}.tar
ersetzt werden, z. B. beir-v1.0.0-bge-base-en-v1.5.tar
. Die oben genannten Befehle sollten mit einigen geringfügigen Änderungen funktionieren: Sie müssen den Parameter --regression
anpassen, um ihn an das Schema der YAML-Konfigurationsdateien in src/main/resources/regression/
anzupassen.
Die unten beschriebenen Experimente sind nicht mit strengen End-to-End-Regressionstests verbunden und bieten daher einen niedrigeren Standard an Reproduzierbarkeit. In den meisten Fällen ist das manuelle Kopieren und Einfügen von Befehlen in eine Shell erforderlich, um unsere Ergebnisse zu reproduzieren.
Wenn Sie Anserini als hilfreich empfunden haben, möchten wir Sie ganz einfach um einen Beitrag bitten. Teilen Sie uns im Zuge der Reproduktion der Basisergebnisse für Standardtestsammlungen bitte mit, ob Sie erfolgreich sind, indem Sie uns eine Pull-Anfrage mit einer einfachen Notiz senden, wie sie unten auf der Seite für die Datenträger 4 und 5 angezeigt wird. Reproduzierbarkeit ist wichtig uns, und wir möchten sowohl über Erfolge als auch über Misserfolge Bescheid wissen. Da die Regressionsdokumentation automatisch generiert wird, sollten Pull-Anfragen an die Rohvorlagen gesendet werden. Anschließend kann die Regressionsdokumentation mit dem Skript bin/build.sh
generiert werden. Im Gegenzug werden Sie als Mitwirkender anerkannt.
Darüber hinaus gibt es immer offene Fragen, bei denen wir uns über Hilfe freuen würden!
272565
(02.08.2022) auf Lucene 9.3 aktualisiert: Dieses Upgrade verursachte Abwärtskompatibilitätsprobleme, siehe #1952. Anserini erkennt Lucene 8-Indizes automatisch und deaktiviert konsistentes Tie-Breaking, um Laufzeitfehler zu vermeiden. Allerdings liefert Lucene 9-Code, der auf Lucene 8-Indizes ausgeführt wird, möglicherweise etwas andere Ergebnisse als Lucene 8-Code, der auf Lucene 8-Indizes ausgeführt wird. Lucene 8-Code kann nicht auf Lucene 9-Indizes ausgeführt werden. Pyserini wurde ebenfalls aktualisiert und es treten ähnliche Probleme auf: Lucene 9-Code, der auf Lucene 8-Indizes ausgeführt wird, liefert möglicherweise etwas andere Ergebnisse als Lucene 8-Code, der auf Lucene 8-Indizes ausgeführt wird.17b702d
(11.07.2019) von Java 8 auf Java 11 aktualisiert. Maven 3.3+ ist ebenfalls erforderlich.75e36f9
(12.06.2019) auf Lucene 8.0 aktualisiert; Zuvor verwendet das Toolkit Lucene 7.6. Basierend auf vorläufigen Experimenten wurde die Latenz der Abfrageauswertung in Lucene 8 erheblich verbessert. Als Ergebnis dieses Upgrades haben sich die Ergebnisse aller Regressionen leicht geändert. Um alte Ergebnisse von Lucene 7.6 zu reproduzieren, verwenden Sie v0.5.1. Diese Forschung wird teilweise vom Natural Sciences and Engineering Research Council (NSERC) von Kanada unterstützt. Frühere Unterstützung kam von der US National Science Foundation unter IIS-1423002 und CNS-1405688. Alle geäußerten Meinungen, Erkenntnisse und Schlussfolgerungen oder Empfehlungen spiegeln nicht unbedingt die Ansichten der Sponsoren wider.