fengranMark/OpenDecoder

GitHub: fengranMark/OpenDecoder

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

Stars: 26 | Forks: 0

![OpenDecoder 概览](https://raw.githubusercontent.com/fengranMark/OpenDecoder/main/opendecoder.png) # 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 劫持, 凭据扫描, 大语言模型, 文本生成解码, 文档质量评估, 检索增强生成, 逆向工具