# CharacterEval 复现核查（第一遍：论文优先）

评审方式：逐行读论文 LaTeX 源文件（含注释行、表题、脚注），对论文里每一条关于数据、生成、评判、打分、汇报的陈述，到官方代码里找实现位置，或记录"代码未实现"。全程只读，没有调用任何付费模型或 RM 端点，也没有运行仓库脚本。仓库代码里的字符串是用 Python `ast` 从源文件机械提取的。

## 0. 来源与指纹

| 来源 | 位置 | 指纹 |
|---|---|---|
| 论文 LaTeX（arXiv e-print） | `src/ce_eprint/acl_latex.tex`（785 行） | SHA-256 `f98299737e75bfb7002e47a76a67161246fbf1286c7be43f8ccd5800b50d6c17` |
| 官方仓库 | `src/ce`，commit `c3d44a6fc1790cc8c4b2fd7c01f0c72930655e0c`（2025-05-28） | — |
| `data/test_data.jsonl` | 实为 JSON 数组 | `6d9723a1484f1d2739bcf388c7960abe1933b7a5a1fddae0170cc9ea7c66dcd8` |
| `data/id2metric.jsonl` | 实为 JSON 对象 | `df80ee716124a7deacc6f24ee372a4600b719cdaa79f01cefcdfb286359f1801` |
| `data/character_profiles.json` | | `d9b4c9f7ab63b89b3c348ae88b43c87872f0f6a5cb06d7f31cbe64a630e6434e` |
| `rm_train_data.json` | 2024-11-20 加入 | `0fc906584b5edef50918a38868b732150943d941d6b14e80208af15b4b9a1462` |
| 标注说明 PDF | `Predefined Annotated Examples of CharacterEval.pdf` | `e328142202cc25e6ff6a94bd2261751d65462915326ce6f89fe6d2a53a541ae2` |
| `results/generation_trans_{baichuan_7b,chatglm3_6b,internlm_7b,qwen_7b,xverse_7b}.jsonl` | 5 个 7B 模型的冻结输出（已经过 transform） | 见 `shasum` 记录 |
| RM：`morecry/BaichuanCharRM` | HF 修订 `e953da5f57b86db7adca3a2714b4c3720f5b96a2`（2024-01-10）；只下载了 config / modeling / tokenizer 代码，**没有下载权重** | `modeling_baichuan.py` SHA-256 `64c46c28…a5c934` |
| ChatGLM3 `chat()` 默认值（官方生成脚本调用的第三方代码） | HF `THUDM/chatglm3-6b`，修订 `b098244a71`（2023-12-29），与 main 分支的 `chat`/`process_response` 逐字相同 | — |

依据优先级按 `复现核查清单.md` A1：论文原文（文字与数字矛盾时，取能复现数字的读法）> 官方代码（c3d44a6）> 官方发布物 > 平台选择。

## 1. A3 关键词检索（论文源文件，含注释行）

| 关键词 | 命中行 | 结论 |
|---|---|---|
| prompt / 提示 | 203（相关工作）、259（GPT-4 抽取对话）、535 "We consistently employ the same prompt for each model, with minor adjustments made only for closed-source models." | **论文没有给出生成提示词原文，也没有给出 GPT-4 裁判提示词** |
| length / words / characters / 字 | 24、49（模板注释）；characters 均指"角色" | 没有长度限制 |
| format / JSON | 只命中 "information"/"formulate"等无关词 | 没有输出格式要求 |
| system | 均为 "dialogue system / evaluation system" | 没有说明 system 消息的用法 |
| temperature / top_p / top_k / max_tokens / sampling / sample / seed | **0 次命中** | 生成参数论文完全没有说明 |
| self-consistency / majority / vote / mean | 0（"devote"、"meaningful"、"well-rounded" 是误命中） | 没有多次采样或投票 |
| normalize / scale / average / avg | scale 在 471 行："score responses … in a five-point scale"；Avg. 在表 1、表 4、表 5 的列头 | 1–5 分；"Avg." 的定义没有写明（见 §3，用数字反推） |
| filter / exclude / retry / fail | 255、261（数据构建阶段的过滤）；555 行图注 "CharacterGLM can not successfully complete personality back-testing" | 评测阶段的失败处理论文没有说明 |
| translation | 0 | 只有中文 |
| version / date | 530 "chat-version"；532 `gpt-4`、`gpt-3.5-turbo-1106` | 只有这两个 API 模型给了版本 |
| shot / demonstration | 表 2（1/2/3-shot GPT-4）、472、720（附录用 2-shot） | GPT-4 裁判的 few-shot 内容没有给出 |
| round / decimal / truncat | 0（只有 "ground"、"well-rounded"） | 取整和截断都没有说明 |
| bracket | 212、328 | 行为写在括号里（数据里用的是全角"（）"） |

