别让 Agent 把统计数字当常识:用 Starwell 的来源、核验状态与 MCP 工具建立可追溯数据链
让 AI Agent 回答“美国近一年的失业率是多少”“几个经济体的通胀如何比较”,最危险的失败方式通常不是它直接说“不知道”,而是给出一个貌似合理、却没有口径、时间或来源的数字。把这类数字继续写进报告、告警阈值或产品决策,后续很难追查:它来自哪张官方表?是原始值还是计算值?数据在何时抓取?上游修订之后,系统有没有重新检查?
Starwell 是面向应用和 AI Agent、汇集官方统计来源的第三方数据服务。它把多家统计机构的序列以 REST API 和 MCP 服务器提供,并在响应中附带来源 URL、抓取时间、连接器版本、许可证、引用信息和核验状态。它不是让模型“更会猜数字”的提示词层,而是把数据来源和可验证性变成接口契约的一部分。
这类服务尤其适合两种场景:一是 Agent 需要把公共统计数据带入分析、摘要或工作流;二是团队需要让结果能够回放和审计,而不只是得到一次性的自然语言答案。它并不替代统计专业判断:不同机构的指标定义、季调方式、发布时间和地理口径仍可能不同。可靠的流程是让 Agent 找到数据,再让人或规则检查是否选对了指标。
先把“数字”还原成可检查的观测记录
一个可用于工程决策的统计值至少应回答五个问题:对应哪个指标、观测期是什么、数值来自谁、何时获取、当前是否通过核验。Starwell 的观测接口将这些信息放在同一响应中。以 FRED 的美国失业率序列为例,下面的无认证读取会请求最新三条观测值:
curl "https://starwell.dev/api/starwell/v1/sources/fred/series/UNRATE/observations?latest=3"
文档中的响应包含 period、value、revision 和 provenance。其中 provenance.sourceUrl 指向上游数据来源,retrievedAt 记录抓取时刻,connectorVersion 则标识取数连接器版本;meta 还会提供序列名称、单位、频率、引用与许可证信息。也就是说,应用不必仅保存“4.2”这类孤立值,而能保存它在数据链中的位置。
对自动化系统而言,这会改变错误处理方式。若接口返回的是指标不存在、许可证限制、上游不可达或正在物化新序列,就不应把它们都伪装成空数据。Starwell 文档为这些情形给出不同的 HTTP 状态与机器可读错误码;调用方可以据此重试、退避、提示人工选择替代指标,或中止生成结论。
核验状态不是装饰字段
官方数据也会修订,连接器也可能滞后。因此,Starwell 为序列提供 passing、stale、failing、unverified 等核验状态。passing 表示黄金参考值和新鲜度检查通过;stale 表示数值能够核对但上游已发布较新的数据,或尚未在该序列的更新周期内复查;failing 表示黄金检查与实时来源不一致;unverified 则表示已入库但尚未经过核验流程。
工程上不应把这些状态压平为一个布尔值。展示历史图表时,可以保留 stale 并标出数据时点;驱动风控、价格或对外报告时,通常应拒绝 failing,并明确处理 unverified。如果 Agent 要生成文字结论,也应把核验状态和观测期带入上下文,而不是只把数值交给模型。例如“该序列当前为 stale,最后观测期为某月”比“失业率是 X%”更能阻止过度解读。
先搜索目录,再读取固定序列
不要让 Agent 依赖记忆拼接序列 ID。比较稳妥的流程是先用目录接口按指标和地区搜索,再在工作流配置中固定确认过的 source 与 seriesId。目录响应会携带指标、单位、频率、地理范围、许可证和核验信息;这样,审阅者能看到 Agent 到底选了“失业率”、还是误选了“就业人数”。
Python 任务可直接读取 CSV 输出。该格式把归属信息写在开头注释行中,pandas 可以跳过注释后解析日期列:
import pandas as pd
url = (
"https://starwell.dev/api/starwell/v1/"
"sources/fred/series/UNRATE/observations?format=csv&latest=120"
)
df = pd.read_csv(url, comment="#", parse_dates=["period"])
print(df.tail())
这个例子的关键不在于 pandas,而在于把数据获取 URL 固定为代码的一部分。后续若需要变更序列或窗口,应通过代码审查或配置变更留下记录,而不是让提示词在每次运行时重新猜测数据来源。对于长时间序列,还应处理分页、截断提示和上游修订;不能因为接口返回成功,就默认拿到了完整历史。
MCP 让 Agent 使用工具,不等于取消边界
Starwell 同时提供 Streamable HTTP MCP 端点。Claude Code 可用下列命令注册远程服务:
claude mcp add --transport http starwell https://starwell.dev/api/starwell/mcp
文档列出的工具包括目录搜索、来源和数据集查询、序列元数据、统计摘要、观测读取、计算回答以及监控管理。数据读取可匿名使用;计算回答和监控功能需要在账户中创建免费 API key。对 Agent 来说,MCP 的价值是把“查找—读取—取得引用”变成结构化工具调用,而不是要求它从网页段落中抽取数字。
但把 MCP 接进 Agent 之前,仍建议明确工具权限。只读分析 Agent 可以只允许搜索与观测查询;会创建 webhook 监控的 Agent 则需要额外的网络出口、回调地址校验和密钥管理。Starwell 为监控投递提供 HMAC-SHA256 签名,接收端应在解析 JSON 前对原始请求体验证签名。不要因为数据来自公共机构,就跳过 webhook 认证和重放防护。
计算答案应保留输入,而非只保存一段结论
Starwell 的 POST /v1/answer 支持以自然语言提出问题,并在服务端对已选序列运行 Python 计算后返回答案、所用序列、引用和计算代码。这样的能力适合探索性分析,但生产工作流最好仍显式指定序列与时间窗口。例如“某年平均失业率”必须明确起止日期和频率,否则季度、月度与日度数据会产生不同的平均口径。
服务文档说明,计算在每次请求独立的 microVM 中运行,且在沙箱不可用时失败关闭;这降低了执行不可信分析代码的风险,但不能替调用方完成统计审查。对于需要复现的结果,建议连同响应中的 revision 与抓取时刻一并存档:同一观测期被上游修订后,数值变化不一定意味着程序或模型出了错,关键是能识别它究竟使用了哪一个数据版本。团队应保存问题文本、指定序列、时间窗口、返回的 Python、观测期、核验状态与引用;如果答案缓存因底层数据更新而失效,也应允许后续运行产生不同结果并记录原因。
一个可落地的最低标准是:Agent 输出任何统计结论时,都同时输出指标 ID、观测期、核验状态和引用链接;自动化规则拒绝 failing 状态;重要分析固定序列与窗口;监控回调验证签名。这样,模型负责组织解释,数据接口负责提供可追溯证据,人负责判断指标是否真正回答了业务问题。比起让 Agent “看起来懂数据”,这条边界更能经受复盘。
适用边界:统一入口,不是统一口径
Starwell 更适合需要多来源公共统计数据、希望以 API 或 MCP 接入 Agent、并且重视来源和许可证元数据的团队。它能降低查找、格式转换和引用拼接的重复工作,却不能把不同国家、不同机构的统计定义自动变成可直接横向比较的同一指标。页面中标记为 computed 的值也应与原始发布值区分对待。
上线前可以用一个小实验验收:选择一条业务会用到的序列,分别读取 JSON、CSV 与 MCP 工具结果;断言观测期、单位、引用和核验状态都被保留;再模拟 stale 或 failing 时的降级路径。只有当这些失败分支也能被审计,公共统计数据才真正适合进入 Agent 驱动的生产决策链。