跳到主要内容

76 篇博文 含有标签「infrastructure」

查看所有标签

物理隔离 LLM 蓝图:无出站流量部署的真正需求

· 阅读需 12 分钟
Tian Pan
Software Engineer

云端 AI 的策略通常建立在一个没有人明确写下来的前提之上:出站 HTTPS (outbound HTTPS)。厂商 API、托管评测器、遥测流水线、模型注册表、向量存储、仪表板 SaaS、密钥管理器——其中的每一个都静默地解析到公网上的一个域名。一旦拔掉这根电缆,整个技术栈并不会优雅降级,而是会直接崩溃。

大多数团队直到那一刻才会发现,他们的架构中存在从未考虑过的出站依赖。一个“微小”的提示词更新可能需要调用托管分类器;评估套件需要通过网络访问 LLM 评测器;可观测性代理会向后端发送数据;模型注册表从 CDN 拉取权重。这些都不是恶意的,也并不罕见。当你忽视了那根电缆时,云原生技术栈本就是这个样子的。

你的 LLM 账单只占 Agent COGS 的一半 —— 另一半是无人监控的部分

· 阅读需 11 分钟
Tian Pan
Software Engineer

当财务团队第一次要求 AI 产品团队预测单位经济效益(unit economics)时,对话往往如出一辙。团队打开推理仪表盘,指着每月的 token 支出说:“这就是我们的销售成本(COGS)。”CFO 乘以预估业务量,在图表上画出一条线,并询问毛利率曲线何时能跨过 70%。六周后,当实际损益表(P&L)出炉时,仪表盘上的推理数字是正确的,但毛利率却比预测低了 20 个百分点。没人撒谎。推理费用其实只占 Agent 实际成本的一半。

另一半成本分散在 AI 团队中无人负责的各个分项中。向量数据库的账单在悄无声息地增长,因为检索量随使用量增加,而重新索引的成本计入了计算费用,而非存储费用。可观测性平台的发票则从平台团队的预算中支出。嵌入重构(Embedding regeneration)表现为 CI 成本。遥测数据存储被归入数据仓库。人工审核则计入客户成功(customer-success)的人员成本。这些项目单独看都不起眼 —— 这正是为什么整合后的数字会让所有人大吃一惊。

你的 APM 正在悄悄丢弃 LLM 遥测数据,而 Bug 就隐藏在这些缝隙中

· 阅读需 12 分钟
Tian Pan
Software Engineer

目前你的系统中有一个损坏的 prompt 影响了约 3% 的流量,但你的仪表盘根本察觉不到它的存在。p99 延迟图表是绿色的。错误率保持平稳。模型调用成功率指标高达四个九。唯一的故障迹象出现在一张平台团队无法复现的客户支持工单中,而等这张工单进入调试环节时,相关的 trace 已经因为采样而被丢弃了。

这不是监控缺失,而是一个分类错误。你正在运行的 APM 是为维度受限(如 endpointstatus_coderegionservice)的世界设计的,在这种情况下,增加一个标签的成本最多只是增加几个新的时间序列。LLM 工作负载完全不符合这种模式。真正有趣的维度是用户的 prompt、检索到的 context ID、工具调用序列、模型版本、prompt 模板版本、租户(tenant)、语言区域(locale),以及请求所属的 eval bucket。每一个维度都是高基数(high-cardinality)的,只要你用其中任何一个子集来标记 span,指标存储瞬间就会爆炸。

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 轮大卡车的车队中报告“平均汽车燃油效率”一样——在最无用的层面上,它是准确的。

分词器漂移:你的本地计数在撒谎,账单才说真话

· 阅读需 10 分钟
Tian Pan
Software Engineer

我认识的一个团队花了三周时间追踪一个“上下文截断”的 Bug,这个 Bug 只在针对日本客户的生产环境中触发。他们的 CI 测试用例是英文的。他们的 tiktoken 计数显示 Prompt 符合 8K 的限制,且留有 600 个 Token 的余量。但供应商的账单显示,该请求因超过限制而被拒绝。这两个数字相差 11%,而安全余量正好落在在那 11% 之内,而且从未有人衡量过中日韩 (CJK) 文本上的这种差异。修复方案不是换一个新模型——而是不再将本地计数器作为事实标准。