注释掉的内容（以 `%` 开头，**不属于论文**）：(a) BLEU/ROUGE/DIST "Responding Ability" 维度及其表格（267–301、484–523 行），说明早期版本有 5 个维度，终稿删掉了；(b) 一版旧的结果表，里面有 Yi-6B/Yi-34B（478–523 行）；(c) 一版旧的相关系数表（391–416 行），数值完全不同（Char-RM 整体 0.722，且该表的 Overall 正好是 12 行的均值）；(d) 528 行 "seven baselines… The version of GPT-4 we utilized is gpt-4"；(e) 358 行 Personality 小节的旧版本（含 personality-database 网址，正文 362 行保留了这个网址）。这些内容都不能作为依据。

## 2. 逐项设定表

说明："一致"表示论文和代码说法相同；"论文未说明"表示只有代码给出；"冲突"表示两者矛盾。

| # | 设定 | 论文位置与原文 | 代码位置与行为 | 结论 | 实现要求及依据 |
|---|---|---|---|---|---|
| 1 | 数据规模 | 摘要 126、引言 168、贡献 188："1,785 multi-turn role-playing dialogues, encompassing 11,376 examples and featuring 77 characters"；表 1（373–381）：Training 6,811 / Test 4,564，Avg. Turns/Conv. 9.28，Avg. Tokens/Conv. 369.69；387 行："split … based on examples instead of conversations, where an example is composed by a tuple (Character, Context, Response)" | `test_data.jsonl`：4,564 条，id 唯一，77 个角色，24 部作品，字段只有 `id, role, novel_name, context`（**不含参考回复**）；README 8 行写 "23,020 examples" | 测试集 4,564 条与表 1 一致；6,811+4,564=11,375≠11,376；README 的 23,020 与论文冲突；训练集没有发布 | 使用发布的 4,564 条。总数上的矛盾不影响评测；1,785、9.28、369.69 无法用发布数据核验 |
| 2 | 实际参与打分的样本 | 469："each example … is assessed using a subset of these subjective metrics" | `transform_format.py:17` `if str(data['id']) in id_metric`（commit 9f1a6ae 加入）；`id2metric` 只覆盖 4,531 个 id，有 **33 个测试 id 没有任何指标**，这些样本生成后直接丢弃 | 论文未说明，按代码 | 计分样本为 4,531 个 id、**8,032 个（id, 指标）对**。那 33 条可以跳过生成（不影响分数），但要在协议里写明 |
| 3 | 稀疏指标分配 | 469–471：由标注员为每个样本选定指标子集，再按 5 分制打分 | `id2metric.jsonl`：每个 id 对应 1–11 个 `[metric_en, metric_zh]`。分布：1 个指标 2,801 个 id，2 个 962，3 个 346，4 个 189，5 个 89，6 个 52，7 个 37，8 个 22，9 个 13，10 个 16，11 个 4。各指标的对数：Emp 744、ED 737、CS 734、PU 724、HL 724、PB 720、KA 718、Cons 715、KE 714、Coh 708、**KH 486、Flu 308**；同一 id 内没有重复指标 | 一致 | 逐字使用 `id2metric`。各指标的 n 不同，汇总时必须先按指标求均值（第 15 行） |
| 4 | 指标名称（送入 RM 的维度字符串） | 图 2、313–354：Flu/Coh/Cons/KE/KA/KH/PB/PU/HL/CS/ED/Emp | `id2metric` 中（机械提取）：Fluency 对话流利度、Coherence 对话连贯性、Consistency 对话一致性、Exposure 知识曝光度、Accuracy 知识准确率、Hallucination 知识幻觉性、Behavior 行为一致性、Utterance 言语一致性、Humanlikeness 类人程度、Communication_skills 交流技巧、Diversity 表现多样性、Empathy 共情度 | 一致（标注 PDF 里写的是"曝光率""共情性"，用词不同） | RM 的 `<Dimension>` 段必须用 `id2metric` 里的 `metric_zh` 原文，不能用 PDF 或论文里的叫法 |
| 5 | 指标方向 | 327 KH："avoid responding to queries involving unknown knowledge"；649 "minimal knowledge hallucinations" 对应最高 KH | 标注 PDF 第 3–5 页：拒绝回答不该知道的问题记 5 分 | 一致：所有指标都是**越高越好** | 不要反转 KH |
| 6 | 角色档案（生成端） | 170、127："in-depth character profiles sourced from Baidu Baike"；208 行公式 `r_n = RPCA(C_n, P)` | `get_response.py:49-52`：`role_information = role_informations[role]`（一个 **dict**），被 f-string 插入，所以文本是 **Python `str(dict)` 的 repr**（单引号、`': '` 和 `', '` 分隔，嵌套的 list/dict 也是 repr）。78 份档案中有 77 份被用到（沙僧没有用到）；共 251 种键；**大量值是 list/dict**；有 9 个字符串叶子含 `'` 且不含 `"`，repr 时会改用双引号（薰儿·评价、史强·人物关系/评价、安陵容·人物经历、梅长苏·幽默风趣）；没有反斜杠、控制字符或非 ASCII 空白 | 论文未说明格式，按代码 | 必须逐字复现 Python repr。**建议离线用 Python 生成 77 个 repr 字符串作为数据文件，不要在 TS 里重写 repr**。按角色名排序后 `role\trepr\n` 拼接的 SHA-256 为 `198d40264a5109b1ed974da4274fa5d1bc711f01df4d5c62c5af53bb14d370c2`，可作核查脚本的基准 |
| 7 | 生成提示词 / 消息结构 | 535 行只说用了同一提示词，**没有给出原文** | `get_response.py:50-52`（AST 提取）：`f'{role_information}\n现在请你扮演一个角色扮演专家。请你根据上述信息扮演{role}进行对话。\n'`（末尾有换行）。`concat_messages`（10–34 行）：① `user` = 上面的系统文本（**放在 user 消息里，不是 system 角色**）；② `assistant` = `f"好的！现在我来扮演{role}。"`，如果上下文第一句是角色本人说的，再拼上 `"我首先发话：" + 第一句的正文`（**不带** `角色：` 前缀）；③ 之后每遇到角色说的一句，就追加 `user` = `"{前一句说话人}：{前一句正文}"` 和 `assistant` = `"{role}：{正文}"`；④ 最后一句（一定不是角色说的）作为 query：`"{说话人}：{正文}"`。`make_inputs`（36–43）：按 `\n` 分行，按第一个全角"："切出说话人，其余部分用"："重新拼回 | 论文未说明，按代码 | 消息数组逐字照代码构造（见附例）。数据检查：最后一句是角色本人的 0 例，角色连续两句的 0 例（两个 assert 都不会触发），**非角色连续两句的 0 例**（所以代码不会丢句）；2,077 条以角色开头；529 条上下文只有一行；id 8158 的说话人有三个（含"小郭（忍着）"） |
| 8 | 按模型或闭源模型调整 | 535："minor adjustments made only for closed-source models"（具体内容没有说明）；530 开源模型用 chat 版 | README 32 行："You could adjust it to adapt the input format of your model."；脚本里只有 ChatGLM3 的 `model.chat(tokenizer, query, messages)` | 两边都没说明具体调整 | 平台选择：所有模型一律用第 7 行的 OpenAI 兼容消息数组，不做调整（因为调整内容无从得知）；在协议中登记 |
| 9 | 生成参数 | **论文完全没有说明**（A3 检索 0 命中） | `get_response.py:7` 用 `.half()`（fp16）；55 行 `model.chat(...)` 没有传参，所以用 ChatGLM3 的默认值（HF `modeling_chatglm.py`）：`max_length=8192`（输入加输出的总长度）、`num_beams=1`、`do_sample=True`、`top_p=0.8`、`temperature=0.8`；每个样本只采样 1 次，不设种子 | 论文未说明；代码只对 ChatGLM3 隐式给出 | 平台选择，必须写理由。我的建议是**不传 temperature/top_p，用模型或服务商的默认值**，并记录实际生效的值。理由：论文用的是各开源模型的 chat 版和各家官方 API，最可能的就是各自默认值；0.8/0.8 只是 ChatGLM3 包装器的默认值，不是 CharacterEval 的设定。备选：统一用 0.8/0.8。不管选哪种，都要写进协议版本；max_tokens 也要定一个足够大的值（建议 ≥1024），保证第一行不被截断 |
| 10 | 回复后处理 | 212："behavior … enclosed in brackets"（只是描述，不要求解析） | `transform_format.py:15`：`data['model_output'].split("\n")[0]`（注释写的是 "Prevent continuous generation"），**不做 strip**，**不去掉 `角色：` 前缀**。ChatGLM3 的 `process_response` 会先做 `strip()`，这是模型包装器的行为。冻结输出中 89–98% 以 `{role}：` 开头（如 baichuan 4,208/4,531），会原样送进 RM；RM 训练数据中也有 6,317/7,228 条带前缀 | 论文未说明，按代码 | 只按 `\n` 取第一行，保留前缀，不解析括号。是否先去掉开头的空白属于平台选择：代码不 strip，开头是空行时会得到空串并被打分；建议照代码不 strip，同时监控空串比例。推理模型只取 content，不含思考内容 |
| 11 | 失败处理 | 论文没有说明；只有 555/623 行提到 CharacterGLM 的 MBTI 无结果，标 "-" | `transform_format.py:14`：`model_output` 为 `None` 或等于 `"ERROR"` 的样本**从所有指标中剔除**（分母相应变小）；**空串 `""` 不会被剔除，会被打分**。官方生成脚本没有重试，也没有写 `"ERROR"` 的代码（这个约定显然来自他们没发布的 API 脚本） | 论文未说明，按代码 | 调用失败（重试用尽、内容过滤报错）记为 ERROR 并剔除；模型真的返回空回复时保留并打分。重试次数是平台选择。剔除数必须在报告中公开，并设上榜门槛（这是平台选择，因为剔除会让分数偏高） |
| 12 | RM 骨干与版本 | 471："CharacterRM, with Baichuan2-13B-base as the backbone" | HF config `_name_or_path: baichuan-inc/Baichuan2-13B-Base`；类 `BaichuanCharRM`：`score = nn.Linear(5120,1,bias=True)`，取**最后一个 token** 的隐状态，`F.sigmoid` | 一致 | 端点固定 HF 修订 `e953da5f…`，并记录权重 SHA |
| 13 | RM 输入格式 | 论文没有说明 | `run_char_rm.py:15-18`（AST 提取）：`"<RoleInfo>\n\n" + str(profile) + "\n\n<Context>\n\n" + context + "\n\n<Response>\n\n" + model_output + "\n\n<Dimension>\n\n" + metric_zh`。`context` 是数据集中的原始多行文本（不是消息数组），`str(profile)` 与第 6 行是同一个 repr | 论文未说明，按代码 | 逐字照搬；Worker 只负责把文本拼好发给端点 |
| 14 | RM 分词、截断、精度、分数变换 | 论文没有说明 | `run_char_rm.py:30-35`：`tokenizer.encode(text, add_special_tokens=False) + [eos_token_id]`（不加 BOS，末尾加 `</s>`=2）；超过 `max_seq_length = 4096` 时**保留最后 4096 个 token**（`input_ids[-4096:]`，从开头砍掉档案）；batch=1，不传 attention_mask；模型 `torch_dtype=torch.bfloat16`，**线性头和 sigmoid 都在 bf16 下计算**，`.item()` 之后再算 `*4 + 1`。依赖：transformers 4.36.2、torch 2.0.1；如果装了 xformers，`modeling_baichuan.py` 会走 xformers 注意力 | 论文未说明，按代码 | 端点必须接收原始文本，在端点内部完成分词、加 EOS、左截断、bf16 前向和 `*4+1`，单条推理（或者确认批处理加 padding 与单条结果逐值相同）。**sigmoid 在 bf16 下输出是离散的**（在 [0.5,1) 区间步长 2⁻⁸，折算到分数步长约 0.0156），换成 fp32 会让单样本分数改变，必须保持 bf16。按字符估算，冻结输出里每个模型有 2–16 条输入超过 4096 字符，截断确实会发生 |
| 15 | 分数变换是否合理 | 471 五分制；表 4 中最低的指标均值有 1.636、1.660 | 训练损失 `MSE(sigmoid, labels/4)`（`modeling_baichuan.py:592`），而发布的标签是字符串 '1'–'5'（`rm_train_data.json`）；训练脚本没有发布 | 代码内部看起来不一致，但论文数字支持推理代码的读法：如果按 labels/4 用 1–5 训练，推理时 `*4+1` 会让分数大多 ≥2，表 4 里不可能出现 1.6 左右的均值；所以训练时实际用的应该是 (label−1)/4 | 按推理代码用 `*4+1`（与论文数字相符） |
| 16 | 每个指标的汇总 | 表 4 每格一个数 | `compute_score.py:5-12`：按 `metric_en` 对所有记录求算术平均，**不取整**，直接打印 | 一致 | 每个指标取样本均值，中间不取整 |
| 17 | 维度平均（Avg.） | 表 4、表 5 的 "Avg." 列，定义没有写明 | 代码没有实现 | 用数字反推：60 个 Avg. 值全部等于对应指标列的**简单平均**，误差不超过 ±0.0007（见 §4），说明是"先算各指标均值，再等权平均"，而不是把所有样本合在一起平均（各指标 n 从 308 到 744 不等，合并平均会明显偏离） | 维度 Avg. = 该维度各指标均值（未取整）的等权平均；Character Consistency 是 5 项，**包括 KE**；Conversational 3 项；Attractiveness 4 项 |
| 18 | 总分 | 论文**没有**总分；图 3 雷达图只有 4 个维度；README 排行榜图与表 4 相同，也没有总分 | 代码也没有 | 两边都没有 | 平台如果需要一个排名用的总分，属于平台选择，必须标明"论文中没有"；MBTI 不应并入 |
| 19 | 取整与显示 | 表 4、表 5 都是 3 位小数；MBTI 列去掉了末尾的 0（"0.62""0.63"，Excel 风格） | `compute_score.py` 打印完整浮点数 | 论文未说明，按表格 | 只在显示时取 3 位；维度 Avg. 用未取整的指标均值计算（C5） |
| 20 | 人格回测（MBTI）流程 | 180："let RPCAs do the MBTI assessment and calculate the MBTI accuracy (personality back-test) as implemented in Wang et al. 2023 (arXiv:2310.17976)"；362：标签来自 personality-database.com，测评用 16personalities.com；473："we collect 54 ground MBTIs … The RPCAs should answer the MBTI questionnaires and then the accuracy will be computed"；667："respond to multi-choice questions" | **仓库里没有任何 MBTI 相关代码、题目、提示词或标签**（全仓库 grep "MBTI/16personalities" 无结果；档案里没有任何 `[EI][NS][TF][JP]` 形式的类型串） | 代码缺失 | **用发布材料无法复现**：54 个标签、题目（语言、题数、选项）、提示词、作答方式、类型判定方式、无法作答时的处理都缺失。数字反推：14 个模型的准确率**全部等于 k/216**（216 = 54 个角色 × 4 个维度；例如 GPT-4 150/216=0.6944，ChatGLM3 115/216=0.5324），对其他分母（54、108、162、77、308……）都对不上。由此推断论文报的是**按维度（逐字母）计算的准确率**，每个角色只测一次。建议：平台默认不提供这一项；如果要做，标为"平台变体，不可与论文比较"，并采用 54×4 逐维准确率的定义 |
| 21 | MBTI 失败 | 555、623：CharacterGLM "can not successfully complete"，标 "-" | 无 | 只有论文提到 | 如果实现，无法完成的模型记为空，不记 0 |
| 22 | 被测模型与版本 | 表 3（447–465）：ChatGLM3-6B；XVERSE 7B/13B；Qwen 7B/14B；InternLM 7B/20B；Baichuan2 7B/13B（均为 chat 版，530 行）；CharacterGLM、Xingchen、MiniMax、BC-NPC-Turbo（规模未公开，闭源）；GPT-3.5 = `gpt-3.5-turbo-1106`，GPT-4 = `gpt-4`（532 行）。530 行写 "10 baselines" | README 58 行写 "ChatGLM-6B, Baichuan-7B-Chat, XVERSE-7B-Chat, InternLM-7B-Chat and Qwen-7B-Chat"（文件名是 `chatglm3_6b`、`baichuan_7b`），"checkpoints are downloaded from Huggingface"，没有给 revision | 表 3 是 11 个系列 15 个模型，与 "10 baselines" 不符；开源模型的 HF revision 和闭源模型的版本都没有给出 | 锚点只能选 `gpt-4`、`gpt-3.5-turbo-1106`（如果仍可调用）以及 5 个有冻结输出的 7B 模型 |
| 23 | 冻结输出（可做锚定校验） | 表 4 中 ChatGLM3-6B / XVERSE-7B / Baichuan2-7B / Qwen-7B / InternLM-7B 五行 | `results/generation_trans_*.jsonl`：每个文件正好 8,032 条，覆盖 4,531 个 id，没有 None/ERROR/空串/换行，context 与测试集逐字一致；**不含 RM 分数** | 发布物 | 部署前做 D5 类校验：把这 5 份冻结输出送进平台的 RM 端点，按第 16、17 行汇总，与表 4 对应的 5 行逐格比较。这是**不需要生成费用**就能核验 RM 端点、输入格式、截断和 bf16 的唯一途径（本轮按要求没有调用端点） |
| 24 | 与人工的相关性 | 表 2（419–441）：Pearson；Char-RM 的 12 项为 0.613/0.607/0.573/0.509/0.336/0.411/0.879/0.472/0.497/0.686/0.765/0.385，Overall 0.631；GPT-4 1/2/3-shot 的 Overall 为 0.362/0.385/0.375。用于计算的标注集、样本数、Overall 的定义都没有说明；README（2024-05-31）：12 名标注员分两组，有分歧时讨论定分；标注 PDF 的示例也被用作 GPT-4 的 ICL 示范 | `rm_train_data.json`：7,228 条（id, 指标, 标签 1–5），**全部来自测试集的 context**（4,241 个 id 都在测试集中，7,228 个（id, 指标）对都在 `id2metric` 里，覆盖 8,032 对中的 90%）；回复来自其他模型（与 5 份冻结输出相同的只有 21 条） | 没有发布留出的标注集，所以 D2（裁判与人工相关性）**无法复现**；在训练数据上算相关性属于样本内，不能与表 2 比较 | 报告中如实说明 D2 做不了。另需注意：RM 是在测试 context 上训练的，这是官方设计本身的问题，不是平台偏离 |
| 25 | GPT-4 作裁判（附录表 5） | 720："we present the evaluation result by GPT-4 in 2-shot setting for reference" | 没有提示词，没有代码 | 不可复现 | 不实现；表 5 不作为锚点 |
| 26 | 稳健性分析（图 4） | 689–703：按对话阶段分析，阶段怎么划分没有说明 | 无 | 不可复现 | 不属于榜单协议 |
| 27 | 训练集 | 表 1：Training 6,811 | 没有发布（`rm_train_data.json` 是 7,228 条 RM 标注，不是表 1 的训练集） | 缺失 | 不影响评测 |

