Repository files navigation

Parametric RAG

📢 News: this work has been accepted at the SIGIR 2025!

Overall Analysis

Overall Analysis

Overview

Welcome to the Official Repository of Parametric Retrieval-Augmented Generation (Parametric RAG)!

This repository contains the code, datasets models used in our paper: "Parametric Retrieval-Augmented Generation".

If you find our project interesting or helpful, we would sincerely appreciate it if you could give us a star! Your support is a tremendous encouragement to us!

What is Parametric RAG?

Parametric RAG introduces a new paradigm for retrieval-augmented generation by embedding external knowledge directly into the parametric space of Large Language Models (LLMs). This approach overcomes the limitations of traditional in-context RAG methods by:

  • Reducing computational overhead by avoiding large context windows.

  • Deeply integrating external knowledge into the Feed-Forward Networks (FFN) of LLMs for improved reasoning and synthesis.

What’s Included?

  • End-to-end implementation of the Parametric RAG pipeline.
  • Preprocessed benchmark datasets for experiments and scripts for customizing and adding new datasets.

Reproduce Paper Results

In the following GitHub repository, we demonstrate how to test the performance of Parametric RAG on various QA datasets. Specifically, follow these steps to run Parametric RAG:

  • Run the Data Augmentation Module: This step corresponds to Section 3.2.1 Self-Augmentation in the original paper, where documents are transformed into a data-augmented dataset.
  • Generate Parametric Representations of Documents: This step corresponds to Section 3.2.2 Additional Parameter Training in the original paper, where additional LoRA parameters are trained.
  • Inference: Merge the parametric representations of relevant documents, insert them into the LLM, and use the updated LLM for inference.

All the prompts used in the experiment are displayed in the all_prompt.md file.

Install Environment

conda create -n prag python=3.10.4
conda activate prag
pip install torch==2.1.0
pip install -r requirements.txt

Please change the ROOT_DIR variable in src/root_dir_path.py to the folder address where you store PRAG.

Self-Augmentation

You can directly use the pre-augmented data file data_aug.tar.gz. To extract it, run the command tar -xzvf data_aug.tar.gz in your terminal.

If you want to perform data augmentation yourself, please process it as follows.

Prepare BM25 for retrieval

  1. Download the Wikipedia dump from the DPR repository using the following command
mkdir -p data/dpr
wget -O data/dpr/psgs_w100.tsv.gz https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz
pushd data/dpr
gzip -d psgs_w100.tsv.gz
popd
  1. Use Elasticsearch to index the Wikipedia dump
cd data
wget -O elasticsearch-8.15.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-linux-x86_64.tar.gz # download Elasticsearch
tar zxvf elasticsearch-8.15.0.tar.gz
rm elasticsearch-8.15.0.tar.gz cd elasticsearch-8.15.0
nohup bin/elasticsearch &# run Elasticsearch in backgroundcd ../..
python prep_elastic.py --data_path data/dpr/psgs_w100.tsv --index_name wiki # build index

Download dataset

For 2WikiMultihopQA:

Download the 2WikiMultihopQA dataset from its repository https://www.dropbox.com/s/ms2m13252h6xubs/data_ids_april7.zip?e=1. Unzip it and move the folder to data/2wikimultihopqa.

For HotpotQA:

mkdir -p data/hotpotqa
wget -P data/hotpotqa/ http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

For PopQA:

Download the PopQA dataset from its repository https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv, and put the file popQA.tsv into folder data/popqa.

mkdir -p data/popqa
wget -P data/popqa https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv

For ComplexWebQuestions:

Download the ComplexWebQuestions dataset from its repository https://www.dropbox.com/scl/fo/nqujvpg2gc4y0ozkw3wgr/AOzjVEsdUhv2Fx2pamfJlSw?rlkey=746t7xehfqxf1zr867nxiq8aq&e=1, and put the file ComplexWebQuestions_dev.json into folder data/complexwebquestions.

Data Augmentation:

python src/augment.py \
--model_name llama3.2-1b-instruct \
--dataset 2wikimultihopqa \
--data_path data/2wikimultihopqa/ \
--sample 300 \
--topk 3
ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_pathfolder to the saved data, such as data/2wikimultihopqa
sampleNumber of questions to run
topkretrieval number

The results of data augmentation will be stored in the file data_aug/{dataset}/{data_type}.json.

If you want to apply data augmentation to a new dataset, the default data format for the augmented data is JSON. Each element in the array should include both a 'question' and an 'answer,' as shown in the example below.

[
{
"question": "string",
"answer": "string or list[string]",
}
]

At this point, the input parameter dataset refers to the name of the dataset you’ve set, and data_path is the path to the JSON file mentioned above. The last filename in data_path will be treated as the data_type. The output file will be saved in data_aug/{your_dataset_name}/{data_type}.json.

Document Parameterizing

Methodology

By calling the src/encode.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0

When running for the first time with a specific LoRA parameter, an initial random parameter, base_weight will be created. All subsequent training will start from this base_weight.

All generated parameters are stored in the offline folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ ├── base_weight/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {data_type}/
│ └── data_{did}/
│ └── passage_{pid}/
| └── parameters

The running parameters of the main experiments in the paper are listed in the configs folder.

Generate

By calling the src/inference.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0
max_new_tokensNumber of generate tokens
inference_method"icl" is naive RAG, "prag" is our method, and "combine" is using both methods together

All generated results are stored in the output folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {inference_method}/
│ └── {data_type}/
│ ├── config.json
│ ├── predict.json
│ └── result.txt

Also, the running parameters of the main experiments in the paper are listed in the configs folder.

Warm up LoRA

After calling python src/get_warmup_data.py, the initialization training data for finetuning will be generated from the latter part of the dataset. The data generation code ensures that there is no data leakage.

Then, the following code will be used to train and generate two base LoRA weights:

# the training used 600 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--block_size 3000 \
--lora_rank 2 \
--lora_alpha 32 \
--with_cot # the training used 2000 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--lora_rank 2 \
--lora_alpha 32 \
--block_size 3000 

About

Code for Parametric RAG, SIGIR 2025 Full Paper

Resources

Stars

233 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Parametric RAG

📢 News: this work has been accepted at the SIGIR 2025!

Overall Analysis

Overall Analysis

Overview

