跳到主要内容

702 篇博文 含有标签「llm」

查看所有标签

Token 是有限资源:复杂 Agent 的上下文预算分配框架

· 阅读需 11 分钟
Tian Pan
Software Engineer

前沿模型如今宣传的上下文窗口动辄 200K、1M 乃至 2M token。工程团队将其视为已解决的问题而继续前行。数字如此之大,我们应该永远不会触及上限。

然而,在一个自主研究任务执行六小时后,agent 开始产生幻觉,对它三小时前编辑过的文件路径一无所知。一个代码 agent 自信地打开了它在第四轮已删除的函数。文档分析流水线开始与它之前从同一文档得出的结论相矛盾。这些不是模型失败——它们是上下文预算失败:可预测、可测量,而且只要将上下文窗口视为它实际所是的稀缺计算资源,几乎完全可以预防。

生产环境中的零样本与少样本:示例何时有用,何时有害

· 阅读需 11 分钟
Tian Pan
Software Engineer

关于少样本提示,最常见的建议是:加入示例,质量就会提升。这个建议经常是错的,错到你不能不加以实测就随意信任它。在实践中,示例数量与模型性能之间的关系是非单调的——在某个点达到峰值之后就会下降,有时候下降幅度相当大。

2025 年的一项实证研究追踪了 12 个 LLM 在多项任务中的表现,发现 Gemma 7B 在漏洞识别任务中,随着示例数量超过最优值,准确率从 77.9% 跌至 39.9%。LLaMA-2 70B 在同类任务中从 68.6% 跌至 21.0%。在代码翻译基准测试中,功能正确性通常在 5 到 25 个示例之间达到峰值,之后便开始下降。这并非个别模型的特例——研究人员将其命名为"少样本崩溃"(few-shot collapse),这一现象普遍存在。

AI 辅助故障响应:LLM 如何在不取代 SRE 手册的情况下改变它

· 阅读需 12 分钟
Tian Pan
Software Engineer

AIOps 供应商圈子里没人愿意宣传的悖论是:投入超过 100 万美元用于故障响应 AI 工具的组织,其运维负担占工程工时的比例反而从 25% 上升到了 30%——这是五年来的首次增长。团队本以为自动化能替代手工劳动,结果却多出了一项新工作:在执行 AI 建议之前先验证它说的是否正确。旧的任务没有消失,反而在上面又叠加了一层验证层。

这并不是反对在故障响应中使用 AI 的论点。同样的数据显示,当 AI 被妥善整合时,平均故障解决时间(MTTR)可降低 40%,部分团队报告将排查时间从两小时缩短到了三十分钟以内。这里要表达的论点更为精准:AI 副驾驶的故障模式在性质上与传统 SRE 工具的故障模式截然不同,而大多数团队还没有做好识别这些故障的准备。

AI 事故严重程度分类法:幻觉何时算作 Sev-0?

· 阅读需 13 分钟
Tian Pan
Software Engineer

一个法律团队的 AI 研究助手伪造了三个案例引用,并将它们混入了法庭文件中。这些引用看起来非常可信 —— 真实的法院、听起来很真实的案例名称、连贯的判决理由。在提交摘要之前,没有人发现它们。这一事件导致律所面临紧急听证会、公开道歉以及律师协会的调查。

那是 Sev-0 还是 Sev-2?答案取决于你使用的框架 —— 而传统的严重程度模型几乎每次都会给你错误的答案。

软件事故严重程度分类是为确定性系统构建的。服务要么有响应,要么没有。数据库查询要么成功,要么抛出错误。失败模式是二进制的,责任可以追溯到某个 commit,而修复方案则是回滚或补丁。AI 系统同时打破了这三个假设,如果组织将传统的严重程度框架应用于 LLM 故障,最终要么是对噪声感到恐慌,要么是将结构性故障视为偶然的异常。

别再手写提示词了:利用 DSPy 和 MIPRO 实现自动化优化

· 阅读需 11 分钟
Tian Pan
Software Engineer

你会花一个下午的时间来调整提示词(prompt)。你会移动一个句子的位置,把“classify”(分类)换成“categorize”(归类),添加一条关于边缘情况的注释,并针对笔记本中记录的少量示例进行抽查。到这一天结束时,提示词有了略微的改善——你觉得是这样。但你无法证明这一点。你没有一个可重复的基准。一周后,一位同事改动了几个词,整个系统就退化了。