附例：按第 7 行的规则，用我自己写的等价逻辑（不是运行仓库代码）构造的 id 3344（角色 佟湘玉，上下文以角色开头）的消息数组：

```
user:      <str(profile['佟湘玉'])>\n现在请你扮演一个角色扮演专家。请你根据上述信息扮演佟湘玉进行对话。\n
[line removed: it quoted the authors' test set, a profile or a released model output]
[line removed: it quoted the authors' test set, a profile or a released model output]
[line removed: it quoted the authors' test set, a profile or a released model output]
[line removed: it quoted the authors' test set, a profile or a released model output]
```

## 3. 论文与代码的冲突、两边都没说明的项，以及处理建议

### 3.1 冲突

| # | 冲突 | 建议 |
|---|---|---|
| C1 | 样本数：论文 11,376，表 1 合计 11,375，README 23,020 | 以发布的测试集 4,564 条为准（与表 1 的 Test 列一致）；其余不影响评测 |
| C2 | README 写 "ChatGLM-6B, Baichuan-7B-Chat"，论文写 ChatGLM3-6B、Baichuan2-7B | 以论文和文件名（chatglm3、表 4 中的 Baichuan2）为准 |
| C3 | RM 训练损失是 labels/4，而发布的标签是 1–5；推理是 `*4+1` | 用论文数字检验：只有"训练时用 (label−1)/4"才与表 4 里约 1.6 的均值相符，所以推理按代码 `*4+1` |
| C4 | 论文说 "same prompt … minor adjustments for closed-source"，代码只有 ChatGLM3 一个模型的路径 | 调整内容不明；平台对所有模型用同一套代码消息结构，不做调整，并登记 |
| C5 | 标注 PDF 的维度名（曝光率、共情性）与 `id2metric` 的 `metric_zh`（知识曝光度、共情度）不同 | RM 的输入用 `id2metric` 原文 |

