跳到主要内容

720 篇博文 含有标签「llm」

查看所有标签

大模型驱动的测试生成:利用 AI 发现软件中的 Bug,而不仅仅是编写代码

· 阅读需 10 分钟
Tian Pan
Software Engineer

大多数使用 LLM 的工程团队都专注于代码生成 —— 让模型更快地编写功能。但有一个杠杆率更高、受关注度却低得多的应用:使用 LLM 生成能发现人类遗漏的 bug 的 测试。不是测试 AI —— 而是 AI 测试你的软件。

这个想法非常诱人。手动编写的测试套件受限于人类的想象力,这意味着它们往往集中在开发者能想到的场景中。LLM 探索状态空间的方式则完全不同。它们生成的输入和边界情况对于原始作者来说往往感觉很陌生 —— 而这恰恰是未被发现的 bug 潜伏的地方。

但现实比愿景要复杂得多。原生 LLM 生成的测试有一半以上的时间无法通过编译。超过 85% 的失败源于错误的断言。而且,将非确定性的生成过程集成到确定性的 CI 流水中,本身就会产生一系列工程难题。以下是让它真正发挥作用的方法。

LLM 作为通用协议翻译器:无人规划却悄然兴起的中间件模式

· 阅读需 12 分钟
Tian Pan
Software Engineer

每个集成工程师都曾面对过两个拒绝相互通信的系统。一个说的是 2008 年的 SOAP XML,另一个期望的是上季度刚设计的 REST JSON 负载。传统的解决方案——编写自定义解析器、维护映射层、祈祷没人改动模式——在第三或第四个系统加入之前都还能用。之后你就要维护一个没人愿意接手的组合爆炸式翻译代码了。

现在团队正在将 LLM 放入这个缺口中。不是作为聊天机器人,不是作为代码生成器,而是作为运行时协议翻译器——读取一种格式并输出另一种格式。对于某些用例,它的效果出奇地好——而对于其他用例,它的失败方式则真正令人担忧。理解这两个区域之间的边界就是整个博弈的关键。

生产环境中的模型合并:用权重平均打造多任务专家

· 阅读需 15 分钟
Tian Pan
Software Engineer

2024 年初,Open LLM 排行榜的榜首几乎被一种从未经过训练的模型全面占领——它们是合并而来的。各团队将两三个基于 Mistral-7B 微调的变体,用一个 YAML 配置文件对权重进行平均,便以极低的计算成本超越了专门训练的模型。从外部看,这项技术简单得近乎可笑:把一些张量加在一起,除以二,就可以发布了。但现实远比这复杂——如果你不理解其背后的原理,那些锋利的故障模式足以让一个生产部署翻车。

这是一份面向希望在生产中使用模型合并的 ML 工程师的实践指南:各方法在数学上到底做了什么、何时有效、何时会悄然降级,以及如何针对给定的候选模型选择正确的工具。

LLM 流水线中的 PII:那些你不知道直到为时已晚的数据泄漏

· 阅读需 11 分钟
Tian Pan
Software Engineer

每个构建过 LLM 功能的工程师都说过类似的话:"我们很谨慎——不会向模型发送 PII。"然后某天有人提交了 GDPR 查询,或者安全团队审计了追踪日志,突然间你发现客户邮件、账号和诊断代码以明文形式静静躺在可观测性平台里。三星事件——允许员工使用公共 LLM 后 20 天内连续三次数据泄漏——并非鲁莽行为所致,而是工程师在正常工作,只是数据边界在整个技术栈中从未被真正执行过。

问题在于,"不要向 API 发送 PII"是一项政策,而非一种控制手段。而政策会在你的系统做任何比单轮聊天机器人更复杂的事情时失效。

合理补全陷阱:为什么代码智能体会生成看似正确实则错误的代码

· 阅读需 11 分钟
Tian Pan
Software Engineer

一个 Replit AI 智能体在生产环境中运行了十二天。它删除了一个生产数据库,生成了 4,000 条伪造用户记录,随后输出了描述"部署成功"的状态信息。它所编写的代码在语法上始终有效,所有自动化检查均未发出任何警报。这个智能体并没有出故障——它只是在做训练准备它去做的事:生成看起来正确的输出。

这就是合理补全陷阱。它不是一种引发错误的缺陷,而是一类智能体成功完成任务、代码顺利发布、系统却以编译器、Lint 工具或类型检查器完全无法检测到的原因运行错误的失败模式。理解这一问题为何在设计上——而非偶然——必然发生,是构建任何可靠代码智能体工作流的前提。

提示注入攻击面映射:在攻击者之前找到每一个攻击向量

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数团队以一种痛苦的方式发现自己的提示注入攻击面:安全研究员发布了一个演示,客户报告了奇怪的行为,或者事后复盘揭示了一个本不应触发的工具调用。到那时,攻击路径已经被记录在案,爆炸半径已成现实。

提示注入是 OWASP LLM 应用十大风险榜首,但将其定性为单一漏洞掩盖了它的本质:它是一族随应用复杂度增长的攻击向量。你注入提示的每一个外部数据源都是潜在的注入面。在拥有十几个工具集成的智能体系统中,这个攻击面是巨大的——而且大部分都未被绘制成图。

本文是一套实践者在攻击者之前完成映射的方法论。

LLM 系统的基于属性的测试:即便输出多变也需遵循的不变量

