SimToM
SimToM(Wilf et al., 2023)是一类专门应对 “多人物/多对象 + 视角差异(谁知道什么)”问题的提示策略。它的目标不是让模型掌握新知识,而是让模型按“某个人的认知范围”来推理,避免把“读者/全知视角”的信息误当成角色已知,从而减少被无关信息或“你我都看见的事实”干扰。
你可以把它理解为:在回答前先做一次 Theory of Mind(心智理论) 的显式建模——“A 只知道哪些事实?”然后只用这些事实回答。
1) SimToM 解决的典型问题
这类题在故事推理、对话代理、游戏/剧本杀、多方协作里非常常见:
- 错位认知:Alice 离开房间后,Bob 把钥匙藏到抽屉里;问“Alice 会去哪里找钥匙?”
- 多对象追踪:多个物品被不同人移动/遮挡;问“某人认为某物在哪里?”
- 带大量干扰信息:故事细节很多,但问题只取决于某个角色当时看见/听见的内容。
- 对话场景的隐私/权限:某个代理不能使用它“全局看到”的信息,只能用被授权的事实回答。
2) 两段式 Prompt(SimToM 的标准流程)
SimToM 的关键是两次调用(或一个调用内的两段输出):
Prompt 1:建立“某人的知识集合”(facts the person knows)
让模型把故事过滤成:角色 X 亲眼所见/被告知/可推断的事实,并标注不确定项。
模板:
你是“心智建模器”。
输入:一个包含多人物/多物体的事件描述,以及目标角色 {X}。
任务:列出 {X} 在问题发生时刻确切知道的事实(只包括:亲眼看到、亲耳听到、别人明确告诉他的内容、以及从这些内容可直接推出的结论)。
不要使用全知视角。不要包含 {X} 没看到/没听到的事件。
输出 JSON:
{
"known_facts": ["..."],
"unknown_or_uncertain": ["..."],
"time_reference": "..."
}
Prompt 2:只基于知识集合回答
模板:
你是“受限推理器”。
仅使用以下 known_facts 回答问题。
如果无法确定答案,输出“无法确定”,并说明缺失哪个关键事实。
输入:
- known_facts: ...
- question: ...
3) 例子 1:经典“钥匙/视角”问题
故事:
Alice 把钥匙放在桌上。Bob 进来,看见了。
Alice 离开房间。Bob 把钥匙从桌上拿走,放进抽屉。
Bob 离开。Alice 回到房间。
问:Alice 会去哪里找钥匙?
Prompt 1(建立 Alice 的已知事实)输出示例
{
"known_facts": [
"Alice 曾把钥匙放在桌上",
"Alice 离开房间前,钥匙在桌上"
],
"unknown_or_uncertain": [
"Alice 不知道 Bob 是否移动过钥匙",
"Alice 不知道钥匙现在是否还在桌上"
],
"time_reference": "Alice 回到房间的时刻"
}
Prompt 2(受限回答)
仅基于已知事实:Alice 会先去桌上找钥匙。因为她最后看到钥匙在桌上,且不知道钥匙被移动过。
这就避免了模型用“全知视角”直接回答“抽屉”。
4) 例子 2:多对象 + 干扰信息(更接近真实应用)
故事:
会议室里有一个红色文件夹和一个蓝色U盘。
张三把红色文件夹放进了柜子里,李四看见了。
李四去接电话离开了房间。
这时王五进来,把红色文件夹从柜子拿出来放到桌上,又把蓝色U盘塞进抽屉。
李四回来后看到桌上有红色文件夹,但没有打开抽屉。
问:李四认为蓝色U盘在哪里?
Prompt 1(李四的知识集合)应得到类似:
{
"known_facts": [
"会议室里有红色文件夹和蓝色U盘",
"张三把红色文件夹放进柜子里(李四看见)",
"李四离开接电话",
"李四回来时看到桌上有红色文件夹"
],
"unknown_or_uncertain": [
"李四不知道王五进来过",
"李四不知道蓝色U盘被移动到抽屉"
],
"time_reference": "李四回来后"
}
Prompt 2(受限回答)
无法确定李四认为蓝色U盘在哪里(故事未说明李四最后一次看到蓝色U盘的位置)。
关键缺失事实:李四在离开前是否看到蓝色U盘放在哪里,或是否有人告知过他U盘的位置。
这类“无法确定”在真实系统里非常重要:比瞎猜更可靠。
5) 工程落地:什么时候把 SimToM 用在产品里
- 多代理/角色扮演系统:每个角色只能用自己的记忆/权限回答。
- 隐私与权限控制:把“可见事实”作为 known_facts,强制模型不泄露无权限信息。
- 长对话客服/销售:不同参与者知道的信息不同,避免“把内部备注当成对客户可说的事实”。
- 游戏 NPC/剧本推理:NPC 只能基于自己的目击证词推理。
6) 与 S2A 的区别(避免混淆)
- S2A:主要是“去掉无关信息/潜在注入”,让问题更干净。
- SimToM:主要是“建立某个角色的知识边界”,即使信息相关,但角色没看到也要排除。
两者可以组合:先 S2A 降噪,再 SimToM 做视角约束推理。
如果你给我一个你自己的场景(例如:多方聊天记录里问“某人当时知道什么/会怎么认为”),我可以帮你把它改写成一套可直接用的两段 Prompt(含 JSON 输出字段),并给一组测试用例检验是否还会“全知视角泄露”。