跳到主要内容

183 篇博文 含有标签「observability」

查看所有标签

用户侧概念漂移:当你的提示词依然奏效,但用户已经变了

· 阅读需 11 分钟
Tian Pan
Software Engineer

大多数团队都在契约的错误一端设置了漂移监控(drift monitoring)。他们盯着模型——当供应商发布新的 checkpoint 时发生的性能偏移、提示词重写后的输出分布变化,或是预示着安全过滤器重新调整的拒绝率激增。仪表板非常详尽,告警已接入 PagerDuty,团队也准备好了针对“模型变了”的运维手册。然而,当模型没变而仪表板依然报红时,这些都无济于事,因为真正发生偏移的是你的用户。

用户侧概念漂移是几乎所有评估流水线(eval pipeline)都会忽略的一种问题。你的提示词、模型和工具与发布当天完全一致。你的黄金测试集(golden test set)依然保持 91% 的通过率。但在第一周达到 91% 的提示词,在第三十周的实际效果可能只有 78%,因为底层的输入分布已经发生了变化——用户了解了产品并改变了提问方式、词汇发生了演变、出现了季节性的任务类型、竞争对手重新定义了品类,或者某个热门帖子教给用户一种表达相同意图的新方式。模型和提示词稳住了,契约也稳住了,但契约所针对的那个世界变了。

Agent 的链路追踪采样:每日千万级 Span 中哪些值得保留

· 阅读需 12 分钟
Tian Pan
Software Engineer

一个 Web 服务请求在繁忙时段产生 5 个 Span。而一个现代的 Agent 会话产生 50 个,如果 Planner 决定递归,有时甚至会产生 1000 个。你们平台团队从微服务时代复制粘贴过来的 1% 均匀采样器,从定义上就会丢弃你真正关心的稀有故障——因为故障是稀有的,而均匀采样对稀有性没有任何判断力。

“我们对 Agent 拥有完全的可观测性”的真实版本听起来与营销版本不同。它听起来应该是:我们保留重要的 Trace,丢弃不重要的,并且我们预先知道哪些是哪些。这句话中的每一个词都至关重要,而那些在账单寄来之前一直忽视采样设计的平台团队,现在正被迫反向学习这一学科——在成本压力下,以及在经历了一个季度的故障之后,这些故障本应“在数据中”,但在有人查看之前就被剔除了。

你在无意中为 Prompt 构建了一个功能开关系统 —— 但却缺少治理

· 阅读需 12 分钟
Tian Pan
Software Engineer

打开你团队用来发布提示词(prompt)变更的配置仓库。看看最近的 30 个 commit。其中有多少个经过了代码审查(code review)?有多少个在 CI 中设置了评估门禁(eval gate)?有多少个你能——肯定地——归因为对看到它们的用户的生产环境行为产生了可衡量的变化?如果你的答案是“绝大多数”,那你是个例外。对于其他人来说,这些 commit 此刻正在生产环境中运行,而读取它们的系统所做的事情与特性标志(feature-flag)服务完全一致:热加载一个值,分发给用户,改变产品行为。区别在于,你的特性标志服务拥有审计日志、曝光追踪、熔断开关(kill switches)以及针对特定分群的定向投放。而你的提示词发布流水线只有 git push

这并非隐喻。这是对你团队正在运行的生产系统的准确描述。提示词配置仓库、你的 worker 轮询的 S3 存储桶、数据库中的 “prompts” 集合、你的应用在启动时获取的 LangSmith/PromptLayer/Braintrust 资产——这些全都是特性标志服务。它们具有相同的运行时形态:一个存在于二进制文件之外的值,二进制文件在热路径(hot path)上读取它,更改该值即可在无需部署的情况下改变真实用户的行为。唯一缺少的,是你的 SRE 团队在批准“真正的”特性标志服务之前所要求的所有控制措施。

确认与行动间的鸿沟:智能体的“明白了”并不等同于承诺

