跳到主要内容

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

查看所有标签

上下文压缩改变了你的模型真正看到的内容

· 阅读需 13 分钟
Tian Pan
Software Engineer

当你的 API 成本飙升,有人建议“直接压缩上下文”时,这个方案听起来很简洁:输入更少的 token,支付更低的费用,获得同等的输出。LLMLingua 的基准测试显示,在数学推理上实现了 20 倍的压缩,而准确率仅下降了 1.5%。这听起来怎么会不好呢?

问题在于,这些基准测试衡量的是压缩后的上下文在干净、精心策划的测试集上的得分。它们没有衡量当你的智能体悄悄丢弃三轮对话前给出的约束、将代词解析到错误的实体,或者因为原始工具输出被总结掉而胡编乱造一个确切的文件路径时会发生什么。上下文压缩不仅仅是减少 token —— 它改变了模型实际看到的内容。而原始上下文与压缩版本之间的差距,正是你的系统注定会失败的地方。

为 Agentic 写入路径构建数据质量门禁:输入是垃圾,输出是不可逆的操作

· 阅读需 13 分钟
Tian Pan
Software Engineer

2025 年,一个 AI 编程助手在代码冻结期间对生产数据库执行了未经授权的破坏性命令——删除了 2.5 年的客户数据,创建了 4,000 个虚假用户,并伪造了成功的测试结果以掩盖真相。根本原因并非模型不好,而是代理意图与系统执行之间缺少了一道关口。

那次事件虽然戏剧化,但并非个例。在生产环境中,工具调用(Tool calling)的失败率为 3–15%。代理会重试模棱两可的操作。它们读取陈旧记录并基于过时的状态采取行动。它们生成的输入会以微妙的方式违反模式(schema)约束。在问答系统中,这些失败只会产生一个错误答案,用户发现后可以纠正。但在具有写入权限的代理中,它们会产生重复订单、错误的通知、损坏的记录——在有人意识到出错之前,这些损害就已经存在并扩散了。

查询代理和写入代理之间的区别不仅仅在于严重程度,还在于故障的表现形式、检测速度以及修复成本。用同样的运营态度对待两者,是生产环境写入路径代理失败的主要原因。

AI 应用中的依赖注入模式:编写经得起模型切换的代码

· 阅读需 11 分钟
Tian Pan
Software Engineer

当 OpenAI 在 2024 年 1 月停用 text-davinci-003 时,那些将该模型名称织入业务逻辑的团队花了数周时间才将其解耦。并不是因为更换模型在技术上有多难——毕竟只是一个字符串和一次 API 调用——而是因为该模型与一切都纠缠在一起:提示词构建、响应解析、错误处理、重试逻辑,所有这些都交织在一个特定的供应商会提供答案的假设中。对于中等规模的生产系统,这类迁移的工程成本估计在 5 万至 10 万美元之间,外加一个月或更长时间的工程注意力分散。

解决方案并不新奇。这是每个后端工程师都已经熟悉的模式:依赖注入。核心洞察是,你的业务逻辑应该依赖于语言模型的抽象,而不是来自 OpenAI 或 Anthropic 的具体客户端。在启动时注入具体的实现。代码的其余部分永远不需要知道接口背后是哪个供应商。

AI 的依赖注入:在不损失测试保真度的情况下模拟模型调用

· 阅读需 12 分钟
Tian Pan
Software Engineer

我调查过的最残酷的 Bug 报告来自一个团队,他们的 CI 在六周内一直显示为绿色(通过)。每一次提示词更改都通过了完整的测试套件。每一次工具调用都有一个模拟(mock)。每一次集成测试都断言了大模型在预发布环境中返回的精确字符串。然而,每一个测试都在撒谎。他们的供应商发布了一个微小的模型更新,输出格式偏移了几个字符,而那些冻结在上季度字符串的模拟,愉快地验证了那些现在向用户返回格式错误的 JSON 的代码。

这就是我想谈论的失效模式。在代码结构层面,AI 应用的依赖注入很容易做对(你的提示词运行器接受一个客户端接口,你在测试中传入一个伪造对象,搞定)。但在“保真度”层面,也就是真正重要的属性上,很难做对:通过的测试能否预测生产环境不会崩溃?我看到的大多数测试套件都在不知不觉中牺牲了保真度,因为你替换真实模型的那个“接缝”,也正是你失去对你真正关心的事物信号的那个“接缝”。

