跳到主要内容

678 篇博文 含有标签「ai-engineering」

查看所有标签

MCP 工具弃用:为什么模型仍然调用旧名称

· 阅读需 10 分钟
Tian Pan
Software Engineer

六周前,你将 get_user_email 重命名为 lookup_contact。新名称已发布,旧的处理程序已移除,变更日志记录了这一点,你的评估集也通过了。然而上周二,一位客户支持工程师联系了你:智能体在上周的大约 3% 的工具调用中返回了错误——tool_not_found: get_user_email。那个已被重命名的名称。那个在实时系统中已经不再对外公开的名称。

先验知识(Prior)具有粘性。你的智能体正在与之对话的模型是在一个语料库上训练的,在这个语料库中,get_user_email 是询问“这个人的电子邮件是什么”的绝大多数规范方式。即使你在推理时传递的 tools 数组中仅列出了 lookup_contact,模型偶尔——在特定的上下文条件下,特别是长追踪(long traces)或错误恢复状态下——仍会退回到它记忆中的名称。直接切换并不能消除长尾效应;它只是将软故障变成了硬故障。

移动应用商店审核与 AI 功能:发布频率的碰撞

· 阅读需 10 分钟
Tian Pan
Software Engineer

一个 Prompt 回归在上午 9 点上线。在 Web 应用上,工程师在午饭前就回滚了系统 Prompt,追踪日志随之恢复平静。在 iOS 上,同样的回归存在于 App Store 三周前审核通过的二进制文件中——团队现在必须在两种方案中做出选择:要么在服务端替换 Prompt(这会使商店对用户实际行为的审核失效),要么申请加急审核(这需要花费 24-48 小时,还要消耗一点与平台团队积攒的人情值)。哪种方案都不在操作手册(runbook)里。

这就是部署节奏冲突(deploy cadence collision):Web AI 功能按照团队的时钟迭代,而移动端 AI 功能则按照平台的时钟迭代。大多数发布流程(release trains)在有人想到“Prompt 是否应该与二进制文件绑在同一辆列车上”之前就已经确定了。结果是税收在悄然累积——审核延迟、不对称的回滚延迟、在重新提交时无法通过隐私审核的未披露 AI 界面,以及一整类移动端工程师修复速度仅为 Web 同行十分之一的 AI Bug。

凌晨 3 点处理一个没有报 500 错误的 AI 功能报警

· 阅读需 13 分钟
Tian Pan
Software Engineer

传呼机在凌晨 3:02 响起。你眯起眼睛盯着手机,预料着那些常见故障:数据库故障转移、CDN 边缘节点失联,或者是某个八个月没人碰过的服务出现了 500 报错峰值。然而,警报显示的是:summarizer.eval-on-traffic.helpfulness rolling-1h: 4.21 → 4.05 (Δ -0.16)。没有 HTTP 错误。没有延迟峰值。没有服务宕机。系统在过去一小时内处理的每一个请求都返回了 200,并且响应体解析正常。然而,情况显然比午夜时分变糟了,而值班轮换要求你查明原因。

这种值班任务是标准的运维手册中从未提及的。出故障的东西并没有“坏掉”——它只是退化(regress)了。你多年来追踪的错误预算是以可用性和延迟来衡量的,而触发此次报警的故障模式在两者中都不可见。报警是真实的,客户受到的影响也是真实的,而你通常的诊断循环——检查部署日志、检查依赖图、查找错误的发布版本、执行回滚——在你意识到那个“错误的发布”可能只是昨天下午 4 点上线的一个 30 行系统提示词(system-prompt)的修改时,便碰了壁。在代码审查中,那次修改看起来完全无害。

Prompt 即文档:当系统 Prompt 成为唯一可信的交付物时

· 阅读需 11 分钟
Tian Pan
Software Engineer

一位产品经理在 Slack 上私聊你,询问当客户要求助手取消订阅时会发生什么。你开始凭记忆输入答案,然后又自我怀疑,于是打开系统提示词读了 30 秒。你粘贴回一份摘要。他们向你道谢后继续忙别的了。三小时后,支持团队问了同样的问题。到了周四,合作伙伴负责人把提示词的截图贴进了交易审查中。

这就是“提示词即文档”(prompt-as-documentation)反模式。当你第一次意识到这种情况发生时,感觉会很棒。你花了六个星期调优的制品,现在成了产品功能的权威真理来源。产品经理在读它,支持团队在读它,销售团队在读它,甚至某个角落的设计师也在读它。你的工作成了支柱,这在以前的服务层代码中从未有过。你可以通过计算有多少不相干的人能凭记忆调出这个文件来证明这一点。

