基于确定性信念追踪的社会心智理论(Social ToM)故事生成库。
SocialiToM 是一个用于生成心智理论评测故事的 Python 库,聚焦于社会情感场景(情绪、目标、人际关系、语用现象)。所有标准答案均通过规则引擎确定性计算,无需任何人工标注或 LLM 判断。
- 确定性 GT:所有答案来自规则引擎
SocialBeliefTracker,而非 LLM 判断 - 30 种问题类型:情绪归因、目标推断、失言检测、间接提示、标量含义、奇怪故事、社会后果(9 维度)等
- 7 种任务类型:
emotion_attribution、faux_pas、hinting、social_consequence、scalar_implicature、strange_story、persuasion - 4 种扩展:人物画像(文化背景/情感依附/个人特质)、隐含线索 NL 风格、情绪弧线、语用扩展(反语/幽默/谎言)
- 思维链(CoT):从追踪器状态自动生成推理链,无需人工标注
- 输出适配器:支持转换为 EmoBench、FANToM、SocialIQA、ToMBench 格式
pip install -r requirements.txt
pip install -e .from social_tom.pipeline.pipeline import generate_story
result = generate_story(
task_type="emotion_attribution",
difficulty="easy",
seed=42,
)
print(result["story_text"])
for q in result["questions"]:
print(q["question"], "→", q["GT"])或直接运行示例:
python examples/quickstart.pysocial_tom/
├── core/
│ ├── world_state.py # AgentState、Goal、RelationshipState、SocialWorldState 等数据类
│ ├── belief_tracker.py # SocialBeliefTracker — 14 个原子动作
│ ├── emotion_rules.py # 情绪规则引擎(25+ 条规则)
│ └── question_generator.py # 30 种问题类型生成器
├── rules/
│ ├── pragmatic_rules.py # 语用规则(间接提示 / 标量含义 / 失言 / 奇怪故事 / 劝说)
│ └── social_consequence.py # SocialIQA 9 维度规则引擎
├── extensions/
│ ├── agent_profile.py # 文化背景 / 情感依附 / 个人特质画像扩展
│ ├── cue_style_nl.py # 视觉 / 声音线索 NL 风格扩展
│ ├── emotion_arc.py # 情绪转变 / 混合情绪 / 意外结果扩展
│ └── pragmatic_ext.py # 反语 / 讽刺 / 幽默 / 谎言类型扩展
└── pipeline/
├── pipeline.py # generate_story() — 统一生成入口
├── story_context.py # 上下文池(人物 / 场景 / 关系)
├── story_infiller.py # 结构化脚本 → 自然语言故事
├── cot_generator.py # 自动生成 CoT 推理链
├── distractor_generator.py # MCQ 干扰项生成
└── output_adapter.py # 多数据集格式适配器
from social_tom.pipeline.pipeline import generate_story
result = generate_story(
task_type="emotion_attribution", # emotion_attribution | faux_pas | hinting | social_consequence | scalar_implicature | strange_story | persuasion
extensions=None, # ["agent_profile", "cue_style_nl", "emotion_arc", "pragmatic_ext"]
difficulty="medium", # easy | medium | hard
context=None, # 自定义上下文字典
llm_client=None, # 可选 LLM 客户端(用于 NL 实例化)
seed=None,
)返回值:
{
"story_text": str,
"questions": [{"question_type": str, "question": str, "GT": ..., "distractors": [...]}],
"GT_answers": {"question_type": answer, ...},
"CoT": {"question_type": cot_text, ...},
"metadata": {"task_type": str, "people": [...], ...},
}from social_tom.core.belief_tracker import SocialBeliefTracker
tracker = SocialBeliefTracker(
people=["Alice", "Bob"],
initial_relations={"Alice_Bob": "colleague"},
)
tracker.set_goal("Alice", "get_promotion", importance="high")
tracker.perform_action("Alice", "helped_other", target="Bob")
tracker.block_goal("Bob", "goal_x", by="circumstance")
print(tracker.get_emotion("Alice")) # → "satisfaction"