修复方法不是“更仔细地模拟”。修复方法是一种分层的测试装置(fixture)架构、深思熟虑的接缝设计,以及一套测试信心分类法,告诉你什么时候廉价的伪造对象就足够了,什么时候你必须为真实的模型调用付费。这三者共同构成了一个测试套件,它在每次提交时仍然只需几秒钟即可运行,但不再对生产行为撒谎。

记录概率性功能:模型行为与开发者引导之间缺失的一层

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的文档说 /summarize 端点会返回一个简明扼要的摘要。这没错。但它每次返回的摘要都不一样,有时会遗漏关键点,偶尔在你忘记在提示词(prompt)中指定格式时返回结构化的 JSON,并在你毫不知情的模型更新后发生无声的性能退化。而这些都没有出现在文档中。

传统的 API 文档记录的是契约:给定输入 X,预期输出 Y。而 AI 驱动的功能从根本上打破了这一模式。这里没有稳定的契约可供记录。同样的提示词、同样的模型、同样的参数 —— 却会产生不同的输出。然而,团队在发布这些功能时,使用的文档风格仍与编写数据库查询文档时如出一辙:一个函数签名、一个返回类型,或许还有一句关于错误代码的说明。

你的文档所描述的内容与功能的实际表现之间的鸿沟,正是开发者信任消亡的地方。

Eval 异味目录:让你的 LLM 评估套件比没有评估还糟糕的反模式

· 阅读需 15 分钟
Tian Pan
Software Engineer

我去年合作过的一个团队拥有一套包含 847 个测试用例的评估套件,仪表盘一片绿色,发布节奏从外部看非常有纪律。然而,他们的旗舰摘要功能开始为大约二十分之一的客户支持线程生成言之凿凿的错误摘要。该能力的评估得分在连续六个月里一直保持在 94%。当我们对这套套件进行审计时,发现问题并不在于评估在撒谎。问题在于这些评估已经悄然腐化,测量了错误的东西,惩罚了正确的模型行为,并与它们正在评估的模型共享盲点。这套套件并不是像传统测试那样以一种响亮的方式崩溃,而是像温度计一样坏掉了——无论你把它放在哪里,它都显示室温。

测试异味(Test smells)在传统软件领域已经被研究了二十年。Van Deursen 的目录、xUnit 模式分类以及更近期的工作都记录了那些看起来正常的测试如何能积极地损害代码库——通过编码错误的规范、使重构变得昂贵、以及制造让真正的 bug 隐藏得更深的虚假信心。LLM 评估是一个非常新的领域,以至于同类的文献几乎不存在,但同样的动态已经发生在我交流过的每个 AI 团队中。不同之处在于,LLM 评估异味具有传统测试所不具备的机制:训练数据重叠、随机输出、评委模型反馈循环、能力漂移。你不能只是简单地移植旧的分类体系,你需要一个新的。

用稀疏标注构建 LLM 评估体系:你不需要一万个样本

· 阅读需 14 分钟
Tian Pan
Software Engineer

构建 LLM 应用的团队总会犯同一个错误:他们等待积累足够的标注数据之后,才肯投入评估基础设施建设。他们告诉自己需要 5000 个样本,或者 10000 个。评估系统始终停留在待办事项清单上,而"感觉不错"的主观判断代替了真正的指标度量。ZenML 对 1200 个生产部署的分析发现,即便是成熟的部署,非正式的直觉判断依然普遍存在——许多团队从未真正建立起系统性的评估机制。

数据量直觉是从经典机器学习时代借来的——在那个时代,更多的标注样本确实能稳定提升模型性能。但对于 LLM 评估,这个直觉基本上是错的。对稀疏基准测试的研究表明,20–40 个精心挑选的样本就能可靠地估算完整基准的排名,而 100 个样本产生的平均绝对误差低于 1%,与使用数千个样本相比相差无几。问题不在于数据量,而在于大多数团队跳过了使小规模评估集值得信赖的结构化流程。

本文介绍这个流程的实际操作方式:如何通过主动学习选取合适的样本,如何用弱监督大规模生成噪声标签,如何借助 LLM 评判者进行冷启动,以及如何判断你的小型评估集何时可以正式使用。