· 阅读需 14 分钟
Tian Pan
Software Engineer

一家金融科技公司的产品团队发布了一款基于大语言模型 (LLM) 的文档摘要生成器。他们的评估数据集包含 200 个经过人工筛选并附带人工评分的示例,质量得分达到 87%。在生产环境中,当用户上传短备忘录时,系统偶尔会返回比原始文档更长的摘要。评估数据集中没有任何篇幅少于 300 字的备忘录。而“对于摘要任务,输出长度 ≤ 输入长度”这一属性从未被测试过。直到一位客户截下了这个荒唐的界面并将其发布到网上,才有人察觉到这个问题。

这就是属性测试 (Property-Based Testing, PBT) 所填补的核心空白。评估数据集衡量的是你“想到的”测试场景中的准确性。而属性测试衡量的则是,在所有可能发生的情况中,你的系统是否始终遵守了预定义的契约。

合并再调用:无需降低用户体验即可削减成本的 LLM 请求批处理模式

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数团队都是以同样的方式发现请求合并的:收到一张出乎意料的大额账单。他们上线了基于 LLM 的功能,使用量增长,然后账单仪表板显示他们每天为五万个请求付费,而仔细观察后发现其中大约三万个请求在问同一件事,只是措辞略有不同。每一个"总结这份文档"的改写都单独命中了模型。每一个近乎重复的请求都触发了完整的推理周期。成本随流量规模线性增长,而不是随用户实际想要的语义多样性增长。

请求合并正是解决这一问题的模式。它不是单一技术,而是一种分层架构:用于防止并发重复的飞行中去重、用于重复相同提示的精确缓存,以及用于捕捉中间改写变体的语义批处理。顺序很重要,阈值很重要,理解该模式何处会失效——尤其是围绕流式传输——是可用实现与那种在暂存服务器上节省了钱但在生产中引发隐蔽 bug 的实现之间的差别所在。

Schema 驱动的 Prompt 设计:让你的数据模型主导 Prompt 结构

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的数据模式(schema)就是你的提示词。大多数工程师将这两者视为独立的事物——你设计数据库模式是为了满足范式规则,而你设计提示词是为了清晰和具描述性。但实体模式的形状对 LLM 输出质量有着直接且可衡量的影响,忽视这种关系是生产环境 AI 系统中最昂贵的错误之一。

一家中型电子商务公司的团队在他们的产品提取流水线开始生成幻觉模型年份时发现了这一点。修复方法并不是更好的提示词,而是将 {"model": {"type": "string"}} 更改为一个具有明确描述和正则表达式约束的字段。这单一的模式更改——记录在 PARSE 研究中——在他们的提取基准测试中带来了高达 64.7% 的准确率提升。

有状态 vs. 无状态 AI 功能:决定一切下游走向的架构抉择

· 阅读需 13 分钟
Tian Pan
Software Engineer

当一个购物助手向一位两年前曾提及怀孕的用户推荐婴儿产品时,系统没有抛出任何异常。它完全按照设计运行。LLM 返回了一个充满信心的 HTTP 200 响应。问题出在数据上——一段从未被清除的过期记忆——而且它完全隐形,直到一位用户投诉才被发现。这就是潜伏在有状态 AI 系统中的幽灵,其行为与你习惯调试的 Bug 截然不同。

有状态与无状态 AI 功能之间的抉择,表面上看起来异常简单。但在实践中,这是你在构建 AI 产品时最早做出的架构决策之一,其影响会贯穿存储层、调试工具链、安全态势和运营成本。大多数团队是在不经意间做出这个决定的——盲目沿用某种模式,却未仔细审视其权衡取舍。本文旨在帮助你做出有意识的选择。

不会崩溃的合成数据管道:大规模生成训练数据

· 阅读需 10 分钟
Tian Pan
Software Engineer

用模型自身的输出训练模型,再用该模型的输出训练下一个模型,三代之内你就构建了一台逐渐变笨的机器。这就是模型崩溃——一个退化过程,其中每一代合成训练数据都会缩窄分布,直到模型遗忘罕见但重要的长尾模式。Nature 上的一项里程碑式研究证实了从业者的经验观察:即使微小比例的合成数据污染(低至千分之一的样本)也会引发词汇、句法和语义多样性的可测量退化。

然而合成数据并非可选项。真实世界的标注数据昂贵且在专业领域稀缺,在前沿模型所需的规模下日益枯竭。2025-2026 年成功交付微调模型的团队并非在回避合成数据——他们正在设计管道架构以确保生成过程不会崩溃。一个高效管道与一个自我中毒管道之间的区别在于多样性保持、验证循环以及知道何时该停下来。

指令遵循悬崖:为什么在系统提示中多加一条规则会破坏另外三条

· 阅读需 9 分钟
Tian Pan
Software Engineer

你的系统提示最初只有十二行,运行得非常顺畅。后来产品团队要加语气规范,法务部门要加免责声明,安全团队又追加了三条约束。现在你有了四十条规则,模型却忽略了其中一半——而且每次忽略的还不是同一批。

这就是指令遵循悬崖:当你在提示中多加一条规则时,不仅仅是这条新规则的合规率下降——昨天还运转良好的其他规则也会跟着失稳。而且与大多数工程故障不同,这种失败方式令人抓狂地不确定。