Welcome to the Official Repository of Parametric Retrieval-Augmented Generation (Parametric RAG)!

This repository contains the code, datasets models used in our paper: "Parametric Retrieval-Augmented Generation".

If you find our project interesting or helpful, we would sincerely appreciate it if you could give us a star! Your support is a tremendous encouragement to us!

What is Parametric RAG?

Parametric RAG introduces a new paradigm for retrieval-augmented generation by embedding external knowledge directly into the parametric space of Large Language Models (LLMs). This approach overcomes the limitations of traditional in-context RAG methods by:

  • Reducing computational overhead by avoiding large context windows.

  • Deeply integrating external knowledge into the Feed-Forward Networks (FFN) of LLMs for improved reasoning and synthesis.

What’s Included?

  • End-to-end implementation of the Parametric RAG pipeline.
  • Preprocessed benchmark datasets for experiments and scripts for customizing and adding new datasets.

Reproduce Paper Results

In the following GitHub repository, we demonstrate how to test the performance of Parametric RAG on various QA datasets. Specifically, follow these steps to run Parametric RAG:

  • Run the Data Augmentation Module: This step corresponds to Section 3.2.1 Self-Augmentation in the original paper, where documents are transformed into a data-augmented dataset.
  • Generate Parametric Representations of Documents: This step corresponds to Section 3.2.2 Additional Parameter Training in the original paper, where additional LoRA parameters are trained.
  • Inference: Merge the parametric representations of relevant documents, insert them into the LLM, and use the updated LLM for inference.

All the prompts used in the experiment are displayed in the all_prompt.md file.

Install Environment

conda create -n prag python=3.10.4
conda activate prag
pip install torch==2.1.0
pip install -r requirements.txt

Please change the ROOT_DIR variable in src/root_dir_path.py to the folder address where you store PRAG.

Self-Augmentation

You can directly use the pre-augmented data file data_aug.tar.gz. To extract it, run the command tar -xzvf data_aug.tar.gz in your terminal.

If you want to perform data augmentation yourself, please process it as follows.

Prepare BM25 for retrieval

  1. Download the Wikipedia dump from the DPR repository using the following command
mkdir -p data/dpr
wget -O data/dpr/psgs_w100.tsv.gz https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz
pushd data/dpr
gzip -d psgs_w100.tsv.gz
popd
  1. Use Elasticsearch to index the Wikipedia dump
cd data
wget -O elasticsearch-8.15.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-linux-x86_64.tar.gz # download Elasticsearch
tar zxvf elasticsearch-8.15.0.tar.gz
rm elasticsearch-8.15.0.tar.gz cd elasticsearch-8.15.0
nohup bin/elasticsearch &# run Elasticsearch in backgroundcd ../..
python prep_elastic.py --data_path data/dpr/psgs_w100.tsv --index_name wiki # build index

Download dataset

For 2WikiMultihopQA:

Download the 2WikiMultihopQA dataset from its repository https://www.dropbox.com/s/ms2m13252h6xubs/data_ids_april7.zip?e=1. Unzip it and move the folder to data/2wikimultihopqa.

For HotpotQA:

mkdir -p data/hotpotqa
wget -P data/hotpotqa/ http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

For PopQA:

Download the PopQA dataset from its repository https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv, and put the file popQA.tsv into folder data/popqa.

mkdir -p data/popqa
wget -P data/popqa https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv

For ComplexWebQuestions:

Download the ComplexWebQuestions dataset from its repository https://www.dropbox.com/scl/fo/nqujvpg2gc4y0ozkw3wgr/AOzjVEsdUhv2Fx2pamfJlSw?rlkey=746t7xehfqxf1zr867nxiq8aq&e=1, and put the file ComplexWebQuestions_dev.json into folder data/complexwebquestions.

Data Augmentation:

python src/augment.py \
--model_name llama3.2-1b-instruct \
--dataset 2wikimultihopqa \
--data_path data/2wikimultihopqa/ \
--sample 300 \
--topk 3
ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_pathfolder to the saved data, such as data/2wikimultihopqa
sampleNumber of questions to run
topkretrieval number

The results of data augmentation will be stored in the file data_aug/{dataset}/{data_type}.json.

If you want to apply data augmentation to a new dataset, the default data format for the augmented data is JSON. Each element in the array should include both a 'question' and an 'answer,' as shown in the example below.

[
{
"question": "string",
"answer": "string or list[string]",
}
]

At this point, the input parameter dataset refers to the name of the dataset you’ve set, and data_path is the path to the JSON file mentioned above. The last filename in data_path will be treated as the data_type. The output file will be saved in data_aug/{your_dataset_name}/{data_type}.json.

Document Parameterizing

Methodology

By calling the src/encode.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0

When running for the first time with a specific LoRA parameter, an initial random parameter, base_weight will be created. All subsequent training will start from this base_weight.

All generated parameters are stored in the offline folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ ├── base_weight/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {data_type}/
│ └── data_{did}/
│ └── passage_{pid}/
| └── parameters

The running parameters of the main experiments in the paper are listed in the configs folder.

Generate

By calling the src/inference.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0
max_new_tokensNumber of generate tokens
inference_method"icl" is naive RAG, "prag" is our method, and "combine" is using both methods together

All generated results are stored in the output folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {inference_method}/
│ └── {data_type}/
│ ├── config.json
│ ├── predict.json
│ └── result.txt

Also, the running parameters of the main experiments in the paper are listed in the configs folder.

Warm up LoRA

After calling python src/get_warmup_data.py, the initialization training data for finetuning will be generated from the latter part of the dataset. The data generation code ensures that there is no data leakage.

Then, the following code will be used to train and generate two base LoRA weights:

# the training used 600 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--block_size 3000 \
--lora_rank 2 \
--lora_alpha 32 \
--with_cot # the training used 2000 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--lora_rank 2 \
--lora_alpha 32 \
--block_size 3000 

About

Code for Parametric RAG, SIGIR 2025 Full Paper

Resources

Stars

233 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Parametric RAG

📢 News: this work has been accepted at the SIGIR 2025!

Overall Analysis

Overall Analysis

Overview

Welcome to the Official Repository of Parametric Retrieval-Augmented Generation (Parametric RAG)!

This repository contains the code, datasets models used in our paper: "Parametric Retrieval-Augmented Generation".

