跳到主要内容

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

查看所有标签

系统提示词作为代码、配置或数据:影响全局的架构决策

· 阅读需 13 分钟
Tian Pan
Software Engineer

上个季度我交流过的一个团队发布了一个客户支持智能体,其系统提示词存储在 Postgres 的一行中,每个租户一行。这个方案听起来很合理:企业客户要求定制语气,“让提示词可编辑”是实现这一目标最廉价的方式。六个月后,发生了三件事。评估套件从 200 个案例膨胀到了 11,000 个,因为每个租户的提示词现在都需要自己的回归测试集。提示词更新工作流悄然变成了一个没有审核的写入路径,因为产品负责人被赋予了对表的直接访问权限。此外,由于部署流水线根本不知道提示词发生了变化,一个韩国租户提示词中损坏的 UTF-8 字符导致该租户的聊天机器人下线了两天,却没人察觉。

这些结果都不是需求强制导致的。它们是由一个无人刻意做出的架构决策所强制导致的:系统提示词存放在哪里?在代码中?在配置文件中?还是在数据库行中?团队选择了“数据库”,因为这是实现功能最快的路径,而后果在接下来的几个月里级联影响到了每一个相邻系统。

AI 工程师的三种品味:为什么 Prompt、Eval 和 Guardrail 往往无法共存于一个大脑中

· 阅读需 13 分钟
Tian Pan
Software Engineer

我今年雇佣的三位最优秀的 AI 工程师,如果让他们互相面试,可能都会被刷掉。那个能写出在模型升级后依然稳健的提示词(prompt)的人,这辈子没写过一个有用的评估(eval)用例。那个能设计出捕捉到关键故障的评估集的人,写的提示词其他工程师根本不想去维护或扩展。那个能设计出既能“故障闭合”(fail closed)又不阻塞正常路径的护栏(guardrail)的人,对另外两个人的看法我在这里不便多说。

职级体系将他们三人都称为“AI 工程师”。定级委员会在对比他们的晋升材料时,仿佛他们做的是同样的工作。其实不然。

Token 放大:烧掉你账单的提示词注入攻击

· 阅读需 11 分钟
Tian Pan
Software Engineer

用户提交了一个 0.01的请求。你的智能体读取了一个网页。40秒后,该次对话的推理账单变成了0.01 的请求。你的智能体读取了一个网页。40 秒后,该次对话的推理账单变成了 42。该查询在技术上是成功的——智能体返回了一个合理的答案。只是为了得到这个答案,它经历了三个嵌套的子智能体、一次 200K token 的文档获取,以及一个递归的计划优化循环。这些扇出(fanout)操作并非用户的本意,而是隐藏在智能体所读取页面中的一句话。

这就是代币放大(token amplification):一种提示词注入攻击,它不窃取数据,不调用未授权工具,也不会留下明显的安全特征。它只是烧光你的账单。云账单是攻击载荷,而用户的请求则是载体。

Tokenizer Churn:你的“兼容”模型升级中隐藏的破坏性变更

· 阅读需 13 分钟
Tian Pan
Software Engineer

供应商声称这次升级是无缝替换。API 契约保持不变。配置中的模型名称几乎没变。一周后,你的上下文窗口防御机制(context-window guard)开始在以前从未触发过的提示词(prompts)上报警,你的停止序列(stop-sequence)正则匹配在了错误的位置,而你的少量样本(few-shot)示例之一开始产生一个极其自信的错误答案,而你的评估套件恰好没有覆盖到这一点。没有人动过提示词。没有人动过温度参数(temperature)。有人悄悄重新训练了分词器(tokenizer)。

分词器更改是供应商不会称之为“破坏性”(breaking)的破坏性更改。API 层面保持了字节级稳定,SDK 没有升级主版本,发布说明中提到了“改进的指令遵循能力”——但从你的输入字符串到模型实际看到的整数序列的映射函数已经被替换了。你的代码关于文本如何转换为标记(token)的每一个假设现在都出现了微妙的偏差。这种隐形代价是,在有人重新通过 count_tokens 运行标准提示词并发现答案之前,你会经历两周“感觉模型不太一样”的困惑期。

拒绝还是上报:置信度门控 AI 中的双阈值问题

· 阅读需 14 分钟
Tian Pan
Software Engineer

大多数生产环境中的 AI 功能在发布时只带有一个置信度阈值。在阈值之上,模型给出回答;在阈值之下,用户会得到一句生硬的“我不确定”。这个单一的数值同时承担着两个完全不同的任务,这就是为什么即便你对已回答查询的准确率看起来不错,但信任度指标却已经连续两个季度下滑的原因。

