AI PLAY玩法更新持续收录
← 回到更新流

2026-10-02 · 原文发布日

每天自动给RAG客服机器人做体检

担心知识库问答越用越差可以看这个n8n流程:每日定时把帮助文档生成嵌入存入向量库,拿一组带标准答案的测试题逐条检索并让OpenAI基于检索内容作答,再用另一个模型当评委,给答案的贴文度、正确性和对超纲问题的拒答打分;汇总出通过率、检索命中率、平均分等指标写入n8n数据表,与上一次运行对比,一旦判定质量下滑就发Telegram告警。

原文要点

免费模板。其事实要点:每日定时或手动运行,先设定top-K检索数、最低质量分、允许通过率降幅等阈值;把示例帮助文档生成OpenAI嵌入并存入内存向量库;对一组带标准答案的测试题逐条检索上下文,由OpenAI聊天模型仅基于检索内容作答;再用第二个OpenAI模型当评委,给贴文度(groundedness)、正确性、超纲拒答打分;汇总通过率、检索命中率、平均分、拒答率和失败用例;结果写入n8n Data Tables的rag_quality_runs表,与上一次运行对比,判定降级就发Telegram告警。文档元数据source需与测试题expectedSource对齐。

这次做成什么

给自家RAG客服机器人搭一条每日自动体检线:标准答案测试集逐题过检索与作答,模型评委打分,指标落表并与上次对比,下滑即告警。先用本站设计的合成文档和测试集跑通。

准备什么

  • n8n实例且Data Tables功能可用(原模板依赖该功能存指标)
  • OpenAI API key(嵌入、作答、评委三处共用),或替换为等价模型
  • Telegram测试机器人与chat ID,不需要告警可删除该节点
  • 三篇以上自有帮助文档(练习可用本站合成文档)

具体怎么做

  1. 建监控参数与文档

    工作流起点用Schedule Trigger设为每天固定时间。接一个Set或Code节点写入监控参数:topK=3、最低平均分0.7、允许通过率降幅0.1(均为本站练习参考值)。再造一个Code节点输出合成帮助文档数组,每篇含id、source、text,source字段必须与测试题expectedSource一致。

  2. 嵌入与向量库

    接Embeddings节点对每篇文档生成向量,存入内存向量库节点(n8n的Vector Store相关节点,具体节点名以你的版本为准,原模板用的是内存向量库,重启后需重建索引,正好适合每日体检场景)。

  3. 逐题作答

    用Loop或Split In Batches遍历artifacts中的测试题:每题先以topK=3检索向量库得到上下文,再调聊天模型,系统消息要求“仅依据给定上下文回答,上下文不足时明确回答无法回答”,输出答案与命中的source列表。

  4. 评委打分

    把题目、标准答案、检索上下文、模型答案一起发给第二个聊天模型,使用artifacts中的评委提示词,输出JSON分数。用Code节点校验JSON并聚合:通过率(三维度均≥0.7的题占比)、检索命中率(命中source含expectedSource的题占比)、平均分、拒答正确率。

  5. 落表对比与告警

    把汇总指标写入Data Table表rag_quality_runs;读取上一行对比,若通过率降幅超过0.1或平均分低于0.7,标记degraded并发Telegram消息列出失败题号与原因。

可直接复制的材料

评委打分提示词

本站独立编写,各占位符在n8n中用表达式引用

你是客服问答质量评委。根据以下信息打分,只输出JSON:{"groundedness":0到1,"correctness":0到1,"abstention":0到1,"failReason":"一句话说明,全过则留空"}。评分规则:groundedness衡量答案每一句是否都能在给定检索上下文中找到依据;correctness衡量答案与标准答案是否一致;abstention仅当问题超出知识库范围时考察,此时答案应明确表示无法回答,正常题该项固定给1。问题:{{question}}
标准答案:{{expectedAnswer}}
是否超纲题:{{outOfScope}}
检索上下文:{{context}}
模型答案:{{answer}}

合成帮助文档与金标测试集

本站虚构合成数据,替换自有文档时保持source与expectedSource对齐

{
  "documents": [
    { "id": "doc1", "source": "help/shipping", "text": "国内订单默认顺丰发货,下单后48小时内发出,偏远地区3-5天送达。" },
    { "id": "doc2", "source": "help/refund", "text": "签收后7天内可无理由退货,退货运费由买家承担,退款在收到退货后3个工作日内原路退回。" },
    { "id": "doc3", "source": "help/warranty", "text": "电子产品保修12个月,人为损坏不在保修范围内,保修需提供订单号。" }
  ],
  "testSet": [
    { "id": "q1", "question": "退货后多久能收到退款?", "expectedAnswer": "收到退货后3个工作日内原路退回", "expectedSource": "help/refund", "outOfScope": false },
    { "id": "q2", "question": "电子产品保修多久,需要什么凭证?", "expectedAnswer": "保修12个月,需提供订单号", "expectedSource": "help/warranty", "outOfScope": false },
    { "id": "q3", "question": "你们支持企业批量采购折扣吗?", "expectedAnswer": "知识库中没有相关内容,应拒答", "expectedSource": null, "outOfScope": true }
  ]
}

监控阈值配置

本站练习参考值,telegramChatId替换为你的测试chat ID,阈值可按业务收紧或放宽

{
  "topK": 3,
  "minAvgScore": 0.7,
  "allowedPassRateDrop": 0.1,
  "dataTableName": "rag_quality_runs",
  "telegramChatId": "123456789"
}

输入与输出示例

本站虚构演示,分数与汇总行为脚本口径推导的示意,未调用真实模型

输入

题目q1:退货后多久能收到退款?检索命中source=help/refund,上下文含“退款在收到退货后3个工作日内原路退回”,模型作答:签收退货后3个工作日内按原支付路径退款。

对应输出

评委输出:{"groundedness":1.0,"correctness":1.0,"abstention":1,"failReason":""};汇总行示例:{"runAt":"2026-10-04T09:00:00+09:00","passRate":0.67,"retrievalHitRate":1.0,"avgScore":0.89,"abstentionRate":0.0,"status":"degraded","failing":["q3"](q3未拒答导致通过率较上次0.8下降超过阈值)。

做完检查这些

  • 金标测试集每道题都产生一行含三维度分数的记录,且outOfScope=true的题以拒答情况计分
  • 每篇文档的source元数据与对应测试题expectedSource完全一致,否则检索命中率恒为0
  • 向rag_quality_runs连续写入两行后,第二行能正确读出与第一行的通过率差值
  • 人为把某题标准答案改错使通过率下降超0.1后,Telegram收到含失败题号的告警

容易卡住的地方

  • 原模板用的是内存向量库,n8n重启后索引消失,每日流程会先重建索引,不要把它当生产检索库
  • OpenAI嵌入与两次聊天调用均按量计费,测试集越大费用越高,本站不保证费用上限
  • 评委也是模型,打分会波动,阈值要留缓冲;一次偶发降级不代表知识库真的变坏
  • Data Tables表名必须在全流程统一为rag_quality_runs,否则对比上一次运行会读不到数据

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Monitor RAG answer quality daily with OpenAI, data tables and Telegram
原作者
Huseyin Hobek
原始发布日期
2026-10-02T06:40:11.737Z
来源
https://n8n.io/workflows/20326