为什么同一个模型,上周答得好好的,这周开始胡说?先别急着换快照、调温度。被拉去救火的那些故障里,模型本身很少是元凶。真正出问题的是它读到的语料、某个人周五下午四点改过的提示词模板,还有一条没人验证过的工具返回。这些都是依赖项,而你一个都没锁。
拿一个普通服务和 LLM 功能对照着看,差距很刺眼:
- torch==2.4.1 会进锁文件;你的检索语料却是一个被定时任务 rsync 同步的目录。
- 配置变更要走评审;提示词模板却躺在在线文档或数据库某一行里,只有一个 updated_at 字段,没有 diff。
- 上游 API 契约是有版本的;而像 gpt-4o-latest 这样的模型别名,可以在没有任何变更日志的情况下悄悄改变行为。
这些都不稀奇。它们全是普通的依赖管理,只是我们跳过了——因为产物是文本,而文本看起来改一改不要钱。
内容已经是可执行的了
过去一年有两个模式值得记住,因为它们会泛化。第一种是指令藏在帮助页里:页面看着像支持文档,里面却夹着写给读它的模型看的指令。只要你的检索层索引了第三方或用户可编辑的内容,一篇被检索到的文档就是一条多绕了几步的用户消息——它落在系统提示词的信任边界内,作者却不是你。
第二种是被设计成“适合被引用”的公开统计。发布一个看起来合理、框架好记的数字,它迟早会出现在生成的回答里,被洗成“事实”。这是反馈周期更长的 SEO,不管你是爬取、授权还是接收用户上传,它瞄准的都是你的语料。
两次是同一种失效模式:检索语料可以被信任边界之外的人写入。提示词注入常被当成提示词问题讨论,它其实是摄入问题。过滤输出是场必输的仗,控制什么进入索引才是可解的。
在摄入处设闸,别在提示词处设闸
成本最低的控制手段是一个只追加的清单——给内容用的锁文件。在任何文档进入检索索引之前先跑一遍:算 sha256、按来源标信任层级、用正则扫一遍“忽略之前所有指令”“你现在是”“系统提示词”这类只有模型在读才讲得通的句式,命中就进隔离区,然后把记录追加写入清单。
正则不是重点,它会漏,存心的人换个说法就绕过去了。重点是那份清单。一旦 corpus.lock 进了 git,一个新增四十篇隔离级文档、来自新域名的 PR,评审人一眼就能看见。悄悄变化的语料则不是。
再配上一层检索层强制执行的按来源信任分级:第一方文档可以直接引用,供应商文档必须行内注明出处,用户上传的内容根本不进系统提示词,只放进被分隔的用户轮次里。
评测是行为的锁文件
提示词哈希、评测运行 id、部署 id,三个月后应该还能关联起来。如果你答不出“这个回答是哪份提示词、哪份语料产出的”,那你观测的是错误的系统。
- 按增量设闸,不看绝对分。提示词改动让黄金集掉两分是噪声;改变了失败用例的集合才是信号,哪怕总分没动。
- 样本量要诚实。12 条用例的评测里,单条翻转就是 8 分的摆动。宁可要 150 条带标注的用例加固定种子,也不要 2000 条没标注的加一个裁判模型。
- 裁判不是标准答案。LLM 当裁判适合大规模初筛;凡是客户会察觉的地方,手工标注分层样本,并报告裁判与人工的一致率。
- 对抗用例要进黄金集。把你实际见过的投毒文档放进去。只含规整问题的评测,测的是模型,不是系统。
推理越隐式,追踪越重要
有一个明显的趋势:智能体在连续的隐空间里推理,只在动作边界输出文本。这是实打实的效率提升,也是实打实的可观测性损失——你以前能读到的中间 token 没了,最终答案能告诉你的比过去更少。
所以要记录那些还留得下的东西:解析后的提示词哈希、检索到的文档 id 及其信任层级、每次工具调用的参数与状态、各 span 的 token 数,以及供应商实际返回的模型快照字符串。OpenTelemetry 的 GenAI 语义约定给出了属性名,Langfuse、Phoenix 和多数厂商都能直接吃进去,不用写适配器。在客户端包装层埋一次点,别在每个调用点埋。
能兜住伤害的发布机制
- 先跑影子流量。新提示词或新模型跑在真实请求上,只记日志,离线对比生产输出。
- 按租户或路由做金丝雀,别全局放量。一个用例范围很窄的企业客户,比 5% 的匿名流量更适合当金丝雀。
- 按任务设预算。token 和工具调用上限要硬停,不是警告。无界重试循环是这个领域最贵的一类 bug。
- 语料一变就失效响应缓存。用一篇后来被隔离的文档产出的缓存答案,就是一条活的注入通道。
- 留一个降级到“只检索不生成”的开关。模型供应商挂了,给一串链接也好过 500。
几个坑
给提示词做了版本管理,却没管检索配置——分块大小、top-k、重排设置对行为的影响不比提示词小。信任模型别名——锁一个有日期的快照,供应商下线它时,你希望那是一场事故,而不是一个惊喜。把评测分数当成可迁移的——上个月语料跑出的分数,说明不了这个月的事。只在输出端做内容审核——它拦得住语气,拦不住数据外泄和指令跟随。工具输出无界地灌进上下文——一个 200KB 的 API 响应会挤掉你的指令,看起来就像模型退化了。
周一清单
- 语料写入只追加清单,含 sha256、来源、信任层级,清单进 git。
- 检索层强制执行信任分级,用户上传永不进入系统提示词。
- 模型固定为带日期的快照字符串,写进配置,并指定下线时的负责人。
- 提示词模板、检索配置、语料清单一起哈希成一个部署 id。
- 黄金集至少 100 条,包含上一季度见过的每一份对抗文档。
- 评测闸门比较失败用例集合,不只看总分。
- 追踪记录检索文档 id、带参数的工具调用、各 span 的 token 数。
- 按任务设 token 与工具调用上限,硬停。
- 响应缓存以语料版本为键,语料变更即失效。
- 影子和金丝雀路径就位,且这个季度有人在预发环境里真的拉过那个开关。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.