这就是 Tokenizer 漂移那种隐蔽且昂贵的形式:不是一个简单的错误数字,而是一类在被你忽略的测试边界处累积的小型系统性误差。你 IDE 中的本地计数器、网关中的预算计算器、重试中间件中的速率限制评估器,以及供应商据以收费的权威计数——这些都不一致,而且差距恰恰在你用户所在的领域扩大。

反事实日志:通过今天的充足记录,在明年的模型上重放昨天的流量

· 阅读需 14 分钟
Tian Pan
Software Engineer

每个 LLM 团队最终都会收到主管发来的同一封邮件:“Anthropic 发布了新的 Sonnet。用我们的流量跑一下测试,周五前告诉我是否应该切换。”团队打开生产环境的追踪(trace)存储,调取上个月的请求,并针对新模型排队运行——但在运行三小时后,有人发现工具调用环节的差异评分看起来非常离谱。答案是:没有人以原始形式捕捉工具的响应。追踪记录忠实地记录了模型的“回复”,并存储了每个工具返回内容的一行摘要。回放这些请求并不能回放旧模型实际看到的内容;它回放的是一段被严重压缩的投射。迁移评估并不是在衡量新模型,而是在衡量新模型如何与一个不同的现实对话。

这就是我想讨论的失败模式。大多数生产环境的 LLM 日志都是“以输出为导向”的:它们能很好地回答“模型说了什么?”,但只能模糊地回答“模型看到了什么?”。这种不对称性在你需要针对新模型回放历史数据之前是隐形的——到那时,它就成了整个问题的关键,因为日志记录与实际发送内容之间的差距,正是真实评估与虚假评估之间的差距。

称之为反事实日志(counterfactual logging):今天就捕捉那些你明天询问“如果用另一个模型处理这个完全相同的请求,它会做什么?”时所需的输入。标准不是“我们记录了请求”,而是“我们可以针对不同的模型重新执行该请求,并确信结果是有意义的”。

跨区域 Prompt 版本偏差:你的 CDN 误运行了六小时的 A/B 测试

· 阅读需 12 分钟
Tian Pan
Software Engineer

你在 09:14 发布了一个系统提示词(system-prompt)变更。发布仪表盘在 09:31 变绿。到 11:00 时,你的评估追踪器依然显示正常,成本仪表盘也无异常,但一位客户成功工程师联系了团队:仅在亚太地区,解析端的结构化输出错误上升了约 3%。北美无异常。欧洲无异常。

发布在覆盖 67% 的区域时自动暂停了,因为某个 POP 节点上的一个非核心健康检查在切换期间发生了抖动,而当时没人注意到。在六个小时里,us-easteu-west 运行着提示词 v47,而 ap-southap-northeast 仍停留在 v46。你正在运行一个按地理位置划分的实时 A/B 测试——只不过这个测试不是你设计的,你看不到测试过程,而且那个本应捕捉质量回退的评估套件正巧连接到其中一个区域的新版本,然后若无其事地忽略了问题。

这种失败模式并不是单个工具的 bug。它是将提示词通过为不同类型的工件构建的部署系统进行推送时,所产生的可预见的后果。

当你的 CLI 开始说英语:可提示基础设施的最小权限原则

· 阅读需 13 分钟
Tian Pan
Software Engineer

我本季度交流过的一个平台团队发布了一个封装了 kubectl 并支持英语指令的 Slack 机器人。一名工程师输入了 “清理 staging 中未使用的分支”。这个机器人非常“热心地”删除了 12 个命名空间——其中一个的名字匹配到了子字符串 “branch”,但它恰好托管了移动团队已经使用了一周的长期集成环境。没有任何异常被抛出。机器人发起的每一次调用都是它合法持有的权限。复盘报告无法指出任何违背的访问规则,因为确实没有规则被打破。该机器人完全按照其 IAM 策略允许的操作执行。

Unix 哲学是一种隐藏在审美偏好下的隔离策略。具有窄接口的小型工具意味着任何单个命令的爆炸半径都受到它所接受的谓词和标志 (flags) 的限制。rm -rf 极其危险,因为这是大家的共识;kubectl delete namespace 要求操作者完整输入命名空间名称,而这种手动输入就是一道关卡。最小特权原则之所以容易执行,是因为权限是词法化的:命令的形式告诉了你行动的形式。