这就是目前大多数团队提示词工程的现状。DSPy 是斯坦福大学给出的答案。与其手动编写指令文本,你只需声明你的 LLM 程序应该做什么,定义一个指标,然后让优化器为你编译实际的提示词。MIPRO——多提示词指令提案优化器(Multi-prompt Instruction PRoposal Optimizer)——是一种让这种方法能与人工编写的替代方案竞争(且通常优于人工编写方案)的算法。

LLM 流水线中的背压:排队论在基于 Token 的服务中的应用

· 阅读需 13 分钟
Tian Pan
Software Engineer

凌晨 3 点的重试风暴通常以同样的方式开始:提供商的一次短暂抖动导致少数请求超过了速率限制,你的客户端库对此进行了重试,而这些重试落在了尚未恢复的端点上,导致更多请求失败;在 90 秒内,你的队列深度迅速飙升,而你的提供商仪表板显示你已经用满了 100% 的每分钟 Token 配额(TPM),由此产生的积压工作甚至可以用五位数的美元来衡量。事后分析会将其归结为“惊群效应(thundering herd)”。但诚实的回答是,你在一个容量多变的下游服务之上构建了一个固定吞吐量的重试策略,却忘记了排队论对此早有定论。

大多数知名的服务韧性模式是为那些吞吐量像一堵墙一样固定的下游服务设计的:例如带有连接池的数据库,或者具有已知并发限制的微服务。但 LLM 提供商并非如此。你的有效吞吐量是一个动态目标,受到你的服务层级、所选模型、Prompt 大小、响应大小、一天中的时间,以及同一提供商的其他用户是否正在微调前沿模型的影响。将它视为一根固定的管道,是我今年看到的多数 LLM 故障的根本原因。

你一直在忽略的偏见审计:如何为 LLM 流水线构建人口特征公平性

· 阅读需 13 分钟
Tian Pan
Software Engineer

一个团队发布了一项由 LLM 驱动的功能。它通过了安全过滤器,通过了准确性评估。但用户开始投诉。六个月后,一名研究人员运行了一项包含 300 万次对比的研究,发现该系统在输入完全相同的情况下,有 85% 的时间选择了与白人相关的名字,而选择与黑人相关的名字仅占 9%。

这不是安全问题。这是一个公平性问题,两者需要完全不同的工程应对方案。安全过滤器防范伤害。公平性检查衡量你的系统是否能为每个人产生同样优质的输出。一个模型可以满足你所有的内容策略,但仍可能诊断出黑人患者的死亡风险高于同样患病的白人患者,或者为女性生成的简历比男性更单薄。这些差异对于拦截脏话的护栏来说是不可见的。

大多数团队从未构建过第二种检查。这篇文章将探讨你为什么要构建它,以及具体如何去做。

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

· 阅读需 13 分钟
Tian Pan
Software Engineer

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

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

持续微调而不污染数据:生产流水线指南

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数运行持续微调的团队都以同样的方式发现了污染问题:每周评估指标持续提升,团队欢欣鼓舞,然后某个用户反馈模型"变差了"。一旦深入排查,你才意识到你的评估基准已经悄悄地泄漏到训练数据中好几个月了。每一个看起来像能力提升的指标,其实不过是记忆。

数字比直觉更糟糕。LLaMA 2 的 MMLU 样本中有超过 16% 被污染——其中 11% 属于严重污染(超过 80% 的词元重叠)。GPT-2 在被污染的基准上比干净基准的得分高出 15 个百分点。这不是边缘案例。在持续微调循环中,污染是默认结果,除非你从架构层面明确加以防范。

凌晨三点调试 AI:LLM 驱动系统的故障响应指南

· 阅读需 11 分钟
Tian Pan
Software Engineer

你正在值班,凌晨三点,告警触发:过去一小时内 AI 聊天功能的用户满意度下降了 18%。你打开日志,却看到……什么都没有。每个请求都返回了 HTTP 200,延迟正常,没有任何报错。

这就是 AI 事故的体验。传统值班的肌肉记忆——grep 堆栈跟踪、找到异常、部署修复——在这里完全失效。系统并没有崩溃,它做的正是它被设计来做的事。只是输出结果是错的。

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

· 阅读需 11 分钟
Tian Pan
Software Engineer

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

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

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

· 阅读需 12 分钟
Tian Pan
Software Engineer

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

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

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