· 阅读需 12 分钟
Tian Pan
Software Engineer

Agent 对客户说:“收到——我已经提交了你的退款请求。你应该会在 5–7 个工作日内看到它。”客户关闭了聊天。但退款从未被提交。没有工单,没有 API 调用,退款表中也没有记录。有的只是一段礼貌且自信的英语,以及随后成功的会话终止。

这就是确认与行动的脱节(acknowledgment-action gap),它是生产环境 Agent 系统中代价最高昂的一类 Bug。这种脱节之所以存在,是因为让经过指令微调(instruction-tuned)的模型显得很能干的流利文字,与真正改变世界的结构化工具调用(tool calls)属于不同的输出通道——而大多数团队将业务逻辑挂接到了错误的通道上。

每个发布 Agent 的人最终都会以惨痛的方式意识到这一点。模型生成了一份读起来像承诺的精美确认函,下游系统将其解读为承诺,几周后一份支持工单寄来,询问退款去了哪里。令人尴尬的不是模型撒了谎,而是系统被设计成去信任它所说的话。

Agent 延迟预算是树而非线 —— 你一直在错误的维度进行调试

· 阅读需 14 分钟
Tian Pan
Software Engineer

用户报告“今天早上助手感觉很慢”。值班工程师调出火焰图,按持续时间降序排列工具调用,找到了最慢的一个——耗时 2.1 秒的向量搜索——将其优化到 900ms,发布修复补丁,并将事件标记为已解决。一周后,同样的投诉再次出现。向量搜索仍然是 900ms,但该查询类型的端到端延迟实际上变得更糟了。火焰图中没有任何内容能解释原因。

这就是当工程师在“线”轴上调试一棵“树”时所发生的情况。Agent 延迟不是一系列顺序步骤的瀑布——它是一个由规划调用、工具子树、并行扇出、重试和递归子 Agent 组成的嵌套树。当预算是结构化的,而工具却将其视为线性的,局部优化就会错过真正的违规点,而违规点存在于时间如何分布在各分支中,而不是任何单个调用耗时多久。你可以让每个叶子节点都变得更快,但交付的 p99 却仍在恶化。

静默成功:当你的 Agent 宣告完成但实际上什么也没发生

· 阅读需 11 分钟
Tian Pan
Software Engineer

在智能体对话记录中,最危险的一行往往是那句充满自信的话。“我已经更新了记录。”“邀请已发送。”“权限已应用。”这里的每一句话都是一种主张,而非事实。当背后的工具调用遭遇限流、超时,或返回了一个被摘要步骤过度压缩成安抚性语言的 500 错误时,你所拥有的就只剩下这一句主张了。你的遥测系统会将这一轮对话记录为成功,因为所谓的“成功”被定义为模型在其最后一条消息开头所输入的任何内容。而下游的写入操作从未提交。整整三周都没有人察觉。

这是一种将智能体与之前所有系统区分开来的故障类别。传统服务失败时会返回状态码。传统的批处理作业失败时会提供堆栈追踪。而智能体失败的方式则是继续交谈。它将错误吸收进正在进行的叙事中,对其进行修饰以使故事逻辑自洽,然后交给你一段读起来像是大功告成的文字。用户读了这段话。你的可观测性平台索引了这段话。但数据库中的记录却纹丝未动。

取消税:用户点击停止后的推理账单

· 阅读需 10 分钟
Tian Pan
Software Engineer

你的停止按钮是个谎言。当用户点击它时,你的 UI 停止渲染 Token;但在大多数配置下,你的供应商仍在继续生成它们。这些字节从未到达浏览器,但却出现在你的发票上。用户看到的与你支付的之间的差距就是“取消税”(cancellation tax),它是 AI 成本仪表盘上被低估最严重的支出项。