随后,封装层开始接受英语。现在,“命令的形式”变成了 LLM 认为它是什么,它就是什么。

你的智能体发件箱将是你的下一个送达率事故

· 阅读需 13 分钟
Tian Pan
Software Engineer

当这种情况第一次发生时,值班工程师正盯着已经全红的 Gmail Postmaster 仪表盘,支持信箱因为客户重置密码邮件落入垃圾邮件箱而告急,而导致这一切的智能体(Agent)仍在运行。在当地时间凌晨 4 点到上午 9 点之间,它从公司的主要发送域名发送了 8 万封“个性化跟进邮件”,且全部使用了计费系统所用的同一个 DKIM 密钥签名。等有人注意到时,花费三年建立的域名声誉已毁于一旦,接下来六周内,公司所依赖的每一条事务性消息的收件箱投递率也将随之化为乌有。

从智能体发送邮件看起来就像是一个单行的工具调用。send_email(to, subject, body) 是最经典的演示,每个框架都将其作为入门集成提供。但邮件不同于其他工具。错误的数据库查询可以回滚,错误的 API 调用会返回错误。而一批糟糕的邮件会降低你公司发送的每一封其他邮件的送达率,且持续数周之久。这里没有可以回滚的事务,因为邮件已经发送到了接收方的邮件服务器,而这些服务器正在记录你域名的声誉历史。

你的 API 曾假设一次只有一个人类用户。并行智能体打破了这一契约。

· 阅读需 14 分钟
Tian Pan
Software Engineer

我认识的一位后端工程师在一个周二的下午盯着一个从未有过波动的 Datadog 图表:其内部日历服务的单用户 429 计数器。投诉的客户并没有改变他们的行为。他们只是开启了助手功能,现在每当用户说“帮我找下周的时间”时,该功能就会针对同一个日历 API 并行启动八个规划线程。速率限制器(Rate Limiter)——每用户每分钟 60 次请求,这个设置非常合理,是多年前针对一个在物理上无法点击得那么快的 UI 编写的——在每次请求的前三秒内就会触发,并悄无声息地破坏了助手一半的响应。

速率限制不是 Bug。契约才是 Bug。那个后端,就像大多数在 2024 年之前编写的内部服务一样,在每一层都植入了一个悄然执行的假设:一个用户意味着一条活动流,其节奏受限于人类的反应时间,拥有一个 cookie 罐、一个 CSRF 令牌和一套在出现问题时可以重新提示的凭据。Agent 一次性粉碎了所有这五个假设,故障表现为一系列看似无关的事件——429 风暴、“最后写入者胜”(last-write-wins)导致的数据损坏、无法取证的审计日志、挂起无头工作线程的重新认证循环——在模式被命名之前,没有人会将它们联系起来。

我一直与平台团队沟通的一个简短总结是:你拥有的每一个后端都与它的调用者有一个未记录的契约,而那个契约是与人类协商达成的。现在 Agent 出现了,要求重新协商。你可以选择在代码审查中主动进行协商,也可以选择在下一次事故期间被动进行。

主权崩塌:记录你的 Prompt 究竟去了哪里

· 阅读需 11 分钟
Tian Pan
Software Engineer

监管机构问了一个简单的问题:“对于上周二 UTC 时间 14:32 提交的这个特定用户 Prompt,请证明该请求及其派生状态经过了哪些管辖区。”

你的应用日志显示 model=claude-sonnet-4-5, region=eu-west-1, latency=2.1s。你的网关日志也显示同样的内容。供应商的发票确认了请求确实发生了。但这些都无法回答上述问题。该请求进入了一个由欧盟托管的网关,被转发到美国区域的主端点,但在一次区域性故障期间故障转移到了新加坡,并预热了一个第三方 GPU 池上的 KV 缓存,而该 GPU 池的数据驻留声明仅存在于供应商的脚注中。你所需要的审计追踪存在于一个你的团队并不掌握的层级中。

这就是主权崩溃:即你的合同中关于数据位置的承诺与你的运行时在事后能实际证明的情况之间的差距。合规主张的强度取决于链路中最薄弱的那行日志。

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

· 阅读需 12 分钟
Tian Pan
Software Engineer

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

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