防护栏优先
模型是引擎。大多数“模型问题”其实是缺失防护栏:没有定义正确输出、没有检验变更、没有设定消费上限、数据缺乏公认定义、行动没有审批、也没有追踪来定位不良调用。在触碰模型之前,先审计这些。
1. 依据证据而非感觉重现症状
- 阅读症状所触及的智能体代码:循环、工具定义、提示组装、数据访问、副作用的工具。
- 阅读所有存在的日志/追踪/转录。汇总它们(按对话、按工具、按错误):谁花费了代币、哪些调用失败、哪些回答错误。通常只有少数离群值占据主导。
- 将根因表述为一种带证据的机制(文件:行、日志ID、你计算出的数字)。“模型不好”不是一种机制。
常见机制:
- 代币烧钱: 无最大迭代次数的循环、在确定性错误上重试、每轮发送完整历史或巨大工具结果、未缓存稳定上下文。
- “幻觉”: 智能体忠实地使用了模棱两可或错误的来源(两个具有相同名称和不同含义的表/字段、过时的文档)。亲自重新计算两个数字来证明。
- 脆弱性: 没有回归集就上线的提示更改;只有作者手动核验过的行为。
2. 评分六项防护栏组件
对每一项,标记 存在 / 部分存在 / 缺失,并附带你发现的证据:
| 组件 | 存在意味着 |
|---|---|
| 精标集 | 约20+个包含期望答案或约束的用例,来自真实流量、事故和边界情况 |
| 裁判 | 优先进行确定性检查(数字、策略规则、禁止内容),仅对代码无法检查的内容使用LLM评分;每次提示/模型/工具更改时运行 |
| 成本治理 | 每用户和每工作流的硬性代币/成本上限、每次运行的最大迭代次数、带消息的优雅停止 |
| 数据层 | 只读凭据用于读取、数据字典定义智能体可能使用的每个指标/字段 |
| 操作安全 | 不可逆或外部操作(发送、支付、删除、写入、退款)是可逆的或需要人工批准 |
| 追踪 | 每次模型和工具调用都记录对话ID、工作流、输入、输出、代币、成本、延迟、错误 |
3. 在构建之前决策
- 在没有评估证据的情况下,绝不推荐更换模型。 如果有人问“我们应该换模型吗?”,答案是:修复机制,然后对两个模型运行精标集,比较质量和成本。说出仅修复机制预计能节省多少,附上你的数字。
- 未经精标集运行,绝不批准上线提示/智能体更改。 如果存在记录的输出,亲自对照期望答案进行评分,并通过用例ID报告失败项。
- 安全漏洞(未关闭的副作用、读取路径上的写入权限、泄露内部数据)是阻塞性的,即使无人询问也必须处理。
4. 按此顺序构建最小防护栏
- 止血: 最大迭代次数、非临时性错误不重试、截断/总结大型工具输出、每次运行硬性成本上限。
- 屏蔽副作用: 对不可逆工具设置批准步骤或草稿模式;对查询工具使用只读连接。
- 精标集文件(
evals/golden.jsonl或类似):输入、期望答案或约束、来源(日志ID/事故/策略条款)。包含刚刚失败的用例。 - 裁判脚本,运行精标集并输出每个用例的通过/失败以及总计。优先进行确定性检查,然后再进行LLM评分。
- 数据字典,用于智能体报告的每个指标(定义、源表/字段、排除项)。
- 追踪,按上述字段配置,如果缺失则添加。
写入真实的文件,而不是文件的描述。运行所有能运行的内容并报告结果。
5. 报告
- 针对实际提出的问题给出单行答案(例如“暂时不要换模型:3次运行卡在重试循环中,消耗了71%的代币”)。
- 带证据和数字的根因。
- 防护栏评分卡(六项组件)。
- 你更改或创建的内容,以及你运行的内容。
- 阻塞风险,然后是一个简短的优先下一步工作列表。
致谢
本技能所遵循的方法来自Mark Ajzenstadt (@mardehaym) 的公开帖子:https://x.com/mardehaym/status/2099562230647804152。论点归功于他;本技能中的过程、措辞和评估均为Edge自有,且作者并未审阅它们。