# Corrective Retrieval Augmented Generation
This repository releases the source code for the paper:
- [Corrective Retrieval Augmented Generation](https://arxiv.org/pdf/2401.15884.pdf).
Shi-Qi Yan, Jia-Chen Gu, Yun Zhu, Zhen-Hua Ling
## Overview
Large language models (LLMs) inevitably exhibit hallucinations since the accuracy of generated texts cannot be secured solely by the parametric knowledge they encapsulate. Although retrieval-augmented generation (RAG) is a practicable complement to LLMs, it relies heavily on the relevance of retrieved documents, raising concerns about how the model behaves if retrieval goes wrong. To this end, we propose the **Corrective Retrieval Augmented Generation (CRAG)** to improve the robustness of generation. Specifically, a lightweight retrieval evaluator is designed to assess the overall quality of retrieved documents for a query, returning a confidence degree based on which different knowledge retrieval actions can be triggered. Since retrieval from static and limited corpora can only return sub-optimal documents, large-scale web searches are utilized as an extension for augmenting the retrieval results. Besides, a decompose-then-recompose algorithm is designed for retrieved documents to selectively focus on key information and filter out irrelevant information in them. CRAG is plug-and-play and can be seamlessly coupled with various RAG-based approaches. Experiments on four datasets covering short- and long-form generation tasks show that CRAG can significantly improve the performance of RAG-based approaches.
## Update
- 2024-10-08: Revise the prompt format in the inference stage to improve the performance in RAG and CRAG modes and make the generator follow instructions better.
- 2024-03-04: Release the knowledge preparation including knowledge refinement and knowledge search to gather correct, incorrect and ambiguous knowledge.
- 2024-03-02: Release the fine-tuning of the evaluator and training data preprocessed on PopQA.
- 2024-03-01: Release the data preprocess and data preparation for the inference of Self-CRAG.
- 2024-02-22: Release the inference of CRAG and the weights of the retrieval evaluator used in our experiments. Will release the inference of Self-CRAG and the fine-tuning of the retrieval evaluator soon.
## Requirements
**Note: We use Python 3.11 for CRAG** To get started, install conda and run:
```
git clone https://github.com/HuskyInSalt/CRAG.git
conda create -n CRAG python=3.11
...
pip install -r requirements.txt
```
## Download
- Download the **eval_data** created by [Self-RAG (Asai et al., 2023)](https://github.com/AkariAsai/self-rag) on PopQA, PubQA, Bio and Arc_challenge with retrieved results
- Download the **LLaMA-2** fine-tuned by [Self-RAG (Asai et al., 2023)](https://huggingface.co/selfrag/selfrag_llama2_7b).
- Download the fine-tuned weights of the [retrieval evaluator](https://drive.google.com/drive/folders/1CRFGsyNguXJwKSvFvJm_82GOOlkWSkW7?usp=drive_link) used in our experiments.
- Download the [training data](https://drive.google.com/file/d/1YXyMtROND7oKTi1MgfrKm7ZVS5FTXSqW/view?usp=sharing) for the evaluator.
## Data Preprocess
Run the following command to preprocess the dataset for questions and retrieval results. Specifically for PopQA, the label of each (question, passage) pair is also collected.
```
bash run_data_preprocess.sh
```
## Run CRAG
### Evaluator fine-tuning
Run the following command to fine-tune the evaluator.
```
bash run_evaluator_training.sh
```
The training data is shared and can be downloaded, the method of label collection is similar to the test set preparation in `scripts/data_process.py`.
### Knowledge Preparation
Run the following command to gather knowledge for inference, including `correct`, `incorrect` and `ambiguous`.
```
bash run_knowledge_preparation.sh
```
Specifically, you can also run the following commands individually.
#### Correct
According to the paper, we decompose the retrieval results and filter out irrelevant parts. Three modes are listed to decompose passages: `fixed_num`, `excerption` and `selection`.
`fixed_num` segments passages into a fixed number of words, 'excerption' segments passages based on the end of the sentences, while passages are not divided in `selection` mode.
You can choose the mode by `--decompose_mode`.
```
python internal_knowledge_preparation.py \
--model_path YOUR_EVALUATOR_PATH \
--input_queries ../data/$dataset/sources \
--input_retrieval ../data/$dataset/retrieved_psgs \
--decompose_mode selection \
--output_file ../data/$dataset/ref/correct
```
#### Incorrect
Question rewriting and web searching are proposed here, thus an openai_api_key and a search_key are required.
In this experiment, we utilized a [third-party Google Search API platform](https://serper.dev/) for searching.
Two selective modes including `wiki` and `all` are available.
`wiki` visits pages related to Wikipedia preferentially, while `all` visit all pages equally.
```
python external_knowledge_preparation.py \
--model_path YOUR_EVALUATOR_PATH \
--input_queries ../data/$dataset/sources \
--openai_key $OPENAI_KEY \
--search_key $SEARCH_KEY \
--task $dataset --mode wiki\
--output_file ../data/$dataset/ref/incorrect
```
#### Ambiguous
Run the following command to combine both correct and incorrect knowledge for ambiguous action.
```
python combined_knowledge_preparation.py \
--correct_path ../data/$dataset/ref/correct \
--incorrect_path ../data/$dataset/ref/incorrect \
--ambiguous_path ../data/$dataset/ref/ambiguous
```
### Inference
#### CRAG
Run the following command for CRAG inference.
```
bash run_crag_inference.sh
```
#### Self-CRAG
Run the following command for Self-CRAG data preparation.
```
bash run_selfcrag_preparation.sh
```
With this command, the retrieval results of the original input files of Self-RAG will be replaced by correct, incorrect and ambiguous context. Then follow the instructions at [Self-RAG (Asai et al., 2023)](https://github.com/AkariAsai/self-rag) for the ultimate results.
### Evaluation
For Bio evaluation, please follow the instructions at the [FactScore (Min et al., 2023)](https://github.com/shmsw25/FActScore) official repository.
```
python -m factscore.factscorer --data_path YOUR_OUTPUT_FILE --model_name retrieval+ChatGPT --cache_dir YOUR_CACHE_DIR --openai_key YOUR_OPEN_AI_KEY --verbose
```
It is worth mentioning that, previous FactScore adopted **text-davinci-003** by default, which has been [deprecated since 2024-01-04](https://platform.openai.com/docs/deprecations) and replaced by **gpt-3.5-turbo-instruct**.
Both results of CRAG and Self-CRAG reported are based on the **text-davinci-003**, which may differ from the current **gpt-3.5-turbo-instruct** evaluation.
For the other datasets, run the following command.
```
bash run_eval.sh
```
e.g., PopQA
```
python eval.py \
--input_file eval_data/popqa_longtail_w_gs.jsonl \
--eval_file ../data/popqa/output/YOUR_OUTPUT_FILE \
--metric match
```
PubHealth
```
python eval.py \
--input_file eval_data/health_claims_processed.jsonl \
--eval_file ../data/pubqa/output/YOUR_OUTPUT_FILE \
--metric match --task fever
```
Arc_Challenge
```
python run_test_eval.py \
--input_file eval_data/arc_challenge_processed.jsonl \
--eval_file ../data/arc_challenge/output/YOUR_OUTPUT_FILE \
--metric match --task arc_c
```
## Cite
If you think our work is helpful or use the code, please cite the following paper:
```
@article{yan2024corrective,
title={Corrective Retrieval Augmented Generation},
author={Yan, Shi-Qi and Gu, Jia-Chen and Zhu, Yun and Ling, Zhen-Hua},
journal={arXiv preprint arXiv:2401.15884},
year={2024}
}
```