BFTree commited on
Commit
3761d38
·
verified ·
1 Parent(s): 8e09265

Release MA-Retriever

Browse files
.gitattributes CHANGED
@@ -1,35 +1 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
  *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  *.safetensors filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
1_Pooling/config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "word_embedding_dimension": 1024,
3
+ "pooling_mode_cls_token": true,
4
+ "pooling_mode_mean_tokens": false,
5
+ "pooling_mode_max_tokens": false,
6
+ "pooling_mode_mean_sqrt_len_tokens": false,
7
+ "pooling_mode_weightedmean_tokens": false,
8
+ "pooling_mode_lasttoken": false,
9
+ "include_prompt": true
10
+ }
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MetaSyn Authors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md CHANGED
@@ -1,3 +1,108 @@
1
  ---
 
 
2
  license: mit
 
 
 
 
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ library_name: sentence-transformers
3
+ pipeline_tag: sentence-similarity
4
  license: mit
5
+ base_model: BAAI/bge-large-en-v1.5
6
+ tags:
7
+ - sentence-transformers
8
+ - information-retrieval
9
+ - biomedical
10
+ - metasyn
11
+ datasets:
12
+ - THUIR/MetaSyn
13
  ---
14
+
15
+ # MA-Retriever
16
+
17
+ MA-Retriever is the dense retriever released with MetaSyn. It fine-tunes
18
+ `BAAI/bge-large-en-v1.5` for retrieving articles linked to the published
19
+ included-study lists of systematic reviews, scoping reviews, and
20
+ meta-analyses.
21
+
22
+ ## Resources
23
+
24
+ - Paper: [arXiv:2606.17041](https://arxiv.org/abs/2606.17041)
25
+ - Dataset: [THUIR/MetaSyn](https://huggingface.co/datasets/THUIR/MetaSyn)
26
+ - Code and evaluator: [THUIR/MetaSyn](https://github.com/THUIR/MetaSyn)
27
+
28
+ ## Use
29
+
30
+ ```python
31
+ from sentence_transformers import SentenceTransformer
32
+
33
+ model = SentenceTransformer("BFTree/MA-Retriever")
34
+
35
+ def encode_protocol(research_question, population, intervention_or_exposure,
36
+ comparison, outcome):
37
+ fields = [
38
+ ("Research Question", research_question),
39
+ ("Population", population),
40
+ ("Intervention or Exposure", intervention_or_exposure),
41
+ ("Comparison", comparison),
42
+ ("Outcome", outcome),
43
+ ]
44
+ protocol = ". ".join(f"{name}: {value}" for name, value in fields if value)
45
+ query = "Represent this sentence for searching relevant passages: " + protocol
46
+ return model.encode(query, normalize_embeddings=True)
47
+
48
+ def encode_article(title, abstract):
49
+ document = f"Title: {title}. Abstract: {abstract}"
50
+ return model.encode(document, normalize_embeddings=True)
51
+ ```
52
+
53
+ The protocol query concatenates the research question, Population,
54
+ Intervention or Exposure, Comparison, and Outcome. It does not use the
55
+ source-review title. Documents use title and abstract. Retrieval uses cosine
56
+ similarity over normalized embeddings.
57
+
58
+ ## Training
59
+
60
+ The base revision is `d4aa6901d3a41ba39fb536a557fa166f842b0e09`. We used
61
+ 40 reviews sampled from the training split to select the epoch count. Recall@20
62
+ is the primary metric, with Recall@100 and Recall@200 used as tie-breakers. The
63
+ released checkpoint was retrained for one epoch using the full training split
64
+ with Multiple Negatives Ranking Loss, batch size 64, learning rate 2e-5,
65
+ maximum sequence length 512, and seed 718. After excluding articles linked to
66
+ a test review, 334 of the 336 training reviews contribute positive pairs.
67
+
68
+ There are 5,585 constructed training pairs. The sentence-transformers training
69
+ loader used 5,568 examples in complete batches during the epoch; this accounts
70
+ for the smaller sample count shown by automatically generated trainer metadata.
71
+
72
+ ## Test retrieval
73
+
74
+ All metrics are macro-averaged over the 86 held-out reviews after removing the
75
+ source review itself from each ranking.
76
+
77
+ | K | Recall@K | Precision@K |
78
+ |---:|---:|---:|
79
+ | 5 | 24.0% | 47.9% |
80
+ | 10 | 38.8% | 42.0% |
81
+ | 20 | 53.5% | 34.0% |
82
+ | 50 | 75.3% | 22.6% |
83
+ | 100 | 84.2% | 14.0% |
84
+ | 200 | 91.7% | 8.4% |
85
+
86
+ The source-review split is disjoint, and every article linked to a test review
87
+ is excluded as a positive retriever-training example.
88
+
89
+ ## Limitations
90
+
91
+ The model is trained on reviews from Nature Portfolio and a PubMed-centered
92
+ corpus. Performance may not transfer unchanged to other databases, languages,
93
+ or domains. A high-recall pool still requires protocol-based screening; model
94
+ scores should not be treated as inclusion decisions.
95
+
96
+ ## Citation
97
+
98
+ ```bibtex
99
+ @misc{metasyn2026,
100
+ title = {Benchmarking {LLM} Agents on Meta-Analysis Articles from {Nature} Portfolio},
101
+ author = {Anzhe Xie and Weihang Su and Yujia Zhou and Yiqun Liu and Min Zhang and Qingyao Ai},
102
+ year = {2026},
103
+ eprint = {2606.17041},
104
+ archivePrefix = {arXiv},
105
+ primaryClass = {cs.CL},
106
+ url = {https://arxiv.org/abs/2606.17041}
107
+ }
108
+ ```
checksums.json ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "path": ".gitattributes",
4
+ "bytes": 50,
5
+ "sha256": "ee05350c7fda0af4da116020dd7b976d731de3beed4f5e717d5bcc95ead24550"
6
+ },
7
+ {
8
+ "path": "1_Pooling/config.json",
9
+ "bytes": 297,
10
+ "sha256": "13e69897522ee8255104483ed9f219465d1be3936654a54a318758738052789e"
11
+ },
12
+ {
13
+ "path": "LICENSE",
14
+ "bytes": 1072,
15
+ "sha256": "8b8b52057027c23382997be7fd01368a0bbd0ea3596e20973bffa7053b4e8fe3"
16
+ },
17
+ {
18
+ "path": "config.json",
19
+ "bytes": 742,
20
+ "sha256": "3d0c874396f8eebd33c1554428f72475494ec68e5bc3abb3e740cfe1f73ccb03"
21
+ },
22
+ {
23
+ "path": "config_sentence_transformers.json",
24
+ "bytes": 283,
25
+ "sha256": "ab257f3f160a1f6d256c13c29740444e974992a89716e6f64ab122f1f45d7bfd"
26
+ },
27
+ {
28
+ "path": "model.safetensors",
29
+ "bytes": 1340612432,
30
+ "sha256": "608a6b98c77ce79d9d14d8d6480c0f7586741083cb5be761cfe448efd4a84322"
31
+ },
32
+ {
33
+ "path": "modules.json",
34
+ "bytes": 349,
35
+ "sha256": "84e40c8e006c9b1d6c122e02cba9b02458120b5fb0c87b746c41e0207cf642cf"
36
+ },
37
+ {
38
+ "path": "sentence_bert_config.json",
39
+ "bytes": 52,
40
+ "sha256": "84e39fda68ccbff05bfa723ae9c0e70e23e2ec373b76e0f8c6e71af72a693cbf"
41
+ },
42
+ {
43
+ "path": "special_tokens_map.json",
44
+ "bytes": 695,
45
+ "sha256": "5d5b662e421ea9fac075174bb0688ee0d9431699900b90662acd44b2a350503a"
46
+ },
47
+ {
48
+ "path": "tokenizer.json",
49
+ "bytes": 711649,
50
+ "sha256": "91f1def9b9391fdabe028cd3f3fcc4efd34e5d1f08c3bf2de513ebb5911a1854"
51
+ },
52
+ {
53
+ "path": "tokenizer_config.json",
54
+ "bytes": 1272,
55
+ "sha256": "7b082b48a08a0b5c5939d99472e33addce3d96202155e33f7928cecd171186a0"
56
+ },
57
+ {
58
+ "path": "training_metadata.json",
59
+ "bytes": 1317,
60
+ "sha256": "3037d33b70f00f62a16a2182f79051bd48026f8caeccfbd93f0809b2ce5e6319"
61
+ },
62
+ {
63
+ "path": "vocab.txt",
64
+ "bytes": 231508,
65
+ "sha256": "07eced375cec144d27c900241f3e339478dec958f92fddbc551f295c992038a3"
66
+ }
67
+ ]
config.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "BAAI/bge-large-en-v1.5",
3
+ "architectures": [
4
+ "BertModel"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "classifier_dropout": null,
8
+ "gradient_checkpointing": false,
9
+ "hidden_act": "gelu",
10
+ "hidden_dropout_prob": 0.1,
11
+ "hidden_size": 1024,
12
+ "id2label": {
13
+ "0": "LABEL_0"
14
+ },
15
+ "initializer_range": 0.02,
16
+ "intermediate_size": 4096,
17
+ "label2id": {
18
+ "LABEL_0": 0
19
+ },
20
+ "layer_norm_eps": 1e-12,
21
+ "max_position_embeddings": 512,
22
+ "model_type": "bert",
23
+ "num_attention_heads": 16,
24
+ "num_hidden_layers": 24,
25
+ "pad_token_id": 0,
26
+ "position_embedding_type": "absolute",
27
+ "torch_dtype": "float32",
28
+ "transformers_version": "4.43.1",
29
+ "type_vocab_size": 2,
30
+ "use_cache": true,
31
+ "vocab_size": 30522
32
+ }
config_sentence_transformers.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "__version__": {
3
+ "sentence_transformers": "3.2.1",
4
+ "transformers": "4.43.1",
5
+ "pytorch": "2.3.1+cu121"
6
+ },
7
+ "model_type": "SentenceTransformer",
8
+ "prompts": {
9
+ "query": "",
10
+ "document": ""
11
+ },
12
+ "default_prompt_name": null,
13
+ "similarity_fn_name": "cosine"
14
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:608a6b98c77ce79d9d14d8d6480c0f7586741083cb5be761cfe448efd4a84322
3
+ size 1340612432
modules.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "idx": 0,
4
+ "name": "0",
5
+ "path": "",
6
+ "type": "sentence_transformers.models.Transformer"
7
+ },
8
+ {
9
+ "idx": 1,
10
+ "name": "1",
11
+ "path": "1_Pooling",
12
+ "type": "sentence_transformers.models.Pooling"
13
+ },
14
+ {
15
+ "idx": 2,
16
+ "name": "2",
17
+ "path": "2_Normalize",
18
+ "type": "sentence_transformers.models.Normalize"
19
+ }
20
+ ]
sentence_bert_config.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "max_seq_length": 512,
3
+ "do_lower_case": true
4
+ }
special_tokens_map.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cls_token": {
3
+ "content": "[CLS]",
4
+ "lstrip": false,
5
+ "normalized": false,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "mask_token": {
10
+ "content": "[MASK]",
11
+ "lstrip": false,
12
+ "normalized": false,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "pad_token": {
17
+ "content": "[PAD]",
18
+ "lstrip": false,
19
+ "normalized": false,
20
+ "rstrip": false,
21
+ "single_word": false
22
+ },
23
+ "sep_token": {
24
+ "content": "[SEP]",
25
+ "lstrip": false,
26
+ "normalized": false,
27
+ "rstrip": false,
28
+ "single_word": false
29
+ },
30
+ "unk_token": {
31
+ "content": "[UNK]",
32
+ "lstrip": false,
33
+ "normalized": false,
34
+ "rstrip": false,
35
+ "single_word": false
36
+ }
37
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "[PAD]",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": true
10
+ },
11
+ "100": {
12
+ "content": "[UNK]",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false,
17
+ "special": true
18
+ },
19
+ "101": {
20
+ "content": "[CLS]",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false,
25
+ "special": true
26
+ },
27
+ "102": {
28
+ "content": "[SEP]",
29
+ "lstrip": false,
30
+ "normalized": false,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": true
34
+ },
35
+ "103": {
36
+ "content": "[MASK]",
37
+ "lstrip": false,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": true
42
+ }
43
+ },
44
+ "clean_up_tokenization_spaces": true,
45
+ "cls_token": "[CLS]",
46
+ "do_basic_tokenize": true,
47
+ "do_lower_case": true,
48
+ "extra_special_tokens": {},
49
+ "mask_token": "[MASK]",
50
+ "model_max_length": 512,
51
+ "never_split": null,
52
+ "pad_token": "[PAD]",
53
+ "sep_token": "[SEP]",
54
+ "strip_accents": null,
55
+ "tokenize_chinese_chars": true,
56
+ "tokenizer_class": "BertTokenizer",
57
+ "unk_token": "[UNK]"
58
+ }
training_metadata.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_model": "BAAI/bge-large-en-v1.5",
3
+ "base_model_revision": "d4aa6901d3a41ba39fb536a557fa166f842b0e09",
4
+ "seed": 718,
5
+ "query_template": "Research_Question + PI/ECO with BGE retrieval instruction",
6
+ "document_template": "Title + Abstract",
7
+ "train_reviews": 336,
8
+ "test_reviews": 86,
9
+ "model_selection_reviews": 40,
10
+ "model_selection_rule": "Recall@20, then Recall@100, then Recall@200",
11
+ "selected_epochs": 1,
12
+ "final_retraining_reviews": 336,
13
+ "training_reviews_with_positive_pairs": 334,
14
+ "test_linked_articles_excluded_from_positive_training": 1649,
15
+ "constructed_training_pairs": 5585,
16
+ "complete_batch_examples_used": 5568,
17
+ "batch_size": 64,
18
+ "learning_rate": 2e-05,
19
+ "max_seq_length": 512,
20
+ "loss": "MultipleNegativesRankingLoss",
21
+ "batch_sampler": "NoDuplicatesDataLoader",
22
+ "epochs": 1,
23
+ "test_metrics": {
24
+ "recall@5": 0.24032354463558983,
25
+ "recall@10": 0.38838341990475195,
26
+ "recall@20": 0.534827514606953,
27
+ "recall@50": 0.7526966587841311,
28
+ "recall@100": 0.8420887384792756,
29
+ "recall@200": 0.917380895710928,
30
+ "precision@5": 0.4790697674418605,
31
+ "precision@10": 0.4197674418604652,
32
+ "precision@20": 0.3401162790697674,
33
+ "precision@50": 0.22604651162790698,
34
+ "precision@100": 0.14046511627906977,
35
+ "precision@200": 0.08406976744186047
36
+ }
37
+ }
vocab.txt ADDED
The diff for this file is too large to render. See raw diff