ParlAI 中的 ConvAI2 任务全指南:PersonaChat 数据集、模型训练与交互评测实战

发布时间:2026/9/24 16:42:30
ParlAI 中的 ConvAI2 任务全指南:PersonaChat 数据集、模型训练与交互评测实战 ParlAI 中的 ConvAI2 任务全指南PersonaChat 数据集、模型训练与交互评测实战【免费下载链接】ParlAIA framework for training and evaluating AI models on a variety of openly available dialogue datasets.项目地址: https://gitcode.com/gh_mirrors/pa/ParlAI本篇技术指南围绕 ParlAI 仓库中 projects/convai2/README.md 所记录的ConvAI2NIPS 2018 竞赛任务展开系统梳理该闲聊chit-chat数据集的多种版本self/self_revised/none/both、Teacher 实现、数据构建流程并给出查看数据、交互对话、训练与评测模型的完整命令。读者读完本文后将能够在当前 ParlAI 仓库中直接使用--task convai2加载数据、运行预训练模型交互并理解该任务用于评估模型利用 persona 进行个性化对话能力的设计意图。一、任务背景从 PersonaChat 到 NIPS 2018 ConvAI2 竞赛ConvAI2 是 ParlAI 在 NIPS 2018 期间赞助并组织的一场对话 AI 竞赛其官网为 convai.io。竞赛使用的数据集基于 PersonaChat 论文arxiv 1801.07243构建属于**基于 persona 的闲聊chit-chat**任务每段对话开始前对话双方各被分配若干条your persona: ...描述模型需要阅读这些 persona 信息并在此基础上与对方自然交谈。原项目 README 明确指出该竞赛代码目前已归档ParlAI 主分支不再维护旧版竞赛代码如需使用旧版交互脚本与 baseline 代码可切换到归档标签git checkout convai2archive需要特别说明的是数据集与 Teacher 部分并未随竞赛代码一起归档它们始终保留在 ParlAI 主分支中位于 parlai/tasks/convai2可以通过--task convai2直接使用。本文后续内容以当前仓库主分支的实际代码为准归档标签中的内容仅作背景说明。二、快速开始查看 ConvAI2 训练数据在 ParlAI 中加载 ConvAI2 任务的最简单方式是使用display_data脚本这与查看其他任务完全一致parlai display_data -t convai2 -dt train其中-t convai2指定任务为 ConvAI2-dt train指定数据类别datatype为训练集也可以换成valid或test。实际输出的一条训练样本形如节选自仓库内的示例数据 parlai/tasks/convai2/test/convai2_train.ymlyour persona: i like to remodel homes. your persona: i like to go hunting. your persona: i like to shoot a bow. your persona: my favorite holiday is halloween. hi , how are you doing ? im getting ready to do some cheetah chasing to stay in shape .可以看到每条样本的text以多行your persona:开头随后是对话历史而labels是下一句应答同时每条样本还附带一组label_candidates候选应答用于支持排序ranking式训练与评测——这正是原 README 中所说的额外添加了候选以支持基于排序损失的训练/评测。三、数据集版本与 Teacher 结构源码级剖析原 README 提到ConvAI2 数据集存在多个版本可通过convai2:self、convai2:self_revised和convai2:none访问分别对应 PersonaChat 论文中的 original self persona、revised self persona 和 no persona。在源码层面这些版本被实现为 parlai/tasks/convai2/agents.py 中的一组 Teacher 类全部继承自FbDeprecatedDialogTeacher读取经典 FbDialog 格式的.txt数据文件任务参数-tTeacher 类对应数据文件说明convai2DefaultTeacher即SelfOriginalTeacherself_original默认设置leaderboard 评测即使用该版本convai2:selfSelfTeacher/SelfOriginalTeacherself_original原始 self personaconvai2:self_revisedSelfRevisedTeacherself_revised修订后的 self personaconvai2:noneNoneTeachernone_original无 persona对照实验用convai2:bothBothTeacherboth_original从双方视角提供训练样本供 self-chat / persona 加载使用其中SelfTeacher只是SelfOriginalTeacher的别名agents.py 第 78-79 行DefaultTeacher同样直接继承自SelfOriginalTeacheragents.py 第 199-200 行。3.1 是否携带 label candidates源码注释agents.py 第 20-27 行明确说明每个 Teacher 默认使用带 label candidates的数据集如果需要不带候选的版本使用如下任务标志--task convai2:{TEACHER_NAME}:no_cands其中TEACHER_NAME为None、SelfOriginal或Self、SelfRevised。以BothTeacher为例agents.py 第 42-51 行Teacher 会解析opt[task]的第三段是否为no_cands从而决定拼接_no_cands后缀的数据文件路径。这在做候选排序 vs 生成两类模型对比时非常实用。3.2 测试集处理逻辑在_path函数中agents.py 第 30-39 行有一段值得注意的逻辑官方测试集不对外公开如果用户传入-dt test系统会打印警告WARNING: Test set not included. Setting datatype to valid.并自动回退到验证集。这是竞赛隐藏测试集的直接体现——提交评测由官方在隐藏测试集上进行详见第五节。3.3 数据下载与版本管理数据构建逻辑位于 parlai/tasks/convai2/build.py数据包convai2_fix_723.tgz下载自http://parl.ai/downloads/convai2/并带 SHA-256 校验值build.py 第 14-20 行内部版本号为v5.0若本地存在旧版本数据会自动清理后重新下载build.py 第 24-39 行数据解压到datapath/ConvAI2/目录下。数据集规模可参考 parlai/zoo/bb3/model_card.md 中的汇总PersonaChat 数据共约 18688 个 episode、131438 条 example可通过parlai dd -t convai2快速浏览仓库内置的小样本文件 parlai/tasks/convai2/test/convai2_train.yml 末尾同样标注了num_episodes: 17878、num_examples: 131438。3.4 标准化 TeacherNormalizedTeacher除原始版本外任务还提供了一套规范化Teacher用于统一文本格式NormalizedTeacher、NormalizedBothTeacher、NormalizedTheirTeacher、NormalizedNoneTeacher。其核心逻辑NormalizedTeacherTraitagents.py 第 94-167 行提供两个命令行参数--your-persona-first默认True是否将your persona:置于partners persona:之前默认行为与BothTeacher保持一致--max-num-turns默认-1每个 episode 只展示前 X 轮-1表示展示整个 episode。此外它会调用parlai.utils.strings.normalize_reply对 persona 句与普通话语进行统一规范化如标点、大小写处理保证不同版本数据格式一致。3.5 世界Worlds实现任务还提供了两个专用 Worldparlai/tasks/convai2/worlds.pyInteractiveWorld支持--display-partner-persona默认True参数对话结束后在终端打印对方扮演的 personaworlds.py 第 57-96 行SelfChatWorld支持 self-chat两个模型自己聊天场景。两者的 persona 来源一致_load_personas会临时以convai2:both数据驱动一个FixedResponseAgent遍历整个数据集提取其中的your persona:/partners persona:语句去重后构成 persona 池worlds.py 第 24-54 行。测试用例 tests/tasks/convai2/test_convai2_worlds.py 验证了InteractiveWorld在clone()分布式/并行共享时不会重复加载 persona 列表。四、与模型交互对话4.1 归档代码中的交互脚本原 README 提供的交互方式基于竞赛归档代码切换到convai2archive标签后可以使用python projects/convai2/interactive.py -mf models:convai2/kvmemnn/model也可以切换成 seq2seq 模型python projects/convai2/interactive.py -mf models:convai2/seq2seq/convai2_self_seq2seq_model -m legacy:seq2seq:0其中-mf--model-file指定模型文件-m指定模型类。注意这两个模型文件models:convai2/kvmemnn/model、models:convai2/seq2seq/convai2_self_seq2seq_model以及projects/convai2/interactive.py脚本都属于归档版本当前主分支的projects/convai2目录下仅保留 README因此运行上述命令前需要先git checkout convai2archive。4.2 当前仓库的交互方式使用 zoo 预训练模型在当前主分支中交互对话统一通过parlai interactive或python parlai/scripts/interactive.py完成。仓库中已提供多个在 ConvAI2 上微调过的预训练模型可直接体验parlai interactive -m transformer/polyencoder \ -mf zoo:pretrained_transformers/model_poly/model \ --encode-candidate-vecs true \ --eval-candidates fixed \ --fixed-candidates-path data/models/pretrained_transformers/convai_trainset_cands.txt该命令来自 parlai/zoo/pretrained_transformers/README.md使用在 Reddit 上预训练、并在 ConvAI2 上微调的 Poly-Encoder 模型配合官方提供的训练集候选文件convai_trainset_cands.txt进行固定候选交互。parlai/zoo/model_list.py 中的模型条目第 400-427 行同样给出了简化版入口parlai interactive -mf zoo:pretrained_transformers/model_poly/model -t convai2其示例对话输出为Enter Your Message: your persona: i love to drink fancy tea.\nyour persona: i have a big library at home.\nyour persona: im a museum tour guide.\nhi how are you doing ? [Polyencoder]: i am alright . i am back from the library . Enter Your Message: oh, what do you do for a living? [Polyencoder]: i work at the museum downtown . i love it there . Enter Your Message: what is your favorite drink? [Polyencoder]: i am more of a tea guy . i get my tea from china .注意 README 中的一句重要提示该模型期望输入与训练数据分布一致的文本即开头必须包含多行your persona: ...否则模型可能答非所问。这正是 ConvAI2 任务persona 驱动特性的体现。其他可用的 ConvAI2 微调模型还包括DodecaDialogue ConvAI2 微调模型zoo:dodecadialogue/convai2_ft/modelimage_seq2seq架构可配合 beam 搜索交互parlai interactive -mf zoo:dodecadialogue/convai2_ft/model -t convai2 \ --inference beam --beam-size 3 --beam-min-length 10 --beam-block-ngram 3 --beam-context-block-ngram 3Unlikelihood 对话模型如zoo:dialogue_unlikelihood/rep_convai2_ctxt_and_label/model针对上下文/标签重复做了 unlikelihood 训练其下载与版本信息见 parlai/zoo/dialogue_unlikelihood/rep_convai2_label.py 等文件python parlai/scripts/interactive.py -mf zoo:dialogue_unlikelihood/rep_convai2_ctxt_and_label/model -m projects.dialogue_unlikelihood.agents:RepetitionUnlikelihoodAgent五、训练模型从归档 baseline 到当前主流模型5.1 归档版本中的 baseline原 README 提到任务提供了若干 baseline 训练/交互脚本位于projects/convai2/baselines/目录例如baselines/seq2seq/train.py与baselines/seq2seq/interact.py后者基于 ParlAI 的 parlai/agents/seq2seq 实现。这些脚本同样属于convai2archive标签当前主分支中已移除。5.2 当前仓库中的 ConvAI2 微调示例在主分支中训练 ConvAI2 模型的推荐路径是在大型预训练模型上微调。以 Poly-Encoder 为例见 parlai/zoo/model_list.py 第 198-220 行parlai train_model \ --init-model zoo:pretrained_transformers/poly_model_huge_reddit/model \ -t convai2 \ --model transformer/polyencoder --batchsize 256 --eval-batchsize 10 \ --warmup_updates 100 --lr-scheduler-patience 0 --lr-scheduler-decay 0.4 \ -lr 5e-05 --data-parallel True --history-size 20 --label-truncate 72 \ --text-truncate 360 --num-epochs 8.0 --max_train_time 200000 -veps 0.5 \ -vme 8000 --validation-metric accuracy --validation-metric-mode max \ --save-after-valid True --log_every_n_secs 20 --candidates batch --fp16 True \ --dict-tokenizer bpe --dict-lower True --optimizer adamax --output-scaling 0.06 \ --variant xlm --reduction-type mean --share-encoders False \ --learn-positional-embeddings True --n-layers 12 --n-heads 12 --ffn-size 3072 \ --attention-dropout 0.1 --relu-dropout 0.0 --dropout 0.1 --n-positions 1024 \ --embedding-size 768 --activation gelu --embeddings-scale False --n-segments 2 \ --learn-embeddings True --polyencoder-type codes --poly-n-codes 64 \ --poly-attention-type basic --dict-endtoken __start__ \ --model-file YOUR MODEL FILE关键参数说明--init-model以 Reddit 预训练的 Poly-Encoder 为初始化权重这是达到高精度的关键-t convai2训练数据使用默认的convai2:selforiginal self persona版本--history-size 20保留 20 轮对话历史persona 行也算入历史--text-truncate 360/--label-truncate 72输入与标签的最大 token 长度--candidates batch训练时使用 batch 内候选做排序学习--validation-metric accuracy --validation-metric-mode max以验证集 accuracy 为早停指标。依据 parlai/zoo/model_list.py 中的记录类似配置训练出的 Poly-Encoder 在 ConvAI2 验证集上的报告结果约为{exs: 7801, accuracy: 0.8942, f1: 0.9065, hits1: 0.894, hits5: 0.99, ...}parlai/zoo/pretrained_transformers/README.md 也注明该模型在 ConvAI2 valid 集上 hits1/20 达 89且足以支撑 10 万候选的实时交互。需要注意的是这些数字来自仓库记录可能因随机性略有浮动并非本文的评测结论。训练好的模型同样用parlai eval_model做离线评测parlai eval_model -mf zoo:pretrained_transformers/model_poly/model -t convai2 --eval-candidates inline六、提交评测与 Leaderboard 机制历史流程原 README 详细描述了竞赛期间的提交流程虽然该流程随竞赛结束已不再开放但它解释了 ConvAI2 任务的评测设计对理解任务仍有价值提交方式参赛者创建一个私有仓库仓库结构类似baselines/目录包含与希望评测的每个指标对应的eval_XXX.py文件评测函数复用这些eval_XXX.py从竞赛代码目录导入官方评测函数。例如baselines/seq2seq/eval_f1.py先为模型设置好参数再导入并运行基础eval_f1.py中的评测逻辑官方评测官方在隐藏测试集格式与公开的验证集一致上运行自动评测并更新 leaderboard提交频率每月最多提交一次人工评测提交系统在 9 月 30 日锁定后官方对排名靠前的模型运行人工评测。这也解释了前文提到的测试集自动回退到验证集的源码行为——测试集数据从未随仓库下发以保证评测公平性。七、数据集版本设计的实验意义self vs none原 README 特别强调了一个实验设计要点可以使用none模式与self模式做对比检验模型是否真正利用了 persona 信息来提升对话表现self是任务的默认设置leaderboard 评测使用self_original。具体而言convai2:self默认对话开始时提供双方各自的 personaoriginal self personaconvai2:self_revised使用修订版 persona对话双方可以互相看到对方 persona 的修订表述convai2:none不提供任何 persona作为对照ablative条件。一个合理的实验设计是分别用-t convai2和-t convai2:none训练两个同架构模型对比其验证指标从而量化 persona 信息带来的增益。由于none版本与self版本共享几乎相同的对话内容仅去掉 persona 行这种对比相对干净。另外与原 PersonaChat 数据集相比ConvAI2 做了三处关键改动原 README 明确说明预处理方式不同modified preprocessing生成了全新的隐藏测试集新增了从双方视角both speakers的训练样本以及额外候选以支持基于排序损失的训练与评测。关于第三点双方视角在源码中的对应物就是BothTeacher数据文件both_original它同时被 worlds.py 的_load_personas用来抽取 persona 池从而支撑interactive与self-chat两类世界。原 README 还提到为原始非竞赛PersonaChat 任务准备的模型通常可以较容易地迁移到本任务相关示例见 projects/personachat 项目目录。八、实战小贴士快速确认数据可用运行parlai display_data -t convai2 -dt valid若输出正常则说明convai2_fix_723.tgz已成功下载并解压到datapath/ConvAI2/跑 Teacher 自检任务内置了自动化 Teacher 测试覆盖DefaultTeacher、NormalizedTeacher、BothTeacher、NoneTeacher、SelfRevisedTeacher等见 parlai/tasks/convai2/test.py可借助 ParlAI 的AutoTeacherTest机制回归验证数据加载是否正常关注任务元信息parlai/tasks/convai2/README.md 标注了任务的 Tag#ConvAI2、#All、#ChitChat与许可协议CC 4.0 BY在数据合规使用场景下请留意该条款区分归档代码与当前代码涉及projects/convai2/interactive.py、baselines/及models:convai2/...模型的操作请先切换到convai2archive标签当前分支请统一使用parlai interactive/parlai train_model/parlai eval_model并优先选用zoo:pretrained_transformers/...、zoo:dodecadialogue/convai2_ft/model、zoo:dialogue_unlikelihood/...等仍受维护的模型入口。九、总结ConvAI2 是 ParlAI 生态中极具代表性的persona 化闲聊任务它以 PersonaChat 为蓝本通过self/self_revised/none三组数据版本支持对 persona 利用能力的对照实验通过both版本与 label candidates 支持排序式训练并通过隐藏测试集与官方评测脚本支撑了 NIPS 2018 竞赛。在当前仓库中数据加载、Teacher 扩展、交互与 self-chat World、模型微调与评测均已沉淀为稳定可用的代码路径——本文所述命令均可直接复制运行是理解与复现该任务的可靠起点。【免费下载链接】ParlAIA framework for training and evaluating AI models on a variety of openly available dialogue datasets.项目地址: https://gitcode.com/gh_mirrors/pa/ParlAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考