Anserini는 재현 가능한 정보 검색 연구를 위한 툴킷입니다. Lucene을 기반으로 우리는 학문적 정보 검색 연구와 실제 검색 애플리케이션 구축 실무 간의 격차를 해소하는 것을 목표로 합니다. 다른 목표 중에서도 우리의 노력은 이와 반대되는 것을 목표로 합니다.* Anserini는 2016년 다양한 오픈 소스 검색 엔진에 대한 재현성 연구를 통해 성장했습니다(Lin et al., ECIR 2016). Yang et al. (SIGIR 2017) 및 Yang et al. (JDIQ 2018) 개요를 참조하세요.
❗ Anserini는 v0.35.0 릴리스에 해당하는 커밋 272565
(2024/04/03)에서 JDK 11에서 JDK 21로 업그레이드되었습니다.
Anserini는 시작하는 가장 간단한 방법을 제공하는 독립형 fatjar에 패키지되어 있습니다. 이미 Java가 설치되어 있다고 가정하고 fatjar를 가져옵니다.
wget https://repo1.maven.org/maven2/io/anserini/anserini/0.38.0/anserini-0.38.0-fatjar.jar
다음 명령은 MS MARCO 구절 말뭉치에서 개발 쿼리(ONNX를 사용하여 인코딩됨)를 사용하여 SPLADE++ ED 실행을 생성합니다.
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
평가하려면:
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
Anserini(v0.38.0)의 현재 fatjar 릴리스에 대한 자세한 지침을 참조하여 TREC 2024 RAG용 MS MARCO V2.1 말뭉치, MS MARCO V1 Passage 및 BEIR에 대한 회귀 실험을 모두 fatjar에서 직접 재현하세요!
또한 Anserini에는 다른 애플리케이션에서 사용할 수 있는 REST API와 함께 대화형 쿼리를 위한 내장 웹앱이 함께 제공됩니다. 여기에서 설명서를 확인하세요.
대부분의 Anserini 기능은 Pyserini Python 인터페이스에 표시됩니다. Anserini가 Pyserini의 중요한 구성 요소를 형성하지만 Python에 더 익숙하다면 거기서부터 시작하십시오. 따라서 Anserini에 대해 배우는 것이 여전히 가치가 있습니다.
Anserini를 빌드하려면 Java 21 및 Maven 3.9 이상이 필요합니다. --recurse-submodules
옵션을 사용하여 저장소를 복제하여 eval/
하위 모듈도 복제되는지 확인하세요(또는 git submodule update --init
사용). 그런 다음 Maven을 사용하여 빌드합니다.
mvn clean package
평가 도구와 기타 스크립트가 포함된 tools/
디렉토리는 실제로 Git 하위 모듈로 통합된 이 저장소입니다(관련 프로젝트 간에 공유할 수 있음). 다음과 같이 빌드하세요(경고가 표시될 수 있지만 무시해도 됩니다).
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 ../../..
이제 준비가 완료되었습니다. Anserini의 온보딩 경로는 여기에서 시작됩니다!
Windows를 사용하는 경우 WSL2를 사용하여 Anserini를 빌드하세요. 아직 설치하지 않은 경우 WSL2 설치 문서를 참조하여 WSL2를 설치하세요.
WSL2가 없는 Windows에서는 인코딩 문제로 인해 테스트가 실패할 수 있습니다. #1466을 참조하세요. 간단한 해결 방법은 위의 mvn
명령에 -Dmaven.test.skip=true
추가하여 테스트를 건너뛰는 것입니다. Windows 빌드 오류 디버깅에 대한 추가 논의는 #1121을 참조하세요.
Anserini는 다양한 표준 IR 테스트 컬렉션에 대한 엔드투엔드 실험을 즉시 지원하도록 설계되었습니다. 이러한 각 엔드투엔드 회귀는 원시 자료에서 시작하여 필요한 인덱스를 구축하고 검색 실행을 수행하고 평가 결과를 생성합니다. 자세한 내용은 개별 페이지를 참조하세요.
개발자 | DL19 | DL20 | |
---|---|---|---|
비지도 스파스 | |||
Lucene BoW 기준선 | ? | ? | ? |
양자화된 BM25 | ? | ? | ? |
WordPiece 기준선(사전 토큰화됨) | ? | ? | ? |
WordPiece 기준선(Huggingface) | ? | ? | ? |
WordPiece + Lucene BoW 기준선 | ? | ? | ? |
doc2query | ? | ||
doc2query-T5 | ? | ? | ? |
학습된 스파스(uniCOIL 제품군) | |||
유니코일 noexp | ? | ? | ? |
doc2query-T5를 사용한 uniCOIL | ? | ? | ? |
TILDE를 사용한 유니코일 | ? | ||
학습된 스파스(기타) | |||
딥임팩트 | ? | ||
SPLADv2 | ? | ||
SPLADE++ CoCondenser-EnsembleDistil | ? | ? | ? |
SPLADE++ CoCondenser-SelfDistil | ? | ? | ? |
학습된 밀도 (HNSW 인덱스) | |||
cosDPR-distil | 가득한:? | 가득한:? | 가득한:? |
BGE-base-en-v1.5 | 가득한:? | 가득한:? | 가득한:? |
오픈AI 에이다2 | 가득한:? int8:? | 가득한:? int8:? | 가득한:? int8:? |
코히어 영어 v3.0 | 가득한:? int8:? | 가득한:? int8:? | 가득한:? int8:? |
학습된 밀도 (플랫 인덱스) | |||
cosDPR-distil | 가득한:? | 가득한:? | 가득한:? |
BGE-base-en-v1.5 | 가득한:? | 가득한:? | 가득한:? |
오픈AI 에이다2 | 가득한:? int8:?️ | 가득한:? int8:? | 가득한:? int8:? |
코히어 영어 v3.0 | 가득한:? int8:? | 가득한:? int8:? | 가득한:? int8:? |
학습된 밀도 (거꾸로, 실험적) | |||
cosDPR-distil("가짜 단어" 포함) | ? | ? | ? |
cosDPR-distil("LexLSH" 포함) | ? | ? | ? |
열쇠:
말뭉치 | 크기 | 체크섬 |
---|---|---|
양자화된 BM25 | 1.2GB | 0a623e2c97ac6b7e814bf1323a97b435 |
유니코일(noexp) | 2.7GB | f17ddd8c7c00ff121c3c3b147d2e17d8 |
유니코일(d2q-T5) | 3.4GB | 78eef752c78c8691f7d61600ceed306f |
유니코일(틸드) | 3.9GB | 12a9c289d94e32fd63a7d39c9677d75c |
딥임팩트 | 3.6GB | 73843885b503af3c8b3ee62e5f5a9900 |
SPLADv2 | 9.9GB | b5d126f5d9a8e1b3ef3f5cb0ba651725 |
SPLADE++ CoCondenser-EnsembleDistil | 4.2GB | e489133bdc54ee1e7c62a32aa582bc77 |
SPLADE++ CoCondenser-SelfDistil | 4.8GB | cb7e264222f2bf2221dd2c9d28190be1 |
cosDPR-distil | 57GB | e20ffbc8b5e7f760af31298aefeaebbd |
BGE-base-en-v1.5 | 59GB | 353d2c9e72e858897ad479cca4ea0db1 |
OpenAI-ada2 | 109GB | a4d843d522ff3a3af7edbee789a63402 |
Cohere embed-english-v3.0 | 38GB | 06a6e38a0522850c6aa504db7b2617f5 |
개발자 | DL19 | DL20 | |
---|---|---|---|
감독되지 않은 어휘, 완전한 문서 * | |||
Lucene BoW 기준선 | + | + | + |
WordPiece 기준선(사전 토큰화됨) | + | + | + |
WordPiece 기준선(Huggingface 토크나이저) | + | + | + |
WordPiece + Lucene BoW 기준선 | + | + | + |
doc2query-T5 | + | + | + |
비지도 어휘, 분할 문서 * | |||
Lucene BoW 기준선 | + | + | + |
WordPiece 기준선(사전 토큰화됨) | + | + | + |
WordPiece + Lucene BoW 기준선 | + | + | + |
doc2query-T5 | + | + | + |
학습된 희소 어휘 | |||
유니코일 noexp | ✓ | ✓ | ✓ |
doc2query-T5를 사용한 uniCOIL | ✓ | ✓ | ✓ |
말뭉치 | 크기 | 체크섬 |
---|---|---|
MS MARCO V1 문서: uniCOIL(noexp) | 11GB | 11b226e1cacd9c8ae0a660fd14cdd710 |
MS MARCO V1 문서: uniCOIL(d2q-T5) | 19GB | 6a00e2c0c375cb1e52c83ae5ac377ebb |
개발자 | DL21 | DL22 | DL23 | |
---|---|---|---|---|
비지도 어휘, 원본 코퍼스 | ||||
기준선 | + | + | + | + |
doc2query-T5 | + | + | + | + |
비지도 어휘, 증강 코퍼스 | ||||
기준선 | + | + | + | + |
doc2query-T5 | + | + | + | + |
학습된 희소 어휘 | ||||
uniCOIL noexp 제로샷 | ✓ | ✓ | ✓ | ✓ |
doc2query-T5 제로샷을 사용한 uniCOIL | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil(캐시된 쿼리) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-EnsembleDistil(ONNX) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil(캐시된 쿼리) | ✓ | ✓ | ✓ | ✓ |
SPLADE++ CoCondenser-SelfDistil(ONNX) | ✓ | ✓ | ✓ | ✓ |
말뭉치 | 크기 | 체크섬 |
---|---|---|
유니코일(noexp) | 24GB | d9cc1ed3049746e68a2c91bf90e5212d |
유니코일(d2q-T5) | 41GB | 1949a00bfd5e1f1a230a04bbc1f01539 |
SPLADE++ CoCondenser-EnsembleDistil | 66GB | 2cdb2adc259b8fa6caf666b20ebdc0e8 |
SPLADE++ CoCondenser-SelfDistil | 76GB | 061930dd615c7c807323ea7fc7957877 |
개발자 | DL21 | DL22 | DL23 | |
---|---|---|---|---|
감독되지 않은 어휘, 완전한 문서 | ||||
기준선 | + | + | + | + |
doc2query-T5 | + | + | + | + |
비지도 어휘, 세그먼트 문서 | ||||
기준선 | + | + | + | + |
doc2query-T5 | + | + | + | + |
학습된 희소 어휘 | ||||
uniCOIL noexp 제로샷 | ✓ | ✓ | ✓ | ✓ |
doc2query-T5 제로샷을 사용한 uniCOIL | ✓ | ✓ | ✓ | ✓ |
말뭉치 | 크기 | 체크섬 |
---|---|---|
MS MARCO V2 문서: uniCOIL(noexp) | 55GB | 97ba262c497164de1054f357caea0c63 |
MS MARCO V2 문서: uniCOIL(d2q-T5) | 72GB | c5639748c2cbad0152e10b0ebde3b804 |
MS MARCO V2.1 말뭉치는 TREC 2024 RAG 트랙용 V2 말뭉치에서 파생되었습니다. 아래 실험은 원래 V2 말뭉치를 대상으로 했지만 V2.1 말뭉치로 "예측"된 주제와 qrel을 캡처합니다.
개발자 | DL21 | DL22 | DL23 | RAGgy 개발 | |
---|---|---|---|---|---|
감독되지 않은 어휘, 완전한 문서 | |||||
기준선 | + | + | + | + | + |
비지도 어휘, 세그먼트 문서 | |||||
기준선 | + | + | + | + | + |
열쇠:
bert-base-uncased
토크나이저로 사전 토큰화됨), 키워드 쿼리(?)모든 BEIR 말뭉치에서 모델에 대한 결과를 "한 번에" 재현하는 방법은 표 아래 지침을 참조하세요.
신체 | F1 | F2 | MF | U1 | S1 | BGE(플랫) | BGE (HNSW) |
---|---|---|---|---|---|---|---|
TREC-COVID | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
바이오ASQ | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
NFCorpus | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
NQ | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
핫팟QA | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
FiQA-2018 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
시그널-1M(RT) | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
TREC-뉴스 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
견고함04 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
아르구아나 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
터치2020 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-안드로이드 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-영어 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack 게임 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-Gis | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-Mathematica | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-물리학 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack 프로그래머 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-통계 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-Tex | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-유닉스 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-웹마스터 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
CQADupStack-워드프레스 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
쿼라 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
DB피디아 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
SCIDOCS | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
발열 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
기후 열병 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
사이팩트 | ? | ? | ? | ? | ? | 가득한:? | 가득한:? |
SPLADE++ CoCondenser-EnsembleDistil 결과를 재현하려면 먼저 컬렉션을 다운로드하세요.
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/
tarball은 42GB이고 MD5 체크섬은 9c7de5b444a788c9e74c340bf833173b
입니다. 데이터의 압축을 풀고 나면 다음 명령이 모든 BEIR 말뭉치를 반복하여 회귀를 실행합니다.
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
logs/
의 로그 파일을 검사하여 결과를 확인할 수 있습니다.
다른 모델의 경우 위 명령을 다음과 같이 수정합니다.
열쇠 | 신체 | 체크섬 | 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 |
위의 "말뭉치"는 전체 파일 이름 beir-v1.0.0-${corpus}.tar
로 대체되어야 합니다(예: beir-v1.0.0-bge-base-en-v1.5.tar
). 위 명령은 약간의 수정을 거쳐도 작동합니다. src/main/resources/regression/
에 있는 YAML 구성 파일의 스키마와 일치하도록 --regression
매개변수를 조정해야 합니다.
아래에 설명된 실험은 엄격한 엔드투엔드 회귀 테스트와 관련이 없으므로 재현성에 대한 낮은 표준을 제공합니다. 대부분의 경우 결과를 재현하려면 명령을 수동으로 복사하여 셸에 붙여넣어야 합니다.
Anserini가 도움이 되었다면, 다시 기여해 주시기를 간단한 요청을 드립니다. 표준 테스트 컬렉션에 대한 기본 결과를 재현하는 과정에서 성공 여부를 디스크 4 및 5의 페이지 하단에 표시되는 것과 같은 간단한 메모와 함께 끌어오기 요청을 보내 알려 주시기 바랍니다. 재현성은 중요합니다. 성공과 실패에 대해 알고 싶습니다. 회귀 문서가 자동 생성되므로 풀 요청은 원시 템플릿에 대해 전송되어야 합니다. 그런 다음 bin/build.sh
스크립트를 사용하여 회귀 문서를 생성할 수 있습니다. 그러면 귀하는 기여자로 인정받게 됩니다.
그 외에도 항상 해결되지 않은 문제가 있으므로 도움을 주시면 감사하겠습니다!
272565
(2022년 8월 2일)에서 Lucene 9.3으로 업그레이드되었습니다. 이 업그레이드로 인해 이전 버전과의 호환성 문제가 발생했습니다. #1952를 참조하세요. Anserini는 Lucene 8 인덱스를 자동으로 감지하고 일관된 타이 브레이킹을 비활성화하여 런타임 오류를 방지합니다. 그러나 Lucene 8 인덱스에서 실행되는 Lucene 9 코드는 Lucene 8 인덱스에서 실행되는 Lucene 8 코드와 약간 다른 결과를 제공할 수 있습니다. Lucene 8 코드는 Lucene 9 인덱스에서 실행되지 않습니다 . Pyserini도 업그레이드되었으며 유사한 문제가 적용됩니다. Lucene 8 인덱스에서 실행되는 Lucene 9 코드는 Lucene 8 인덱스에서 실행되는 Lucene 8 코드와 약간 다른 결과를 제공할 수 있습니다.17b702d
(2019년 7월 11일)에서 Java 8에서 Java 11로 업그레이드되었습니다. Maven 3.3+도 필요합니다.75e36f9
(2019년 6월 12일)부터 Lucene 8.0으로 업그레이드되었습니다. 그 전에는 툴킷이 Lucene 7.6을 사용합니다. 예비 실험에 따르면 Lucene 8에서는 쿼리 평가 대기 시간이 크게 개선되었습니다. 이번 업그레이드 결과 모든 회귀 결과가 약간 변경되었습니다. Lucene 7.6의 이전 결과를 재현하려면 v0.5.1을 사용하세요. 이 연구는 캐나다 자연과학 및 공학 연구 위원회(NSERC)의 일부 지원을 받았습니다. 이전 지원은 IIS-1423002 및 CNS-1405688에 따라 미국 국립 과학 재단에서 제공되었습니다. 표현된 모든 의견, 조사 결과, 결론 또는 권장 사항이 반드시 후원자의 견해를 반영하는 것은 아닙니다.