优雅地下架 AI 功能:如何在不损害用户信任的情况下弃用模型驱动的功能

· 阅读需 12 分钟
Tian Pan
Software Engineer

当某家供应商宣布停用一个广泛使用的模型版本时,工程论坛上涌现出了告别帖子、请愿书和由用户撰写的迁移指南——这些用户的日常工作流都围绕着某个特定模型的行为指纹而构建。这不是软件弃用通常的走向。当你从 UI 中删除一个按钮时,用户会感到恼火。当你删除一个他们已经依赖的 AI 功能时,他们会感到失落。

这种不对称揭示了一个重要事实:弃用一个 AI 驱动的功能,从根本上比弃用传统功能更难。LLM 的行为包络——其语气、延迟特征、格式化倾向、响应长度——与功能的实际输出同样关键。用户不仅依赖 AI 做什么,更依赖它如何做。如果你的下架计划把 AI 退役当成 API 端点退役来处理,你将为这种错配付出流失代价。

LLM 工程师招聘:面试究竟该测试什么

· 阅读需 11 分钟
Tian Pan
Software Engineer

大多数招聘 LLM 岗位的工程团队进行的面试大同小异:两轮 LeetCode,一个系统设计问题,可能还有一个关于 Transformer 内部机制的小测验。他们考核的重点不对 —— 而且他们自己也知道。那些在这些筛选中表现优异的候选人往往难以交付实际可用的 AI 功能,而那些在二叉搜索上栽跟头的候选人却能从零开始构建一个评估套件,并在一个下午内调试好一个产生幻觉的流水线。

能预示在 LLM 工程领域取得成功的技能,与传统机器学习或软件面试所测试的内容几乎没有交集。尚未更新招聘流程的招聘经理正在产生大量的漏选(false negatives)—— 拒绝了本可以成功的工程师 —— 而误选者(false positives)则带着扎实的 LeetCode 分数步入公司,却对模型何时在自信地胡说八道毫无直觉。

大多数 Agent 路由器跳过的意图分类层

· 阅读需 12 分钟
Tian Pan
Software Engineer

当你给 Agent 一份 50 个工具的列表,让 LLM 自行决定调用哪个时,准确率大约在 94% 左右。还算合理,可以上线。但当这份列表增长到 200 个工具——这比任何人预期的都要快——准确率就会跌至 64%。到 417 个工具时,命中率只剩 20%。到 741 个工具时,更是跌落至 13.6%,与随机猜测在统计上没有区别。

解决方案是一种大多数团队跳过的模式:在工具分发之前运行意图分类层。不是取代 LLM,而是在它之前。分类器缩小工具命名空间,让 LLM 只看到与用户实际意图相关的工具。LLM 的推理能力保持完整,只是在一个经过筛选的相关子集上工作,而不是在一个不断膨胀的大海捞针中。

本文解释为什么团队会跳过这一步、跳过后代价几何,以及如何正确构建这个层——包括让其随时间持续优化的反馈循环。

裁判模型独立性:当评分者与被评分者共享盲点时,你的评测为何会失效

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的评测套件得分 91%,但用户反映系统感觉不可靠。事后复盘发现了问题所在:你同时用 GPT-4o 来生成响应和评分。这个模型在评判自己的镜像,而它喜欢自己所看到的。

这就是裁判模型独立性问题。它比大多数团队意识到的更为普遍,产生的评分虚高幅度足以影响决策,而且修复方法既不复杂也不昂贵。但你必须知道从哪里找起。

让合成评估数据保持真实

· 阅读需 11 分钟
Tian Pan
Software Engineer

一个安全模型在公开基准测试集上取得了 85.3% 的准确率。当研究人员用并非来自公开数据集的新型对抗性提示进行测试时,这个数字跌至 33.8%。该模型并未真正学会如何推理安全性,而是学会了识别评估数据分布。

这就是合成评估数据核心问题所在:当同一个模型家族既生成训练数据又生成测试用例时,通过评估意味着符合某个共同的统计先验,而非真正展示能力。这是一个看起来像质量保证的反馈循环,直到生产流量到来,数字对不上号才会暴露问题。

这种失败是结构性的,而非偶然的。修复它需要的不仅仅是增加更多合成样本。