RingBot AI 零代码配流程、上线前先拿旧会话做一次回放

文章导读
零代码把 RingBot AI 的流程配完,配置页面上看着前后自洽,但心里没底的通常是同一件事:真实用户的第一句话不会按你设计的入口走。上线前比较稳的做法是把历史会话导出,挑一部分样本做一次离线回放,先在本地判断“这条会不会答不上来、会不会答偏”,再决定改哪些配置。回放能暴露的是意图覆盖、触发词、兜底话术这一类可改的问题;它不代表线上真实分布,样本选歪了,回放结论也跟着歪。
📋 目录
  1. 一 从旧会话里挑样本:正常、超纲、情绪化各占一部分
  2. 二 把样本整理成统一输入格式
  3. 三 用一段本地脚本做批量比对或人工逐条对照
  4. 四 统计答不上来与答偏的比例,标到对应配置位置
  5. 五 只改最影响体验的两三处,再回放一次
A A

零代码把 RingBot AI 的流程配完,配置页面上看着前后自洽,但心里没底的通常是同一件事:真实用户的第一句话不会按你设计的入口走。上线前比较稳的做法是把历史会话导出,挑一部分样本做一次离线回放,先在本地判断“这条会不会答不上来、会不会答偏”,再决定改哪些配置。回放能暴露的是意图覆盖、触发词、兜底话术这一类可改的问题;它不代表线上真实分布,样本选歪了,回放结论也跟着歪。

配好的流程先别急着上线,用历史会话做一次离线回放:按正常、超纲、情绪化三类挑样本,整理成统一字段,用本地脚本先分桶、再人工判定,把“答不上来”和“答偏”落回具体的意图、触发词、兜底话术配置项。回放只对这批样本负责,不能替代上线后的观察;样本量建议控制在一两百条以内,改两三轮就够,继续堆样本的收益通常不大。

从旧会话里挑样本:正常、超纲、情绪化各占一部分

回放最常见的失败是样本全挑好答的:把几条顺利结束的会话拉出来跑一遍,结果全绿,上线照样踩坑。取样要贴着真实分布走,而不是贴着流程的能力边界走。

建议先按大约 5:3:2 的比例取:正常诉求占一半左右,超纲问题(流程里没有对应意图、或需要人工权限的)占三成,情绪化表达(催促、抱怨、带脏话、反复追问)占两成。样本总量可以先控制在 50 到 150 条,流程分支多、渠道多的时候再往上加,具体要结合你们的会话量和分支数确认。三类样本的用途不同:正常样本验证主链路通不通,超纲样本验证兜底话术和转人工,情绪化样本验证触发词会不会被语气带偏。

剔除规则建议写死在取样这一步,否则样本表会越来越脏:

  • 太短:只有“在吗”“你好”“1”这类单轮且不含信息量的,去掉。
  • 无意义:纯表情、纯标点、重复粘贴的长文、内部测试消息、调试用的字符串,去掉。
  • 重复:同一个用户反复表达同一个诉求,只留最早和最晚各一条,中间的合并。
  • 含个人信息:手机号、地址、订单号、身份证号要先脱敏再进样本表,原始记录不要带出生产库。
  • 无法判定:连人工也说不清用户想要什么的,不进回放,单独记一条说明原因。

把样本整理成统一输入格式

样本要能批量跑,字段必须先统一。下面的字段是够用的最小集合,多出来的列先别加,加了也不会看。

字段必填说明
session_id是回查原始会话用,建议脱敏后保留
channel是网页、App、公众号等,不同渠道的兜底话术可能不同
input_text是用户原话,多轮样本可取首轮加关键一轮,用换行分隔
expected_intent建议你希望命中的流程意图名,与配置里的意图名保持一致
expected_keywords是一个合格回复里应该出现的词,2 到 4 个即可
actual_reply是回放得到的实际回复,先留空,跑完填回
human_label是命中 / 答偏 / 答不上来 / 多轮丢失,人工填
note否判定理由、可疑的配置项

用 JSONL 存一份,一行一条,方便脚本逐行读:

{"session_id":"s-0012","channel":"web","input_text":"我上周下的单现在还没发货,能查一下吗","expected_intent":"order_status","expected_keywords":["订单","发货"],"actual_reply":"","human_label":"","note":""}

actual_reply 怎么来:在 RingBot 的流程预览或试跑页面把 input_text 逐条输入,把返回的回复原样粘回来。这一步是人工的,先把几十条跑完再谈批量,别一开始就想着全自动。