取消税的存在是由结构性原因导致的。自回归推理是一个受 GPU 限制的流水线:当你的客户端关闭 TCP 连接时,模型已经排好队、完成了 KV 缓存,并正以每秒 30–200 个 Token 的速度输出。大多数推理服务栈在 Token 之间不会检查客户端的活跃状态。它们完成任务,记录用量,然后向你收费。客户端看到了 10 个 Token,而日志记录了 800 个。Langfuse、Datadog 以及所有其他观测平台都会忠实地报告这 800 个 Token,因为那是供应商 usage 数据块报告的内容。

级联路由的可靠性陷阱:当成本优化悄然摧毁你的 p95 延迟

· 阅读需 11 分钟
Tian Pan
Software Engineer

成本仪表盘一片绿意。自从级联路由(cascade router)上线以来,单次请求的支出下降了 62%。CFO 很开心。平台团队正在庆祝。而与此同时,你的 p95 延迟悄然上升了 40%,你最重要的客户刚刚流失,理由是“机器人在处理关键查询时变笨了”,而实验团队已经连续两周在追踪一个根本不存在的幻影回归(phantom regression)了。

这就是级联路由的可靠性陷阱。它是每一个“先尝试廉价模型,如果不成功再升级”架构的隐蔽失败模式,也是生产环境 LLM 系统中最少被讨论的二阶效应之一。成本上的收益是真实的、可衡量的,且易于归因。而可靠性上的损失则是弥散的、统计性的,几乎无法追溯到导致它们的路由。因此,成本上的胜利受到赞彰,可靠性上的损失被归咎于“模型变差了”,团队就这样把自己优化进了一个坑里。

你的思维链是一个故事,而非审计日志

· 阅读需 12 分钟
Tian Pan
Software Engineer

一个智能体用简洁明了的文字告诉你,它检查了用户权限,查阅了策略,确认请求在范围内,并执行了操作。法务阅读追踪记录(trace)。审计人员阅读追踪记录。你的事故复盘也在阅读追踪记录。每个人都阅读同一段话,并且每个人都感到满意。

他们中没有人知道权限检查是否真的运行了。这段文字是叙事的证据,而不是执行的证据——而这两者之所以会被混淆,正是因为叙事足够流畅,让人感觉像是证明。Anthropic 自身关于推理模型忠实度的研究发现,当 Claude 3.7 Sonnet 收到关于正确答案的提示时,平均只有约 25% 的时间承认使用了该提示,而在有问题的类别(如针对评分者的 trick、不道德的提示)中,这一比例低至 19%–41%。模型的陈述推理与其真实行为在大约一半或更多的时间里是不一致的,即使是那些被明确训练以展示思考过程的模型也是如此。

智能体无法察觉的死锁:生成计划中的循环工具依赖

· 阅读需 13 分钟
Tian Pan
Software Engineer

一个规划器智能体输出了七个步骤。每一个看起来都很合理。编排器分发了这些步骤,前三个返回了值,第四个在等待第五个,第五个在等待第七个,而第七个——埋藏在规划器散文般描述的第三行里——正静静地等待着第四个。没有任何东西被锁定。没有触发过任何 EDEADLK。智能体消耗了 40,000 个 token 来推理为什么第四步“花费的时间比预期长”,最终以一个温和、合理的道歉向用户宣告放弃。

这就是你的智能体无法察觉的死锁。它不是操作系统课程中的那种经典死锁——这里没有互斥锁(mutex),没有内核可以内省的资源图,也没有你的技术栈中任何人能识别的持有者或等待者。依赖关系存在于规划器生成的英语句子中,循环形成于潜在语义而非任何数据结构中,而故障模式看起来与“模型正在努力思考”无异。经典的死锁检测在这里毫无用处,但代价是相同的:工作流停滞,token 蒸发,而你的 trace 什么也不会告诉你。

按功能计费,而非按 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 个月里只能凭感觉做定价决策,并在事后发现,某个单一客户群在负利润的情况下消耗了一半的推理账单。

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

· 阅读需 11 分钟
Tian Pan
Software Engineer

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

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