跳到主要内容

639 篇博文 含有标签「llm」

查看所有标签

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

· 阅读需 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 中,比如规划、拒绝,或是关于变通方案的“热心”建议。

向量检索中的流行度偏见:为什么相同的五个文本块总是主导每个查询

· 阅读需 13 分钟
Tian Pan
Software Engineer

从任何成熟的 RAG 系统中提取一周的检索日志,并按分块(chunks)被返回的频率进行排序。其分布形态几乎总是相同的:一小部分分块出现在数千次查询中,而语料库中的绝大多数内容仅出现几次,甚至从未出现过。系统没有故障。它正在精准地执行索引构建时的预期功能 —— 而这恰恰是问题所在。

这就是向量检索中的流行度偏差(popularity bias),而且随着语料库的增长,这种情况会变得更加严重。少数分块变成了“引力井”,在互不相关的查询中频频胜出,而长尾内容则悄然消失在 top-k 截断值之下。你的 RAG 系统开始让人感觉“平庸” —— 用户提出具体问题,得到的回答听起来却像是为别人写的一样。等到产品部门开始投诉时,这种分布不均的情况往往已经持续数周了。

你的提示词正在与模型已有的认知竞争

· 阅读需 12 分钟
Tian Pan
Software Engineer

你刚接入的前沿模型对你的竞争对手早有定见。对于你产品旨在反驳的那些难题,它有一套默认答案。它对你所在的领域有一套“最佳实践”,而这些实践往往源于训练语料库中占据主导地位的内容;对于你在设计文档中反复纠结的每一个争议性决策,它都暗自偏向于传统做法。这些都不会出现在你的系统提示词(system prompt)中,也不是你写的。在涉及到你产品核心差异化的查询上,模型会先倾向于那些默认设定,而不是你告诉它的内容。

大多数团队在发布产品时,都把模型当成了一张可以任意配置的白纸。写好角色设定(persona),列出规则,粘贴品牌语气指南,运行几个能产生正确回答形式的 QA 提示词,然后就大功告成了。通过审核的提示词往往是处理简单查询的——在这些查询中,模型的先验认知(prior)恰好与你的预期相符。而那些真正有趣的查询,即如果产生通用回答就会让你的产品惨败的查询,几乎从未进入提示词迭代循环。在这些查询中,先验认知正在悄无声息地取胜。

为什么你的 RAG 引用在撒谎:源归因中的事后合理化

· 阅读需 12 分钟
Tian Pan
Software Engineer

向用户展示一个带有 AI 答案的界面,且每句话末尾都附有链接,还没等他们读完任何一个引用的段落,他们的信任度就已经飙升。这正是企业级 RAG 的全部营销卖点:“有据可查”、“有源可循”、“可验证”。这也是 AI 工程领域中交付最多、但测试最少的说法。最近的基准测试发现,50% 到 90% 的 LLM 回复并未得到其引用来源的完全支持,有时甚至与来源相矛盾。在对抗性评估集中,最先进模型生成的引用中有高达 57% 是不忠实的:模型根本没有真正使用它指向的文档。这些引用是事后补上去的,目的是为了让模型已经决定给出的答案显得合理。

这不是检索层面的 Bug。即便你拥有完美的检索系统,仍然会得到虚假的引用,因为这种失效是架构性的。生成器先写出文字,然后再缝补链接。这些链接看起来像证据,实则只是装饰。