跳到主要内容

861 篇博文 含有标签「insider」

查看所有标签

下午 3 点和凌晨 3 点的同一个 Prompt 并不是同一个 Prompt:LLM 评估中的昼夜漂移

· 阅读需 13 分钟
Tian Pan
Software Engineer

评估套件在凌晨 2 点运行。流量很低。缓存是冷的,但队列是空的。供应商的连续批处理程序有空闲插槽,并将以接近其 TTFT(首 Token 延迟)底线的水平处理每个请求。延迟分布很紧凑,评测模型分数稳定,仪表盘显示一片绿色。团队发布上线。

六个小时后,太平洋时间上午 8 点,同样的 Prompt 在美国早高峰期间进入生产环境。p95 延迟是评估报告的 2.4 倍。相当一部分请求从一个供应商那里收到了 529 错误,并回退到另一个供应商的较小路由层级。流式传输的节奏更加断断续续。评测模型(当天晚上对生产环境追踪样本进行重新运行)给出的中位数得分比凌晨 2 点给出的相同 Prompt 的得分低了半分。代码库没有变化。Prompt 没有变化。只是挂钟时间变了。

必须意识到的架构真相是:LLM 调用不是其输入 Token 的纯函数。它是一个随机分布式系统调用,其输入包括挂钟时间、供应商集群的负载、Prompt 缓存的状态、当前解码批次的大小,以及供应商负载均衡器在你的请求到达的那一毫秒所做出的路由决策。在凌晨 2 点运行评估的团队,是在一种用户永远无法体验到的条件下校准仪器。

结构化输出重试循环:你被忽视的算力浪费

· 阅读需 13 分钟
Tian Pan
Software Engineer

打开你的结构化输出仪表盘。它自豪地显示着类似 “98.4% 的 Schema 合规率” 这样的数字。这就是成功率——即第一次尝试就生成有效 JSON 对象的请求比例。团队为剩下的 1.6% 构建了一个重试封装器(retry wrapper),发布上线,然后就没再管了。两个季度后,推理费用增长了 15%,而请求量仅增长了 4%。首席财务官(CFO)想要个解释。工程师们给不出解释,因为跟踪结构化输出成功率的仪表盘并不跟踪结构化输出的成本。

仪表盘隐藏的部分在于:失败路径并非只有一次重试。第一次重新提示(re-prompt)修复了缺失的 enum 字段,但引入了一个格式错误的嵌套数组。第二次重新提示修复了数组,但丢掉了一个必填键。第三次尝试终于通过了验证,但到那时,该请求已经消耗了四次完整的推理调用加上最初的生成过程,而你的单次请求 Token 计数器显示的是 总和,而不是循环过程。从计数器的角度来看,这是一个昂贵的请求。从成本线的角度来看,这是一个你从未定价的随机循环。

这篇文章将探讨该循环究竟对你的算力预算产生了什么影响,为什么你现有的观测能力(observability)无法察觉到它,以及哪些规范可以使其变得可见且可控。

Token-Per-Watt:你的仪表盘无法计算的 AI 可持续性指标

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的可持续发展仪表盘报告显示:“本季度 AI 能耗:2.3 GWh,同比下降 4%”,这张幻灯片在 ESG 评审中得到了礼貌性的认可。六个月后,CFO 走出分析师电话会议,向平台负责人提出了一个听起来很简单的问题:“我们的每瓦特 Token 数(token-per-watt)是多少?与竞争对手相比如何?”仪表盘无法回答。这并不是因为数据缺失——仪表盘里堆满了数据——而是因为它将推理视为单一的条目,将任务视为产品概念,而 AI 可持续性唯一真实的单位存在于这两者的交汇点。

这种错位并不是报告中的 Bug。这是一个分类错误,现有的碳核算指南(为基于 CPU 小时和每台虚拟机 kWh 的云工作负载而完善)无法独自解决。推理并不是一种具有稳定能量特征的工作负载。每 Token 的瓦特数会根据响应请求的模型层级(model tier)产生 30 倍的变化,根据调用时的批处理大小(batch size)产生 4 倍的变化,并根据前缀缓存(prefix cache)是否命中而产生另一个数量级的差异。将这些汇总成一个单一的 GWh 数字,就像在包含踏板车、轿车和 18 轮大卡车的车队中报告“平均汽车燃油效率”一样——在最无用的层面上,它是准确的。

工具重入:你的函数调用层尚未察觉的 Bug 类别

· 阅读需 13 分钟
Tian Pan
Software Engineer

智能体用 400 毫秒回答了一个简单的问题,然后因递归限制错误(recursion-limit error)崩溃。Trace 显示了 25 次工具调用。从上到下阅读 Trace,工程师会得出结论:智能体糊涂了 —— 以略有不同的顺序反复调用那几个工具,始终无法收敛。这个结论是错误的。智能体并没有糊涂。它陷入了一个死循环:工具 A 调用了模型,模型选择了工具 B,工具 B 的实现再次调用模型来格式化其输出,而格式化程序又选择了工具 A。Trace UI 将四个嵌套调用渲染为扁平列表中的四个兄弟调用,导致唯一能发现问题的开发者也无法察觉这个循环。