Prompt 作者身份问题:三个角色同时编辑同一个文件

· 阅读需 14 分钟
Tian Pan
Software Engineer

翻开任何一个运行了一年的生产系统提示词(system prompt)的 git blame,你都会发现一些工程团队不愿承认的事实:这个文件有三个作者,而他们对“变更”的定义各不相同。上个月重构指令块的工程师将提交记录标为“无功能变更,仅为了清晰起见重新排序”。每季度读一次该文件的产品经理会这样描述同样的差异:“你改写了语气——客户会察觉到的”。运行回归测试套件的 ML 工程师会说:“你搞坏了第三个少样本示例(few-shot example),从那以后评估结果(eval)就一直变红了”。

这三者都是正确的。提示词同时具备代码、规范和超参数的属性。任何长期交付 AI 功能的团队都会发现,该文件的提交历史是一场缓慢进行的三方署名权争议,CODEOWNERS 无法捕捉到这一点,diff 查看器也无法体现出来。

季度模型迁移:将其变成日程安排,而非消防演习

· 阅读需 13 分钟
Tian Pan
Software Engineer

弃用通知邮件在一个周二的下午寄达。你的计费流水线赖以生存了 14 个月的模型现在进入了 60 天的倒计时。提示词是由一名在 3 月离职的工程师调优的。评估套件自发布以来从未重新设定基准。客户成功团队正在询问为什么两个企业账户的“AI 感觉不一样了”。没有人把这件事列入路线图,也没有人能清爽地接手,因为在你组织的心理模型中,这是一个一次性项目 —— 尽管这已经是今年的第四次了。

每个在生产环境中运行 AI 功能的团队在 18 个月内都会得出同样的感悟:基础模型提供商正以团队未曾预料的频率弃用模型,而团队的迁移应对措施始终是由于收到通知邮件而触发的被动仓促应对。解决方法不是为下一次迁移准备一个更好的操作手册 —— 这类手册已经很多了,你的团队可能也写过一个。解决方法是停止将迁移视为一个项目,而是将其视为一个经常性的运营原语。把它排进日历。

针对幻影库存的 RAG:当你的语料库描述产品已删除的功能时

· 阅读需 12 分钟
Tian Pan
Software Engineer

一位客户询问你的支持代理如何执行某项操作。代理检索到了三个相关性评分很高的文档分块,合成了一个自信的答案,并引导客户完成一个五步操作流程。然而,这个流程的最后一步是一个在四个月前就已经不存在的按钮。客户提交了工单。值班工程师调出评估套件,发现结果是绿色的;调出检索追踪,发现结果也是绿色的——模型没有产生幻觉,它忠实地引用了描述产品团队在上个季度发布中重命名的功能的文档。

这就是我想命名的失败模式:不是幻觉,也不是检索未命中,而是幻影库存 (phantom inventory) 问题。你的检索语料库是已不存在的产品界面的快照。向量存储不知道产品发生了变化。评估套件也不知道。唯一能持续捕捉到这一点的系统是支持工单队列,而当工单提交时,客户已经被告知去点击一个并不存在的按钮了。

评估员吞吐量是评估流水线中隐藏的瓶颈

· 阅读需 11 分钟
Tian Pan
Software Engineer

团队像规划服务一样规划评估集(eval suite):梳理失败模式、起草评分标准(rubric)、争论样本量大小、安排评判员校准(judge calibration)时间表。然后,他们把评测员产能(rater capacity)当作脚注——“我们会让标注团队每周评测几百条”——然后就发布了剩下的部分。六周后,评测员队列堆积了 4,300 个条目,评估速度坍缩到每月仅一次评判员校准周期,在一次规划评审会上,有人道破了那个大家都心照不宣的事实:没有人对人力进行过产能规划。

在任何严肃对待人工评分的 AI 系统中,评测员吞吐量都是评估速度的约束性瓶颈。将标注视为 SRE 问题而非招聘问题的准则,才是产品发布的关键。一名人类评审员在专家难度下每小时处理 50–100 个样本,而一名专家标注员每周的上限约为 500–1,000 个样本——这些数字不是通过增加人头就能蛮力解决的招聘问题。它们是评估系统的运行属性,必须像建模数据库 IOPS 一样对其进行建模和预算编制。

重复问题检测:你的单轮评估无法察觉的会话级盲点

