政策风洞 · 预测精度仪器
我们模拟一群真实的人 —— 世界价值观调查第 7 轮,97,220 位受访者、横跨 66 个社会与地区 —— 只问一件事:一记政策冲击带来的分党派意见分化,能不能被预测?每个粒子都是一位真实受访者,按左右政治倾向着色。
操作模拟器每个粒子 = 1 位真实 WVS 受访者(97,220)· 仅 2,596 名美国受访者经校准并参与动画 · 实时旋转
01 它测量什么
想象同一个党派的人沿一条线站开:最左边是坚决反对(pro-life,记 0),最右边是坚决支持(pro-choice,记 1),大多数人散在中间。新闻里那个「pro-choice 份额」,只是0.5 分界线右边站着的那部分人占比。一记冲击把整片人往某个方向推一点,原本贴着线的人就可能越线,数字随之翻动。我们要测的,就是这条线两边各党派怎么分 —— 数据用的是真实的 WVS 第 7 轮(美国 n=2,596,取自 66 个社会与地区共 97,220 人 —— 绝不称「国家」)。
一句话:同一群人对一件事的看法,是摊开成一片的 —— 从「坚决反对」到「坚决支持」一字排开,不是一个数。我们在中间画一条分界线,只数线右边那部分人,这就是新闻标题里的「pro-choice 份额」。一记冲击把整片人往一边推,谁跨过了线,标题数字就跟着翻。
02 机箱里面 · 内部流水线
真实问卷一步步变成「合成的人」,再被推一记冲击 —— 全程拿真实民调当尺子校准,不让任何一步凭空发挥。
一句话:这是仪器机箱里面的四步流水线。每一步都把上一步的东西接过来、加工一下、再交给下一步 —— 真实问卷 → 归类成几种人 → 照真实答案给每人一个起始立场 → 推一记冲击让立场挪动 → 把改了主意的人数加起来。和上面「怎么用」那张图不同,这里看的是内部怎么算。
每一步的「进 → 出」:左边接来什么,右边交出去什么。
先把近 10 万份真实问卷(世界价值观调查·第 7 轮·美国)按相似程度归成几大类,每类记好它代表多少人 —— 不编新人,保住真实的人口和价值观比例。
照每个人真实答过的题(比如堕胎那道 Q184)给他一个出发点:偏哪个党、原本怎么想、在这件事上大概站哪 —— 起点来自真数据,不是我们指定的。
把这件大事「放给」整群人:用一个固定的小推力(代码里叫 SHIFT_COEF=0.035)让每个人的立场往一个方向挪。立场越硬的人挪得越多 —— 不是所有人挪一样多。
分党派数一下有多少人跨过了线、份额变了多少,再拿这个数去和 Gallup / Pew 的真实民调对答案 —— 让输出落回现实,而不是自说自话。
这四步全在后端 pwt 程序包里(95 项测试看着)—— 那才是真机制。网页上模拟器点一下蹦出的数字是手调的示意读数,不走这套后端。
03 挣得的第一个 ✓
刚开机的人群把 pro-choice 支持率估得太高 —— 比真实民调高出 20 多个点。校准就是「归零」这一步:按党派把每个子群的起跑线整体平移,直到「支持率」正好对上真实 Gallup 数字 —— 全在放任何冲击之前。冲击本身只用一个固定幅度去推立场,所以预测锚在真实数据上,不是手调出来的。
一句话:称体重前先把秤归零。我们的「人群」一开机就偏高(太 pro-choice),于是先把它的起点整体挪一挪,直到和真实 Gallup 民调对齐 —— 这一步在「放冲击」之前做完,之后量到的变化才算数。
原始人群整体偏 pro-choice —— 比 Gallup 高出 20+ 个点,秤没归零。
归零后,每条起跑线都落在 Gallup 几个点以内 —— 一条可信的起点。
04 验证账本
一句话:这是我们给自己出的成绩单。「风往哪边吹」对上了真值;更硬的是 —— 用真 MiniMax 大模型角色扮演真人(48 次真实调用),也复现了党派差异:民主党动得最猛、独立派次之、共和党几乎不动。绝对幅度仍只报区间(它由新闻热度决定,在模型之外),这点我们照实说。
风往哪边吹,我们说对了。起点份额对得上 Gallup 民调;「哪一派挪得更多」这个方向,换到没练过的另 2 件大事(移民、对法院的信任)上照样对;两派谁挪得多 8 次全对;所有题合起来 20 道对 17 道 = 85%。
真 MiniMax 大模型角色扮演真实受访者(48 次真实调用),复现了党派差异:民主党动得最猛、独立派次之、共和党几乎不动。预测的「谁多谁少」差距 +0.05,对上真实 +0.06;方向 100% 命中。(绝对幅度仍只报区间 —— 它由新闻热度决定,在模型之外。)
05 它只在围栏里生效
只在「堕胎 / Dobbs」这一件事上真考过、真验过。这里的「pro-choice 份额」就是标准答案 —— 民调机构 Gallup 量的正是它,所以能对答案。选 Dobbs,是因为它是能找到的最干净的一记冲击:最高法院突然推翻堕胎权,前后又有分党派的真实民调当真值。模拟器里其它议题(同性婚姻、移民…)只是照着样子摆给你看,没对过答案。另外:让真 LLM 一个个「扮演真人」那条更贵的路,在「说准幅度」上仍然不划算,暂不上。
一句话:这台仪器只在一道题上「考过试、拿了分」 —— 堕胎(Dobbs)。别的议题它也能跑出数,但那只是照着样子摆给你看,没对过真答案,别当真。
能跑出数,但没对过答案 —— 当示意看,别当预测。
06 对照 · vs 直接问 GPT
一句话:同一道盲测题,直接问顶级 LLM,分人群预测误差 0.087;我们的结构化人群模拟 0.030 —— 准了近 3 倍。差距全在「极化」:LLM 只会把总量平摊给所有人,而真实世界里两党常常反向移动 —— LLM 一个数糊过去,我们把每一群拆开。
看极化事件就懂:旅行禁令后,真实里共和党支持收紧移民 72 → 84、民主党 24 → 10(反向)。LLM 给共和党猜 68、民主党猜 20(只会同向小动);我们的模型抓住了这个反向。这正是客户掏钱的场景 ——「谁往哪动、动多少」,不是一个平均数。
为什么我们赢过 GPT · 机制
一句话:同一道盲测,直接问 GPT 的分人群误差是 0.087;就算是我们不带任何差异化旋钮的结构化基线也只有 0.037(已比 GPT 准 2.4 倍),社会传播机制再降到 0.030(约 2.9 倍)。差距的根子只有一个:GPT 没有人群,只能把总量「+X 给所有人」平摊出去;遇到两党反向移动的极化事件,它直接塌掉,而我们的人群把这一拆解出来。
GPT 为什么塌:它只有一个平均数
LLM 里没有一群可被分别推动的人。你问它「这件事后支持率怎么变」,它能给的最好答案就是把总量均匀铺给每个群体 ——「+X 给所有人」。所以一旦两党反向移动,这个单一的数必然在某一边错。真实例子:特朗普旅行禁令后,收紧移民的支持,共和党 72 → 84、民主党 24 → 10(一升一降,反向)。GPT 给共和党猜 68、民主党猜 20 —— 同向小动,方向都没抓住。
我们为什么不塌:人群结构里自带三样 GPT 没有的东西
我们所谓的「uniform 基线」不是「猜平均」。它带着三样东西:(a) 每个党派真实校准的起点份额;(b) 天花板/余量的几何(已经很高的群体没多少空间再涨);(c) 来自每个智能体真实意识形态的极化方向 —— 移动 = sign(意识形态 − 中点)。正因为方向是从每个真人的左右倾向里读出来的,所以在反向事件上,两党会被推向相反的方向,而不是被同一个数糊住。这就是为什么连这条不带差异化旋钮的基线,都已经比 GPT 准 2.4 倍。
再上一层:差异化机制把误差从 0.037 压到 0.030
基线已经赢了 GPT,但它对「谁动得更多」还是均匀的。社会传播机制让每个智能体只和同倾向的邻居交谈并向其漂移(DeGroot:新值 = (1−α)·自己 + α·邻居均值,跑 R 轮,不带任何极性标量)。差异化从网络里自己长出来:坚定的党人坐在同向紧簇里互相加固,中间派坐在混合簇里互相抵消。结果误差降到 0.030,在极化折叠上方向 8/8 全对。它和另一条独立机制(极性加权)得出同一个 Dem-vs-Rep 差异 —— 说明这是真信号,不是某一种拟合的产物。
怎么打分
一句话:我们只盯一个数 —— 分党派的「变动量」差多少。某党在事件前的份额,减出事件后的份额,得到这党的变动量(delta);我们预测的变动量和真实变动量相差多少,就是这一格的误差。把三党(民主党 / 中间 / 共和党)的误差取平均,再跨事件取平均,就是 by-party-delta MAE。0.030 就是平均差 3 个百分点,而且全在盲测、样本外的题上。
公式。 delta = 事件后份额 − 事件前份额(份额是 [0,1] 的小数)。by-party-delta MAE = 对每一党、每一事件,取 | 预测 delta − 真实 delta |,先按党派平均、再跨事件平均。一句话:把每一党「往哪边、移多少」单独对账,而不是只对一个总平均。
Dobbs 实算(民主党)。 事件前 0.69 → 真实事件后 0.82,真实变动量 = +0.13。模型若预测事件后 0.80,预测变动量 = +0.11。这一格误差 = | 0.11 − 0.13 | = 0.02,也就是差 2 个百分点。三党都这样算、取平均,再跨事件取平均 —— 这就是 MAE。已验证的 Dobbs 判定:民主党 69→82、中间 44→51、共和党 30→32。(0.80 / +0.11 是示意的预测值,只为演示这格怎么算。)
差异符号检验(单独一关)。 不只看「差多少」,还看「哪一党移得更多、往哪边」有没有对。形式上:sign( 预测[民主党 delta − 共和党 delta] ) 是否等于 sign( 真实[民主党 delta − 共和党 delta] )。在极化事件上这关最难也最关键 —— 两党反向移动,谁也别想用一个平均数糊过去。
放回标尺看。 同一道盲测、4 个真实事件:直接问 LLM 的 by-party-delta MAE = 0.087;我们带人群结构的均匀基线 = 0.037;社会传播机制 = 0.030(0.087 / 0.030 ≈ 2.9,约准 3 倍)。提醒:Polymarket 复盘的 Brier 0.049 是另一种度量,不要和 MAE 混用。
两条独立的路 · 都还原同一个党派差
一句话:已知「整群一共挪了多少」,难的是拆出「民主党挪多少、共和党挪多少」。我们用两套完全不搭界的算法去拆 —— 一套看每个人立场有多硬,一套让人只跟同道的邻居聊天。两套都从盲测里还原出同一个 Dem-vs-Rep 差距,所以这个差距是真信号,不是某一套算法凑出来的巧合。
A) 极端度加权 (Extremity weighting)
方法:把每个人的挪动幅度乘上他的「立场硬度」= |Q240 − 5.5| / 4.5(Q240 是 1–10 的左右光谱)。立场越极端的铁杆党人挪得越多,中间选民挪得少。
结果:差异方向对了 17/20 折(85%),在「两党反向」的极化折上 8/8 全对;by-party-delta MAE 0.037 —— 与均匀基线的 0.037 打平,并未跑赢它。
B) 社会传染 (Social contagion · 同质性 + DeGroot)
方法:每个人只和立场相近的邻居说话(同质性),并向他们靠拢(DeGroot:new = (1−α)·own + α·neighbor_mean,跑 R 轮,不带任何极端度系数)。党派差是从网络里「长」出来的,不是手填的。
结果:by-party-delta MAE 0.030 —— 跑赢了 0.037 的均匀基线;极化折方向 8/8 全对;全部折 14/20(70%)。(「折」= 交叉验证:轮流留一个事件出来盲测,4 个验证事件共得 20 个党派×折的预测格。)
为什么社会传染能拆出差距:铁杆党人扎堆在方向一致的小圈子里,互相加强、越聊越极端;中间选民处在立场混杂的圈子里,正反相互抵消、几乎不动。差距不是被规定的,是网络结构自己跑出来的。
要点:极端度加权和社会传染是两套相互独立的机制,却都从盲测里还原出同一个 Dem-vs-Rep 差距 —— 所以这个差距是一个真实信号,而不是某一套机制的拟合产物。
sᵢ′ = clip( sᵢ + d·β·wᵢ·roomᵢ ) , wᵢ = |Q240ᵢ − 5.5| / 4.5sᵢ⁽ᵗ⁺¹⁾ = (1−α)·sᵢ⁽ᵗ⁾ + α · meanj∈N(i) sⱼ⁽ᵗ⁾sᵢ′ = clip( sᵢ + clip( ΔLLM(personaᵢ, 事件, 邻居), −c, +c ) )铁杆 · 同向扎堆 → 相互加强
中间 · 混杂圈子 → 相互抵消
07 产品会四问
先用一句大白话概括,再展开。先看这台仪器到底怎么工作:
就像汽车的风洞:不真撞车,而是对着模型吹风。我们对着「社会的模型」吹一记政策冲击,看意见怎么弯。
一句话:找快 10 万个真实的人,给他们「看」一件大事,看他们的想法会怎么变 —— 用这个去预测民调,目标是比「随便问个 AI」或「拍脑袋猜」更准。
为什么不用 Polymarket(那种押注大事会不会发生的网站)?本想拿它当「考场」—— 因为它有标准答案(事情真发生了没)。但我去数了它 3000 道已结题,用「民调结果」结算的几乎一道都没有,当不了考场。所以改用真实民调当标准答案。有没有苗头?有:我们已经能在多件不同的事上,把「风往哪边吹」说对约 85%;一家叫 Aaru 的公司(估值十亿美元)用类似办法,曾把一场初选的票数预测到差 371 票以内 —— 说明方向不是空想。
一句话:这条赛道已经有人做(Aaru 估值十亿美元),所以不是空想;我们不一样的地方,是敢公开「考试」,考砸了也照实说。
对手:Aaru、Artificial Societies、传统民调、还有「直接问 AI 一个概率」。他们的问题:多半只秀一次成功 —— Aaru 蒙对过一场初选,却在 2024 美国总统大选押错了方向,事后还把「误差范围」偷偷调大来圆场。我们怎么做得更稳:每个结论都用「盖住答案考试」的办法验(留一件事不让模型看真相,再去预测它);还坚持不许偷看未来(防止用事后才知道的信息作弊);底层用的是一份有代表性的全国大调查(WVS),不是从社交网络上扒来的偏样本。学术支撑:斯坦福 2024 那篇「模拟 1000 个真人」,能复现真人问卷答案约 85% —— 证明「让 AI 扮演真人」这条路本身站得住。
一句话:我们能比较准地说出「风往哪边吹」,但说不准「吹多大」。
怎么考的:手上有几件真实大事(堕胎、同性婚姻、移民、对最高法院的信任…),每件都有事前/事后的真实民调当答案。我们每次盖住一件事的答案,用别的事训练好的模型去预测它。为什么「动多远」说不准?因为一件事让大家变多少,取决于它上了多少新闻、闹多大 —— 那是外面世界决定的,不是这群人本身能算出来的。就像天气预报:说「明天会变冷」比说「正好冷 3.2 度」容易得多。最关键的诚实:这些数字是我自己跑的,我先让另一个 AI 当「监考」挑错,它真抓出我一处「偷看答案」的漏洞,我修好后才敢报。
一句话:我把方向拿去给一位 YC 风格的导师「拷问」,她挑了三个毛病,我改了两个、收编一个;后来连她让我改去的方向也被数据否了 —— 证明我跟着数据走,不是嘴硬。
她挑的三刀:① 「去打败赌场赔率」是个陷阱(等于和职业赌徒对赌,大概率输)→ 我认,把赔率降成参照;② 人群模拟未必到处都灵(很多事是被新闻推着走的)→ 我把题目缩小到「由民调结算」那一类;③ 又想准、又想顺便赚钱,容易两头落空 → 我把「赚钱」降成副线、不当成败标准。说服了吗:两刀我改了、一刀我收编了。更有说服力的是:后来数据连她让我缩小到的那类题也否了(那种网站上几乎没有这类题)—— 说明我看数据掉头,不是固执。她还没松口的:样本够不够多到统计上算数、这套模拟比「直接问 AI」贵多少 —— 这两点我产品会上主动认。