AlphaSense SuperAnalyst 启示:用 TypeScript 构建假设监控器

用 TypeScript 构建一个基于假设容差的报告监控器,只在真正重要时重建,并主动询问缺失数据。
AlphaSense 推出的 SuperAnalyst 让 AI 输出在分析完成后继续工作,监控假设并自动更新结论。本文用一个 TypeScript 微缩模型演示其核心机制:报告携带每个输入的容差,通过四分类状态机(Fresh、Noise、Stale、Missing)判断变化是否值得重建。Fresh 什么都不做,Noise 记录但不行动,Stale 触发重建并递增版本号,Missing 主动询问而非沿用旧值。演示中一份供应商续约备忘录在五天内经历三次重建,两次是正确的——每日定时重建会浪费三次,永不重建则送出错误建议。文章也诚实指出教学模型的局限:假设提取困难、容差粗糙、缺少来源追踪与人工审核,但『写下假设、衡量变化、按需重建、无法判断时询问』的形态依然成立。
大多数 AI 回答在写完的那一刻就完成了。
那也是它们开始过期的时刻。
备忘录写着「续约」。两周后价格涨了,一半座位空着,备忘录还是写着「续约」——而且理直气壮。
AlphaSense 宣布推出 SuperAnalyst,一个面向金融与战略工作的常驻代理。它能规划工作、核对证据、运行代码,并产出备忘录、模型和仪表盘。真正让我反复琢磨的是它之后做的事:与静态的 AI 输出不同,SuperAnalyst 在初始分析完成后会继续工作,监控投资逻辑、组合、交易或战略决策背后的假设,识别市场中的重大变化,并在无需新提示的情况下用新信息更新工作产物。
这个区别很关键。输出不是任务的终点,而是一个承诺——只在假设成立时成立。一个无法告诉你它假设了什么答案,也无法告诉你它什么时候是错的。
本文用 TypeScript 构建一个微缩版本,演示如何让一份备忘录在噪声中保持不变、在真正变化时重建、在数据缺失时主动询问。