### 3.2 论文和代码都没说明（或只有代码说明）的项

| # | 项 | 建议（依据） |
|---|---|---|
| U1 | 生成参数（temperature、top_p、max tokens、是否采样） | 平台选择：用服务商或模型的默认值，并记录实际值；备选是 ChatGLM3 默认的 T=0.8、top_p=0.8。max_tokens 定一个固定的大值。写进协议版本（论文未说明；官方代码只隐式给出 ChatGLM3 的值） |
| U2 | system 消息的用法 | 按代码：系统文本放在第一条 user 消息里，不用 system 角色 |
| U3 | 后处理时是否 strip | 按代码：只做 `split("\n")[0]`，不 strip，保留 `角色：` 前缀 |
| U4 | API 失败、重试、内容过滤 | 按代码剔除 None/ERROR，空串保留打分；重试策略属于平台选择；剔除数要公开，并设上榜门槛 |
| U5 | RM 的精度、截断、批处理 | 按代码：bf16、左截断到 4096、末尾加 EOS、不加 BOS、单条推理 |
| U6 | 维度 Avg. 的定义 | 按论文数字反推：各指标均值的等权平均 |
| U7 | 总分 | 论文没有；如果平台需要，作为平台选择单独标注 |
| U8 | 取整 | 只在显示时取 3 位 |
| U9 | MBTI 全流程 | 不可复现；建议不提供，或者标为不可比较的变体，指标定义用 54×4 逐维准确率（数字反推） |
| U10 | 开源模型的 HF revision、闭源模型的具体版本、测评日期 | 只有 `gpt-4`、`gpt-3.5-turbo-1106` 有版本；锚点以这两个模型和 5 份冻结输出为主 |
| U11 | 推理模型的思考内容 | 平台选择：只取最终 content |
| U12 | 33 个没有指标的测试 id | 按代码不计分；可以跳过生成以节省费用 |