正确的设计至少应该有两个切分点。一个“弃权”(abstain)阈值设在低位:低于该值时,模型拒绝回答,因为此时保持沉默比给出任何答案都更有价值。一个“升级”(escalate)阈值设在中间:在两个切分点之间,系统将案例交给人工审核员,而不是直接将其丢弃。将它们合并成一个刻度盘,你发布的产品在出错时和不确定时会让人感到同样无用——在用户只需打开另一个标签页就能找到免费替代品的市场中,这是最糟糕的处境。

这并不是什么新鲜想法。拒绝选项分类器(reject-option classifier)的文献自 20 世纪 70 年代以来就一直在主张拆分阈值,将“歧义”拒绝(输入介于已知类别之间)与“距离”拒绝(输入远离任何训练数据)区分开来。生产环境中的 AI 团队总是在以惨痛的方式重新学习这一教训,通常是在首次发布大约六个月后,当支持队列中挤满了询问“这玩意儿是坏了还是怎么了”的人时。

供应商可迁移性税:为什么“我们可以更换模型”是每季度的成本项,而非一个勾选项

· 阅读需 12 分钟
Tian Pan
Software Engineer

在过去六个月中,我审计过的每一个团队都声称自己是供应商无关的。但实际上没有一个团队能做到。在评估套件中得分最高的系统提示词之所以表现出色,是因为它倾向于单一供应商的分词器行为、JSON 模式协议、拒绝节奏以及停止序列处理 —— 而编写该提示词的团队甚至无法说出其中哪些偏差在起作用。当 CFO 询问为什么采购清单上更便宜的模型不能直接替换时,诚实的回答是:这需要两个工程师季度的提示词重新调优以及对每个评估进行完全的基准重设。这不仅仅是一个勾选项。它是一个季度的成本项。

一直困扰团队的心智模型是将供应商可移植性视为一次性的架构决策。你添加了一个抽象层,在配置中写了一个 model: 字段,以此自我庆贺,然后继续前进。一年后,当供应商提价、发布弃用通知,或者在你关注的某个类别上出现了一周糟糕的拒绝服务时,你发现那个抽象层只是一个围绕特定模型提示词的薄包装。你买到的可移植性是语法上的。而你真正需要的是行为上的可移植性,且行为上的可移植性在你停止支付的那一刻就会衰减。

为什么你的语音智能体显得很没礼貌:话轮转换是你从未记录过的延迟预算

· 阅读需 12 分钟
Tian Pan
Software Engineer

当你第一次发布语音智能体(voice agent)时,你会听到两个相同的抱怨:“它打断了我”和“它感觉很不礼貌”。这两者其实是同一个 Bug。智能体并不是真的没礼貌——它只是在运行一个你从未明确记录过的延迟预算(latency budget)。聊天机器人那种“在输入完成后响应”的直觉,在语音场景下会产生一种挫败感:就像在和一个人聊天,他总是打断你的话,又在不该沉默的时候突然安静。

人类在对话中的轮换(turn-taking)通常发生在约 100 到 300 毫秒的窗口内,这在所有已测量的语言中都是一致的。中位数 200ms 的说话者间隙不是一个目标,而是一个人类校准的基准。任何更慢的反应都会被解读为困惑,任何更快的反应都会被解读为打断。如果语音智能体没有明确模拟这种节奏,每一轮对话都会掉进这两个坑里的其中一个。

解决方案不是用更快的模型,而是承认语音 AI 是一个软实时系统(soft real-time system),其预算由人类对话的物理特性决定,并在发布前记录下这个预算。

为什么 AI 生成的注释腐烂得比代码还快

· 阅读需 12 分钟
Tian Pan
Software Engineer

当智能体(agent)在同一个 diff 中编写函数和注释时,该注释并不是文档。它是代码在编写时的转述,由同一个模型从同一个上下文中生成。当代码第一次发生变动时,它就会悄然出错。函数被重构,参数类型改变,或者添加了提前返回(early-return),但注释却保持不变。到下个季度,注释所编码的规范已不再与代码匹配,而下一位读者会因为注释更易读而选择相信它。

这是一个古老的失效模式 —— 人类修改代码,注释保持陈旧 —— 但智能体从三个维度同时加速了这一进程。注释量增加了,因为智能体无论是否需要,都会给每个函数添加文档块(doc block)。注释的语法非常完美,所以审阅者不会将其标记为低质量。而且,注释用与代码实际执行不同的术语来转述代码,因此它们看起来像文档,但实际上编码了第二套规范,这套规范独立于第一套规范而漂移。