这就是工具重入(tool reentrancy),这是一种你的函数调用层几乎肯定没有建模的 Bug 类别。并发安全的代码对此已有数十年的原语支持:记录同一线程嵌套获取次数的重入互斥锁(reentrant mutexes)、语言层面的递归限制、堆栈检查 API,以及一种文化共识:任何回调运行时的函数都需要一个明确的契约,规定允许何种重入。工具调用层默认采用“发后即忘”(fire-and-forget)模式。运行时没有可供检查的调用栈,调度前没有循环检测器,工具定义上没有重入属性,Trace UI 的形式像日志而非图。结果就是,任何超过十几个条目的工具目录都会悄悄变成框架无法察觉的递归。

工具 Schema 是提示词,而非 API 合约

· 阅读需 12 分钟
Tian Pan
Software Engineer

你智能体代码库中最昂贵的一行,就是从现有的 OpenAPI 规范中自动生成工具 Schema(tool schemas)的那一行。这看起来是一个利落的工程选择——单一事实来源、无重复、每次 API 变更时自动同步。但这也是为什么你的智能体在应该选择 searchUsersV3 时却选择了 searchUsersV2,因为你的规范示例中写了 limit=20 于是它就填了 20,并且悄无声息地丢掉了 tenant_id,因为它被埋在第七个参数槽位里。

单元测试中不会显现任何这类迹象。Schema 是有效的。端点(endpoint)是存在的。智能体的调用是格式正确的 JSON。然而,模型每次都会用错工具,且是以你的 QA 流水线永远察觉不到的方式,因为 QA 测试的是 API,而不是智能体对 API 的理解。

这个 Bug 是观念性的。OpenAPI 的设计初衷是向编写 SDK 代码的人类描述 API;而工具 Schema 则是作为 Prompt 的一部分,在每次调用时由 LLM 读取。将它们视为同一种产物,就好比根据数据库列名自动生成面向用户的文案一样,犯了同类型的错误。

翻译并非本地化:多语言 AI 正面临的文化校准债务违约

· 阅读需 13 分钟
Tian Pan
Software Engineer

一个多语言发布版本,如果只是将英文提示词翻译成 N 种语言,并将英文评估集也翻译成同样的 N 种语言,那它并没有发布一个真正的多语言产品。它只是将同一个产品发布了 N 次,并让所有的失败模式在它自己的仪表盘上变得不可见。该系统虽然表达流畅,但在文化层面上显得格格不入,而团队优化的指标——翻译质量——并不是衡量用户反应的正确维度。

发布当天的明显缺陷通常很小。一位日本用户收到的回复虽然语法正确,但显得生硬无礼。一位印度尼西亚用户发现助手以一种欢快直接的语体说话,听起来却很不礼貌。一位韩国用户收到的建议是围绕个人选择展开的,而提示词其实是关于家庭决策的。这些都不是翻译错误。它们是文化语体(cultural-register)错误,翻译无法修复,且经过翻译的评估也无法检测出来。

两个 PM 的难题:当提示词所有权与产品所有权发生偏离时

· 阅读需 12 分钟
Tian Pan
Software Engineer

周二早上收到了一张支持工单:一名客户收到了关于退款期限的、言之凿凿的错误回答。工程团队调取了追踪记录,发现模型识别错了意图。产品 PM 查看仪表板,发现上个迭代发布的“极速退款”入口触发了一个 Prompt 从未针对其进行过调优的意图。平台 PM 指着评估套件(eval suite)说,测试全是绿色的。两人在技术层面都是正确的。但客户得到的回答依然是错的。

这就是“两个 PM 问题”,大多数 AI 团队都存在这个问题,只是没有给它命名。产品 PM 负责面向用户的界面——意图、成功指标、支持升级路径。平台或 ML PM 负责 Prompt、模型选择、评估套件和成本上限。两者的路线图在季度规划层面是协调的,但在每周发布层面却在背道而驰,因为两个 PM 在不同的仪表板上针对不同的指标进行优化,且有着不同的变更控制流程。

这种有趣的失效模式并不是因为两个 PM 意见不合,而是因为他们都在各自的职责范围内正确地完成了发布,却共同导致了一个无人负责的退化(regression)。

你的向量数据库也有热点 Key:为什么 ANN 索引在生产成本上“撒了谎”

· 阅读需 12 分钟
Tian Pan
Software Engineer

你团队选择的向量索引是在一个生产环境中根本不存在的工作负载上进行基准测试的。每一个公开的 ANN(近似最近邻)基准测试 —— VIBE、ann-benchmarks、数据库厂商落地页上的对比表 —— 都是从语料库中均匀采样查询的,因此每个邻居查找的成本大致相同,每个分片承受的负载也大致相等。真实的检索流量并非如此。它呈现出齐普夫分布(Zipfian):极小部分的查询(今日新闻、趋势产品、循环的支持意图、客服团队整天收到的那几百个问题)命中的一小部分嵌入,其频率比中位数高出百倍。基准测试显示 HNSW 在 50ms p99 下的召回率为 0.97。而生产环境则显示一个分片正在熔化,其余的却闲得发慌。

