fengranMark/OpenDecoder
GitHub: fengranMark/OpenDecoder
OpenDecoder 是一个将文档质量指标注入大语言模型注意力计算的 RAG 解码框架,旨在提升生成阶段对检索文档质量的感知能力。
Stars: 26 | Forks: 0

# OpenDecoder
这是一个用于暂存 WWW 2026 已接收论文的仓库 - OpenDecoder 框架:在检索增强生成中引入文档质量的开放式大语言模型解码。
检查点可在[我们的 Hugging Face 仓库](https://huggingface.co/Meranti/OpenDecoder)中获取。
# 运行步骤
## 1. 下载数据与预处理
所使用的 RAG 数据集可以通过 [FlashRAG](https://huggingface.co/datasets/RUC-NLPIR/FlashRAG_datasets) 下载以获取处理好的数据集(NQ 和 HotpotQA 用于训练,而其他数据集可用于域外评估)。e5 检索器可以通过该[检查点](https://huggingface.co/intfloat/e5-base-v2)加载,而用于检索的语料库是 [wiki18](https://dl.fbaipublicfiles.com/dpr/wikipedia_split/psgs_w100.tsv.gz)。
初始化必要的目录,并将所需的检查点和数据下载到各个目录中
```
mkdir checkpoint
mkdir datasets
```
数据集的文件结构如下所示。请注意每个 Python 脚本中的路径设置
```
├── checkpoints/ # E5, Qwen, OpenDecoder
├── datasets/
│ ├── nq
│ ├── hotpotqa
│ ├── popqa
│ ├── trivialqa
│ ├── 2wiki
│ └── wikipedia
├── src/
│ ├── retrieval
│ └── model/qwen_decoder
├── utils/
├── outputs/
```
然后为维基百科语料库建立索引,并构建从段落 ID 到段落文本的映射。(请记住使用您的相对路径)
```
python ./src/e5_dense_index.py
python ./utils/wikipid2psg.py
```
稠密索引和段落 ID 到内容的映射(pid2psg.pkl)将存储在 datasets/wikipedia 目录下。
## 2. 检索外部信息并构建质量指标
RAG 的第一步是检索相关文档,这可以通过下方的脚本实现,并在相应数据集的目录下获取 TREC 格式的检索 Top-k 列表 -> 例如,/datasets/nq/nq_train_e5.trec 和 /datasets/nq/nq_test_e5.trec
由于我们需要在 OpenDecoder 中使用相关性分数作为文档质量指标,我们通过下方的脚本存储了 Top-k 文档的 ID 和分数,以及采样的不相关文档,以进行稳健训练。生成的结果文件位于相应数据集的目录下 -> 例如,/datasets/nq/RAG_train_input.jsonl 和 /datasets/nq/RAG_test_input.jsonl
```
python src/retrieval/construct_indicators.py
```
生成的 RAG 结果文件的格式为
```
{"id": "", "top_pid": [], "top_pid_score": [], "irrel_pid": [], "irrel_pid_score": []}
```
如需生成 LLM-rank/QPP 分数,请运行下方脚本以生成相同格式的结果文件。
```
python src/retrieval/generate_LLMrank_scores.py
python src/retrieval/generate_QPP_scores.py
```
## 3. 开放 LLM 以调节解码器的计算
### 3.1 访问 LLM
由于 OpenDecoder 需要修改原始的 attention 网络计算,第一步是通过将 Qwen-2.5-3B-instruct [检查点](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)下载到 ./checkpoint 路径来访问 LLM。由于原始的官方源代码不支持额外输入以注入相关指标,我们需要通过脚本将初始 LLM 的权重加载到一种经过修改的、将相关性特征作为输入参数之一的 LLM 架构中。
```
# 请记住根据所使用的 backbone model 版本调整 /src/model/qwen_decoder/final_config.json 中的 Arguments
bash ./iniModel.sh
```
### 3.2 调节计算
修改后的 LLM 架构如下所示
```
./src/model/qwen_decoder/modeling.py
```
在该架构中,我们使用以下内容修改了函数 "eager_attention_forward" 的计算
```
if kwargs.get("relevant_scores", None) is not None:
relevant_scores = kwargs["relevant_scores"].unsqueeze(1).unsqueeze(-1).to(query.dtype)
query = query * relevant_scores
```
## 4. OpenDecoder
(1) 训练 OpenDecoder:
```
bash train.sh # single GPU
bash train_parallel.sh # multiple GPUs
```
所使用的指标特征和稳健训练由以下参数控制
```
--add_irrelevant_psg True/False \ # whether add noisy doc for Robust Training
--add_LLM_scores True/False \ # whether add LLM-rank scores
--add_QPP_scores True/False \ # whether add QPP scores
--shuffle_RAG True/False \ # whether shuffle the position for Robust Training
```
我们建议从全为 False 开始,并根据情况进行调整
训练好的模型将存储在 ./outputs 目录下
(2) 通过 OpenDecoder 进行推理:
```
bash inference.sh
```
评估设置由以下参数控制
```
--add_irrelevant_psg True/False \ # evaluate in noisy setting
--full_irrelevant_psg True/False \ # evaluate in extreme noisy setting
```
(3) 推理一个最小示例(问题 + 检索到的文档 + 相关性分数):
您可以查看并尝试运行 inference_single_sample.py,以了解 OpenDecoder 期望的输入是什么样的。
```
python inference_single_sample.py
```
# 引用信息
如果您觉得我们的论文或模型有帮助,请考虑按如下方式引用:
```
@article{mo2026opendecoder,
title={Opendecoder: Open large language model decoding to incorporate document quality in rag},
author={Mo, Fengran and Su, Zhan and Hui, Yuchen and Zhang, Jinghan and Sun, Jia Ao and Liu, Zheyuan and Zhang, Chao and Sakai, Tetsuya and Nie, Jian-Yun},
journal={arXiv preprint arXiv:2601.09028},
year={2026}
}
```
标签:DLL 劫持, 凭据扫描, 大语言模型, 文本生成解码, 文档质量评估, 检索增强生成, 逆向工具