用一段本地脚本做批量比对或人工逐条对照

脚本只做一件事:按回复里有没有出现兜底话术、有没有覆盖期望关键词,把样本粗分成几桶,让你先看哪一桶最大,而不是盯着两三百行逐条读。它只读本地已导出的 samples.jsonl,不调用任何未确认的接口。

RingBot AI 零代码配流程、上线前先拿旧会话做一次回放
# replay_bucket.py  只读本地文件,不发网络请求
import json, csv

FALLBACK_WORDS = ['没有找到', '暂不支持', '请换个说法', '无法回答']  # 换成你配置里的兜底话术

rows = []
with open('samples.jsonl', encoding='utf-8') as f:
    for line in f:
        line = line.strip()
        if line:
            rows.append(json.loads(line))

bucket = {'命中': [], '答偏': [], '答不上来': [], '待人工': []}
for r in rows:
    actual = r.get('actual_reply', '')
    kws = [k for k in r.get('expected_keywords', []) if k]
    if any(w in actual for w in FALLBACK_WORDS):
        label = '答不上来'
    elif not kws or not actual:
        label = '待人工'
    else:
        rate = sum(1 for k in kws if k in actual) / len(kws)
        label = '命中' if rate >= 0.6 else ('答偏' if rate == 0 else '待人工')
    bucket[label].append(r['session_id'])

with open('replay_result.csv', 'w', encoding='utf-8-sig', newline='') as f:
    w = csv.writer(f)
    w.writerow(['bucket', 'session_id'])
    for k, ids in bucket.items():
        for i in ids:
            w.writerow([k, i])
print({k: len(v) for k, v in bucket.items()})

那个 0.6 的阈值是起步值,需要结合你们话术的长短自己调;关键词比对会误判同义表达,所以脚本结果只当分桶参考,最终标签以人工为准。人工对照的做法是打开样本表,逐条看 actual_reply,填 human_label;脚本标“命中”但人觉得答偏的,单独标出来,这类条目往往就是触发词写得太宽的信号。

统计答不上来与答偏的比例,标到对应配置位置

只统计总数意义不大,要能指回“去哪改”。下面这套口径建议直接照抄成表头,每一条问题都归到唯一一类,避免同一条被记两遍。

问题分类典型现象对应配置位置
无意图可命中回复是兜底话术,用户诉求在流程里根本没有新增意图节点,或补该意图下的知识条目
意图命中错答的是另一件事,语气正常但内容不对触发词列表、相似度阈值、意图优先级
知识条目缺意图对了,具体问题上答不上来该意图下的问答条目、字段回填
多轮上下文丢失第二轮起答非所问,把上一轮的槽位丢了上下文保留轮数、变量继承设置
越界回答承诺了不该承诺的、报了不该报的价兜底话术、禁用表达、转人工条件
情绪化未接管用户明显在催或投诉,机器人还在走流程转人工触发条件、情绪关键词

统计时按 channel 分开看。同一个流程在网页端和公众号端的表现经常不一样,混在一起算会把某个渠道的问题稀释掉,改起来就找不准位置。

只改最影响体验的两三处,再回放一次

回放第一轮的结果通常是一堆问题,全都改一遍既改不完也验证不了。按“出现条数 × 对用户的伤害程度”排序,先动前两三处,尤其是那种同一类问题反复出现的配置项。改动清单建议长这样,条数和结果都按你自己回放出来的填,不要估:

改动项涉及条数改动内容二次回放结果未改善原因
order_status 触发词回放后填补入“发货”“物流”“到哪了”等口语表达回放后填回放后填
兜底话术回放后填兜底后加一句“可以说得更具体些吗”并给出转人工入口回放后填回放后填
上下文轮数回放后填由 1 轮调整为保留最近 2 轮用户输入回放后填回放后填

二次回放只跑同一批样本,样本不要换,换了就没法对比。没改善的条目要写原因,常见的是:触发词补进去之后和另一个意图撞车,或者问题本身不在这条流程的职责范围内,改配置解决不了,得靠人工兜。这类条目从改动清单里拿出来,单独记一笔,别硬改。

改完两轮就上线看真实反馈,比在本地一直跑样本更有效。回放的作用是把明显会翻车的地方提前挑出来,不是把流程调到完美——上线后的真实会话才是下一批样本。