Anserini es un conjunto de herramientas para la investigación de recuperación de información reproducible. Al basarnos en Lucene, nuestro objetivo es cerrar la brecha entre la investigación de recuperación de información académica y la práctica de crear aplicaciones de búsqueda del mundo real. Entre otros objetivos, nuestro esfuerzo pretende ser lo opuesto a esto.* Anserini surgió de un estudio de reproducibilidad de varios motores de recuperación de código abierto en 2016 (Lin et al., ECIR 2016). Véase Yang et al. (SIGIR 2017) y Yang et al. (JDIQ 2018) para obtener resúmenes.
❗ Anserini se actualizó de JDK 11 a JDK 21 en la confirmación 272565
(03/04/2024), que corresponde al lanzamiento de v0.35.0.
Anserini está empaquetado en un fatjar autónomo, que también proporciona la forma más sencilla de empezar. Suponiendo que ya tienes Java instalado, recupera el fatjar:
wget https://repo1.maven.org/maven2/io/anserini/anserini/0.38.0/anserini-0.38.0-fatjar.jar
Los siguientes comandos generarán una ejecución de SPLADE++ ED con las consultas de desarrollo (codificadas usando ONNX) en el corpus de pasajes de 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
Para evaluar:
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
Consulte las instrucciones detalladas para la versión actual de fatjar de Anserini (v0.38.0) para reproducir experimentos de regresión en los corpus de MS MARCO V2.1 para TREC 2024 RAG, en MS MARCO V1 Passage y en BEIR, ¡todo directamente desde fatjar!
Además, Anserini viene con una aplicación web incorporada para consultas interactivas junto con una API REST que pueden utilizar otras aplicaciones. Consulte nuestra documentación aquí.
La mayoría de las funciones de Anserini están expuestas en la interfaz de Pyserini Python. Si se siente más cómodo con Python, comience por ahí, aunque Anserini forma un componente importante de Pyserini, por lo que vale la pena aprender sobre Anserini.
Necesitará Java 21 y Maven 3.9+ para compilar Anserini. Clona nuestro repositorio con la opción --recurse-submodules
para asegurarte de que el submódulo eval/
también se clone (alternativamente, usa git submodule update --init
). Luego, compila usando Maven:
mvn clean package
El directorio tools/
, que contiene herramientas de evaluación y otros scripts, es en realidad este repositorio, integrado como un submódulo de Git (para que pueda compartirse entre proyectos relacionados). Compile de la siguiente manera (es posible que reciba advertencias, pero está bien ignorarlas):
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 ../../..
Con eso, deberías estar listo para comenzar. ¡El camino de incorporación de Anserini comienza aquí!
Si está utilizando Windows, utilice WSL2 para compilar Anserini. Consulte el documento de instalación de WSL2 para instalar WSL2 si aún no lo ha hecho.
Tenga en cuenta que en Windows sin WSL2, las pruebas pueden fallar debido a problemas de codificación; consulte el n.º 1466. Una solución sencilla es omitir las pruebas agregando -Dmaven.test.skip=true
al comando mvn
anterior. Consulte el n.º 1121 para obtener información adicional sobre la depuración de errores de compilación de Windows.
Anserini está diseñado para admitir experimentos de un extremo a otro en varias colecciones de pruebas de infrarrojos estándar listas para usar. Cada una de estas regresiones de un extremo a otro comienza a partir del corpus sin procesar, crea el índice necesario, realiza ejecuciones de recuperación y genera resultados de evaluación. Consulte las páginas individuales para obtener más detalles.
desarrollador | DL19 | DL20 | |
---|---|---|---|
Escaso sin supervisión | |||
Líneas base de Lucene BoW | ? | ? | ? |
BM25 cuantificado | ? | ? | ? |
Líneas base de WordPieza (pre-tokenizadas) | ? | ? | ? |
Líneas base de WordPieza (Huggingface) | ? | ? | ? |
Líneas base de Wordpiece + Lucene BoW | ? | ? | ? |
doc2query | ? | ||
doc2query-T5 | ? | ? | ? |
Aprendido Sparse (familia uniCOIL) | |||
uniCOIL noexp | ? | ? | ? |
uniCOIL con doc2query-T5 | ? | ? | ? |
uniCOIL con TILDE | ? | ||
Aprendido Escaso (otro) | |||
Impacto profundo | ? | ||
SPLADEv2 | ? | ||
SPLADE++ CoCondensador-EnsembleDistil | ? | ? | ? |
SPLADE++ CoCondensador-SelfDistil | ? | ? | ? |
Aprendizaje denso (índices HNSW) | |||
cosDPR-distil | lleno:? | lleno:? | lleno:? |
BGE-base-es-v1.5 | lleno:? | lleno:? | lleno:? |
OpenAI Ada2 | lleno:? int8:? | lleno:? int8:? | lleno:? int8:? |
Cohere Inglés v3.0 | lleno:? int8:? | lleno:? int8:? | lleno:? int8:? |
Denso aprendido (índices planos) | |||
cosDPR-distil | lleno:? | lleno:? | lleno:? |
BGE-base-es-v1.5 | lleno:? | lleno:? | lleno:? |
OpenAI Ada2 | lleno:? int8:?️ | lleno:? int8:? | lleno:? int8:? |
Cohere Inglés v3.0 | lleno:? int8:? | lleno:? int8:? | lleno:? int8:? |
Aprendido denso (invertido; experimental) | |||
cosDPR-distil con "palabras falsas" | ? | ? | ? |
cosDPR-distil con "LexLSH" | ? | ? | ? |
Llave:
corpus | Tamaño | Suma de comprobación |
---|---|---|
BM25 cuantificado | 1,2GB | 0a623e2c97ac6b7e814bf1323a97b435 |
uniCOIL (noexp) | 2,7GB | f17ddd8c7c00ff121c3c3b147d2e17d8 |
uniCOIL (d2q-T5) | 3,4GB | 78eef752c78c8691f7d61600ceed306f |
uniCOIL (TILDE) | 3,9GB | 12a9c289d94e32fd63a7d39c9677d75c |
Impacto profundo | 3,6GB | 73843885b503af3c8b3ee62e5f5a9900 |
SPLADEv2 | 9,9GB | b5d126f5d9a8e1b3ef3f5cb0ba651725 |
SPLADE++ CoCondensador-EnsembleDistil | 4,2GB | e489133bdc54ee1e7c62a32aa582bc77 |
SPLADE++ CoCondensador-SelfDistil | 4,8GB | cb7e264222f2bf2221dd2c9d28190be1 |
cosDPR-distil | 57GB | e20ffbc8b5e7f760af31298aefeaebbd |
BGE-base-es-v1.5 | 59GB | 353d2c9e72e858897ad479cca4ea0db1 |
OpenAI-ada2 | 109GB | a4d843d522ff3a3af7edbee789a63402 |
Cohere embed-inglés-v3.0 | 38GB | 06a6e38a0522850c6aa504db7b2617f5 |
desarrollador | DL19 | DL20 | |
---|---|---|---|
Léxico no supervisado, documento completo * | |||
Líneas base de Lucene BoW | + | + | + |
Líneas base de WordPieza (pre-tokenizadas) | + | + | + |
Líneas base de WordPieza (tokenizador Huggingface) | + | + | + |
Líneas base de Wordpiece + Lucene BoW | + | + | + |
doc2query-T5 | + | + | + |
Documento léxico segmentado no supervisado * | |||
Líneas base de Lucene BoW | + | + | + |
Líneas base de WordPieza (pre-tokenizadas) | + | + | + |
Líneas base de Wordpiece + Lucene BoW | + | + | + |
doc2query-T5 | + | + | + |
Léxico disperso aprendido | |||
uniCOIL noexp | ✓ | ✓ | ✓ |
uniCOIL con doc2query-T5 | ✓ | ✓ | ✓ |
corpus | Tamaño | Suma de comprobación |
---|---|---|
Documento MS MARCO V1: uniCOIL (noexp) | 11GB | 11b226e1cacd9c8ae0a660fd14cdd710 |
Documento MS MARCO V1: uniCOIL (d2q-T5) | 19GB | 6a00e2c0c375cb1e52c83ae5ac377ebb |
desarrollador | DL21 | DL22 | DL23 | |
---|---|---|---|---|
Corpus original léxico no supervisado | ||||
líneas de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Corpus léxico aumentado y no supervisado | ||||
líneas de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Léxico disperso aprendido | ||||
uniCOIL noexp disparo cero | ✓ | ✓ | ✓ | ✓ |
uniCOIL con doc2query-T5 de disparo cero | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil (consultas en caché) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondensador-EnsembleDistil (ONNX) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil (consultas en caché) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondensador-SelfDistil (ONNX) | ✓ | ✓ | ✓ | ✓ |
corpus | Tamaño | Suma de comprobación |
---|---|---|
uniCOIL (noexp) | 24GB | d9cc1ed3049746e68a2c91bf90e5212d |
uniCOIL (d2q-T5) | 41GB | 1949a00bfd5e1f1a230a04bbc1f01539 |
SPLADE++ CoCondensador-EnsembleDistil | 66GB | 2cdb2adc259b8fa6caf666b20ebdc0e8 |
SPLADE++ CoCondensador-SelfDistil | 76GB | 061930dd615c7c807323ea7fc7957877 |
desarrollador | DL21 | DL22 | DL23 | |
---|---|---|---|---|
Léxico no supervisado, documento completo | ||||
líneas de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Documento léxico segmentado no supervisado | ||||
líneas de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Léxico disperso aprendido | ||||
uniCOIL noexp disparo cero | ✓ | ✓ | ✓ | ✓ |
uniCOIL con doc2query-T5 de disparo cero | ✓ | ✓ | ✓ | ✓ |
corpus | Tamaño | Suma de comprobación |
---|---|---|
Documento MS MARCO V2: uniCOIL (noexp) | 55GB | 97ba262c497164de1054f357caea0c63 |
Documento MS MARCO V2: uniCOIL (d2q-T5) | 72GB | c5639748c2cbad0152e10b0ebde3b804 |
Los corpus MS MARCO V2.1 se derivaron de los corpus V2 para TREC 2024 RAG Track. Los experimentos siguientes capturan temas y qrels originalmente destinados a los corpus V2, pero se han "proyectado" a los corpus V2.1.
desarrollador | DL21 | DL22 | DL23 | Desarrollador RAGgy | |
---|---|---|---|---|---|
Léxico no supervisado, documento completo | |||||
líneas de base | + | + | + | + | + |
Documento léxico segmentado no supervisado | |||||
líneas de base | + | + | + | + | + |
Llave:
bert-base-uncased
), consultas de palabras clave (?)Consulte las instrucciones debajo de la tabla para saber cómo reproducir los resultados de un modelo en todos los corpus BEIR "de una sola vez".
Cuerpo | F1 | F2 | MF | U1 | T1 | BGE (plano) | BGE (HNSW) |
---|---|---|---|---|---|---|---|
TREC-COVID | ? | ? | ? | ? | ? | lleno:? | lleno:? |
BioASQ | ? | ? | ? | ? | ? | lleno:? | lleno:? |
NFCorpus | ? | ? | ? | ? | ? | lleno:? | lleno:? |
NQ | ? | ? | ? | ? | ? | lleno:? | lleno:? |
HotpotQA | ? | ? | ? | ? | ? | lleno:? | lleno:? |
FiQA-2018 | ? | ? | ? | ? | ? | lleno:? | lleno:? |
Señal-1M(RT) | ? | ? | ? | ? | ? | lleno:? | lleno:? |
TREC-NOTICIAS | ? | ? | ? | ? | ? | lleno:? | lleno:? |
Robusto04 | ? | ? | ? | ? | ? | lleno:? | lleno:? |
ArguAna | ? | ? | ? | ? | ? | lleno:? | lleno:? |
Toque2020 | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Android | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Inglés | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Juegos | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Gis | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Mathematica | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Física | ? | ? | ? | ? | ? | lleno:? | lleno:? |
Programadores CQADupStack | ? | ? | ? | ? | ? | lleno:? | lleno:? |
Estadísticas de CQADupStack | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Tex | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Unix | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Webmasters | ? | ? | ? | ? | ? | lleno:? | lleno:? |
CQADupStack-Wordpress | ? | ? | ? | ? | ? | lleno:? | lleno:? |
Quora | ? | ? | ? | ? | ? | lleno:? | lleno:? |
DBPedia | ? | ? | ? | ? | ? | lleno:? | lleno:? |
SCIDOCS | ? | ? | ? | ? | ? | lleno:? | lleno:? |
FIEBRE | ? | ? | ? | ? | ? | lleno:? | lleno:? |
FIEBRE Climática | ? | ? | ? | ? | ? | lleno:? | lleno:? |
ciencia ficción | ? | ? | ? | ? | ? | lleno:? | lleno:? |
Para reproducir los resultados de SPLADE++ CoCondenser-EnsembleDistil, comience descargando la colección:
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/
El archivo tar tiene 42 GB y tiene una suma de comprobación MD5 9c7de5b444a788c9e74c340bf833173b
. Una vez que haya descomprimido los datos, los siguientes comandos recorrerán todos los corpus BEIR y ejecutarán las regresiones:
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
Puede verificar los resultados examinando los archivos de registro en logs/
.
Para los otros modelos, modifique los comandos anteriores de la siguiente manera:
Llave | Cuerpo | Suma de comprobación | MODEL |
---|---|---|---|
F1 | corpus | faefd5281b662c72ce03d22021e4ff6b | flat |
F2 | corpus-wp | 3cf8f3dcdcadd49362965dd4466e6ff2 | flat-wp |
MF | corpus | faefd5281b662c72ce03d22021e4ff6b | multifield |
U1 | unicoil-noexp | 4fd04d2af816a6637fc12922cccc8a83 | unicoil-noexp |
T1 | splade-pp-ed | 9c7de5b444a788c9e74c340bf833173b | splade-pp-ed |
BGE | bge-base-en-v1.5 | e4e8324ba3da3b46e715297407a24f00 | bge-base-en-v1.5-hnsw |
El "Corpus" anterior debe sustituirse por el nombre completo del archivo beir-v1.0.0-${corpus}.tar
, por ejemplo, beir-v1.0.0-bge-base-en-v1.5.tar
. Los comandos anteriores deberían funcionar con algunas modificaciones menores: deberá modificar el parámetro --regression
para que coincida con el esquema de los archivos de configuración YAML en src/main/resources/regression/
.
Los experimentos que se describen a continuación no están asociados con pruebas de regresión rigurosas de un extremo a otro y, por lo tanto, proporcionan un estándar de reproducibilidad más bajo. En su mayor parte, es necesario copiar y pegar manualmente comandos en un shell para reproducir nuestros resultados.
Si Anserini le ha resultado útil, tenemos una sencilla solicitud para que contribuya. En el curso de la reproducción de resultados de referencia en colecciones de pruebas estándar, infórmenos si tiene éxito enviándonos una solicitud de extracción con una nota simple, como la que aparece en la parte inferior de la página para los Discos 4 y 5. La reproducibilidad es importante para nosotros, y nos gustaría conocer tanto los éxitos como los fracasos. Dado que la documentación de regresión se genera automáticamente, las solicitudes de extracción deben enviarse contra las plantillas sin formato. Luego, la documentación de regresión se puede generar utilizando el script bin/build.sh
. A su vez, serás reconocido como colaborador.
Más allá de eso, siempre hay problemas abiertos sobre los que agradeceríamos recibir ayuda.
272565
(2/8/2022): esta actualización creó problemas de compatibilidad con versiones anteriores, consulte el n.º 1952. Anserini detectará automáticamente los índices de Lucene 8 y desactivará el desempate consistente para evitar errores de tiempo de ejecución. Sin embargo, el código de Lucene 9 que se ejecuta en índices de Lucene 8 puede dar resultados ligeramente diferentes a los del código de Lucene 8 que se ejecuta en índices de Lucene 8. El código de Lucene 8 no se ejecutará en índices de Lucene 9. Pyserini también se ha actualizado y se aplican problemas similares: el código de Lucene 9 que se ejecuta en índices de Lucene 8 puede dar resultados ligeramente diferentes a los del código de Lucene 8 que se ejecuta en índices de Lucene 8.17b702d
(11/7/2019) desde Java 8. También se requiere Maven 3.3+.75e36f9
(12/06/2019); Antes de eso, el kit de herramientas utiliza Lucene 7.6. Según experimentos preliminares, la latencia de evaluación de consultas ha mejorado mucho en Lucene 8. Como resultado de esta actualización, los resultados de todas las regresiones han cambiado ligeramente. Para reproducir resultados antiguos de Lucene 7.6, utilice v0.5.1. Esta investigación cuenta con el apoyo parcial del Consejo de Investigación en Ingeniería y Ciencias Naturales (NSERC) de Canadá. El apoyo anterior provino de la Fundación Nacional de Ciencias de EE. UU. bajo IIS-1423002 y CNS-1405688. Cualquier opinión, hallazgo, conclusión o recomendación expresada no refleja necesariamente los puntos de vista de los patrocinadores.