If you find our project interesting or helpful, we would sincerely appreciate it if you could give us a star! Your support is a tremendous encouragement to us!

What is Parametric RAG?

Parametric RAG introduces a new paradigm for retrieval-augmented generation by embedding external knowledge directly into the parametric space of Large Language Models (LLMs). This approach overcomes the limitations of traditional in-context RAG methods by:

  • Reducing computational overhead by avoiding large context windows.

  • Deeply integrating external knowledge into the Feed-Forward Networks (FFN) of LLMs for improved reasoning and synthesis.

What’s Included?

  • End-to-end implementation of the Parametric RAG pipeline.
  • Preprocessed benchmark datasets for experiments and scripts for customizing and adding new datasets.

Reproduce Paper Results

In the following GitHub repository, we demonstrate how to test the performance of Parametric RAG on various QA datasets. Specifically, follow these steps to run Parametric RAG:

  • Run the Data Augmentation Module: This step corresponds to Section 3.2.1 Self-Augmentation in the original paper, where documents are transformed into a data-augmented dataset.
  • Generate Parametric Representations of Documents: This step corresponds to Section 3.2.2 Additional Parameter Training in the original paper, where additional LoRA parameters are trained.
  • Inference: Merge the parametric representations of relevant documents, insert them into the LLM, and use the updated LLM for inference.

All the prompts used in the experiment are displayed in the all_prompt.md file.

Install Environment

conda create -n prag python=3.10.4
conda activate prag
pip install torch==2.1.0
pip install -r requirements.txt

Please change the ROOT_DIR variable in src/root_dir_path.py to the folder address where you store PRAG.

Self-Augmentation

You can directly use the pre-augmented data file data_aug.tar.gz. To extract it, run the command tar -xzvf data_aug.tar.gz in your terminal.

If you want to perform data augmentation yourself, please process it as follows.

Prepare BM25 for retrieval

  1. Download the Wikipedia dump from the DPR repository using the following command
mkdir -p data/dpr
wget -O data/dpr/psgs_w100.tsv.gz https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz
pushd data/dpr
gzip -d psgs_w100.tsv.gz
popd
  1. Use Elasticsearch to index the Wikipedia dump
cd data
wget -O elasticsearch-8.15.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-linux-x86_64.tar.gz # download Elasticsearch
tar zxvf elasticsearch-8.15.0.tar.gz
rm elasticsearch-8.15.0.tar.gz cd elasticsearch-8.15.0
nohup bin/elasticsearch &# run Elasticsearch in backgroundcd ../..
python prep_elastic.py --data_path data/dpr/psgs_w100.tsv --index_name wiki # build index

Download dataset

For 2WikiMultihopQA:

Download the 2WikiMultihopQA dataset from its repository https://www.dropbox.com/s/ms2m13252h6xubs/data_ids_april7.zip?e=1. Unzip it and move the folder to data/2wikimultihopqa.

For HotpotQA:

mkdir -p data/hotpotqa
wget -P data/hotpotqa/ http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

For PopQA:

Download the PopQA dataset from its repository https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv, and put the file popQA.tsv into folder data/popqa.

mkdir -p data/popqa
wget -P data/popqa https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv

For ComplexWebQuestions:

Download the ComplexWebQuestions dataset from its repository https://www.dropbox.com/scl/fo/nqujvpg2gc4y0ozkw3wgr/AOzjVEsdUhv2Fx2pamfJlSw?rlkey=746t7xehfqxf1zr867nxiq8aq&e=1, and put the file ComplexWebQuestions_dev.json into folder data/complexwebquestions.

Data Augmentation:

python src/augment.py \
--model_name llama3.2-1b-instruct \
--dataset 2wikimultihopqa \
--data_path data/2wikimultihopqa/ \
--sample 300 \
--topk 3
ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_pathfolder to the saved data, such as data/2wikimultihopqa
sampleNumber of questions to run
topkretrieval number

The results of data augmentation will be stored in the file data_aug/{dataset}/{data_type}.json.

If you want to apply data augmentation to a new dataset, the default data format for the augmented data is JSON. Each element in the array should include both a 'question' and an 'answer,' as shown in the example below.

[
{
"question": "string",
"answer": "string or list[string]",
}
]

At this point, the input parameter dataset refers to the name of the dataset you’ve set, and data_path is the path to the JSON file mentioned above. The last filename in data_path will be treated as the data_type. The output file will be saved in data_aug/{your_dataset_name}/{data_type}.json.

Document Parameterizing

Methodology

By calling the src/encode.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0

When running for the first time with a specific LoRA parameter, an initial random parameter, base_weight will be created. All subsequent training will start from this base_weight.

All generated parameters are stored in the offline folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ ├── base_weight/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {data_type}/
│ └── data_{did}/
│ └── passage_{pid}/
| └── parameters

The running parameters of the main experiments in the paper are listed in the configs folder.

Generate

By calling the src/inference.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0
max_new_tokensNumber of generate tokens
inference_method"icl" is naive RAG, "prag" is our method, and "combine" is using both methods together

All generated results are stored in the output folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {inference_method}/
│ └── {data_type}/
│ ├── config.json
│ ├── predict.json
│ └── result.txt

Also, the running parameters of the main experiments in the paper are listed in the configs folder.

Warm up LoRA

After calling python src/get_warmup_data.py, the initialization training data for finetuning will be generated from the latter part of the dataset. The data generation code ensures that there is no data leakage.

Then, the following code will be used to train and generate two base LoRA weights:

# the training used 600 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--block_size 3000 \
--lora_rank 2 \
--lora_alpha 32 \
--with_cot # the training used 2000 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--lora_rank 2 \
--lora_alpha 32 \
--block_size 3000 

About

Code for Parametric RAG, SIGIR 2025 Full Paper

Resources

Stars

233 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Parametric RAG

📢 News: this work has been accepted at the SIGIR 2025!

Overall Analysis

Overall Analysis

Overview

Welcome to the Official Repository of Parametric Retrieval-Augmented Generation (Parametric RAG)!

This repository contains the code, datasets models used in our paper: "Parametric Retrieval-Augmented Generation".

If you find our project interesting or helpful, we would sincerely appreciate it if you could give us a star! Your support is a tremendous encouragement to us!

