真实世界锚定与溯源¶
模拟的可信度取决于它据以构建的数字。SocioVerse 把溯源当作一等公民的产物: 研究里每一个承重数值,都能追到一个来源、一个代理指标,或一条被公开声明的假设。
在找事件服务或 persona 池?
外部数据服务已经拆到单独一页:外部能力。
grounding 侧车¶
每个研究都携带 grounding/grounding.json,一份三类条目的台账:
- 事实(facts)——带来源;研究初始化时由真实世界检索收集
(
/sv-init时检索必定执行一次); - 实现参考(implementation references)——某个设计选择所依赖的 建模文献或既有系统;
- 声明的假设(declared assumptions)——所有承重但无法溯源的内容。
每个条目有一个 basis:sourced(有源)、proxy(代理)、
assumed(假设)。构建阶段查阅并扩充这份台账;工作流的规则是:
先锚定、再发明。 承重的环境或人群数值要引用一个事实 id 或假设 id。无法溯源的内容被声明——绝不悄悄编造。
/sv-report 会把台账渲染为报告的数据基础与参考来源一节,读者在结果
旁边就能看到证据基础。侧车会自动随 fork 与版本快照一起走。
文档结构¶
| 键 | 内容 |
|---|---|
facts |
id、断言、数值、basis、via(怎么拿到的:web_search / event_service / provider)、来源 url 与访问日期 |
implementation_refs |
某个机制照搬自哪篇论文或哪个既有系统,以及照搬了什么 |
assumptions |
id、假设了什么、为什么无法溯源、结果对它有多敏感 |
method_notes |
自由文本,说明这个研究是怎么被锚定的——包括下面的 fork 决策 |
工作流用的辅助模块是 skills.sv_grounding(merge(...)、method_notes=...),
API 见 workflow helpers 参考。
是溯源,不是运行时校验
grounding 是「审阅时长牙齿」的文档,不是运行时约束:引擎不会拿你的 常量对照台账做检查。这份契约是社会性、可审阅的——每个数字都可被 引证,审阅者能看到每个数字站在哪种依据上。
fork 时的显式再锚定决策¶
Path A 的 fork 会把源研究的 grounding.json 一并复制过来。但它不会默认那份
锚定依然成立。在动 fork 的产物之前,/sv-init 先问一个问题——这个 fork 的
delta 是否需要继承来的 grounding 尚未覆盖的外部数据?——并在两个答案里选一个:
| 决策 | 什么时候 | 会发生什么 |
|---|---|---|
| search(重新检索) | delta 引入了新的真实世界断言(新地区、新时期、新冲击幅度、新政策) | 跑一次新的检索;按 id 新增 facts / refs;仍然成立的继承条目保留 |
| inherit(沿用) | 纯参数变体——每个 delta 都落在源研究已锚定的范围内 | 不做新检索;只把 delta 触及的继承条目复核后按 id 合并 |
无论选哪个,选择本身都要写进侧车的 method_notes,并附理由:
from skills import sv_grounding
sv_grounding.merge(
"studies/chicago_sez",
method_notes="fork re-grounding: searched — 一次性 +20% 冲击幅度需真实调价案例支撑",
)
# 或:method_notes="fork re-grounding: inherited — 纯参数变体,锚点沿用源研究"
dashboard 的「参考来源」卡片会显示这条记录,读者因此能看出这个 fork 是重新检索过
还是沿用了母研究、以及为什么。这个判断绝不静默跳过;如果研究本来就是刻意
风格化的,诚实的写法是 method_notes="stylized",而不是编造事实。
一条贯穿一切的原则¶
运行时循环永不外呼。 一切外部内容都在构建时物化,溯源记入 grounding 侧车。因此运行是自包含的:模拟中途没有网络意外,一次运行看到 的每个输入都在磁盘上,与研究一起被版本化。
延伸阅读¶
- 外部能力——产出锚定事实的那些服务,以及没有它们时怎么办
- 迭代与报告——台账如何变成报告的最后一节
- workflow helpers 参考——
sv_grounding