核心问题:每日重建与永不重建都不对
让报告保持最新有两种简单做法:每天重建,或者永不重建。
第一种烧算力,还会因为无意义的波动改变答案;第二种正是过期备忘录被批准的原因。有用的版本在两者之间:当真正重要的事情发生变化时才重建,否则不要碰它。
「重大」本身就是整个功能的核心,其他一切都只是定时任务。这个判断的难点在于区分噪声和信号——一个 3% 的座位数波动和 10% 的价格涨幅,对结论的影响完全不同。
第一步:把假设写下来
报告携带它构建时所用的输入,以及每个输入的容差。tolerancePct 表示一个值可以漂移多远,结论才值得怀疑。价格用紧容差,座位数用松容差——这是人类的判断。
type Assumption = { key: string; value: number; tolerancePct: number };
type Report = { title: string; assumptions: Assumption[]; build: (v: Record<string, number>) => string; text: string; version: number };
build 函数就是分析本身:相同输入,相同输出。这保证了重建的可复现性——如果输入没变,输出就不该变。
什么是容差(tolerance)? 在工程与统计语境中,容差指一个量偏离基准值仍可被视作「等价」的允许范围。本文借用这一概念,让每个假设携带一个 tolerancePct(百分比容差),表示该数值可以漂移多大比例而结论依然成立。它本质上是一种业务规则:价格通常对结论敏感,容差设小(如 5%);座位数或使用率的短期波动常属正常,容差设大(如 10%–15%)。
为什么用百分比而非绝对值? 百分比容差让不同量级的输入可比较,也让阈值与数值规模解耦。但它也有代价:小数绝对值的小幅波动会被放大成高百分比(例如使用率 0.02 的变化),而大数值的绝对巨变可能只产生温和的百分比。更成熟的系统会结合绝对阈值或统计显著性来设定边界。
「重新基准化」(rebasing)又是什么? 当报告因 stale 重建时,每个假设的基准值会被更新为当前实时值,下一次比较便以此为起点。这避免了误差累积:如果始终对比原始基准,三个月来的持续小幅漂移会迟早一次性触发重建,掩盖真实的变化节奏。重新基准化让每次重建都是一次「清零」,代价是失去长期漂移的全局视图,通常需要额外的历史记录来补足。
第二步:衡量变化幅度
用当前值相对报告构建时的值计算百分比变化,而不是相对昨天。
function movePct(old: number, now: number): number {
if (old === 0) return now === 0 ? 0 : Infinity;
return Math.abs((now - old) / old) * 100;
}
这一点很重要。十个微小的每日漂移可能累积成一个大变化。如果永远跟昨天比,就会在噪声中不断重建,却错过缓慢累积的重大偏移。
第三步:分类变化
检查函数返回四种结果之一:
- Fresh:什么都没动。
- Noise:有东西动了,但在容差内。记录,不行动。
- Stale:有东西超出了容差。重建。
- Missing:实时值丢了。询问,不要猜。
type Check =
| { kind: "fresh" }
| { kind: "noise"; moves: string[] }
| { kind: "stale"; moves: string[] }
| { kind: "missing"; keys: string[] };
Missing 被优先检查是有意为之。一份悄悄沿用旧数字的报告,比一份说「我现在不知道」的报告更糟。前者会让你在错误的前提下做决定,后者至少诚实地暴露了不确定性。
第四步:只在过期时重建
只有 stale 会触碰报告。
function refresh(r: Report, live: Record<string, number | undefined>): Check {
const c = check(r, live);
if (c.kind !== "stale") return c;
const values: Record<string, number> = {};
for (const a of r.assumptions) {
a.value = live[a.key]!;
values[a.key] = a.value;
}
r.text = r.build(values);
r.version += 1;
return c;
}
重建时,每个假设都被重新基准化到实时值,版本号递增,这样任何人都能看到答案发生了变化。版本号是这个系统里最被低估的部分——它让「答案什么时候变了、为什么变」变成可追溯的历史。
版本号为什么重要? 在任何需要追踪「结论为何改变」的场景里,版本号都是审计线索的核心。它让下游使用者能回答:这份报告的 v1 和 v3 差别在哪?变化是由哪个假设驱动的?如果版本号缺失,使用者只能看到「最新的答案」,无法判断它是何时、为何成为现在的样子。本文的 r.version += 1 看似简单,却是把一次重建事件转化为可追溯历史的唯一机制。
与「不可变数据」(immutability)的对比。 这里的 refresh 函数直接修改了 Report 对象的字段(a.value、r.text、r.version),属于原地更新。在许多生产系统中,更安全的做法是返回一个新的报告对象,而旧版本保留为不可变快照,从而支持回滚、对比与并发读取。本文采用原地更新是为了教学简洁,但在多代理协作或需要审计的场景中,不可变快照通常是更稳妥的选择。
幂等性(idempotency)如何保证? 因为 build 函数是纯函数——相同输入必得相同输出——只要假设值未变,重复调用 refresh 不会产生新的版本号,也不会改变报告正文。这种幂等性是整个监控器可靠运行的基础:它让「重建」这个动作本身不引入额外噪声,变化只会来自真实的输入变化。
第五步:运行它
用一份虚构的备忘录演示:是否续签供应商合同,假设包括座位数、每座位价格和使用率。
tiny-assumption-watch demo
v1: Annual cost $57600. 74 of 120 seats used. Renew as is.
mon [FRESH] nothing moved
tue [NOISE] seats 120 -> 124 (3.3%, tol 10%); usageRate 0.62 -> 0.6 (3.2%, tol 15%)
wed [REDO] pricePerSeat 40 -> 44 (10.0%, tol 5%)
v2: Annual cost $65472. 74 of 124 seats used. Renew as is.
thu [ASK] no live value for usageRate
fri [REDO] usageRate 0.6 -> 0.41 (31.7%, tol 15%)
v3: Annual cost $65472. 51 of 124 seats used. Cut seats before renewing.
周三价格从 40 涨到 44,超出 5% 容差,重建到 v2,成本上升但结论仍成立。周四使用率数据缺失,监控器选择询问而非沿用周三的数字。周五使用率从 0.6 掉到 0.41,重建到 v3,建议翻转为「续约前先砍座位」。
在每日定时任务下会浪费三次重建,而零次重建会送出错误建议。两次重建才是正确答案。
这个模型在哪里失效
这是一个教学模型,真实的监控更难。手工列出的假设只是冰山一角——真实的金融分析背后有几十个隐藏假设,把它们提取出来才是最困难的部分。百分比容差过于粗糙——阈值附近的小变动可能翻转决策,远离阈值的大变动可能无关紧要。
更关键的是:没有来源追踪,真实监控器需要知道每个实时值来自哪里、有多可信;没有人工审核,翻转的建议在送到董事会之前应该有人过目;单份报告也是简化,真实工作产物相互依赖,一个过期的输入会引发连锁反应。
但形态依然成立:写下你的假设,衡量变化,只在重要时重建,无法判断时询问。
更大的图景:答案送达不是终点
report (v1)
└→ assumptions + tolerances
└→ live values arrive
├→ fresh: do nothing
├→ noise: log it
├→ stale: rebuild, bump version
└→ missing: ask
分析提供答案,假设提供收据,容差提供判断,实时值提供现实检验,版本提供历史,人类提供阈值。
我认为智能体接下来要学的有用能力,不是写出更好的备忘录,而是注意到上周的备忘录什么时候不再成立。这个演示不够激动人心,但在周五的时候实用得多。工作不是在答案送达时完成,而是在答案不再为真时才完成。
相关推荐

Workbuddy零基础入门:桌面AI智能体如何落地工作流
Workbuddy桌面AI智能体零基础教程解读:从安装、积分领取到文件管理与自动化工作流搭建,对比CodeX的适用场景与成本差异,帮助职场人完成从AI提问者到AI管理者的思维转变。

OpenAI智能体新栈:计算机操作、决策API与超速工作流
OpenAI Dev Day发布智能体新栈:Computer Use操作速度超越普通人,Decisions API基于Luna实现极低延迟分类,Agents API开放同源计算机操作能力,GPT-6.1 Sol成本仅为Astra七分之一。本文梳理核心更新、实测数据与开发者落地要点。

梁文峰开源推理框架DeepInfo,硬刚美国禁令
DeepSeek在开源模型后再开源推理框架DeepInfo,包含GPU/CPU交叉流水线、小模型预判大模型复核、华为昇腾与英伟达芯片全面适配等技术,直面美国联邦禁令。本文解析其对AI产业落地的意义与开源策略。