## 4. 论文数字内部的不一致

1. **样本数**：6,811 + 4,564 = 11,375，正文写 11,376（126、168、188 行）；README 写 23,020。
2. **"10 baselines"**（530 行）与表 3 不符：表 3 是 11 个系列 15 个模型（注释掉的旧文还写着 "seven baselines"）。
3. **表 4 的下划线标错**：Cons. 列下划线标在 Baichuan2-7B（3.827），实际第二高的是 Baichuan2-13B（3.864）。其余 31 列的粗体和下划线都经脚本核对无误。
4. **维度 Avg.**：表 4、表 5 共 120 个 Avg. 值，与对应列简单平均的差都在 ±0.0007 以内，与"用未取整的指标均值平均后再取 3 位"的读法相符，没有发现错误。
5. **表 2 的 Overall 不是 12 项的均值**：Char-RM 12 项均值为 0.561，表中写 0.631；1/2/3-shot 的均值为 0.368/0.385/0.395，表中写 0.362/0.385/0.375。Overall 可能是把所有指标的样本合在一起算的 Pearson，但论文没有说明。注释掉的旧表里 Overall 恰好是均值（0.722/0.295/0.330/0.339），说明定义改过。
6. **472 行说 "performance of GPT-4 will improve with the number of demonstration increase"**，而表 2 的 Overall 是 0.362 → 0.385 → **0.375**，3-shot 反而比 2-shot 低；只有用 12 项均值时才是单调上升。
7. **MBTI 列的格式**："0.62""0.63" 去掉了末尾的 0。所有值都能写成 k/216，与"54 个角色"的说法一致，但论文没有说明是逐维准确率。
8. **693 行的推理与上下文不符**："InternLM-20B maintains consistent performance… This could be attributed to the fact that these models, primarily designed for role-playing…"，但 InternLM-20B 并不是角色扮演专用模型。
9. **644 行有一句重复**（Qwen/XVERSE 的比较写了两遍），属于文字问题，不影响数字。

## 5. 结论：哪些会阻碍忠实复现

- **阻碍项**：(1) MBTI 人格回测无法复现（标签、题目、提示词、判定方式全部没有发布）；(2) 表 2 的人工相关性无法复现（没有发布留出的标注集，RM 又是在测试 context 上训练的）；(3) 附录的 GPT-4 裁判结果无法复现（没有提示词）。
- **可以忠实复现的部分**：12 个主观指标的完整管线（数据 → 消息构造 → 取第一行 → RM 输入 → bf16 打分 → `*4+1` → 每个指标求均值 → 维度等权平均）。其中只有生成参数和闭源模型的"微调"必须作为平台选择登记。
- **部署前必须做的校验**：用 5 份冻结输出对 RM 端点做逐格比对（表 4 的 5 行 × 12 列），以及档案 repr 的哈希比对（`198d4026…370c2`）。