What is Parametric RAG?

Parametric RAG introduces a new paradigm for retrieval-augmented generation by embedding external knowledge directly into the parametric space of Large Language Models (LLMs). This approach overcomes the limitations of traditional in-context RAG methods by:

  • Reducing computational overhead by avoiding large context windows.

  • Deeply integrating external knowledge into the Feed-Forward Networks (FFN) of LLMs for improved reasoning and synthesis.

What’s Included?

  • End-to-end implementation of the Parametric RAG pipeline.
  • Preprocessed benchmark datasets for experiments and scripts for customizing and adding new datasets.

Reproduce Paper Results

In the following GitHub repository, we demonstrate how to test the performance of Parametric RAG on various QA datasets. Specifically, follow these steps to run Parametric RAG:

  • Run the Data Augmentation Module: This step corresponds to Section 3.2.1 Self-Augmentation in the original paper, where documents are transformed into a data-augmented dataset.
  • Generate Parametric Representations of Documents: This step corresponds to Section 3.2.2 Additional Parameter Training in the original paper, where additional LoRA parameters are trained.
  • Inference: Merge the parametric representations of relevant documents, insert them into the LLM, and use the updated LLM for inference.

All the prompts used in the experiment are displayed in the all_prompt.md file.

Install Environment

conda create -n prag python=3.10.4
conda activate prag
pip install torch==2.1.0
pip install -r requirements.txt

Please change the ROOT_DIR variable in src/root_dir_path.py to the folder address where you store PRAG.

Self-Augmentation

You can directly use the pre-augmented data file data_aug.tar.gz. To extract it, run the command tar -xzvf data_aug.tar.gz in your terminal.

If you want to perform data augmentation yourself, please process it as follows.

Prepare BM25 for retrieval

  1. Download the Wikipedia dump from the DPR repository using the following command
mkdir -p data/dpr
wget -O data/dpr/psgs_w100.tsv.gz https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz
pushd data/dpr
gzip -d psgs_w100.tsv.gz
popd
  1. Use Elasticsearch to index the Wikipedia dump
cd data
wget -O elasticsearch-8.15.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-linux-x86_64.tar.gz # download Elasticsearch
tar zxvf elasticsearch-8.15.0.tar.gz
rm elasticsearch-8.15.0.tar.gz cd elasticsearch-8.15.0
nohup bin/elasticsearch &# run Elasticsearch in backgroundcd ../..
python prep_elastic.py --data_path data/dpr/psgs_w100.tsv --index_name wiki # build index

Download dataset

For 2WikiMultihopQA:

Download the 2WikiMultihopQA dataset from its repository https://www.dropbox.com/s/ms2m13252h6xubs/data_ids_april7.zip?e=1. Unzip it and move the folder to data/2wikimultihopqa.

For HotpotQA:

mkdir -p data/hotpotqa
wget -P data/hotpotqa/ http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

For PopQA:

Download the PopQA dataset from its repository https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv, and put the file popQA.tsv into folder data/popqa.

mkdir -p data/popqa
wget -P data/popqa https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv

For ComplexWebQuestions:

Download the ComplexWebQuestions dataset from its repository https://www.dropbox.com/scl/fo/nqujvpg2gc4y0ozkw3wgr/AOzjVEsdUhv2Fx2pamfJlSw?rlkey=746t7xehfqxf1zr867nxiq8aq&e=1, and put the file ComplexWebQuestions_dev.json into folder data/complexwebquestions.

Data Augmentation:

python src/augment.py \
--model_name llama3.2-1b-instruct \
--dataset 2wikimultihopqa \
--data_path data/2wikimultihopqa/ \
--sample 300 \
--topk 3
ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_pathfolder to the saved data, such as data/2wikimultihopqa
sampleNumber of questions to run
topkretrieval number

The results of data augmentation will be stored in the file data_aug/{dataset}/{data_type}.json.

If you want to apply data augmentation to a new dataset, the default data format for the augmented data is JSON. Each element in the array should include both a 'question' and an 'answer,' as shown in the example below.

[
{
"question": "string",
"answer": "string or list[string]",
}
]

At this point, the input parameter dataset refers to the name of the dataset you’ve set, and data_path is the path to the JSON file mentioned above. The last filename in data_path will be treated as the data_type. The output file will be saved in data_aug/{your_dataset_name}/{data_type}.json.

Document Parameterizing

Methodology

By calling the src/encode.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0

When running for the first time with a specific LoRA parameter, an initial random parameter, base_weight will be created. All subsequent training will start from this base_weight.

All generated parameters are stored in the offline folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ ├── base_weight/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {data_type}/
│ └── data_{did}/
│ └── passage_{pid}/
| └── parameters

The running parameters of the main experiments in the paper are listed in the configs folder.

Generate

By calling the src/inference.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0
max_new_tokensNumber of generate tokens
inference_method"icl" is naive RAG, "prag" is our method, and "combine" is using both methods together

All generated results are stored in the output folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {inference_method}/
│ └── {data_type}/
│ ├── config.json
│ ├── predict.json
│ └── result.txt

Also, the running parameters of the main experiments in the paper are listed in the configs folder.

Warm up LoRA

After calling python src/get_warmup_data.py, the initialization training data for finetuning will be generated from the latter part of the dataset. The data generation code ensures that there is no data leakage.

Then, the following code will be used to train and generate two base LoRA weights:

# the training used 600 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--block_size 3000 \
--lora_rank 2 \
--lora_alpha 32 \
--with_cot # the training used 2000 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--lora_rank 2 \
--lora_alpha 32 \
--block_size 3000 

About

Code for Parametric RAG, SIGIR 2025 Full Paper

Resources

Stars

233 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Parametric RAG

📢 News: this work has been accepted at the SIGIR 2025!

Overall Analysis

Overall Analysis

Overview

Welcome to the Official Repository of Parametric Retrieval-Augmented Generation (Parametric RAG)!

This repository contains the code, datasets models used in our paper: "Parametric Retrieval-Augmented Generation".

If you find our project interesting or helpful, we would sincerely appreciate it if you could give us a star! Your support is a tremendous encouragement to us!

What is Parametric RAG?

