跳到主要内容

702 篇博文 含有标签「llm」

查看所有标签

冷启动评估:如何在零生产环境追踪的情况下发布 AI 功能

· 阅读需 11 分钟
Tian Pan
Software Engineer

每个 AI 功能上线前都有一个同样的静默时刻:在第一个用户看到它之前,团队中的某个人会问“我们怎么知道这个东西好不好?”,而诚实的回答是“我们现在还不知道”。你没有追踪记录 (traces),因为你还没有用户。你没有用户,因为你还没有发布。这是一个真实的死循环,而它产生的两种失败模式都是致命的——要么盲目发布,让第一周的线上问题 (escalations) 成为你的评估数据集;要么等待“真实数据”,眼睁睁地看着产品路线图推迟一个季度,而竞争对手却发布了演示视频。

摆脱困境的方法不是假装冷启动评估与发布后的评估是同一个问题(只是样本量较小)。事实并非如此。你不是在对分布进行采样,而是在构建先验 (prior)。上线首日的每一个信号都是你所做选择的产物——关于衡量什么、模拟谁的行为以及关注哪些失败的选择。能够出色发布 AI 功能的团队会将发布前的评估栈 (eval stack) 视为一等交付物——它不是在准入审查前一晚匆忙拼凑的电子表格,而是一个由内部试用 (dogfooding)、模拟、专家标注和对抗性探测 (adversarial probes) 组成的层级化系统,每一层都提供不同类型的信号,并伴随着关于它能告诉你什么以及不能告诉你什么的明确说明。

对话历史是你的提示词从未承认的负担

· 阅读需 12 分钟
Tian Pan
Software Engineer

下次当用户抱怨“AI 今天变笨了”时,去看看你产品的分析数据。筛选出对话轮次超过 20 轮的会话。你会发现每次都是同样的 U 型曲线:前几轮表现良好,中间几轮表现也不错,而到了后期轮次,质量却直线下跌。提示词没变,模型也没变。变化的是,后期每一轮对话都背负着沉重的载荷:用户的拼写错误、话说到一半的废话、模型的模棱两可、后来被撤销的更正、没人重读的工具输出,以及用户在第四轮就放弃了的目标残余。你的提示词模板把这些“沉积物”当成了信号,模型也是如此。但这不应该。

对话历史并非免费的上下文。它是一种你每一轮都在付费重新发送的负债;它变得越混乱,就越会损害你向用户收费提供的答案。“聊天”这个隐喻是混乱的根源。聊天界面让用户和工程师习惯于将记录视为神圣不可侵犯的 —— 可滚动的、仅限追加的、从不重置。这种习惯被原封不动地引入了 LLM 应用中,尽管在模型处理上下文的物理机制上并没有这种依据。模型是无状态的。对话记录只是你选择不断拉长的一段字符串。你可以缩减它,而且通常你应该这样做。

按功能计费,而非按 Token 计费:AI 预算分配中的缺口

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的财务团队可以准确告诉你,上个月你在 Anthropic 和 OpenAI 上花了多少钱。你的产品团队可以告诉你,哪些功能的用户点击量最高。但公司里没人能告诉你 Draft-Email 是否盈利,Summarize-Thread 是否应该保留在免费层级,或者新的 Rewrite-Tone 功能是否在单用户成本上蚕食了 Draft-Email 的利润。你拥有两个声称追踪同一笔支出的仪表盘,但它们都无法回答那个真正驱动产品决策的问题。

这就是分配缺口。你按端点(endpoint)测量 Token 支出,因为这是供应商 API 提供的数据。但 /chat 端点服务于 12 个刚好共享同一个提示词模板的功能,“按端点”统计将这 12 个功能全部合并到了同一个细目中。在有人完成将 Token 成本导回至产生成本的功能这一底层工作之前,定价层级、功能权限管理、弃用决策以及“我们要不要发布这个功能?”的讨论,全都只能靠直觉。

这项底层工作并不光鲜。它是请求级标记(request-level tagging)、追踪与遥测数据的关联(trace-to-telemetry joins),以及一种坚决的态度:如果不带成本标签,就不发布任何 AI 功能。将此视为基础设施投资的团队,最终会获得按用户群细分的单功能利润报告。而将其推迟到下季度的团队,最终在 18 个月里只能凭感觉做定价决策,并在事后发现,某个单一客户群在负利润的情况下消耗了一半的推理账单。

“以后再加评估”的陷阱:测量债务如何产生复利效应

· 阅读需 10 分钟
Tian Pan
Software Engineer

每个在没有评估(evals)的情况下发布 AI 功能的团队都会对自己讲同样的故事:我们会以后再添加衡量标准,等到找到产品与市场契合点(PMF)之后,等到提示词(prompt)稳定之后,等到下一次发布之后。六个月后,提示词已经被四位工程师和两名产品经理修改过,其行为支撑着三个客户集成,团队发现“以后添加评估”意味着要从从未为此目的结构化过的生产日志中重建意图。本应开发新功能的季度变成了考古季度。

