9 月 17 号早上七点多,手机亮了一下。我那个每天定时跑的破脚本推来一条摘要,标题是:「美联储释放鸽派信号,降息路径临近」。
我盯着看了十秒。
前一晚我刚扫过同一批信源。关键词是加息。三年来头一回,3.5%-3.75% 上调到 3.75%-4%。方向完全反了。
先把工具交代清楚,不然说不下去。它特别小:一个 cron,加一个循环。拉十几个源——通讯社、几家央行公告页、几个我一直看的博客——标题和摘要拼成 JSON,整包丢给模型,让它吐不超过五条「昨天可能值得我回头看一眼」的东西。目的很朴素,我不想每天早上刷二十个页面。
大概长这样:
items = [
{"src": it.source, "title": it.title, "body": it.summary}
for it in fetch_feeds()
]
resp = client.messages.create(
model=MODEL,
system=SYSTEM_PROMPT, # ← 真凶在这儿,后面说
messages=[{
"role": "user",
"content": json.dumps(items, ensure_ascii=False),
}],
)
跑了大半年,出过最严重的错也就是日期写错、机构名翻成中文。直到这次。
我一直管这类玩意儿叫实习生。手速没得说,判断力嘛——这次算是把短板全露出来了。
先怀疑抓取
第一反应是抓取挂了。翻日志,没有。BBC 那篇原文标题里就有「加息」,第一段也是加息。材料是干净的。
第二反应,模型太弱。换了一档更贵的重跑。还是「降息」。
而且写得挺像回事。摘要列了三条理由:通胀连续超过五年高于 2% 的目标、决策者需要防止物价上涨向更广的经济面扩散、就业市场足够强所以撑得住紧缩。三条全对。全是对的那一轮加息的论据。
它只是把小标题的主语搞反了。
[09-17 07:02] 美联储释放鸽派信号,降息路径临近
· 通胀已连续多年高于 2% 目标
· 决策者需防止物价上涨向下游扩散
· 就业市场强劲,为政策调整提供空间
画外音:这才是真正让人后背发凉的地方。
论点错,论据对,缝得一点破绽都没有。这种错不会像编译报错那样自己跳出来喊。它跟正确答案长得几乎一样,只是方向差了 180 度。
然后是那行 prompt
翻 SYSTEM_PROMPT。半年前写的,中间零敲碎打改过几次,从来没系统重写过。有问题的就这半句:
你是一个宏观信息助理。从下面这批材料里提炼出对利率路径、通胀趋势
和资产配置有影响的关键信息,重点关注降息预期、宽松信号,以及市场
对政策路径的定价。
「重点关注降息预期、宽松信号」——写它的时候降息确实是主线,我甚至记得当时纠结过要不要改成中性的「利率路径变化」,后来嫌啰嗦,没改。
现在它是整个流程头上的一副眼镜。材料进来,先被这副眼镜筛一遍。
但我把它换成中性表述、重跑几次之后,它还是有两回给我填了「下调」。所以锅不能全推给 prompt。
得说先验的事。
模型见过的那部分世界里,「美联储降息」是高频道,「美联储加息」是低频事件。方向这个东西是事件性的,机制这个东西是教科书性的。你问它「高通胀时央行一般怎么做」,它十条都能写对;你问它「这次是高还是低」,它得从一堆没见过的具体语境里现推。低频事件在生成的时候,会被高频分布盖过去——它不是不知道加息是什么意思,它是默认这次不是。
而且这条新闻本身就反共识。沃什当初被确认的时候,不少民主党议员说他会变成总统的傀儡,很多美联储观察人士也赌他会顺着白宫的意思降息,总统本人确实也在社交媒体上喊过要迅速降息。结果他上来就加,还在记者会上把这次决定形容成「清醒且负责任」。被问到这算给总统传递了什么信号,他笑了一下,说和总统的讨论无可奉告。
我提这个不是要聊政治。我想说的是,这条新闻的价值恰恰在于它反共识——而反共识恰恰是这类模型最不擅长的东西。训练语料里塞满了共识,共识是高频的。
顺一句,那阵子不是美国一家在加,欧洲央行前一周也动了。全球一起拐弯的时候,模型一个人朝着老方向走。
补丁三条,都不高级
第一条,把带引导性的词全删了。prompt 里凡是出现「重点关注」「倾向于」「主要看」,基本等于在给模型戴眼镜。它不会质疑这副眼镜,它只会透过它看。
第二条,抽取和判断拆开。抽取交给它,判断题我自己做。
EXTRACT_PROMPT = """只做抽取,不做判断。从下面的文本里找出:
- 利率的变动方向(上调 / 下调 / 不变)
- 变动幅度
- 这是否是本轮周期内第一次反向调整
每个字段必须附带原文中支持它的那句话。
原文里没有明确写,就填 null。"""
最后那句「原文里没有明确写就填 null」是第三版才加上的。前两版它在方向那一栏还是自信地填「下调」,加了这个出口之后才老实下来。
我一度想干脆不用模型,写个正则算球。后来没写——我拉的那些源格式太杂,正则的维护代价比这大。但输出我改了:方向这个字段现在必须带原文引用,没有引用的一律当 null 处理。粗暴但有效。
顺手做了个三版对照,同一批材料,只换 prompt:
A:「提炼今天的宏观要点」 → 方向:降息 ❌
B:「逐字抽取利率的变动方向」 → 方向:上调 ✅(无引用)
C:「抽取方向,无原文支持则填 null」 → 方向:上调,附原文引用 ✅
A 和 B 差的就是一个动词。就这么点距离。
第三条,给它一个时间锚。
+ 背景锚点:本轮最近一次方向调整是 2025 年 12 月(降息)。
+ 上一次反方向调整是 2023 年 7 月。
这不是给它补知识——这些它多半知道。它需要的是知道自己现在不在常态里。给个锚点,它会收敛很多。
跟写代码是一回事
编译不过的错、类型不匹配的错、跑挂的测试——这些吵是吵,但它们不骗你。你说得清它在哪、为什么错、怎么改。
难抓的是另一种:能跑、测试全绿、命名规范、注释也齐,然后它解决的是它以为你要解决的那个问题。
我现在审 AI 写的东西,第一遍不看细节,就看它到底在解哪道题。方向错了,后面细节再漂亮都白搭;方向对了,细节糙一点可以慢慢收拾。
说回代价。那天早上我只是多花了十分钟困惑,没真按那条摘要去动任何配置。但它要是出现在一个每天要处理上百条信号、或者干脆要直接推给别人的流程里,那就不是十分钟的事了。
扯远了,回正题。
我到现在也没完全想明白,它是怎么把「通胀高企」这批证据缝进「鸽派」那个结论里的——读起来一点破绽都没有。也许是材料里本来就带着那副眼镜的倒影,也许是别的。这块我承认我没搞透。
但有件事我搞透了:让它做判断题,是我自己的偷懒,不是它的能力问题。
现在这条规则贴在我的配置里,夹在一堆别名中间,很不起眼:
凡是让 AI 做「方向性判断」的地方——涨还是跌、加还是减、该还是不该——一律降级成抽取加引用,判断题自己来做。
它不性感,也不通用,换个领域可能完全不成立。但这是我这半年抄来的所有配置里,唯一一条我记得住的。