Parametric RAG introduces a new paradigm for retrieval-augmented generation by embedding external knowledge directly into the parametric space of Large Language Models (LLMs). This approach overcomes the limitations of traditional in-context RAG methods by:

  • Reducing computational overhead by avoiding large context windows.

  • Deeply integrating external knowledge into the Feed-Forward Networks (FFN) of LLMs for improved reasoning and synthesis.

What’s Included?

  • End-to-end implementation of the Parametric RAG pipeline.
  • Preprocessed benchmark datasets for experiments and scripts for customizing and adding new datasets.

Reproduce Paper Results

In the following GitHub repository, we demonstrate how to test the performance of Parametric RAG on various QA datasets. Specifically, follow these steps to run Parametric RAG:

  • Run the Data Augmentation Module: This step corresponds to Section 3.2.1 Self-Augmentation in the original paper, where documents are transformed into a data-augmented dataset.
  • Generate Parametric Representations of Documents: This step corresponds to Section 3.2.2 Additional Parameter Training in the original paper, where additional LoRA parameters are trained.
  • Inference: Merge the parametric representations of relevant documents, insert them into the LLM, and use the updated LLM for inference.

All the prompts used in the experiment are displayed in the all_prompt.md file.

Install Environment

conda create -n prag python=3.10.4
conda activate prag
pip install torch==2.1.0
pip install -r requirements.txt

Please change the ROOT_DIR variable in src/root_dir_path.py to the folder address where you store PRAG.

Self-Augmentation

You can directly use the pre-augmented data file data_aug.tar.gz. To extract it, run the command tar -xzvf data_aug.tar.gz in your terminal.

If you want to perform data augmentation yourself, please process it as follows.

Prepare BM25 for retrieval

  1. Download the Wikipedia dump from the DPR repository using the following command
mkdir -p data/dpr
wget -O data/dpr/psgs_w100.tsv.gz https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz
pushd data/dpr
gzip -d psgs_w100.tsv.gz
popd
  1. Use Elasticsearch to index the Wikipedia dump
cd data
wget -O elasticsearch-8.15.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-linux-x86_64.tar.gz # download Elasticsearch
tar zxvf elasticsearch-8.15.0.tar.gz
rm elasticsearch-8.15.0.tar.gz cd elasticsearch-8.15.0
nohup bin/elasticsearch &# run Elasticsearch in backgroundcd ../..
python prep_elastic.py --data_path data/dpr/psgs_w100.tsv --index_name wiki # build index

Download dataset

For 2WikiMultihopQA:

Download the 2WikiMultihopQA dataset from its repository https://www.dropbox.com/s/ms2m13252h6xubs/data_ids_april7.zip?e=1. Unzip it and move the folder to data/2wikimultihopqa.

For HotpotQA:

mkdir -p data/hotpotqa
wget -P data/hotpotqa/ http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

For PopQA:

Download the PopQA dataset from its repository https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv, and put the file popQA.tsv into folder data/popqa.

mkdir -p data/popqa
wget -P data/popqa https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv

For ComplexWebQuestions:

Download the ComplexWebQuestions dataset from its repository https://www.dropbox.com/scl/fo/nqujvpg2gc4y0ozkw3wgr/AOzjVEsdUhv2Fx2pamfJlSw?rlkey=746t7xehfqxf1zr867nxiq8aq&e=1, and put the file ComplexWebQuestions_dev.json into folder data/complexwebquestions.

Data Augmentation:

python src/augment.py \
--model_name llama3.2-1b-instruct \
--dataset 2wikimultihopqa \
--data_path data/2wikimultihopqa/ \
--sample 300 \
--topk 3
ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_pathfolder to the saved data, such as data/2wikimultihopqa
sampleNumber of questions to run
topkretrieval number

The results of data augmentation will be stored in the file data_aug/{dataset}/{data_type}.json.

If you want to apply data augmentation to a new dataset, the default data format for the augmented data is JSON. Each element in the array should include both a 'question' and an 'answer,' as shown in the example below.

[
{
"question": "string",
"answer": "string or list[string]",
}
]

At this point, the input parameter dataset refers to the name of the dataset you’ve set, and data_path is the path to the JSON file mentioned above. The last filename in data_path will be treated as the data_type. The output file will be saved in data_aug/{your_dataset_name}/{data_type}.json.

Document Parameterizing

Methodology

By calling the src/encode.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0

When running for the first time with a specific LoRA parameter, an initial random parameter, base_weight will be created. All subsequent training will start from this base_weight.

All generated parameters are stored in the offline folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ ├── base_weight/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {data_type}/
│ └── data_{did}/
│ └── passage_{pid}/
| └── parameters

The running parameters of the main experiments in the paper are listed in the configs folder.

Generate

By calling the src/inference.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0
max_new_tokensNumber of generate tokens
inference_method"icl" is naive RAG, "prag" is our method, and "combine" is using both methods together

All generated results are stored in the output folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {inference_method}/
│ └── {data_type}/
│ ├── config.json
│ ├── predict.json
│ └── result.txt

Also, the running parameters of the main experiments in the paper are listed in the configs folder.

Warm up LoRA

After calling python src/get_warmup_data.py, the initialization training data for finetuning will be generated from the latter part of the dataset. The data generation code ensures that there is no data leakage.

Then, the following code will be used to train and generate two base LoRA weights:

# the training used 600 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--block_size 3000 \
--lora_rank 2 \
--lora_alpha 32 \
--with_cot # the training used 2000 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--lora_rank 2 \
--lora_alpha 32 \
--block_size 3000 

About

Code for Parametric RAG, SIGIR 2025 Full Paper

Resources

Stars

233 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Parametric RAG

📢 News: this work has been accepted at the SIGIR 2025!

Overall Analysis

Overall Analysis

Overview

Welcome to the Official Repository of Parametric Retrieval-Augmented Generation (Parametric RAG)!

This repository contains the code, datasets models used in our paper: "Parametric Retrieval-Augmented Generation".

If you find our project interesting or helpful, we would sincerely appreciate it if you could give us a star! Your support is a tremendous encouragement to us!

What is Parametric RAG?

Parametric RAG introduces a new paradigm for retrieval-augmented generation by embedding external knowledge directly into the parametric space of Large Language Models (LLMs). This approach overcomes the limitations of traditional in-context RAG methods by:

  • Reducing computational overhead by avoiding large context windows.

  • Deeply integrating external knowledge into the Feed-Forward Networks (FFN) of LLMs for improved reasoning and synthesis.

