
评估开源大模型时经常遇到一种让人困惑的情况同一个模型能写出结构完整的神话故事却在基础文化常识题上给出不稳定答案把题目从选择题改成开放式问答结果又完全不同。最近围绕“Cultural Awareness is Represented but Not Decoded”这条研究线索可以把这类现象拆成一个更本质的问题模型内部可能已经编码了神话知识但在最终生成阶段没有稳定解码出来。换句话说评测 18 个开源大模型的神话知识不能只看“答对了多少”还要看“模型的隐藏状态里是不是已经存在这些知识”。这篇文章会围绕“18 个开源大模型 神话知识追踪”这条主线先解释为什么需要区分“表示”和“解码”再给出一个可复现的评测实验设计包括测试集构建、prompt 设计、批量推理、指标计算和 probing 分析。最后会说明如何解读 “有知识但答不对” 的模型以及生产环境里做文化能力评测时容易踩的坑。1. 先理解“有文化知识”和“能答对文化题”是两回事1.1 神话知识为什么适合做文化意识刻度文化意识是一个很宽泛的概念包含价值观念、社会规范、历史记忆、宗教信仰、节日习俗、语言表达等。直接评测这些维度很难构造统一答案。相比之下神话知识具备几个更适合自动化评测的特点实体边界清晰。神话人物、神兽、宝物、地点都可以作为独立实体。关系相对固定。父子关系、师徒关系、神器归属、创世事件都有明确答案。有跨文化可比性。中国神话、希腊神话、北欧神话、印度神话等体系都可以用同一套问答框架测试。答案可验证。多数题目可以整理成单选题或短答案题不需要依赖过于主观的判定。所以“神话知识”可以看作是文化意识的切片。它不能代表全部文化能力但能提供一组可测量、可对比、可复现的指标。1.2 从行为输出到内部表示由表层到深层一个语言模型处理“女娲补天”相关问题时内部会发生多层计算tokenizer 把文本切分成 token。每一层 transformer block 把 token 表示逐步转换成上下文相关的隐藏状态。最后通过 lm head 把隐藏状态映射到词表概率。采样或贪心解码后得到输出文本。传统评测只关心第 4 步的文本是否正确也就是行为层。但“是否知道”这个问题其实更接近第 2 步模型在隐藏状态里是否编码了“女娲”“补天”“五彩石”这些实体以及它们之间的关系。内部表示存在并不代表 lm head 一定能解码成功。解码结果会受到提示词表达、候选答案竞争、上下文干扰、采样策略、模型偏好等多方面影响。这就是 “represented but not decoded” 的含义知识在隐藏状态里是线性可分的但生成时没有出现在输出文本里。1.3 18 个模型评测的基本思路为了追踪神话知识需要同时做两类实验评测层数据形式核心指标回答的问题行为层多选题、开放式问答准确率、拒答率、幻觉率模型最终输出是否正确表示层隐藏状态向量probing 准确率模型内部是否编码了答案信息解码层logits / 概率分布正确答案平均概率、置信度模型是否有能力把表示转化为输出“追踪”还包含另一层含义不只取最后一层隐藏状态而是逐层读取 transformer 每一层的表示看神话知识在哪个位置开始变得线性可分。这样做能回答“知识存在”也能回答“知识存在哪里”。2. 评测对象与实验设计18 个开源模型怎么选、怎么跑2.1 模型分层尺寸、家族、训练数据差异如果没有指定具体模型清单选模型时要注意覆盖多个维度避免结论只来自某一家模型。覆盖维度建议范围关注原因参数规模0.5B 到 70B观察规模对文化知识的影响模型家族至少 3 到 4 个不同系列不同架构、训练数据、对齐策略存在差异语言覆盖中文、英文、多语言模型神话题材与训练语料语言强相关指令能力基座模型和指令微调模型对比“知道”与“能按指令输出”开源协议Apache-2.0、MIT、社区许可等影响可复现实验时的部署边界实际落地时先确认每个模型的版本号、参数量、是否量化、上下文长度。同一个系列不同检查点的行为差异可能很大实验结果必须记录到具体版本不能只写“Qwen”“LLaMA”这种家族名。2.2 神话知识测试集构建神话知识测试集建议包含以下字段{ id: cn-001, myth_system: 中国神话, question: 下列哪个神话人物与补天直接相关, options: [女娲, 刑天, 夸父, 精卫], answer: A, entity: 女娲, relation: 补天, source: 需要标注资料来源 }构建时要注意三点题目要经过人工校对不能只依赖 AI 生成避免错误答案污染评测。必须记录实体和关系方便后续按神话体系、实体类型做分层分析。不同模型训练数据可能包含题目原文因此测试集不能作为绝对“知识盲区”的证据只适合做相对比较。多选题和开放式问答应该使用同一组知识条目构造。多选题方便自动判分开放式问答更接近真实使用场景。2.3 评测方式生成式问答与多选题多选题的优点是判分简单但缺点是模型可能对选项位置敏感。四个选项中答案放在 A 和放在 D结果可能不同。开放式问答的优点是更能反映真实生成能力但判分困难。用户可能写“女娲”“女娲娘娘”“补天的女娲”等不同表达判断时不能只看字符串完全匹配。推荐做法是两种方式都跑多选题用于计算稳定准确率。开放式问答用于统计“答对、答错、拒答、幻觉”四类结果。如果预算允许开放式答案用 judge 模型或人工评分但需要先定义评分规则。2.4 环境与依赖用 Python 做实验时核心依赖如下torch2.1 transformers4.40 datasets2.19 accelerate0.30 scikit-learn1.4 numpy1.26 vllm0.5如果只跑少量模型直接用 transformers 足够。如果要跑 18 个模型的大量问答建议用 vLLM 做行为层推理再用 transformers 单独跑需要隐藏状态的 probing 实验。硬件上7B 以下模型单张 A100 或 RTX 4090 可以处理70B 模型需要多卡或者使用量化版本。3. 用提示词问神话知识行为层评测的完整实现3.1 构造神话知识问答模板prompt 模板必须统一。不同模型对格式的敏感度不同建议为 instruct 模型使用模型自带的 chat template为基座模型使用纯文本模板。mcq_template 以下是一个关于神话知识的多选题请从 A、B、C、D 中选择唯一正确的答案。 题目{question} A. {option_a} B. {option_b} C. {option_c} D. {option_d} 请只输出答案字母不要解释。 generation_template 问题{question} 答案注意对 instruct 模型不要自己拼s,[INST]等特殊 token直接传给 tokenizer 的apply_chat_template更稳妥。对基座模型可以用generation_template或更简单的文本。3.2 批量推理脚本下面以 Hugging Face transformers 加载一个 7B 指令模型为例import re import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_name Qwen/Qwen2.5-7B-Instruct tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.bfloat16, device_mapauto ) def predict_mcq(example): prompt mcq_template.format( questionexample[question], option_aexample[options][0], option_bexample[options][1], option_cexample[options][2], option_dexample[options][3], ) messages [{role: user, content: prompt}] input_ids tokenizer.apply_chat_template( messages, add_generation_promptTrue, return_tensorspt ).to(model.device) output_ids model.generate( input_ids, max_new_tokens16, do_sampleFalse ) response tokenizer.decode( output_ids[0][input_ids.shape[-1]:], skip_special_tokensTrue ).strip() return response这里把do_sample设置为False是为了让多次实验尽量稳定。如果研究采样对“解码”的影响可以单独设置top_p和temperature并在结果里记录种子。3.3 指标计算准确率、幻觉率、拒答率生成结果需要先归一化再从里面提取答案字母def extract_option(text): text text.strip().upper() match re.search(r([ABCD]), text) return match.group(1) if match else None def is_refusal(text): refusal_markers [ 无法回答, 不能回答, 我不确定, I cant answer, I am not sure ] return any(marker in text for marker in refusal_markers)对每个模型计算指标计算公式说明准确率答案正确数 / 有效题目数判定模型行为是否正确拒答率拒答数量 / 总题数模型是否因为不确定而拒绝输出幻觉率答案错误且非拒答数量 / 总题数模型是否在不知道时编造答案选项一致性多次打乱选项后正确答案的平均比例排除选项位置带来的波动一个很常见的坑只计算准确率不统计拒答率。模型可能为了规避错误在大部分题目上回答“无法确定”导致准确率看起来不高但实际并不是“不知道”。4. 进一步看内部表示从“答不对”到“知不知道”4.1 内部表示与解码不是同一个系统理解这条线索需要重新认识语言模型的输出链。模型生成文本时每一步只做一件事根据当前上下文预测下一个 token 的概率分布。隐藏状态里包含的信息非常多但 lm head 需要在这个高维向量和词表之间建立起比较直接的映射。文化知识如果只是以“某种模式”存在隐藏状态里而没有和最终 token 形成强连接就可能在生成时被其他可能性压制。这也是为什么有时候改变 prompt 就能让模型从答错变成答对。prompt 改变的是解码路径模型内部的知识表示可能一直存在。4.2 用 probing 判断表示中是否编码了神话实体常见的做法是线性探测。训练一个逻辑回归分类器输入模型在某层的隐藏状态输出题目答案类别。如果分类器在测试集上表现明显高于随机猜测就说明该层的表示里存在与答案相关的信息。先取隐藏状态with torch.no_grad(): outputs model(**inputs, output_hidden_statesTrue) hidden_states outputs.hidden_states # tuple每一层一个 tensor last_token_hidden hidden_states[-1][:, -1, :] # (batch, hidden_size)然后逐层训练逻辑回归import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split features [] labels [] for layer_idx in range(len(hidden_states)): layer_feat hidden_states[layer_idx][:, -1, :].float().cpu().numpy() features.append(layer_feat) labels np.array(answer_indices) train_idx, test_idx train_test_split( np.arange(len(labels)), test_size0.3, random_state42 ) layer_probe_accs [] for layer_idx in range(len(hidden_states)): X_train features[layer_idx][train_idx] X_test features[layer_idx][test_idx] clf LogisticRegression(max_iter1000, C1.0) clf.fit(X_train, labels[train_idx]) acc clf.score(X_test, labels[test_idx]) layer_probe_accs.append(acc)这里取最后一个 token 的隐藏状态是因为 decoder-only 模型在当前位置已经看到了完整的问题最后一个 token 可以聚合上下文信息。项目里也可以尝试取倒数第二层、最后 token 的平均向量但要用同一套切分方式比较避免引入数据划分差异。4.3 对比行为准确率与 probe 准确率拿到行为层准确率和 probe 准确率后可以构建四象限行为准确率probe 准确率解读低低模型可能没有学习到相关知识低高有表示但未能稳定解码高高知识和解码链路都比较健康高低结果需要复核可能行为正确来自表面模式或数据泄漏四象限不是唯一结论。probe 准确率高只能说明“在隐藏状态中可以通过线性分类器找到答案信息”并不直接证明模型在生成时使用了这个信息。因此更严谨的表述是行为准确率与 probe 准确率差距大说明模型存在“可表示但未解码”的候选证据。5. 18 个模型结果如何解读相关性、分层和“有知识但答错”5.1 模型尺寸与行为表现不一定是线性关系一个常见的错误是只看模型参数规模得出“越大越好”的结论。神话知识覆盖度受训练数据影响很大。一个 7B 模型如果训练语料里有大量相关神话文本可能比一个 30B 模型表现更好。评测 18 个模型时要把以下因素分开记录参数规模是否经过指令微调训练语料语言分布使用了多少上下文窗口量化精度然后再看行为准确率和 probe 准确率的分布。如果某个大模型行为准确率不高但 probe 准确率很高这条差异本身就是更有价值的发现。5.2 表示存在不代表能解码三类模型画像在 18 个模型上做逐层追踪后常见结果可以归纳成三类模型画像行为准确率probe 准确率典型现象扎实型高高能稳定输出答案内部表示也清晰潜藏型低高内部有知识但生成时被其他候选答案压制空白型低低题目涉及的知识可能不在训练语料中“潜藏型”模型最难处理因为光做行为测试会误判为“没有文化知识”。对这类模型应该继续检查解码层问题正确答案的 logits 排名、选项之间的概率差、采样随机性、prompt 表达方式等。5.3 不同神话体系之间的差异神话知识不是一整个均匀的知识域。一个模型可能在中国神话上表现良好但在印度神话或北欧神话上几乎空白。评测结果要按myth_system分组统计不能只给一个平均分数。分组之后还可以继续按实体和关系拆分人物识别类题目问“谁是谁”。关系判断类题目问“父子/师徒/敌对”。事件归属类题目问“某个事件由谁完成”。宝物/神器类题目问“某件宝物属于谁”。不同任务类型对模型解码能力的要求不同。事件归属类往往需要更长推理链模型更容易在解码阶段丢失信息。6. 常见问题与排查路径6.1 提示词不一致导致结果失真行为层评测最怕模板不一致。同一个模型换一个标点符号或换一种例子顺序结果都可能变化。排查时重点检查是否使用了模型自带的 chat template。多选题 ABCD 选项顺序是否固定。是否在 prompt 里加了“请只输出字母”之外的多余说明。是否对不同模型使用了同一个模板而实际某些模型没有强制遵守指令。解决方式先用 20 条题目做模板稳定性测试同一个题目跑 3 到 5 次观察方差。如果方差过大先修模板再跑全量数据。6.2 probing 结果虚高或虚低probing 实验常见的问题是结果不可信。主要来自数据泄漏和标签泄漏同一题目的不同选项出现在训练集和测试集导致 probe 记忆了题目特征。隐藏状态只包含 prompt 里的线索不包含真实答案。训练集和测试集没有按题目 ID 划分而是按样本行划分同一题的多个变体可能同时进入两边。建议在构建 probing 数据集时以题目 ID 为最小切分单位。同一个知识条目的所有问题只能出现在训练集或测试集的一侧。还可以做随机标签 baseline把标签随机打乱后训练同一个 probe如果随机标签也有很高的准确率说明实验流程有问题。6.3 多选答案位置偏差与拒答误判多选题经常出现“选项位置偏差”。例如模型可能倾向于选 A。对策是生成多个 shuffle 版本每次重新打乱选项顺序然后统计答案的一致性。拒答误判也很常见。模型输出可能是“A 答案应该是女娲”文本里包含字母 A但实际是解释。单独用正则提取字母会把这种回答判为正确。应该先从输出文本中判断是否包含“无法确定”“不确定”等拒答信号再做字母提取。6.4 排查链从结果反推问题问题现象可能原因检查方式处理建议行为准确率很低probe 很高解码层被其它候选答案压制查看正确答案 logits 排名和概率差改用生成式问答或对比不同 promptprobe 准确率异常高标签泄漏或重复条目进入测试集检查 train/test 切分是否按题目 ID按题目 ID 重新切分不同模型准确率波动大prompt 格式不兼容检查是否用了 chat template按模型选择合适的模板固定输出格式拒答率很高但是准确率还行模型用“不确定”规避错误统计全部输出文本设计多轮追问要求必须给出答案开放式答案被判错判分规则太严格抽样人工检查误判样本使用关键词、模型 judge 或人工复核7. 最佳实践与扩展方向7.1 发布前检查清单如果要把这套评测做成可复现项目发布前至少检查以下内容模型名称、版本、精度是否记录完整。随机种子是否固定采样参数是否写进配置。是否区分了基座模型和指令微调模型。测试题是否经过人工校对是否记录了来源。prompt 模板是否对所有模型统一是否使用了 chat template。多选题是否做了选项 shuffle结果是否汇报方差。probing 数据切分是否按题目 ID 完成。是否同时汇报行为准确率、拒答率、幻觉率和 probe 准确率。是否保存了每次生成的原文而不是只保存判分结果。是否提供了加载隐藏状态和训练 probe 的脚本。7.2 如何从“表示”走向“解码”对“潜藏型”模型可以尝试以下几种改进方向调整 prompt加入“根据你自己的神话知识回答不要猜测”这类约束。在多选题里增加“以上都不确定”选项给模型一条安全出口。使用对比解码或 logit 校准提高正确答案在输出分布中的权重。用多轮追问第一轮让模型给出初答第二轮要求它复核。如果可以用 representation engineering可以尝试在隐藏状态层面做方向干预把内隐知识推高到输出层。这些方法都还不能做到“保证解码成功”但可以作为工程侧的探索路径。7.3 扩展方向神话知识只是文化意识的一个起点。后续可以扩展为节日、习俗、谚语、历史人物等更多文化知识类别。跨语言文化问答对比中英文 prompt 对同一知识条目的影响。模型对齐层面的文化偏好测试观察模型对不同文化的表述是否偏斜。自动化测试集生成但必须有人工纠错和抽样验证环节。从“做评测”转向“改评测”让文化能力指标进入模型训练或微调的数据筛选中。最后想强调一点评估 18 个开源模型不是为了简单排一个文化知识分数榜。真正的价值在于识别那些“内部有知识、但输出不稳定”的模型并针对性地改进解码链路。做实验时把行为层数据和表示层数据放在一起看比单独看准确率更能说明问题。