这不是规划错误。而是一个复利错误。为了更快发布而跳过评估的团队,正是那个将花费十二周时间从不完整的追踪(traces)中重建评估基础设施、为二月份所谓的“正确”含义争论不休、并悄悄移除没人能证明依然有效的功能的团队。追赶的成本超过了内置的成本——不是一点点,而是随着每一次未经回归检查就发布的提示词修改而倍增。

幻觉成功问题:当你的智能体宣称完成却一事无成时

· 阅读需 11 分钟
Tian Pan
Software Engineer

在智能体(agent)系统中,最危险的失败并非那些大张旗鼓的报错。而是智能体自信地宣布“任务完成”,并返回一份它从未执行过的工作摘要。文件从未写入。Webhook 从未触发。数据库行仍保持一小时前的状态。但追踪记录(trace)显示为绿色,完成计数器在增加,仪表盘告诉领导层新功能运行良好。

这就是“幻觉成功”(hallucinated success)问题,它是生产环境中最难捕捉的一类漏洞,因为它能避开你拥有的所有廉价信号。智能体没有崩溃。它没有超时。它没有返回错误。它叙述了一个合理、连贯且完全虚构的成功执行过程。你的可观测性堆栈是为捕捉嘈杂的失败而构建的。而无声的成功看起来与真正的成功一模一样,直到用户注意到输出是错误的。

你的 P99 正在受陌生人流量的影响:托管 LLM 推理中的“吵闹邻居税”

· 阅读需 13 分钟
Tian Pan
Software Engineer

你的仪表板很干净。昨天的部署也已干净地回滚。模型版本已锁定。提示词没有更改。但你的 TTFT p99 刚刚翻了一倍,客户成功渠道已经炸锅了,而你唯一能给出的诚实回答是“这是提供商的问题”。这个答案显得很苍白——就像耸耸肩一样——它通常会引出一个团队中没人能回答的后续问题:证明它。

这是托管 LLM 推理中营销页面不会讨论的部分。当你调用前沿模型 API 时,你正在与你看不见的负载共享 GPU、PCIe 结构、连续批处理和 KV 缓存预算。你的 p99 是这些负载突发的函数。大规模推理的经济性取决于租户的多路复用是否足够紧密,以使硬件利用率保持在 60-70% 以上,这意味着你的尾部延迟在结构上与同一分片上最大、最不规整、最不稳定的租户耦合。你购买的不是容量;你购买的是一个别人也排在其中的队列切片。

你的 LLM Span 在撒谎:APM 工具没告诉你的推理延迟真相

· 阅读需 10 分钟
Tian Pan
Software Engineer

你的 LLM 调用耗时 2,340 毫秒。你的 APM Span 是这么记录的。这个数字是你可观测性堆栈中最昂贵的谎言,因为四种完全不同的故障模式都被渲染成了同一个不透明的紫色条块。长提示词下的 Prefill(预填充)浪涌。一个一小时没访问的租户导致的冷 KV 缓存。提供商连续批处理(continuous batching)中的“吵闹邻居”。一次无声的路由变更将你的流量导向了不同的区域。同样的 Span。同样的耗时。同样的 p99 告警。却是四个截然不同的复盘分析。

适用于微服务的分布式追踪准则 —— 每个网络跳数一个 Span、一个时长、几个标签 —— 在面对托管推理时失效了。LLM 调用并非单一实体。它是一个由多个阶段组成的流水线,每个阶段都有截然不同的扩展特性,运行在行为取决于队列中其他人的共享硬件上。将其视为一个单一且不透明的 Span,会导致你花费三天时间去调试“模型变慢了”,而实际上模型根本没变。

Markdown 优于 JSON:你正在支付却未察觉的输出格式税

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数团队在上线当天开启 JSON 模式,却从未衡量这背后的代价。这种假设合情合理:结构化输出能保证正确性,为什么不选它呢?答案是,严格的 JSON 模式约束解码通常会使数学、符号和多步分析任务的推理准确度降低 5–15%,而由于评估是在开启格式标志之前运行的,或者评估衡量的是可解析性而非质量,因此没人注意到这一点。

输出格式是一种解码时的约束,正如所有约束一样,它会扭曲模型的概率分布。当你查看日志时,这种扭曲是不可见的:JSON 有效,Schema 匹配,字段类型也对得上。你在日志中看不到的是模型本可以用散文形式产出的推理过程,但由于无法塞进你给定的语法中而消失了。“格式税”是真实存在的,在文献中已有详尽记录,但在生产环境中几乎普遍未被衡量。

