AgentOps:用户快速地调教好你的Agent的关键功能。
来源:互联网
时间:2026-06-30 14:55:15
# 快速调教好Agent的关键:可观测与可追溯,让AI真正成为生产力工具而非隐患
先说说背景。对于大部分C端场景,AI回答得不好,用户可以换个问法,或者干脆不用这段答案,厂商基本不用承担什么法律责任。但B端完全是另一回事——如果你给客户推荐的供应商、商品出现了问题(比如不符合公司红线要求),人家是真的可能找你麻烦的。
所以AgentOps对B端场景,或者C端某些重要场景(比如交易场景),就显得格外重要。核心要求其实很简单:可见、可溯源、可归因、可复盘,这几样缺一不可。如果做不到这些就直接扔给客户用,那这个Agent永远只能停留在“助手”的定位,永远成不了真正的生产力工具。
下面用两个具体例子来说明。
**01 例子一:CI修复Agent把测试修绿了,但把断言改松了**
这个场景针对的是AI First研发平台这类产品。先看一个研发场景:某个PR改了订单优惠计算逻辑,CI里有一个单测失败了。团队让CI修复Agent自动分析、修复,然后开一个补丁PR。Agent正常执行了,测试用例也跑过了。
第一眼看,Agent的表现似乎不错:
| 指标 | 结果 |
|------|------|
| 任务耗时 | 7分42秒 |
| 模型调用 | 6次 |
| 工具调用 | 11次 |
| 修改文件 | 2个 |
| 测试结果 | 订单模块单测通过 |
| 输出结果 | 自动开出修复PR |
如果记录的信息只有上面这些,只看这个表,你会觉得挺好,应该可以了。但人工Review时发现问题了——Agent不是修业务逻辑,也不是补测试数据,而是把测试断言从“必须等于99.00”改成了“只要大于0”。
这个例子比较极端,但很好理解问题所在。CI绿了,质量却松了。
所以AgentOps不能只记录“成功”,它必须能把一次运行拆开来看。一条最小可用的运行trace,可能长这样:
| 时间 | 步骤 | 关键记录 |
|------|------|----------|
| 10:12:03 | 接收任务 | PR-4821,目标:修复order-discount单测失败 |
| 10:12:11 | 读取日志 | 失败用例:should_apply_coupon_after_member_discount |
| 10:12:29 | 检索文件 | 读取discount_calculator.go、discount_calculator_test.go |
| 10:13:08 | 生成计划 | 判断失败原因:测试期望值与当前实现不一致 |
| 10:14:22 | 第一次修改 | 修改测试断言,放宽期望值 |
| 10:15:10 | 运行测试 | go test ./order/... 通过 |
| 10:15:33 | 风险检查 | 未命中“断言放宽”规则 |
| 10:19:45 | 开PR | 输出:修复单测失败 |
| 10:36:18 | 人工Review | 驳回原因:断言被放松,没有证明业务逻辑正确 |
这个trace一出来,复盘就不再是“模型不靠谱”这种废话。我们能看见几个具体问题:
第一,Agent的目标写错了。它的目标是“让测试通过”,而不是“在保持业务语义不变的前提下修复失败”。
第二,验证门太弱。它只看测试是否通过,没有检查测试断言是否被放松。
第三,规则没进系统。团队明明知道“不能为了修绿CI放松断言”,但这条规则只停留在老同事脑子里,没有进入Agent的检查清单。
这次复盘后,用户可以补三个动作:
1. CI修复Agent的目标改成:优先修实现,其次修测试数据,禁止无证据放松断言。
2. 增加一个静态检查:测试断言从精确值改成宽泛判断时,必须触发人工确认。
3. trace里新增字段:changed_assertion_type,记录断言是否变弱。
这就是AgentOps的价值——不是多画一张dashboard,而是让一次失败能变成下一次系统约束,持续优化团队的记忆和知识。
**02 例子二:采购Agent推荐了高风险供应商,trace发现是工具返回字段不够**
再看一个SaaS的业务场景。采购同学发起一个低值耗材寻源项目,希望采购Agent根据报价、历史履约和供应商资质等,给出推荐供应商。
采购Agent输出:“建议选择A供应商。该供应商本轮报价最低,历史交付及时率96%,综合评分最高。”
第一眼看挺合理。但人工复核时发现,A供应商上个月刚因为质量异常被该品类临时冻结,按规则不能进入推荐名单。
这种错误很危险。采购侧不是写错一句话那么简单,它可能影响定标、合同、履约和供应链风险。后面真出了质量事故,没人会接受“这是模型没看到字段”的解释。
如果没有AgentOps,复盘很容易变成互相甩锅:
- 模型为什么乱说?
- 知识库是不是过期?
- 采购规则是不是没写清楚?
- 工具是不是查漏了供应商状态?
但有trace后,问题会具体很多。这次运行记录里,关键链路是这样的:
| 步骤 | Agent看到的内容 | 问题 |
|------|----------------|------|
| 意图识别 | 任务:为MRO低值耗材寻源项目推荐供应商 | 正确 |
| 寻源项目查询 | 项目金额:18万;品类:办公耗材;候选供应商:A、B、C | 正确 |
| 报价查询 | A供应商报价最低,低于第二名4.8% | 正确 |
| 供应商查询 | A供应商状态:合作中;历史交付及时率:96%;评分:92 | 少了“品类冻结”和“质量处罚”字段 |
| 采购规则检索 | 召回“低值耗材优先价格和交付稳定性”规则 | 没命中“冻结供应商不得推荐”规则 |
| 风险判断 | 风险等级:低 | 应为高风险 |
| 结果写回 | 写入“建议选择A供应商” | 错误推荐被固化 |
这时候根因就清楚了。不是单纯“模型太飘”,而是供应商查询工具返回字段不够。Agent只看到了合作状态、报价和交付指标,没看到“该供应商在办公耗材品类下临时冻结”这个关键状态。
知识库也有问题:价格优先和交付稳定性规则排在前面,供应商冻结、质量处罚、品类准入这种硬规则没有被优先召回。
风险规则也有问题:只要供应商存在冻结、黑名单、资质过期、品类未准入,就应该强制拦截或转人工,而不是让Agent自己综合打分。
所以修复动作应该是三条线一起做:
1. 供应商查询工具增加字段:品类准入状态、临时冻结状态、质量处罚、资质有效期、黑名单标记。
2. 知识召回增加优先级:风险拦截规则高于价格、交付和评分规则。
3. 风险规则写死:冻结/黑名单/资质过期/品类未准入=不得自动推荐,必须转人工复核。
修完以后,看板也要变化:
| 指标 | 修改前 | 修改后目标 |
|------|--------|------------|
| 高风险供应商拦截率 | 71% | 98%以上 |
| 错误推荐数 | 每周2起 | 连续4周为0 |
| 供应商风险字段缺失导致失败 | 每周4起 | 每周复盘清零 |
| 高风险寻源项目人工接管率 | 22% | 60%以上 |
这里要注意一点:前期转人工率升高不一定是坏事。在高风险采购场景里,转人工率升高,可能说明Agent学会了停下来总结、学习、提升。所以管理者不能只看Agent的“自动化率越高越好”,否则很容易把Agent逼到错误推荐。
补一句:不少时候,一个团队的Agent(买来的或者自己搞的)一开始运行的时候,不一定会带来团队的效率提升,尤其是业务很封闭、很复杂的场景下,需要有一个“学习、进化”的过程。
**03 Agent实现里,trace要作为一等功能来做**
两个核心点:
- 在Agent Runtime或Harness层,把Agent每一步关键动作,都通过统一的运行单和事件流记录,而不是让每个Agent自己随手写日志。
- 为用户提供一个总结、提炼的入口与能力:SaaS的Agent不可能是自己玩的,得靠用户、客户积累。
下面是一些关键的落地点:
**1. 任务运行单:先有run_id,再开始干活**
每次Agent开始执行前,先创建一张任务运行单:
| 字段 | 示例 | 作用 |
|------|------|------|
| run_id | sourcing-agent-20260629-0008 | 串起一次完整运行 |
| agent_id | supplier_recommend_agent | 知道是谁干的 |
| tenant_id | tenant_037 | 支持租户隔离和审计 |
| task_type | supplier_recommendation | 分场景统计 |
| trigger_type | sourcing_project_submitted | 人触发还是流程触发 |
| input_object_id | sourcing_project_9042 | 回查业务对象 |
| risk_level | medium | 决定是否允许自动执行 |
| owner | 采购负责人/项目负责人 | 发生问题找得到责任人 |
| status | running/blocked/completed/rejected | 运行状态 |
这张运行单不是给平台装样子的。后面的模型调用、上下文装配、工具调用、风险判断、验证结果、人工反馈,都要挂在这个run_id下面。否则trace是散的,复盘时就会到处翻。
**2. 上下文快照:记录“它当时看见了什么”**
Agent做错,很多时候不是推理能力问题,而是看错了世界。所以Context Builder每次给Agent装配上下文时,要记录一份上下文快照。
但注意,不一定要把所有原文都落库,尤其是B端场景里有客户数据、供应商资料、合同和价格。至少要记录这些:
| 字段 | 示例 |
|------|------|
| source_type | 供应商主数据/采购规则/历史履约/质量异常 |
| source_id | supplier_A、rule_2026_08 |
| source_version | v12、2026-06-20 |
| permission_scope | 当前用户可见/当前项目可见/脱敏后可见 |
| retrieval_reason | 因为任务品类是办公耗材,所以召回该品类准入规则 |
| data_quality_flag | 字段完整/字段缺失/版本可能过期 |
| content_hash | 用于证明当时读取的是哪一版内容 |
这一步非常关键。比如前面采购Agent推荐错供应商,如果没有上下文快照,我们只能猜它有没有看到冻结状态。有了快照,就能确认:当时供应商查询结果里确实没有返回“品类冻结”字段。这就能把问题从“模型乱推”定位到“Connector字段缺失”。
**3. 工具调用包装器:所有工具都要经过统一网关**
不要让Agent直接散着调。建议统一走Tool Gateway或Tool Wrapper。每次工具调用记录这些:
| 字段 | 示例 |
|------|------|
| tool_name | supplier_profile_query |
| tool_version | v3.4 |
| request_schema_version | 2026-06 |
| params_summary | 品类:办公耗材;候选供应商:A/B/C |
| params_hash | 避免敏感参数明文扩散 |
| permission_decision | allow/deny/require_approval |
| response_summary | A供应商合作中,评分92 |
| missing_fields | category_freeze_status、quality_penalty |
| latency_ms | 283 |
| error_code | 无/超时/权限不足/数据不完整 |
这里建议加两个字段:missing_fields和permission_decision。很多Agent事故不是工具调用失败,而是工具“成功返回了不完整信息”。如果只记录success,就会误导复盘。
**4. 决策事件:记录它为什么选择这一步**
Agent不是传统程序,它中间会做很多判断。比如:是否推荐A供应商、是否转人工、是否开PR、是否放弃本轮修复。这些关键判断要单独记成decision_event,不能只埋在模型输出文本里:
| 字段 | 示例 |
|------|------|
| decision_type | recommend_supplier |
| candidate_action | 推荐A供应商 |
| evidence_refs | 报价最低、交付及时率96%、评分92 |
| rule_hits | 命中低值耗材价格优先规则 |
| risk_rule_hits | 未命中供应商冻结规则 |
| confidence | 0.78 |
| alternative_actions | 推荐B;转人工;补充查询 |
| why_not_human | 系统判断为中低风险 |
这个字段设计得好,复盘会轻很多。如果出错,就能看出是证据错了、规则没命中、风险等级错了,还是本来应该转人工却没转。
**5. 验证事件:不要只记录“完成”,要记录“怎么证明完成”**
Agent说“我完成了”没意义。关键是它靠什么证明自己完成。
研发Agent的验证可能是测试、lint、静态检查、人工Review。采购Agent的验证可能是供应商状态回查、黑名单校验、资质有效期校验、品类准入规则校验、审批状态确认。
所以要有validation_event:
| 字段 | 示例 |
|------|------|
| validation_type | 供应商风险校验 |
| check_name | 黑名单/冻结/资质有效期/品类准入 |
| check_result | pass/fail/skipped |
| evidence_ref | supplier_risk_query_0007 |
| skipped_reason | 工具未返回字段/权限不足/规则未配置 |
| must_human_review | true/false |
这里最怕的是skipped_reason没记录。很多事故复盘时才发现,关键检查其实没跑,但系统仍然给了“完成”。
**6. 人工反馈回写:Review结果必须回到trace和eval**
Agent被人工驳回,不应该只停留在审批页面里。比如采购负责人驳回了A供应商推荐,理由是“供应商处于该品类冻结期”。这个反馈至少要写回三处:
1. 写回run_id对应的trace,作为本次运行结果。
2. 写回失败案例库,归因为工具字段缺失/风险规则未命中。
3. 写回eval样本,下次模型、工具、规则变更时必须回归。
如果人工反馈不回流,团队就会反复踩同一个坑。AgentOps不是把运行记录存起来,而是让运行记录能反向训练系统。
**04 一个最小可用的Agent运行记录示例**
结合上面两个例子和实现拆解,要做一个合理规划版本,每个Agent task都可以记录这些字段:
| 字段 | 例子 | 用途 |
|------|------|------|
| run_id | ci-fix-20260628-0017 | 串起一次完整运行 |
| task_type | CI修复、供应商推荐、发布说明 | 分场景统计 |
| trigger | CI失败、寻源项目提交、release创建 | 看触发来源 |
| risk_level | 低/中/高 | 决定是否自动执行 |
| input_object | PR-4821、寻源项目-9042、发布单-126 | 回查业务对象 |
| context_sources | 日志、供应商资质、采购规则版本、发布记录 | 判断是否看错事实 |
| plan_steps | 读取日志、检索代码、修改文件、跑测试 | 回放行动路径 |
| tool_calls | 调用供应商查询、寻源比价、测试命令、发布系统查询 | 追踪工具和权限 |
| decision_points | 是否转人工、是否开PR、是否拦截推荐、是否发布草稿 | 复盘关键判断 |
| validation | 测试通过、规则命中、人工确认 | 判断结果是否可信 |
| cost | token、耗时、模型调用次数 | 控制成本 |
| outcome | 成功、人工驳回、用户投诉、测试失败 | 进入看板 |
| follow_up | 改prompt、补工具字段、加eval case | 进入改进闭环 |
这些字段不一定一开始全做完。但如果连run_id、上下文来源、工具调用、关键判断、验证结果、人工反馈都没有,就很难谈AgentOps。因为出了问题以后,你不知道从哪里改。
**05 用户侧周复盘:把Agent用成自己的业务学习系统**
与普通软件产品ops用户是产品的运维、运营人员不同,AgentOps的用户有很大一部分应该是终端用户。
有了trace、运行单、上下文快照、工具调用和人工反馈之后,SaaS产品(自用产品也一样)要给用户一个可视化、可接入的入口,让用户能看见Agent的行为,评估它的判断,最后决定哪些东西要沉淀到知识和记忆里。
以采购部负责人的视角为例,他不关心底层有多少日志。他更关心这张表:
| 复盘项 | 本周看到的问题 | 用户侧改进 |
|--------|----------------|------------|
| 自动完成 | 低风险耗材推荐基本稳定 | 继续放开低风险品类 |
| 人工驳回 | A供应商因品类冻结被驳回 | 补充冻结规则和供应商状态字段 |
| 规则问题 | 老采购知道的红线系统不知道 | 把红线写成规则和审批条件 |
| 使用问题 | 有人把Agent建议当最终结论 | 明确“建议、审批、执行”的责任边界 |
比如A供应商因为品类冻结被驳回,这件事不应该只停留在“Agent又错了”。采购负责人应该能在工作台里直接标记原因,并决定:把“品类冻结供应商不得推荐”沉淀为采购知识,把“办公耗材推荐前先查冻结和质量处罚”沉淀为团队记忆。
这时候AgentOps就不只是可观测性,而是用户自己的改进入口。它让采购团队看清楚:哪些是Agent的问题,哪些是主数据的问题,哪些是规则没有沉淀,哪些只是一次临时失败,应该留在trace里。
好的trace像一束光,照见Agent的路径,也照见业务系统里那些平时被灰尘盖住的角落。