辩论多样性坍塌:当三个智能体投出 3-0 只因它们读过同样的互联网

· 阅读需 13 分钟
Tian Pan
Software Engineer

架构图上写着“三个前沿模型集成、辩论与对齐、多数投票”。追踪记录显示,所有三个智能体在第一轮就达成了一致,并又花了两个回合礼貌地互相转述。评估结果显示比单次调用高出 0.4 分。账单显示成本是 4.2 倍。在这其中的某个环节,有人判定这个委员会运作良好。

多智能体辩论被宣传为一种获取分歧驱动推理的方法:三个大脑相互争论,以获得比其中任何一个单独达到的更好的答案。但这取决于智能体是否真的存在分歧。在重叠的网络语料库上训练、针对重叠的偏好数据集进行指令微调、并针对重叠的安全分类法进行对齐的前沿 LLM,其共享的先验知识远比架构图所承认的要多。在经过一轮“让我们达成一致”之后,你观察到的并不是三种观点向真理汇聚——而是来自同一个分布的三个样本向它们原本就相距不远的众数汇聚。

这种模式在最近的文献中有一个名字:当一个集成的投票分歧率趋于零且与问题难度无关时,你就遇到了辩论多样性崩塌(debate diversity collapse)。委员会仍在投票。但投票已不再携带任何信息。

Prompt 迭代中的“局部最大值”陷阱:如何判断你调错了地方

· 阅读需 12 分钟
Tian Pan
Software Engineer

在一个严肃的 LLM 项目进行到第六周时,总会有那么一个时刻,Prompt 迭代日志开始变得像一本心理治疗日志。每一次微调都是在用一种失败模式交换另一种。增加一个更严格的 “do not”(不要)条款,模型在以前能处理的情况下就开始回避。放软语气,另一类幻觉又回来了。评测得分板在三四个点的范围内徘徊,拒绝突破。有人说,“让我再试一次重新排序,”于是又是半天时间烟消云散。

这就是局部最优陷阱(local-maximum trap)。团队正在爬山,但这山头已经到顶了。残忍的是,这座山是真的——每一次 Prompt 的改动确实会在某些案例子集上产生可衡量的变化,而这正是让每个人持续微调的信号。被忽略的是:上方的天花板根本不是 Prompt 的天花板。

采纳率是一个虚荣指标:你的 Copilot ROI 隐藏在敲击键盘后的 90 秒里

· 阅读需 12 分钟
Tian Pan
Software Engineer

仪表板显示,你的工程师在上个季度采纳了 45% 的 AI 建议。管理层将其解读为“节省了开发人员 45% 的时间”,并签署了续约合同。与此同时,工程师们正在悄悄重写他们采纳内容的一半,调试另一半,并纳闷为什么他们的 Sprint 看起来还是和以前一样长。双方都在看同一个数字,但只有其中一方看对了数字。

2025 年引用次数最多的这项研究,本应单枪匹马地终结“厂商仪表板时代”。METR 衡量了经验丰富的开源维护者在有无 AI 的情况下,处理自己代码库中真实问题的表现。开发者预测 AI 会让他们提速 24%。实验结束后,他们仍然认为 AI 让他们提速了 20%。但秒表显示他们慢了 19%。故事与数据之间存在 39 个百分点的差距——而季度评审中采用的正是那个“故事”。

智能体能力悬崖:为什么你的模型升级让简单的 95% 变得完美,却让困难的 5% 成了你最糟糕的季度

· 阅读需 13 分钟
Tian Pan
Software Engineer

你上线了新模型。综合评估通过率从 91% 提升到了 96%。产品团队在全体员工大会上宣布这是一次重大胜利。六周后,可靠性团队却迎来了有史以来最糟糕的一个季度——并不是因为故障变多了,而是因为现在每一个故障都需要三名工程师花上两天时间才能解决。

这就是智能体能力悬崖 (agent capability cliff),它是生产环境 AI 中最反直觉的失败模式之一。模型升级并不会均匀地提升所有任务的表现。它们将增益集中在大部分流量上——即那些旧模型原本就能在大部分时间内处理正确的简单和中等案例——而长尾中真正困难的输入却只看到了微乎其微的改进。你的失败面缩小了,但剩下的每一次失败都是能力边界案例,这些案例旧模型也处理不了,而且简单的提示词工程 (prompt engineering) 也无法修复。

这个“悬崖”并不是新模型的缺陷。它是我们衡量模型改进的方式(混合难度评估集的平均通过率)与值班排班中实际遇到的问题(最难流量的残差集,现在已经没有了以前占据主导地位的简单故障的缓冲)之间的不匹配。