这篇文章将探讨何时该支付这笔费用,如何在不必支付时及时止损,以及对于既想要结构化输出又想要准确性的工程师来说,格式选择的决策树究竟是什么样的。

多模型可靠性并非 2 倍:引入第二个 LLM 服务商的非线性成本

· 阅读需 16 分钟
Tian Pan
Software Engineer

这种天真的算法是这样的。我们的主供应商拥有 99.3% 的可用性。增加第二个具有类似独立性的供应商,同时故障的概率就会降至大约 0.005%。成本翻倍,风险降至两百分之一。工程负责人批准了双倍预算,轮值报警在供应商宕机时也不再响起。电子表格显示,这是路线图上性价比最高的可靠性投资。

六个月后,电子表格错了。评估套件(eval suite)的运行时间变成了三倍,提示词(prompt)修改需要提交两个 PR,每周的回归报告中有两列内容相互矛盾,而且没人记得预发布环境的备选方案当前路由到了哪个供应商。一旦团队核算了用于保持两条路径校准的人力工时,双倍预算实际上更接近 4–5 倍。第二个供应商在技术上仍在提供流量,但一半的功能已被悄悄锁定在其中一方,因为保持两者同步已经变得不再划算。

这就是多模型成本陷阱。可靠性算法是正确的;但团队搞错的是运营层面的算法。接下来是对引入多供应商后的成本分解、大多数团队应该首先尝试的“单供应商加降级模式”方案,以及真正证明这种非线性复杂性合理性的少数准则。

输出承诺问题:为什么流式自我纠正比原始错误更损害用户信任

· 阅读需 12 分钟
Tian Pan
Software Engineer

用户向你的智能体提问。Token 开始流式输出。写到第三句时,模型写道“实际上,让我重新考虑一下——”并转向一个不同的答案。修改后的答案更出色。用户却关闭了标签页。

这就是输出承诺问题(Output Commitment Problem),它是已发布 AI 产品中被低估得最严重的 UX 失败案例之一。工程师思维将自我修正视为一项特性——模型注意到了自己的错误,这意味着系统正按预期运行。而用户感知思维则将其视为一场灾难——产品现场演示了其最初自信的断言是错误的。这两种解读都是正确的,且它们本身无法调和。

核心的不对称性在于,流式传输让思考过程变得清晰可见,而清晰的思考就是可审计的思考。一个静默地产生幻觉然后给出简洁最终答案的模型看起来很专业。而同一个模型,如果流式输出每一个不成熟的想法,看起来就像是在胡言乱语。答案的质量是相同的,但感知却截然不同。

模式匹配失败:当你的 LLM 流利地解决了错误的问题时

· 阅读需 12 分钟
Tian Pan
Software Engineer

用户将一份冗长且复杂的错误报告粘贴到你的 AI 助手。它看起来像是一个经典的空指针问题,其措辞和代码布局与数以千计的 Stack Overflow 帖子如出一辙。模型自信地做出了响应,引用了常用的修复方案,听起来非常权威。用户向它表示感谢。然而,错误依然存在。这份报告实际上关于的是竞态条件 (race condition);空指针的表述只是用户描述症状时的偶然方式。

这是在生产环境 LLM 系统中捕捉难度最高的一类 Bug。模型没有拒绝回答,没有推诿。它没有幻觉出一个虚假的 API。它只是极其流畅地解决了错误的问题,而下游的所有环节——包括用户、你的评估流水线、你的护栏 (guardrails)——都看到了一个看似合理且切中要害的回答,然后继续下一步。我将此称为模式匹配失败 (pattern-matching failures):模型锁定了查询的表面特征,并针对与实际提出的问题相邻的问题给出了一个自信的答案。

你的规划器知道用户无法调用的工具

· 阅读需 10 分钟
Tian Pan
Software Engineer

一个免费层级用户打开你的支持聊天窗口并询问:“你能为订单 #4821 退款吗?”你的智能体(agent)回答:“我无法办理退款 —— 这是管理员才能执行的操作。你可以通过控制面板进行升级,或者我可以为你转接。”拒绝是正确的。退款工具上的 ACL 是正确的。而你刚刚告诉了一个匿名用户:存在一个名为 issue_refund 的工具,它受名为 manager 的角色限制,并且你的平台接受格式为 #NNNN 的订单 ID。

你的规划器(planner)知道用户无法调用的工具。这种不对称性 —— 推理层可见完整目录,而动作层仅能执行部分目录 —— 正是大多数智能体权限控制(agent authorization)悄无声息出错的地方。工具边界处的 ABAC 能拦截未经授权的调用。但它无法拦截已经发生的“能力泄露”,这种泄露往往出现在前一个 token 中,比如规划、拒绝,或是关于变通方案的“热心”建议。