有人编了一部孟加拉语电影,叫《灰色河流的彼岸》。它不存在。他把片名丢给开放权重的 Qwen3.5-4B,问导演是谁。
![]()
模型答得毫不犹豫:萨蒂亚吉特·雷伊执导,1958 年上映,主演是苏米特拉·米特拉、塔伦·米特拉和希巴吉特·查托帕迪亚伊。年份、卡司、导演,每一个字都是它自己造的。
这就是“幽灵实体”:一个不存在的人、书或电影,语言模型却用十足把握把它描述出来。在孟加拉语这类训练文本稀少的语种里,幽灵遍地都是。作者用孟加拉民间故事里的“পেত্নী”(petni,一种看起来在那里、其实不在的鬼)给项目命名——PetniHunter。
它不只是一个检测器,而是一道挡在孟加拉语聊天机器人前面的守卫。用户问某位作家的出生年份、某本书的作者、某部电影的导演,它先去孟加拉语维基百科和维基数据核对实体,然后做三件事之一:拒绝、改问、或救回正确答案。
先看它有多糟
作者从维基数据搭了一套测试集:真实的孟加拉语作家、书籍和孟加拉语电影,外加 929 个编造条目。编造名有两个来源,沿用 Meta 的 HalluLens 基准做法:模型自己生成的名字,以及把两个真实名字拼接出来的名字。凡是能匹配到真实维基百科页面的,一律剔除。
衡量指标是误接受率——系统把幽灵当成真货回答的比例。裸模型接受了 96.3% 的幽灵。作为对照,HalluLens 报告 Mistral-7B 在英文上是 94.7%,同一量级。
不只是幽灵。问它真实小说《帕瑟·潘查利》的作者是谁,它答拉宾德拉纳特·泰戈尔。正确答案是比布蒂布尚·班迪奥帕迪亚伊。在测试集的真实实体上,裸模型只答对了 3.7%。
两个显而易见的修法,都失败了
修法一:让它不确定时就承认。假名字接受率降到 18.2%,但模型对 79.3% 的真实实体也拒答了。它学会了几乎对一切说“我不知道”。
修法二:微调它说“我不知道”。作者用 R-Tuning 风格的拒答感知配方,在 Tinker 上跑 LoRA:拿基础模型回答每道训练题,答对的保留真答案,其余全部训练成“我不知道”。
结果是 0.0% 的假名字被接受,100% 的真实名字被拒答。一个从不回答的模型没有幻觉,也没有用处。
原因在训练目标里:2,427 个目标中,只有 35 个是基础模型真正知道的真答案。一个 4B 模型对冷门孟加拉语作家几乎一无所知,也就没有素材教它区分“我知道”和“我不知道”。全盘拒答已经是它能做到的最好结果。作者说这是整个项目里最有用的结论。
这也是为什么记分板需要两面。他用 SimpleQA 的 F 值,把“答对了多少”和“答的里面有多少是对的”合在一起算。
于是不再让模型去“知道”
模型无法可靠掌握孟加拉语冷知识,查表可以。守卫接管了核对工作:
- 抽取名字和所问内容:常见句式走快速模式匹配,自由提问交给一次小的 Qwen 调用。
- 搜索孟加拉语维基百科。它的搜索容忍拼写差异,还会给出“您是不是要找”,维基数据自己的搜索不会——作者测过,维基数据搜索漏掉了泰戈尔名字的一种常见拼法。
- 把最佳标题与名字比对,折叠孟加拉语常见拼写变体(ী/ি、ূ/ু、শ/ষ/স),再用维基数据确认匹配到的是正确类型:作家、书或电影。
- 执行动作:拒绝、改问、或救回。
网络故障永远不会被当成“此物不存在”,它是独立的错误状态。遇到重名,守卫会问是哪一位,而不是自己挑一个。
2,367 个测试项,95% 区间在仓库里。作家 91.9% 正确,书籍 87.8%,电影 81.4%。电影从未用于训练,正好检验这套方法能否迁移到没调过的实体类型。守卫本身没有训练步骤,两个相似度阈值是事先定好、在训练集上做过合理性检查的;实体类型检查是在看到训练集失败案例之后才加的。
对拼错名字的真实实体(330 项),70% 处理正确:200 项给出了正确的“您是不是要找”,31 项在披露替换的前提下解决,99 项漏掉。没有任何一项被悄悄当成另一个实体回答。
它在哪里会坏
作者的原话是:比起被数字打动,他更希望读者相信这些数字。
- 守卫的分数是天花板。标准答案来自维基数据,守卫也查维基百科和维基数据,干净实体上的近乎满分有一部分是构造使然。它证明的是流水线能跑通,不是守卫知道维基百科不知道的事。
- 幽灵有一部分是自我实现的。他只保留了维基百科搜索找不到的编造名,而守卫用的是同一个搜索,拒绝它们几乎必然。他还用小分类器测过幽灵能否仅凭名字风格识别:模型生成的名字 AUC 为 0.72–0.80(0.5 是随机),风格确实是条捷径;拼接名只有 0.46–0.62,所以两类都报。
- 常见名字是硬骨头。在训练集上,加实体类型检查之前,1,005 个幽灵里有 5 个匹配到了同名真人,检查修好了它。测试集里守卫唯一答上的幽灵是 প্রতিশ্রুতি(“承诺”),一个普通词,也是 2001 年一部真实电影。那更像是幽灵生成器的失误。
- 一次演示失败后他改过守卫。泰戈尔名字的拼写错误曾让它推荐了一部关于他的纪录片,因为建议没做类型检查。这意味着测试集跑了两遍,两遍都在仓库里。修复把拼写错误处理率从 65.2% 提到 70.0%,其余没变。
- 答案检查器是规则式的,不是 LLM 裁判,会犯错:一个不可见字符就让“জসীম উদ্দীন”和“জসীম উদ্দীন”被判为不同,维基数据有时给同一个人列两个出生年份。他准备了 100 条输出的盲人工审计,但还没做完,检查器的错误率因此未被测量。
- 它只覆盖作家、书和电影,需要联网,救不回孟加拉语维基百科里没有的东西——11.5% 的真实实体没得到回答。
为什么开放创新重要
开放权重让他找到了真正的失败点。闭源 API 下,他没法微调模型、没法在训练层面看清它到底在做什么,也没法便宜且可重复地在 2,367 道题上跑四套系统。正因为 Qwen3.5-4B 开放,他才能认真试“教它说我不知道”这个修法,并弄清它为什么失败——模型就是知道得太少。这个负面结果,在提示框里是发现不了的。
开放数据让测试成为可能。维基数据和孟加拉语维基百科既是标准答案也是查询源,没有可查询的开放许可孟加拉语知识,就造不出 929 个经过验证的幽灵,也做不出带引用的救回层。
守卫与模型无关。核对交给查表,所以它可以挡在任何模型前面,开源闭源都行,不依赖某一家厂商一直在。
一切可复现。每套系统的每一条原始输出都在仓库里,你可以重新给我的数字打分,而不是选择相信。
开放没帮上忙的地方:守卫需要联网访问维基百科,这不是一个“关灯也能跑”的项目。他原本指望的离线版本就是那个微调模型,而它没成。
项目里每一次模型调用都跑在 Tinker 上:四路基线评测(每套系统 2,367 道题)、生成编造名、从自由提问中抽取实体、为演示翻译原始答案,以及那次 LoRA 微调。线上演示是 Render 的 Web 服务,Tinker 的 API 密钥只存在 Render 的环境变量里,从不进仓库;公开演示每问一次都花真金白银,所以应用做了按访客和按天的限流。
作者从小读孟加拉语书。阅读危机之下,孟加拉语文学正面临读者锐减,而大模型还在不断误读它。他担心的是,满地的“petni”会让这门文学本身也变成一个幽灵。他想证明的是,这种幻觉水平或许可以降下来一点。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.