这种不匹配并不是调优问题。而是向量检索继承了所有其他数据库工作负载的访问倾斜特性,而该领域标准化的索引在设计时并未考虑到这种特性。你的 KV 存储免费获得的缓存层 —— 预热你最常读取的行的操作系统页面缓存(OS page cache),针对热点 Key 的 LRU —— 在 ANN 中并不存在,因为图是按图结构顺序遍历的,而不是按访问顺序。热门嵌入在内存中依然是“冷的”,因为搜索算法的遍历模式在页面缓存看来是随机的,而你的“热门”集群位于单个分片上,其 CPU 运行火热,而集群的其他部分却在闲置。

方差正在吞噬实验:为什么传统的 A/B 测试功效计算不适用于 LLM 功能

· 阅读需 12 分钟
Tian Pan
Software Engineer

模型团队可以演示新功能并展示十个令人信服的并排对比获胜案例。增长团队将其作为为期两周的 A/B 测试运行,得到 p = 0.31,读数显示“无显著效果”。两个团队都是正确的。实验是错误的。

这种模式在每个将 LLM 强行接入产品但未重建其实验栈的组织中不断重复。增长团队使用的数学模型是为按钮颜色、排名变化和定价页面设计的——这些功能的输出在给定用户和上下文的情况下是确定性的。LLM 功能打破了该数学模型赖以生存的两个假设,而标准的 80% 效能、5% 显著性、两周扩量模板在两个方向上都系统性地输出了错误的判断:真实的获胜被读取为无效结果,而噪声则被读取为置信的获胜。

智能体完成任务时房间已空:异步后台任务中的过时上下文交付

· 阅读需 10 分钟
Tian Pan
Software Engineer

一个需要 90 秒才能完成任务的后台智能体,其操作基于的是 90 秒前的世界快照。当它返回结果时,用户可能已经导航到了不同的视图,开始了一个新的对话,归档了原始请求,或者完全关闭了标签页。大多数智能体框架无论如何都会交付结果,修改状态以反映结果,并将这次往返视为成功。但这并不是成功。这是智能体在一间空屋子中结束。

这种失败模式比直接丢弃结果更糟糕。丢弃结果只是一次投递失败——虽然烦人但可以恢复。而应用陈旧的结果则是对一个用户不再提出的问题的回答,它是针对不再匹配的状态编写的,往往会覆盖用户已经开始的新工作。用户会注意到发生了他们没有要求的事情,却无法重构原因,从而对系统失去信任,这种信任损失是简单的超时永远不会造成的。

解决办法不是更快的智能体,而是一个交付时的相关性门控,它将返回的时刻视为一个全新的决定,而不是派发时刻预设的定论。

Agent 飞行记录仪:在第一次事故发生前必须捕获的字段

· 阅读需 14 分钟
Tian Pan
Software Engineer

当 agent 在生产环境中第一次失控时——它删错了行,给错误的客户发了邮件,在单个任务上烧掉了 400 美元的推理费用,或者对受监管的用户说了法律风险极高的话——团队打开日志,却发现他们实际上拥有的是:一串参数被截断的 CloudWatch 工具调用名,一个只捕获了最新一轮对话的“用户提示词”字段,而且没有记录实际运行的是哪个模型版本。供应商在两周前滚动更新了别名。系统提示词存在于一个没有快照的配置服务中。由于框架默认值是 0.7 且“人尽皆知”,因此没有记录温度。触发错误操作的工具结果超过了日志行大小限制,并被截断为“...”。

你无法重现决策过程。你只能猜测。六个月后,你堆积了一堆无解的“它为什么这么做”的报告,团队开始像对待天气一样对待 agent——把它当作一种发生在你身上的事情,而不是你可以调试的东西。

飞行记录仪准则(Flight recorder discipline)是你为了防止这种情况所能交付的最廉价的东西,但如果你等到第一次事故发生才开始,它也将是你交付的最昂贵的东西。以下字段是最低要求,存储形式不容商量,采样和隐私边界必须同步设计,而不是事后修补。

智能体记忆漂移:为什么一致性对齐是你缺失的关键环

· 阅读需 12 分钟
Tian Pan
Software Engineer

你长期运行的智能体(agent)所做的最危险的事情,也是它做得最自信的事情:根据记忆回答。客户的地址在上周二更改了。智能体认为“开启”的工单在昨天被人工关闭了。智能体拥有整洁解释笔记的产品功能,其实际交付的形式与智能体三周前阅读的规范不同。在教科书定义上,这些都不属于幻觉——模型准确地召回了它存储的内容。只是在智能体看向别处时,世界已经发生了变化。

大多数团队将记忆视为一个写入问题:智能体应该记住什么、我们如何总结、嵌入(embedding)策略是什么、如何防止存储爆炸。这种思维方式产生的架构会随着错误程度的增加而变得更加自信。更难的问题——那个决定你的智能体在第三周后是否仍然有用的问题——是对账(reconciliation):这是一个明确的、持续的闭环,用于比较智能体认为真实的情况与底层系统当前显示的真实情况。