What’s Included?

  • End-to-end implementation of the Parametric RAG pipeline.
  • Preprocessed benchmark datasets for experiments and scripts for customizing and adding new datasets.

Reproduce Paper Results

In the following GitHub repository, we demonstrate how to test the performance of Parametric RAG on various QA datasets. Specifically, follow these steps to run Parametric RAG:

  • Run the Data Augmentation Module: This step corresponds to Section 3.2.1 Self-Augmentation in the original paper, where documents are transformed into a data-augmented dataset.
  • Generate Parametric Representations of Documents: This step corresponds to Section 3.2.2 Additional Parameter Training in the original paper, where additional LoRA parameters are trained.
  • Inference: Merge the parametric representations of relevant documents, insert them into the LLM, and use the updated LLM for inference.

All the prompts used in the experiment are displayed in the all_prompt.md file.

Install Environment

conda create -n prag python=3.10.4
conda activate prag
pip install torch==2.1.0
pip install -r requirements.txt

Please change the ROOT_DIR variable in src/root_dir_path.py to the folder address where you store PRAG.

Self-Augmentation

You can directly use the pre-augmented data file data_aug.tar.gz. To extract it, run the command tar -xzvf data_aug.tar.gz in your terminal.

If you want to perform data augmentation yourself, please process it as follows.

Prepare BM25 for retrieval

  1. Download the Wikipedia dump from the DPR repository using the following command
mkdir -p data/dpr
wget -O data/dpr/psgs_w100.tsv.gz https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz
pushd data/dpr
gzip -d psgs_w100.tsv.gz
popd
  1. Use Elasticsearch to index the Wikipedia dump
cd data
wget -O elasticsearch-8.15.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-linux-x86_64.tar.gz # download Elasticsearch
tar zxvf elasticsearch-8.15.0.tar.gz
rm elasticsearch-8.15.0.tar.gz cd elasticsearch-8.15.0
nohup bin/elasticsearch &# run Elasticsearch in backgroundcd ../..
python prep_elastic.py --data_path data/dpr/psgs_w100.tsv --index_name wiki # build index

Download dataset

For 2WikiMultihopQA:

Download the 2WikiMultihopQA dataset from its repository https://www.dropbox.com/s/ms2m13252h6xubs/data_ids_april7.zip?e=1. Unzip it and move the folder to data/2wikimultihopqa.

For HotpotQA:

mkdir -p data/hotpotqa
wget -P data/hotpotqa/ http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

For PopQA:

Download the PopQA dataset from its repository https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv, and put the file popQA.tsv into folder data/popqa.

mkdir -p data/popqa
wget -P data/popqa https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv

For ComplexWebQuestions:

Download the ComplexWebQuestions dataset from its repository https://www.dropbox.com/scl/fo/nqujvpg2gc4y0ozkw3wgr/AOzjVEsdUhv2Fx2pamfJlSw?rlkey=746t7xehfqxf1zr867nxiq8aq&e=1, and put the file ComplexWebQuestions_dev.json into folder data/complexwebquestions.

Data Augmentation:

python src/augment.py \
--model_name llama3.2-1b-instruct \
--dataset 2wikimultihopqa \
--data_path data/2wikimultihopqa/ \
--sample 300 \
--topk 3
ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_pathfolder to the saved data, such as data/2wikimultihopqa
sampleNumber of questions to run
topkretrieval number

The results of data augmentation will be stored in the file data_aug/{dataset}/{data_type}.json.

If you want to apply data augmentation to a new dataset, the default data format for the augmented data is JSON. Each element in the array should include both a 'question' and an 'answer,' as shown in the example below.

[
{
"question": "string",
"answer": "string or list[string]",
}
]

At this point, the input parameter dataset refers to the name of the dataset you’ve set, and data_path is the path to the JSON file mentioned above. The last filename in data_path will be treated as the data_type. The output file will be saved in data_aug/{your_dataset_name}/{data_type}.json.

Document Parameterizing

Methodology

By calling the src/encode.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0

When running for the first time with a specific LoRA parameter, an initial random parameter, base_weight will be created. All subsequent training will start from this base_weight.

All generated parameters are stored in the offline folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ ├── base_weight/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {data_type}/
│ └── data_{did}/
│ └── passage_{pid}/
| └── parameters

The running parameters of the main experiments in the paper are listed in the configs folder.

Generate

By calling the src/inference.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0
max_new_tokensNumber of generate tokens
inference_method"icl" is naive RAG, "prag" is our method, and "combine" is using both methods together

All generated results are stored in the output folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {inference_method}/
│ └── {data_type}/
│ ├── config.json
│ ├── predict.json
│ └── result.txt

Also, the running parameters of the main experiments in the paper are listed in the configs folder.

Warm up LoRA

After calling python src/get_warmup_data.py, the initialization training data for finetuning will be generated from the latter part of the dataset. The data generation code ensures that there is no data leakage.

Then, the following code will be used to train and generate two base LoRA weights:

# the training used 600 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--block_size 3000 \
--lora_rank 2 \
--lora_alpha 32 \
--with_cot # the training used 2000 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--lora_rank 2 \
--lora_alpha 32 \
--block_size 3000 

About

Code for Parametric RAG, SIGIR 2025 Full Paper

Resources

Stars

233 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Parametric RAG

📢 News: this work has been accepted at the SIGIR 2025!

Overall Analysis

Overall Analysis

Overview

Welcome to the Official Repository of Parametric Retrieval-Augmented Generation (Parametric RAG)!

This repository contains the code, datasets models used in our paper: "Parametric Retrieval-Augmented Generation".

If you find our project interesting or helpful, we would sincerely appreciate it if you could give us a star! Your support is a tremendous encouragement to us!

What is Parametric RAG?

Parametric RAG introduces a new paradigm for retrieval-augmented generation by embedding external knowledge directly into the parametric space of Large Language Models (LLMs). This approach overcomes the limitations of traditional in-context RAG methods by:

  • Reducing computational overhead by avoiding large context windows.

  • Deeply integrating external knowledge into the Feed-Forward Networks (FFN) of LLMs for improved reasoning and synthesis.