· 阅读需 12 分钟
Tian Pan
Software Engineer

用户打开你的聊天窗口,提了一个问题,得到一个评估套件打分为 4.6(满分 5 分)的回答。接着,他们换了一种说法问了同样的问题。同样的回答,同样的分数。他们又试了一次,这次用了人们在怀疑机器没在听时常用的套话——“我实际上想做的是……”——然后他们关闭了标签页。从模型的视角来看,这是三个干净的问答轮次。从仪表盘的视角来看,这是一个活跃的会话。但从用户的视角来看,这是一个连续三次失败的产品,而且以后再也不会打开了。

这就是“单轮评估”(per-turn evaluation)无法察觉的失效模式。孤立来看,每一轮对话似乎都是正确的。裁判(Judge)给了赞。幻觉检测器保持沉默。相关性评分很高。然而,整个对话作为整体并没有解决任何问题——而这正是用户真正评估你的单位。

检索引用税:为什么合规性会增加 30% 的 RAG Token 账单

· 阅读需 12 分钟
Tian Pan
Software Engineer

我最近交流过的一个团队向一家财富 500 强公司的内部法务办公室出售了他们的法律 AI 产品,并在系统提示词中增加了一行:“每一个事实性陈述必须包含对检索源的内联引用。”产品路线图为这种新行为分配了 5% 的 Token 预算缓冲。在该受监管租户上线 60 天后,财务部门标记了每月推理支出激增了 34%。没有人搞坏产品。没有人发布新功能。这项促成交易的合规要求,也悄然改写了其背后的单位经济效益。

这就是检索引用税,几乎每个服务于受监管行业——法律、医疗、金融、有审计约束的企业——的 RAG 系统最终都要支付这笔费用。这笔税收是结构性的,而不是 Bug。它源于引用纪律迫使模型进入了一种不同的生成模式,而且它在客户签署的采购规范中无处可寻。

影子评估:当私有切片取代了你的评估汇总

· 阅读需 11 分钟
Tian Pan
Software Engineer

想要发现你的 AI 团队缺乏评测纪律,最快的方法就是分别在 Slack 私聊中询问三名工程师:“你上次的提示词(prompt)修改提升了质量吗?”——然后看着他们三个人都回答“是”,但给出的却是三个不同的数字,针对的是三个不同的切片(slice),在三台不同的笔记本电脑上运行,而且团队中没有其他人能复现这些结果。从教科书式的定义来看,这不单纯是评测问题。教科书会说你没有评测。而现实情况更糟:你有 太多 的评测,每个评测都是私有的,每个都能衡量一些真实的东西,但没有一个能汇总成组织可以据此制定计划的单一指标。

这就是“影子评测(shadow eval)”反模式,大多数 AI 团队在承认这一点之前,这种状态持续的时间比他们愿意承认的要长。它看起来效率很高——每个工程师都有一个 notebook,每个 PR 都附带一张通过率的截图,每次站会都会提到“在长尾切片上取得了胜利”——而且它能在季度评审中幸存下来,因为“我们做评测”的门槛太低了,只要运行任何内容都算。但组织得不到任何信号。领导层无法判断上个月的三次提示词修改是推动了产品进步还是原地踏步,因为三名工程师是根据三个私有切片进行衡量的,而且在切换文件的那一刻就停止了对之前基准(baseline)的追踪。

过时的 Few-Shot 示例以及你的提示词仓库所忽略的半衰期

· 阅读需 11 分钟
Tian Pan
Software Engineer

打开任何已经上线超过九个月的 AI 功能的系统 Prompt。向下滚动,越过角色描述,越过格式规则,越过安全护栏。停在标题为 <examples>## Examples 的块,或者是你的团队在某人把前三个好用的 Slack 线程复制到代码块的那天给它起的任何名字。读一读它们。有 60% 的可能性,其中至少有一个引用了已经更名的功能、一个已不存在的按钮,或者产品经理在两个季度前悄悄砍掉的工作流。

这种衰退从评测(eval)仪表盘上是看不出来的。评测得分是绿色的。它们已经绿了好几个月了。它们之所以是绿色的,是因为评测集是针对 Few-shot 示例所引用的同一个产品界面编写的,两者已经同步老化。模型正在完美地模仿去年的产品,而在一个以此标准打分的测试集上,它是合格的,然而真实用户在与今年的产品互动,并默默忍受由此产生的幻觉(confabulations)。这就是没有人写进 LLMOps 路线图的半衰期。