我是小兵,一个动手派AI架构师。「AI工程化实战」系列第 10 篇。
500 条叫好,评测分开始说胡话
第 9 篇《Token 成本六维优化》结尾我讲过一句话:再压就伤质量。可“伤没伤”,谁说了算?线上真实用户觉得行不行,得有人把话递回来。我的做法很朴素:给每个回答挂上点赞点踩,攒批回灌 golden set。
上线第一周 500 条反馈一片叫好。团队把“被赞最多的输出”当 gold 灌进评测集,第二周评测分开始说胡话——用户狂赞的回答,人工一查是“顺耳但错”的流畅幻觉:金额抽错了,可句式流畅、格式齐全,用户被说服了。那一刻我明白:把“用户觉得好”当“答案是对的”,评测集就废了。反馈不是答案,是线索;收回来不叫闭环,滤成可信样本才叫闭环。
反馈是弱信号,还带毒
“多收集点用户反馈,模型就会越用越好”——错得隐蔽,三个坑我挨个踩过。反馈不在请求上下文里:点踩发生在响应之后、可能隔几天,跟那次调用没有 ID 关联,第 8 篇《OTel + LangFuse 全链路 Trace》串起的那棵树,反馈这脚踩在树外。反馈不携带 gold:点踩只说“不对”不说“什么才对”,第 2 篇《Golden Set 评测》立过规矩,每条样本都要有 gold answer,光有点踩变不出样本。最要命的是反馈还带毒:点赞可能被流畅幻觉说服、点踩可能是预期错或误触、纠错可能带 PII 和注入。而且 ~95% 的会话根本没评分,满意用户不点(happy users don't click),你攒到的评分天然负向偏斜。
结论先放这儿:反馈要变 golden set 增量,先挂回一次调用、滤成可信样本、回灌前过防污染闸——三步少一步,回流就是投毒。
六环节闭环:每环一道闸
主线一句话:一次调用带 trace_id 回执 → 用户点赞点踩 → 六环节滤成可信样本 → 攒批触发回归,绿了入库、红了整批退回。
① 挂载,回答“这句反馈对应哪次调用”。唯一联系是响应带回的 trace_id(第 5 篇《LLM 网关选型》入口生成),拿它回捞第 8 篇那棵树的裁决事实。两条纪律钉死:反馈原文不进 span——纠错可能带身份证号,进了等于给第 6 篇《OWASP LLM 安全护栏》留绕行通道,只能旁路独立存、脱敏后进评测集;trace_id 查不到就隔离不静默丢。再提醒第 8 篇的硬约束:正常 trace 只采 1/100,要回捞的必须采样留痕。
② 分流,回答“模型错、用户错还是知识库缺”。点赞走正候选、点踩带纠错走纠错候选、点踩无纠错进疑样队列,三类可信度不是一个量级。单捞一类“查不到/库里没有”——多半是知识库没有或过期,打标递给第 11 篇《知识库防腐坏》。
③ 筛选:去重(同 trace 同用户折叠、一次调用只产一条)、置信度(下节三刀)、分层配额(高频封顶、长尾保底)。
④ 仲裁,最锋利一刀:纠错跟权威事实核对,用户说“金额应该是 9999”、权威是 1234.0,冲突就拒收送人工。宁可丢真样本,不放脏 gold。
⑤ 回灌 + ⑥ 触发回归:攒够 N 条或到点才转,生产按第 2 篇统计功效定——重训要攒 ~300 条、收集 2-4 周够一次回流。合并后跑第 2 篇那道门:新增样本合格率 + 全体不破噪声地板,绿了入库、红了整批退。
三刀防污染
点赞不是真理。用户可能只是被“顺耳但错”的回答说服,所以 up-vote 默认不当 gold:过结构闸、又有独立核对双背书才入库;只过结构闸的进正候选池当统计信号。放一个流畅幻觉当 gold,评测集就开始自我表扬。
点踩不是罪证。点踩只说“不对”不说“什么才对”,带纠错才可能产出 gold;无纠错的只进疑样队列或当劣化信号,绝不直接变负样本——硬塞等于自己编 gold,编出来比没有还糟。
纠错不是 gold。反馈的 gold 天然来自模型输出之后,违反第 2 篇“gold 答案必须在看到模型输出之前写”的纪律。我补四道自动闸:结构闸背书、仲裁闸、回归门、holdout。有些域就是不敢全自动,老实把疑样队列留给人工。
demo:500 条反馈只进 2 条 golden set
这套逻辑落成可离线跑的最小实现:纯标准库,trace 存储、脱敏、评测全藏在可替换接口后,生产换 LangFuse 的 trace 回放 + annotation queue、换第 2 篇 harness,六环节一行不改。跑完是确定性数字:500 条反馈只进 2 条 golden set。
挂载隔离 1 条孤票,去重折掉 427 条刷票,63 条光点踩送疑样队列,筛选拦下格式没过的赞、流畅幻觉(进 positive_pool 当信号)、带 PII/注入的纠错,仲裁拒掉“金额应该是 9999”,最后转 2 条样本,回归门 pass。这是 mock 流量上的确定性结论——绝大多数反馈当不了样本,只配当信号。
6 个断言锁死防污染,最狠的做了对照:干净管线回归门 pass;把光点踩编负样本、只过 schema 的赞当 gold、矛盾纠错当 gold 全灌进去,脏 gold 自己挂掉、合格率跌破地板,回归门 block。
选型:谁有资格守 gold 可信度
三条路线:纯人工标注最可信但贵且慢;LLM-as-judge 快,但 judge 判“像不像对的”不是“对没对”,偏置会回流成“标准答案”,只配当信号和预筛;我走分级规则管线,机器滤掉九成,人工只碰那撮疑样。
工具我主推 LangFuse annotation queues——同时有第 8 篇的 trace 和 annotation queue,闭环两端同一套自托管栈,挂 trace_id 天然顺。Argilla 对 LLM 反馈标注最专,但已进维护模式、只修 bug 不加新功能,是硬伤;LangSmith 生态深,但是 SaaS 绑定。
checklist 抄走就能用:反馈带 trace_id 吗?不带先补埋点。点赞过结构闸吗?没过不当 gold。点踩有纠错吗?没有只进疑样队列。纠错跟事实冲突吗?冲突送人工。高频淹长尾吗?上配额。回灌过回归门吗?一条一灌迟早污染。
反馈回流本来就是一条细管子
回到开头那 500 条反馈,走完六环节真正变样本的只有 2 条。公开量级也同向:~95% 会话无评分;重训 ~300 条、收集 2-4 周才够一次回流;每类反馈 >5 条才保留;holdout 留最后 ~100 条;评测集从 50 条长到几百条,准确率提升 >3% 才 promote。别指望这根细管子当消防栓。
但还剩一类我处理不了的:用户问的知识点模型答得没错,是知识库没有或躺着过期版本。这不是模型问题,回灌训模型是拿错药。下一篇《知识库防腐坏》:让 RAG 知识库跟着真实业务长,别让“查不到/查到过期”堵死反馈闭环的最后一公里。
这篇是脱水版。完整版含可离线跑的 mini_feedback_loop.py + test_mini_feedback_loop.py 全量代码(6 个断言)、反馈→样本决策大表、三个付费踩坑、选型对比和附录样本量推导与工具对接,已同步发布在 CSDN。点文末「阅读原文」看完整代码和可跑 Demo。
评论区聊聊:你们上线后接用户反馈,是当好评收着,还是真回灌进质量基线?有没有遇到过“用户狂赞、人工一查是流畅幻觉”的时刻?
我是小兵,一个动手派AI架构师。这里只写自己跑过、摔过、复盘过的AI工程化案例。如果你想持续收到这类实战内容,点击关注,下篇见。