What’s Included?

  • End-to-end implementation of the Parametric RAG pipeline.
  • Preprocessed benchmark datasets for experiments and scripts for customizing and adding new datasets.

Reproduce Paper Results

In the following GitHub repository, we demonstrate how to test the performance of Parametric RAG on various QA datasets. Specifically, follow these steps to run Parametric RAG:

  • Run the Data Augmentation Module: This step corresponds to Section 3.2.1 Self-Augmentation in the original paper, where documents are transformed into a data-augmented dataset.
  • Generate Parametric Representations of Documents: This step corresponds to Section 3.2.2 Additional Parameter Training in the original paper, where additional LoRA parameters are trained.
  • Inference: Merge the parametric representations of relevant documents, insert them into the LLM, and use the updated LLM for inference.

All the prompts used in the experiment are displayed in the all_prompt.md file.

Install Environment

conda create -n prag python=3.10.4
conda activate prag
pip install torch==2.1.0
pip install -r requirements.txt

Please change the ROOT_DIR variable in src/root_dir_path.py to the folder address where you store PRAG.

Self-Augmentation

You can directly use the pre-augmented data file data_aug.tar.gz. To extract it, run the command tar -xzvf data_aug.tar.gz in your terminal.

If you want to perform data augmentation yourself, please process it as follows.

Prepare BM25 for retrieval

  1. Download the Wikipedia dump from the DPR repository using the following command
mkdir -p data/dpr
wget -O data/dpr/psgs_w100.tsv.gz https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz
pushd data/dpr
gzip -d psgs_w100.tsv.gz
popd
  1. Use Elasticsearch to index the Wikipedia dump
cd data
wget -O elasticsearch-8.15.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-linux-x86_64.tar.gz # download Elasticsearch
tar zxvf elasticsearch-8.15.0.tar.gz
rm elasticsearch-8.15.0.tar.gz cd elasticsearch-8.15.0
nohup bin/elasticsearch &# run Elasticsearch in backgroundcd ../..
python prep_elastic.py --data_path data/dpr/psgs_w100.tsv --index_name wiki # build index

Download dataset

For 2WikiMultihopQA:

Download the 2WikiMultihopQA dataset from its repository https://www.dropbox.com/s/ms2m13252h6xubs/data_ids_april7.zip?e=1. Unzip it and move the folder to data/2wikimultihopqa.

For HotpotQA:

mkdir -p data/hotpotqa
wget -P data/hotpotqa/ http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

For PopQA:

Download the PopQA dataset from its repository https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv, and put the file popQA.tsv into folder data/popqa.

mkdir -p data/popqa
wget -P data/popqa https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv

For ComplexWebQuestions:

Download the ComplexWebQuestions dataset from its repository https://www.dropbox.com/scl/fo/nqujvpg2gc4y0ozkw3wgr/AOzjVEsdUhv2Fx2pamfJlSw?rlkey=746t7xehfqxf1zr867nxiq8aq&e=1, and put the file ComplexWebQuestions_dev.json into folder data/complexwebquestions.

Data Augmentation:

python src/augment.py \
--model_name llama3.2-1b-instruct \
--dataset 2wikimultihopqa \
--data_path data/2wikimultihopqa/ \
--sample 300 \
--topk 3
ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_pathfolder to the saved data, such as data/2wikimultihopqa
sampleNumber of questions to run
topkretrieval number

The results of data augmentation will be stored in the file data_aug/{dataset}/{data_type}.json.

If you want to apply data augmentation to a new dataset, the default data format for the augmented data is JSON. Each element in the array should include both a 'question' and an 'answer,' as shown in the example below.

[
{
"question": "string",
"answer": "string or list[string]",
}
]

At this point, the input parameter dataset refers to the name of the dataset you’ve set, and data_path is the path to the JSON file mentioned above. The last filename in data_path will be treated as the data_type. The output file will be saved in data_aug/{your_dataset_name}/{data_type}.json.

Document Parameterizing

Methodology

By calling the src/encode.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0

When running for the first time with a specific LoRA parameter, an initial random parameter, base_weight will be created. All subsequent training will start from this base_weight.

All generated parameters are stored in the offline folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ ├── base_weight/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {data_type}/
│ └── data_{did}/
│ └── passage_{pid}/
| └── parameters

The running parameters of the main experiments in the paper are listed in the configs folder.

Generate

By calling the src/inference.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0
max_new_tokensNumber of generate tokens
inference_method"icl" is naive RAG, "prag" is our method, and "combine" is using both methods together

All generated results are stored in the output folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {inference_method}/
│ └── {data_type}/
│ ├── config.json
│ ├── predict.json
│ └── result.txt

Also, the running parameters of the main experiments in the paper are listed in the configs folder.

Warm up LoRA

After calling python src/get_warmup_data.py, the initialization training data for finetuning will be generated from the latter part of the dataset. The data generation code ensures that there is no data leakage.

Then, the following code will be used to train and generate two base LoRA weights:

# the training used 600 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--block_size 3000 \
--lora_rank 2 \
--lora_alpha 32 \
--with_cot # the training used 2000 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--lora_rank 2 \
--lora_alpha 32 \
--block_size 3000 

About

Code for Parametric RAG, SIGIR 2025 Full Paper

Resources

Stars

233 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Parametric RAG

📢 News: this work has been accepted at the SIGIR 2025!

Overall Analysis

Overall Analysis

Overview

Welcome to the Official Repository of Parametric Retrieval-Augmented Generation (Parametric RAG)!

This repository contains the code, datasets models used in our paper: "Parametric Retrieval-Augmented Generation".

If you find our project interesting or helpful, we would sincerely appreciate it if you could give us a star! Your support is a tremendous encouragement to us!

What is Parametric RAG?

Parametric RAG introduces a new paradigm for retrieval-augmented generation by embedding external knowledge directly into the parametric space of Large Language Models (LLMs). This approach overcomes the limitations of traditional in-context RAG methods by:

  • Reducing computational overhead by avoiding large context windows.

  • Deeply integrating external knowledge into the Feed-Forward Networks (FFN) of LLMs for improved reasoning and synthesis.

What’s Included?

  • End-to-end implementation of the Parametric RAG pipeline.
  • Preprocessed benchmark datasets for experiments and scripts for customizing and adding new datasets.

