✨ 这是ACL 2023论文《中文长篇问答互动网络搜索》的实现
请用中文阅读此内容。
在这项工作中,我们提出了 WebCPM,一个使用中文预训练模型进行交互式网络搜索的项目。我们开发了一个网络搜索界面,它既适合人类,又收集人类的网络搜索行为。然后,我们使用多达 10B 个参数对 PLM 进行微调,以模仿人类的网络搜索行为,并根据收集到的事实生成答案。我们开源网络搜索接口、数据集、实现和模型参数。
要运行我们的代码,请使用以下命令安装所有依赖包:
pip install -r requirements.txt
注意:不同版本的软件包(例如,pytorch
)可能会导致本文得出不同的结果。然而,无论您使用什么版本的软件包,这种趋势应该仍然存在。
首先从Google Drive下载数据,并将文件interactive_data
和pipeline_data
放到./data
,或者运行以下命令:
下载的文件包含以下内容:
interactive_data/data.json
是论文实验中使用的数据集(总共
5500个interactive_data/data_zhihu.json
实例)。是与本文一起收集的附加数据集(约900 个实例),问题来自知乎,您可以使用它来进行数据增强。
请使用以下代码将上述数据拆分为train、dev和test集(设置--add_zhihu将添加data_zhihu.json)。
cd data/interactive_data
python split.py --add_zhihu
除了交互式网络搜索数据之外,我们还提供了训练基于管道的网络搜索所需的数据集:(pipeline_data
总共110k 个实例)。所有数据都是通过提示text-davinci-003(也涉及Bing搜索引擎)创建的,然后由人工注释者手动过滤。 (注意这部分没有包含在论文中,不需要将其拆分为train / dev / test。)
WebCPM基于CPM-bee ,参数高达100亿,是社区最大的中文预训练语言模型之一。我们使用 CPM-bee 的早期版本,表示为 cpm_10b_webcpm_exp.pt。最新版本的 CPM-bee 托管在New-CPM-bee。您可能需要替换新版本的 cpm-live 软件包。请注意,模型检查点尚未针对任何下游任务进行微调。要访问cpm_10b_webcpm_exp.pt,您可以在清华云下载模型参数,或运行以下脚本:
cd models
bash download_model_initial_model.sh
上述代码会在 处下载10B(非微调)模型models
,微调后的管道模型请参考,或从清华云download_model_pipeline_finetuned.sh
手动下载。
我们提供了两个版本的WebCPM:(1)交互式网络搜索(ACL论文中提出的方法)和(2)基于管道的网络搜索,更容易部署(论文中没有报道该方法)。两个版本都使用不同的脚本来生成训练数据,并使用相同的代码来进行模型训练。
工作流程分为四个阶段:(1)首先,根据原始问题生成可能的搜索查询; (2)然后对于每个搜索查询,调用Bing搜索并访问top-K网页; (3)针对每个网页,提取重要信息; (4) 根据所有记录的信息,生成连贯且细致入微的答案。所有这些都是以多任务方式训练的,请参考run_web_browsing/run_pipeline.py
。有关交互式网络搜索的详细信息,请参阅我们的原始论文。
在开始之前,请运行以下代码:
export PYTHONPATH=/**your-base-path**/webcpm
训练数据生成如下(我们区分交互式网络搜索和基于管道的方法)。以下代码会在对应文件夹中生成train_data
、dev_data
、test_data
,训练时会加载。
首先,使用以下代码构建综合模型的数据:
cd dataset_interactive
python make_data_synthesis_model.py --data_path ../../data/interactive_data --augment_qa_data --augment_data_path ../../data/pipeline_data
我们对一些论点的解释如下:
data_path
:源数据路径。augment_qa_data
:是否使用text-davinci自动生成的qa数据来增强训练数据。 (要复制我们论文中的结果,请不要添加此参数)augment_data_path
:增强训练数据的数据路径。
搜索模型的训练数据生成如下:
python make_data_search_model.py --add_query --add_action --add_abstract --abstract_all_tokens
我们对一些论点的解释如下:
data_path
:源数据路径。add_query
:如果为True,将添加查询生成数据。add_abstract
:如果为 True,将添加生成支持事实提取数据。abstract_all_tokens
:如果为 True,则支持事实提取模块将生成所有标记,而不是仅生成前/最后几个标记。add_action
:如果为 True,将添加动作预测数据。add_synthesis
:如果为 True,将为综合模型加载本地数据。注意 您必须首先运行 python make_data_synthesis_model.py 来获取综合数据,然后在此处添加此参数。
如果你想以多任务的方式训练所有子任务,只需添加以上所有参数即可;否则只--add_query
为单任务测试添加一个参数(例如, )。
请运行以下代码:
cd dataset_pipeline
python make_data.py
要训练 WebCPM,请运行以下代码:
cd training export PYTHONPATH=/**your-base-path**/webcpm export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 GPUS_PER_NODE=$(echo $CUDA_VISIBLE_DEVICES | tr ',' '\n' | wc -l | xargs) echo "Number of visible devices: $GPUS_PER_NODE, should be the same as visible devices"set -ex
MASTER_ADDR=localhost MASTER_PORT=3239 NNODES=1 NODE_RANK=0
OPTS="" OPTS+=" --model-config config/cpm-bee-10b.json" OPTS+=" --dataset ../data/dataset_interactive/train_data" OPTS+=" --dataseteval ../data/dataset_interactive/dev_data" OPTS+=" --epoch 5" OPTS+=" --batch-size 8" OPTS+=" --train-iters 100" OPTS+=" --save-name webcpm_finetuned" OPTS+=" --max-length 2560" OPTS+=" --save ../models/" OPTS+=" --lr 0.0001" OPTS+=" --inspect-iters 100" OPTS+=" --warmup-iters 1" OPTS+=" --save-epochs 1" OPTS+=" --lr-decay-style noam" OPTS+=" --weight-decay 0.01" OPTS+=" --clip-grad 1.0" OPTS+=" --loss-scale 32768" OPTS+=" --start-step 0" OPTS+=" --load ../models/cpm_10b_webcpm_exp.pt"
CMD="torchrun --nnodes=${NNODES} --nproc_per_node=${GPUS_PER_NODE} --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=${MASTER_ADDR}:${MASTER_PORT} finetune_cpm_bee.py ${OPTS}"
echo ${CMD} $CMD
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
我们对一些论点的解释如下:
dataset
和dataseteval
:已处理文件的路径。对于交互式网络搜索,它是dataset_interactive,而对于基于管道的方法,它是dataset_pipeline。batch-size
:单个GPU的批量大小,实际批量大小将为#GPUs x 每个GPU的批量大小。max-length
:数据(不是模型)的最大序列长度,那些较长的训练实例将被丢弃。save-name
和save
:保存微调模型的路径和保存的模型检查点的名称。epoch
:训练时期数。load
:预训练模型检查点的路径(在本例中为 cpmb)。
请注意,无论您正在训练哪个模块(或多任务设置),都可以使用上述代码。我们在8x80G A100上进行训练,您可以根据您的GPU设备更改batch size,性能对超参数不敏感。
要评估不同的子任务,您可以首先运行以下代码来获得微调模型对测试数据的预测:
cd inference python inference.py --test_file ../training/dataset_interactive/test.txt --output_file output/test_predictions.json --ckpt_path **your_finetuned_checkpoint.pt
我们对一些论点的解释如下:
test_file
:测试文件的路径,应该是数据预处理时生成的。output_file
:您要写入预测的路径。ckpt_path
:微调模型的路径。
获得测试文件的预测后,可以运行以下代码进行单任务评估:
python evaluate.py --input_file output/test_predictions.txt --evaluate_action
我们对一些论点的解释如下:
input_file
:您编写测试文件的预测的路径。evaluate_action
:是否要评估动作预测任务(F1)。evaluate_query
:是否要评估搜索查询生成任务(Rougel-L)。evaluate_abstract
:是否要评估支持事实提取任务(Rougel-L)。abstract_all_tokens
:您使用哪种模式来训练模型以支持事实提取,如果生成所有标记,请添加此参数(Rougel-L)。evaluate_answer
:是否要评估答案综合任务(Rougel-L)。beam_size
:将光束大小设置为 1 会显着加速推理,但会稍微损害性能。
这是整个管道评估的实现。您可以使用以下代码生成新问题的答案。请注意,这要求您首先从此处获取 Bing 搜索 API 密钥并运行以下代码:
cd run_web_browsing export PYTHONPATH=/**base-path**/webcpm export BING_SEARCH_KEY="**Your Bing Search API Key**"
python run_interactive.py --data_path predictions/test_interactive.json --ckpt_path **your-checkpoint**
python run_pipeline.py --data_path predictions/test.json --ckpt_path **your-checkpoint**
我们对一些论点的解释如下:
data_path
:您编写预测的路径。ckpt_path
:使用基于管道的方法进行训练的检查点的路径。
我们开源了我们的网络搜索接口,您可以使用它来进行数据注释。请参阅注释。目前代码有点混乱,我们很快就会上传更清晰的版本。
如果您对代码或论文有任何疑问,请联系 Yujia ( qyj20@mails.tsinghua.edu.cn
) 或提出问题。
凭借基础模型的强大功能,我们渴望看到它们在操作各种工具方面的应用。 WebCPM就是一种典型的研究尝试。更多资源请参考以下内容:
如果您发现我们的 WebCPM 有用,请使用以下引用:
@inproceedings{qin2023webcpm, title = "WebCPM: Interactive Web Search for Chinese Long-form Question Answering", author={ 5FEE span>Yujia Qin and Zihan Cai and Dian Jin and Lan Yan and Shihao Liang and Kunlun Zhu and Yankai Lin and Xu Han and Ning Ding and Huadong Wang and Ruobing Xie and Fanchao Qi and Zhiyuan Liu and Maosong Sun and Jie Zhou}, booktitle = "Proceedings of ACL 2023", year = "2023", publisher = "Association for Computational Linguistics", url = "https://arxiv.org/abs/2305.06849", }