结构硅取样(S3)
IC2S2 2026论文的开源实现:
超越提示:硅调查样本的认知基础框架
S3将调查响应的认知模型(Tourangeau等人,2000)作为模型上下文协议(MCP)服务器进行操作。S3不是将整个角色背景故事加载到提示中,而是将角色信息存储在模块化数据库中,并让LLM选择性地仅检索与每个调查问题相关的模块。
建筑
该框架将认知调查响应模型的四个阶段具体化为三个可分离的层:
| 层次 | 认知阶段 | 它的作用 |
|---|---|---|
| 规则 | 理解+响应 | 提供最小的身份锚(persona_id)以及严格的响应约束。没有预先加载人口统计或态度内容,迫使模型主动寻求信息。 |
| 技能 | 判断+策略 | 一种基于问题类型选择推理过程的认知路由器: *事实记忆*, *直接态度*,或 *态度建设*每种技能都指定了要检索哪些模块以及如何合成它们。 |
| 主控程序 | 检索 | 将角色暴露为模块化数据库(13个域,~170个字段),只能通过显式工具调用访问。该模型每个问题检索2-5个模块,而不是一次接收所有约170个字段。 |
存储库结构
server.py MCP server (core)
run_experiment.py Experiment runner (Claude Agent SDK)
analyze_results.py Compute per-persona metrics (exact match, within-1, MAE)
significance_analysis.py Paired significance tests across phases
eval_items.json 22 held-out ANES 2024 evaluation items with ground truth
personas/ 50 ANES 2024 personas (stratified by party ID x region)
anes_001.json ... anes_050.json
rules/ Rule templates (researcher-specified)
survey_respondent.txt Full framework rule (identity anchor only)
baseline_static.txt Static backstory baseline (Argyle et al. style)
rules_only.txt Ablation: rules without Skills or MCP
skills/ Skill templates (model-selected per question)
factual_recall.txt Personal circumstances and estimation
direct_attitude.txt Single-topic policy/social attitudes
attitude_construction.txt Complex cross-domain attitude formation
scripts/ Data processing
download_anes.py Download ANES 2024 data
generate_personas.py Generate persona JSON files from ANES
results/ Pilot experiment results (N=10 per phase)
phase0_phase1_n10_seed2024.json Phases 0-1
phase2_n10_seed2024.json Phase 2
phase3_n10_seed2024.json Phase 3快速开始
先决条件
- Python 3.10+
- MCP兼容客户端(Cursor、Claude Desktop或Claude Agent SDK)
安装
pip install -r requirements.txt运行MCP服务器
# stdio transport (for Cursor, Claude Desktop)
python server.py
# SSE transport (for web clients)
python server.py --transport sse
# Restrict modules for phase experiments
python server.py --allowed-modules demographics life_narrative politics economy health social_context local_context在游标中配置
添加 .cursor/mcp.json:
{
"mcpServers": {
"silicon-sampling": {
"command": "python",
"args": ["/absolute/path/to/server.py"]
}
}
}在Claude桌面中配置
添加 claude_desktop_config.json:
{
"mcpServers": {
"silicon-sampling": {
"command": "python",
"args": ["/absolute/path/to/server.py"]
}
}
}MCP工具
| 工具 | 说明 |
|---|---|
get_survey_skill | 选择推理技能(factual_recall, direct_attitude, attitude_construction)基于问题类型 |
get_persona_modules | 按名称选择性地检索角色模块(例如。, ["economy", "demographics"]) |
get_retrieval_log | 查看本次课程的所有技能选择和模块检索 |
Persona模块
每个角色最多包含13个主题模块(共约170个字段):
| 模块 | 字段 | 内容 |
|---|---|---|
demographics | 10 | 年龄、性别、种族、教育程度、收入、婚姻状况、宗教、国家 |
life_narrative | 1 | 生活情况概述 |
politics | 35 | 政党ID、意识形态、批准、投票、候选人评估、参与 |
economy | 18 | 就业、住房、投资、粮食安全、经济前景、贸易 |
health | 20 | 保险、医疗保健问题、心理健康、诊断条件 |
social_context | 19 | 社会信任、团体温度计、移民、警察、枪支 |
racial_attitudes | 16 | 种族/族裔群体温度计、歧视观念 |
values_personality | 9 | 道德基础、威权主义、科学态度 |
media_consumption | 12 | 新闻来源、社交媒体、福克斯/美国有线电视新闻网、机构温度计 |
religion_community | 7 | 出席情况、重要性、指导、儿童、社区 |
local_context | 2 | 州、人口普查区 |
policy_positions | 19 | 支出优先级、候选人安置、能力评级 |
civic_participation | 3 | 活动志愿者、标志、按钮 |
实验设计
试点实验在四个阶段改变了人物角色的复杂性,以测试S3的优势随着信息负载而增长的假设:
| 阶段 | 模块 | 字段 | 检索 |
|---|---|---|---|
| 0:稀疏 | 7 | ~31 | 有限(2-3个模块) |
| 1:丰富 | 11 | ~107 | 有限(2-3个模块) |
| 2:丰富+免费 | 11 | ~107 | 无限 |
| 3:满 | 13 | ~170 | 无限制 |
每个阶段使用10个随机抽样的人物角色(跨阶段不重叠),对6个领域(政治、经济、健康、社会背景、种族态度、价值观)的22个ANES项目进行评估。
再现结果
# Run experiment (requires Claude Agent SDK with Max subscription)
python run_experiment.py --phases 0 1 --n-personas 10 --conditions baseline_static full_framework --seed 2024
python run_experiment.py --phases 2 --n-personas 10 --conditions baseline_static full_framework --seed 2024
python run_experiment.py --phases 3 --n-personas 10 --conditions baseline_static full_framework --seed 2024
# Analyze results
python analyze_results.py results/phase0_phase1_n10_seed2024.json results/phase2_n10_seed2024.json results/phase3_n10_seed2024.json
# Significance tests
python significance_analysis.py示例会话
具有完整框架的典型调查模拟:
1. Model reads Rule (survey_respondent.txt): receives persona_id and response constraints only
2. Model receives survey question: "How often can you trust the federal government?"
3. Model calls get_survey_skill("attitude_construction", "trust in federal government")
-> Receives instructions to retrieve politics + economy + values_personality + demographics
4. Model calls get_persona_modules("anes_010", ["politics", "economy", "values_personality", "demographics"], "trust in federal government")
-> Receives only those 4 modules (~80 fields), not all 170
5. Model synthesizes a response grounded in the retrieved information消融条件
完整的评估计划比较了四种条件,以隔离每一层的贡献:
| 条件 | 规则 | 技能 | MCP检索 |
|---|---|---|---|
| 基线 | baseline_static (提示中有完整的背景故事) | 否 | 否 |
| 仅限规则 | rules_only (锚+完整背景故事) | 否 | 否 |
| 规则+技能 | survey_respondent +技能选择+完整背景故事 | 是 | 否 |
| 完整S3 | survey_respondent +技能选择+选择性检索 | 是 | 是 |
许可证
麻省理工学院