Reproduce Paper Results

In the following GitHub repository, we demonstrate how to test the performance of Parametric RAG on various QA datasets. Specifically, follow these steps to run Parametric RAG:

  • Run the Data Augmentation Module: This step corresponds to Section 3.2.1 Self-Augmentation in the original paper, where documents are transformed into a data-augmented dataset.
  • Generate Parametric Representations of Documents: This step corresponds to Section 3.2.2 Additional Parameter Training in the original paper, where additional LoRA parameters are trained.
  • Inference: Merge the parametric representations of relevant documents, insert them into the LLM, and use the updated LLM for inference.

All the prompts used in the experiment are displayed in the all_prompt.md file.

Install Environment

conda create -n prag python=3.10.4
conda activate prag
pip install torch==2.1.0
pip install -r requirements.txt

Please change the ROOT_DIR variable in src/root_dir_path.py to the folder address where you store PRAG.

Self-Augmentation

You can directly use the pre-augmented data file data_aug.tar.gz. To extract it, run the command tar -xzvf data_aug.tar.gz in your terminal.

If you want to perform data augmentation yourself, please process it as follows.

Prepare BM25 for retrieval

  1. Download the Wikipedia dump from the DPR repository using the following command
mkdir -p data/dpr
wget -O data/dpr/psgs_w100.tsv.gz https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz
pushd data/dpr
gzip -d psgs_w100.tsv.gz
popd
  1. Use Elasticsearch to index the Wikipedia dump
cd data
wget -O elasticsearch-8.15.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-linux-x86_64.tar.gz # download Elasticsearch
tar zxvf elasticsearch-8.15.0.tar.gz
rm elasticsearch-8.15.0.tar.gz cd elasticsearch-8.15.0
nohup bin/elasticsearch &# run Elasticsearch in backgroundcd ../..
python prep_elastic.py --data_path data/dpr/psgs_w100.tsv --index_name wiki # build index

Download dataset

For 2WikiMultihopQA:

Download the 2WikiMultihopQA dataset from its repository https://www.dropbox.com/s/ms2m13252h6xubs/data_ids_april7.zip?e=1. Unzip it and move the folder to data/2wikimultihopqa.

For HotpotQA:

mkdir -p data/hotpotqa
wget -P data/hotpotqa/ http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

For PopQA:

Download the PopQA dataset from its repository https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv, and put the file popQA.tsv into folder data/popqa.

mkdir -p data/popqa
wget -P data/popqa https://github.com/AlexTMallen/adaptive-retrieval/blob/main/data/popQA.tsv

For ComplexWebQuestions:

Download the ComplexWebQuestions dataset from its repository https://www.dropbox.com/scl/fo/nqujvpg2gc4y0ozkw3wgr/AOzjVEsdUhv2Fx2pamfJlSw?rlkey=746t7xehfqxf1zr867nxiq8aq&e=1, and put the file ComplexWebQuestions_dev.json into folder data/complexwebquestions.

Data Augmentation:

python src/augment.py \
--model_name llama3.2-1b-instruct \
--dataset 2wikimultihopqa \
--data_path data/2wikimultihopqa/ \
--sample 300 \
--topk 3
ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_pathfolder to the saved data, such as data/2wikimultihopqa
sampleNumber of questions to run
topkretrieval number

The results of data augmentation will be stored in the file data_aug/{dataset}/{data_type}.json.

If you want to apply data augmentation to a new dataset, the default data format for the augmented data is JSON. Each element in the array should include both a 'question' and an 'answer,' as shown in the example below.

[
{
"question": "string",
"answer": "string or list[string]",
}
]

At this point, the input parameter dataset refers to the name of the dataset you’ve set, and data_path is the path to the JSON file mentioned above. The last filename in data_path will be treated as the data_type. The output file will be saved in data_aug/{your_dataset_name}/{data_type}.json.

Document Parameterizing

Methodology

By calling the src/encode.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0

When running for the first time with a specific LoRA parameter, an initial random parameter, base_weight will be created. All subsequent training will start from this base_weight.

All generated parameters are stored in the offline folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ ├── base_weight/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {data_type}/
│ └── data_{did}/
│ └── passage_{pid}/
| └── parameters

The running parameters of the main experiments in the paper are listed in the configs folder.

Generate

By calling the src/inference.py file, you will generate a parameterized representation of the documents (LoRA) for the given dataset. The parameters for this file are as follows:

ParameterExample/Options
model_namellama3.2-1b-instruct, qwen2.5-1.5b-instruct, llama3-8b-instruct
dataset2wikimultihopqa, hotpotqa, popqa, complexwebquestions
data_typeNot set means using the entire dataset, otherwise, specify a particular data type
with_cotIf included, generate a CoT
sampleNumber of questions to run
augment_modelModel used for data augmentation. If not set, the current model will be used for augmentation
per_device_train_batch_size, num_train_epochs, learning_rateTraining parameters
lora_rank, lora_alphaLoRA parameters, dropout will be set to 0
max_new_tokensNumber of generate tokens
inference_method"icl" is naive RAG, "prag" is our method, and "combine" is using both methods together

All generated results are stored in the output folder. The specific location of the parameter files is as follows:

offline/
├── {model_name}/
│ └── rank={lora_rank}_alpha={lora_alpha}/
│ └── {dataset}/
│ └── lr={learning_rate}_epoch={num_train_epochs}/
│ └── aug_model={augment_model}/
│ └── {inference_method}/
│ └── {data_type}/
│ ├── config.json
│ ├── predict.json
│ └── result.txt

Also, the running parameters of the main experiments in the paper are listed in the configs folder.

Warm up LoRA

After calling python src/get_warmup_data.py, the initialization training data for finetuning will be generated from the latter part of the dataset. The data generation code ensures that there is no data leakage.

Then, the following code will be used to train and generate two base LoRA weights:

# the training used 600 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--block_size 3000 \
--lora_rank 2 \
--lora_alpha 32 \
--with_cot # the training used 2000 data points 
python src/warmup_lora.py \
--model_name llama3.2-1b-instruct \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--learning_rate 3e-4 \
--lora_rank 2 \
--lora_alpha 32 \
--block_size 3000 

About

Code for Parametric RAG, SIGIR 2025 Full Paper

Resources

Stars

233 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages