Anserini é um kit de ferramentas para pesquisa reproduzível de recuperação de informação. Ao desenvolver o Lucene, pretendemos preencher a lacuna entre a pesquisa acadêmica de recuperação de informação e a prática de construção de aplicações de pesquisa do mundo real. Entre outros objetivos, nosso esforço visa ser o oposto disso.* Anserini surgiu de um estudo de reprodutibilidade de vários mecanismos de recuperação de código aberto em 2016 (Lin et al., ECIR 2016). Veja Yang et al. (SIGIR 2017) e Yang et al. (JDIQ 2018) para visões gerais.
❗ Anserini foi atualizado do JDK 11 para JDK 21 no commit 272565
(2024/04/03), que corresponde ao lançamento da v0.35.0.
O Anserini é embalado em um fatjar independente, que também fornece a maneira mais simples de começar. Supondo que você já tenha o Java instalado, busque o fatjar:
wget https://repo1.maven.org/maven2/io/anserini/anserini/0.38.0/anserini-0.38.0-fatjar.jar
Os comandos a seguir irão gerar uma execução SPLADE++ ED com as consultas dev (codificadas usando ONNX) no corpus de passagem 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 avaliar:
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
Veja instruções detalhadas para a versão atual do fatjar do Anserini (v0.38.0) para reproduzir experimentos de regressão nos corpora MS MARCO V2.1 para TREC 2024 RAG, no MS MARCO V1 Passage e no BEIR, tudo diretamente do fatjar!
Além disso, o Anserini vem com um webapp integrado para consultas interativas junto com uma API REST que pode ser usada por outros aplicativos. Confira nossa documentação aqui.
A maioria dos recursos do Anserini são expostos na interface Pyserini Python. Se você se sentir mais confortável com Python, comece por aí, embora o Anserini seja um importante alicerce do Pyserini, por isso vale a pena aprender sobre o Anserini.
Você precisará do Java 21 e do Maven 3.9+ para construir o Anserini. Clone nosso repositório com a opção --recurse-submodules
para garantir que o eval/
submódulo também seja clonado (como alternativa, use git submodule update --init
). Em seguida, construa usando Maven:
mvn clean package
O diretório tools/
, que contém ferramentas de avaliação e outros scripts, é na verdade este repositório, integrado como um submódulo Git (para que possa ser compartilhado entre projetos relacionados). Construa da seguinte maneira (você pode receber avisos, mas pode ignorar):
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 ../../..
Com isso, você deve estar pronto para ir. O caminho de integração do Anserini começa aqui!
Se você estiver usando Windows, use WSL2 para construir o Anserini. Consulte o documento de instalação do WSL2 para instalar o WSL2, caso ainda não o tenha feito.
Observe que no Windows sem WSL2, os testes podem falhar devido a problemas de codificação, consulte #1466. Uma solução simples é pular os testes adicionando -Dmaven.test.skip=true
ao comando mvn
acima. Consulte #1121 para discussões adicionais sobre depuração de erros de compilação do Windows.
O Anserini foi projetado para oferecer suporte a experimentos completos em várias coleções de testes IR padrão prontos para uso. Cada uma dessas regressões ponta a ponta começa no corpus bruto, constrói o índice necessário, executa execuções de recuperação e gera resultados de avaliação. Consulte as páginas individuais para obter detalhes.
desenvolvedor | DL19 | DL20 | |
---|---|---|---|
Esparso não supervisionado | |||
Linhas de base Lucene BoW | ? | ? | ? |
BM25 quantizado | ? | ? | ? |
Linhas de base do WordPiece (pré-tokenizadas) | ? | ? | ? |
Linhas de base do WordPiece (Huggingface) | ? | ? | ? |
Linhas de base WordPiece + Lucene BoW | ? | ? | ? |
doc2query | ? | ||
doc2query-T5 | ? | ? | ? |
Aprendeu esparso (família uniCOIL) | |||
uniCOIL noexp | ? | ? | ? |
uniCOIL com doc2query-T5 | ? | ? | ? |
uniCOIL com TILDE | ? | ||
Aprendi escasso (outro) | |||
Impacto Profundo | ? | ||
SPLADEv2 | ? | ||
SPLADE++ CoCondenser-EnsembleDistil | ? | ? | ? |
SPLADE++ CoCondenser-SelfDistil | ? | ? | ? |
Densa aprendida (índices HNSW) | |||
cosDPR-destilar | completo:? | completo:? | completo:? |
BGE-base-pt-v1.5 | completo:? | completo:? | completo:? |
OpenAI Ada2 | completo:? int8:? | completo:? int8:? | completo:? int8:? |
Cohere Inglês v3.0 | completo:? int8:? | completo:? int8:? | completo:? int8:? |
Densa aprendida (índices planos) | |||
cosDPR-destilar | completo:? | completo:? | completo:? |
BGE-base-pt-v1.5 | completo:? | completo:? | completo:? |
OpenAI Ada2 | completo:? int8:?️ | completo:? int8:? | completo:? int8:? |
Cohere Inglês v3.0 | completo:? int8:? | completo:? int8:? | completo:? int8:? |
Densa aprendida (invertida; experimental) | |||
cosDPR-distil com "palavras falsas" | ? | ? | ? |
cosDPR-distil com "LexLSH" | ? | ? | ? |
Chave:
Corpos | Tamanho | Soma de verificação |
---|---|---|
BM25 quantizado | 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++ CoCondenser-EnsembleDistil | 4,2GB | e489133bdc54ee1e7c62a32aa582bc77 |
SPLADE++ CoCondenser-SelfDistil | 4,8GB | cb7e264222f2bf2221dd2c9d28190be1 |
cosDPR-destilar | 57 GB | e20ffbc8b5e7f760af31298aefeaebbd |
BGE-base-pt-v1.5 | 59GB | 353d2c9e72e858897ad479cca4ea0db1 |
OpenAI-ada2 | 109GB | a4d843d522ff3a3af7edbee789a63402 |
Cohere incorporar-english-v3.0 | 38 GB | 06a6e38a0522850c6aa504db7b2617f5 |
desenvolvedor | DL19 | DL20 | |
---|---|---|---|
Lexical não supervisionado, documento completo * | |||
Linhas de base Lucene BoW | + | + | + |
Linhas de base do WordPiece (pré-tokenizadas) | + | + | + |
Linhas de base do WordPiece (tokenizer Huggingface) | + | + | + |
Linhas de base WordPiece + Lucene BoW | + | + | + |
doc2query-T5 | + | + | + |
Documento lexical não supervisionado e segmentado * | |||
Linhas de base Lucene BoW | + | + | + |
Linhas de base do WordPiece (pré-tokenizadas) | + | + | + |
Linhas de base WordPiece + Lucene BoW | + | + | + |
doc2query-T5 | + | + | + |
Lexical esparso aprendido | |||
uniCOIL noexp | ✓ | ✓ | ✓ |
uniCOIL com doc2query-T5 | ✓ | ✓ | ✓ |
Corpos | Tamanho | Soma de verificação |
---|---|---|
Documento MS MARCO V1: uniCOIL (noexp) | 11GB | 11b226e1cacd9c8ae0a660fd14cdd710 |
Documento MS MARCO V1: uniCOIL (d2q-T5) | 19GB | 6a00e2c0c375cb1e52c83ae5ac377ebb |
desenvolvedor | DL21 | DL22 | DL23 | |
---|---|---|---|---|
Lexical não supervisionado, Corpus Original | ||||
linhas de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Corpus Lexical Não Supervisionado e Aumentado | ||||
linhas de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Lexical esparso aprendido | ||||
uniCOIL noexp tiro zero | ✓ | ✓ | ✓ | ✓ |
uniCOIL com doc2query-T5 tiro zero | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil (consultas em cache) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil (ONNX) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil (consultas em cache) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil (ONNX) | ✓ | ✓ | ✓ | ✓ |
Corpos | Tamanho | Soma de verificação |
---|---|---|
uniCOIL (noexp) | 24GB | d9cc1ed3049746e68a2c91bf90e5212d |
uniCOIL (d2q-T5) | 41GB | 1949a00bfd5e1f1a230a04bbc1f01539 |
SPLADE++ CoCondenser-EnsembleDistil | 66 GB | 2cdb2adc259b8fa6caf666b20ebdc0e8 |
SPLADE++ CoCondenser-SelfDistil | 76 GB | 061930dd615c7c807323ea7fc7957877 |
desenvolvedor | DL21 | DL22 | DL23 | |
---|---|---|---|---|
Lexical não supervisionado, documento completo | ||||
linhas de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Documento lexical não supervisionado e segmentado | ||||
linhas de base | + | + | + | + |
doc2query-T5 | + | + | + | + |
Lexical esparso aprendido | ||||
uniCOIL noexp tiro zero | ✓ | ✓ | ✓ | ✓ |
uniCOIL com doc2query-T5 tiro zero | ✓ | ✓ | ✓ | ✓ |
Corpos | Tamanho | Soma de verificação |
---|---|---|
Documento MS MARCO V2: uniCOIL (noexp) | 55 GB | 97ba262c497164de1054f357caea0c63 |
Documento MS MARCO V2: uniCOIL (d2q-T5) | 72GB | c5639748c2cbad0152e10b0ebde3b804 |
Os corpora MS MARCO V2.1 foram derivados dos corpora V2 para o TREC 2024 RAG Track. Os experimentos abaixo capturam tópicos e qrels originalmente direcionados aos corpora V2, mas foram "projetados" para os corpora V2.1.
desenvolvedor | DL21 | DL22 | DL23 | Desenvolvedor RAGgy | |
---|---|---|---|---|---|
Lexical não supervisionado, documento completo | |||||
linhas de base | + | + | + | + | + |
Documento lexical não supervisionado e segmentado | |||||
linhas de base | + | + | + | + | + |
Chave:
bert-base-uncased
), consultas de palavras-chave (?)Veja as instruções abaixo da tabela sobre como reproduzir os resultados de um modelo em todos os corpora BEIR "de uma só vez".
Corpus | F1 | F2 | MF | U1 | S1 | BGE (plano) | BGE (HNSW) |
---|---|---|---|---|---|---|---|
TREC-COVID | ? | ? | ? | ? | ? | completo:? | completo:? |
BioASQ | ? | ? | ? | ? | ? | completo:? | completo:? |
NFC Corpus | ? | ? | ? | ? | ? | completo:? | completo:? |
QN | ? | ? | ? | ? | ? | completo:? | completo:? |
HotpotQA | ? | ? | ? | ? | ? | completo:? | completo:? |
FiQA-2018 | ? | ? | ? | ? | ? | completo:? | completo:? |
Sinal-1M(RT) | ? | ? | ? | ? | ? | completo:? | completo:? |
TREC-NOTÍCIAS | ? | ? | ? | ? | ? | completo:? | completo:? |
Robusto04 | ? | ? | ? | ? | ? | completo:? | completo:? |
ArguAna | ? | ? | ? | ? | ? | completo:? | completo:? |
Toque2020 | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Android | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Inglês | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Gaming | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Gis | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Mathematica | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Física | ? | ? | ? | ? | ? | completo:? | completo:? |
Programadores CQADupStack | ? | ? | ? | ? | ? | completo:? | completo:? |
Estatísticas CQADupStack | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Tex | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Unix | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Webmasters | ? | ? | ? | ? | ? | completo:? | completo:? |
CQADupStack-Wordpress | ? | ? | ? | ? | ? | completo:? | completo:? |
Quora | ? | ? | ? | ? | ? | completo:? | completo:? |
DBPedia | ? | ? | ? | ? | ? | completo:? | completo:? |
SCIDOCS | ? | ? | ? | ? | ? | completo:? | completo:? |
FEBRE | ? | ? | ? | ? | ? | completo:? | completo:? |
Clima-FEBRE | ? | ? | ? | ? | ? | completo:? | completo:? |
Fato científico | ? | ? | ? | ? | ? | completo:? | completo:? |
Para reproduzir os resultados do SPLADE++ CoCondenser-EnsembleDistil, comece baixando a coleção:
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/
O tarball tem 42 GB e possui soma de verificação MD5 9c7de5b444a788c9e74c340bf833173b
. Depois de descompactar os dados, os comandos a seguir farão um loop em todos os corpora BEIR e executarão as regressões:
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
Você pode verificar os resultados examinando os arquivos de log em logs/
.
Para os outros modelos, modifique os comandos acima da seguinte forma:
Chave | Corpus | Soma de verificação | 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 |
O "Corpus" acima deve ser substituído pelo nome completo do arquivo beir-v1.0.0-${corpus}.tar
, por exemplo, beir-v1.0.0-bge-base-en-v1.5.tar
. Os comandos acima devem funcionar com algumas pequenas modificações: você precisará ajustar o parâmetro --regression
para corresponder ao esquema dos arquivos de configuração YAML em src/main/resources/regression/
.
Os experimentos descritos abaixo não estão associados a testes de regressão rigorosos de ponta a ponta e, portanto, fornecem um padrão mais baixo de reprodutibilidade. Na maioria das vezes, é necessário copiar e colar manualmente comandos em um shell para reproduzir nossos resultados.
Se você achou que Anserini foi útil, temos um simples pedido para que você contribua de volta. Durante a reprodução dos resultados da linha de base em coleções de testes padrão, informe-nos se tiver êxito, enviando-nos uma solicitação pull com uma nota simples, como a que aparece na parte inferior da página para os Discos 4 e 5. A reprodutibilidade é importante para nós, e gostaríamos de saber sobre sucessos e fracassos. Como a documentação de regressão é gerada automaticamente, as solicitações pull devem ser enviadas contra os modelos brutos. Em seguida, a documentação de regressão pode ser gerada usando o script bin/build.sh
. Por sua vez, você será reconhecido como um contribuidor.
Além disso, sempre há questões em aberto para as quais gostaríamos de receber ajuda!
272565
(02/08/2022): esta atualização criou problemas de compatibilidade com versões anteriores, consulte #1952. Anserini detectará automaticamente os índices Lucene 8 e desabilitará o desempate consistente para evitar erros de tempo de execução. No entanto, o código Lucene 9 executado em índices Lucene 8 pode fornecer resultados ligeiramente diferentes do código Lucene 8 executado em índices Lucene 8. O código Lucene 8 não será executado em índices Lucene 9. O Pyserini também foi atualizado e problemas semelhantes se aplicam: o código Lucene 9 executado em índices Lucene 8 pode fornecer resultados ligeiramente diferentes do código Lucene 8 executado em índices Lucene 8.17b702d
(11/07/2019) do Java 8. Maven 3.3+ também é necessário.75e36f9
(12/06/2019); antes disso, o kit de ferramentas usa Lucene 7.6. Com base em experimentos preliminares, a latência de avaliação de consulta melhorou muito no Lucene 8. Como resultado dessa atualização, os resultados de todas as regressões mudaram ligeiramente. Para reproduzir resultados antigos do Lucene 7.6, use v0.5.1. Esta pesquisa é apoiada em parte pelo Conselho de Pesquisa em Ciências Naturais e Engenharia (NSERC) do Canadá. O apoio anterior veio da National Science Foundation dos EUA sob IIS-1423002 e CNS-1405688. Quaisquer opiniões, conclusões e conclusões ou recomendações expressas não refletem necessariamente as opiniões dos patrocinadores.