保时捷金融问答机器人 · 需求文档与评估计划

保时捷金融问答机器人 · 需求文档与评估计划

微信小程序问答服务 · 类 Coze 平台(titan)搭建 · 当前版本 V1.0(QA 数据 2026-07)
当前版本 V1.0 75 条 QA 点选精确匹配 知识库映射 答案原样输出 · 不润色

一、需求概述

场景:为保时捷融资租赁项目搭建微信小程序问答机器人,用户在小程序内咨询还款、变更银行卡、车辆登记证、电子发票、结清寄送、提前结清、忠诚客户权益、车辆返还等业务问题。

问答数据:QA 问答对(当前版本 75 条,8 个业务场景),由业务方提供 Excel 维护。

提问方式:① 列表点选为主(页面预置问题,用户点选)② 自由输入兜底(用户输入文字)

输出要求

  • 只输出匹配到的 answer 原文,不使用大模型润色/改写
  • 无匹配时返回固定话术:「非常抱歉,未能为您检索到对应答案。如需进一步帮助,欢迎您在工作日的9:00至18:00,通过“热线客户”联系保时捷融资租赁客户中心,按提示选择“3”,我们将竭诚为您服务。」
  • 第一段未匹配显式返回 __NO_MATCH__ 标识,便于节点路由(走知识库);第二段未匹配直接返回内置兜底话术

承载平台:公司自研类 Coze 平台(titan),暂不脱离平台实现(刚接手求稳)。

方案一句话:这是一个「检索/匹配」机器人,不是「生成」机器人——节点链路只负责把最匹配的那条答案原样捞出来,大模型全程不参与,从机制上保证答案与 QA 原文逐字一致。

二、方案总览:双路径架构

机器人按提问方式分两条路径处理,整体工作流程如下:

微信小程序问答机器人 — 双路径工作流程用户进入小程序问答页提问方式?列表点选 · 主路径自由输入 · 兜底路径携带 question_id条件分支:question_id 非空 → 第一段代码节点第一段代码节点:字典查表 {question_id → answer}命中?否 · 防御输出 answer 原文(不润色)输出固定话术携带 free_text知识库节点:语义检索 top1(只匹配 Q 字段,A 不参与匹配)→ 输出 Array[Object] 检索结果数组相似度 ≥ 阈值?(取 top1 条目 knowMeta.score,阈值 0.7 或 0.8 实测二选一)第二段代码节点:取最高分条目→ 解析 content → answer 原文输出 answer 原文(不润色)输出固定话术「非常抱歉,未能为您检索到对应答案」

2.1 两条路径

路径触发方式实现机制精确度
路径一:点选(主)用户点选问题卡片第一段代码节点字典查表 {question_id → answer}100% 精确
路径二:自由输入(兜底)用户输入文字知识库节点语义检索 top1(平台侧过滤阈值)→ 第二段代码节点取第一个结果映射答案平台阈值内可靠

2.2 两段代码的分工

  • 第一段代码节点(点选路径):维护 {question_id → answer} 字典,入口 data_process(df) 读取 sys.query (String),命中即输出 answer 原文;未命中(防御)输出固定话术
  • 第二段代码节点(自由输入路径):入口 data_process(df) 读取 ragQuestionArr (Array<Object>),**直接取第一个结果**(平台知识库节点已完成检索 + 阈值过滤,传进来的就是 top1 命中,代码不再做相似度匹配/阈值判断),解析 content 输出 answer 原文;无匹配输出内置兜底话术
  • 两段代码由同一份 qa_data.json 自动生成,字典同源,保证两条路径的答案完全一致

三、全流程交互时序

三种典型请求(点选 / 自由输入命中 / 未命中)的完整交互过程:

微信小程序问答机器人 — 交互时序图用户用户微信小程序微信小程序类Coze平台(titan)类Coze平台(titan)知识库知识库代码节点代码节点路径一:列表点选(主路径,100% 精确)点选问题卡片POST 问答接口 { question_id: "Q03" }第一段代码节点(字典查表)answer 原文{ answer: "……原文……" }展示答案路径二:自由输入(兜底路径,语义检索 + 阈值)输入文字「怎么申请退款?」POST 问答接口 { free_text: "怎么申请退款?" }语义检索(只匹配 Q 字段,top1)Array[Object]: [{ content: "{\"问题\":\"如何申请退款\"}", knowMeta: { score: 0.82 } }]第二段代码节点(取 top1 → 阈值过滤 → 解析 content){ answer: "……原文……" } (命中)展示答案路径三:未命中 → 固定话术输入文字「今天天气如何?」POST 问答接口 { free_text: "今天天气如何?" }语义检索Array[Object]: [{ content: "...", knowMeta: { score: 0.41 } }] (低于阈值)第二段代码节点(score < 阈值 → 固定话术){ answer: "非常抱歉,未能为您检索到对应答案" }展示固定话术

四、平台能力确认(2026-08-04 与业务方确认 4 点)

#确认项结论对方案的影响
1知识库匹配相似度在哪儿设置?titan 平台知识库节点的设置中配置,最小以 0.1 为单位增加阈值只能设 0.7 / 0.8 等 0.1 步进值;原「0.75 起步」不可配置,改为 0.7 或 0.8 实测二选一
2机器人被调用的并发量?按机器人设置的并发量走——配置的并发几,瞬时能起的会话就是几并发上限由平台机器人配置决定;上线前按预估峰值设置并发,注意平台配额
3上线后每次请求输入输出导出?已有功能:运营管理-执行日志;日志记录时间为 T+1QA 扩写迭代依赖此日志(未命中 query 采集);注意 T+1 延迟,复盘按天粒度
4模型名称?待确认:需向杨林凤询问对应市场上的模型名称和版本,交由商务过审后,再答复保时捷本方案默认不使用大模型节点(纯规则匹配);若平台强制要求挂载模型节点,需等模型名称确认后配置「透传」

五、节点配置步骤

5.1 节点链路

开始节点(接收 user_input)
  └─ 第一段代码节点:精确匹配(归一化查表)
       ├─ 命中 → 输出 answer 原文
       └─ 未命中(__NO_MATCH__)→ 知识库节点:语义检索 top1 + 阈值过滤(只匹配 Q,平台侧完成)
            ├─ 有命中 → 第二段代码节点:取第一个结果 + 解析 content → 输出 answer 原文
            └─ 无命中(空集合)→ 输出固定话术

5.2 配置步骤(照做)

  1. 开始节点:接收小程序传入的 sys.query(String,点选时 = question_id,自由输入时 = 文本)
  2. 第一段代码节点:粘贴「八、两段匹配代码」的第一段(入口 data_process(df));输入 sys.query (String),输出 answer (String) = answer / __NO_MATCH__
  3. 条件分支:判断第一段输出 answer 是否为 __NO_MATCH__;不是则直接返回 answer
  4. 知识库节点:配置 QA 知识库(仅索引 Q 字段),语义检索 top1,阈值按「七」节设置;输出为检索结果数组(字段名 ragQuestionArr,类型 Array<Object>,每条含 knowMeta.score 相似度、content JSON 字符串)
  5. 第二段代码节点:粘贴第二段(入口 data_process(df));输入 ragQuestionArr (Array<Object>),代码直接取第一个结果 + 解析 content 输出 result (String) = answer / 兜底话术(不做检索、不做阈值判断)
  6. 固定话术节点(可选,防御):第二段代码已内置兜底话术,如平台仍需独立节点可输出同一话术
  7. 发布:按平台要求配置机器人并发量(见 4 点确认第 2 条)

六、知识库设计

  • 匹配 Q 不匹配 A(已确认):检索只对问题文本做语义匹配。知识库条目只存问题、不带答案——带答案字段会用答案里的「客服/电话」等词污染相似度,导致答非所问。答案由第二段代码节点用同源 QA 字典映射输出(与点选路径答案逐字一致)
  • 不切片:一条 QA = 一个知识库条目,答案保持完整(切片只适用于长文档,QA 答案是一段完整的话)
  • 标签筛选:不做:当前量级(75 条)直接全量 top1 匹配即可,标签是纯维护负担;条目数增长到数百条再考虑
  • 条目结构{ Q: 标准问题文本 }(只存问题),向量化对 Q 字段

七、阈值设置

  • 知识库节点阈值 只能设 0.1 步进值:0.7 / 0.8 二选一(0.75 无法设置)
  • 用「② 扩写测试集」分别扫 0.7 和 0.8,选误命中为 0 且命中率最高的
  • 原则:宁可答不上来(漏命中)也不能答错(误命中)——错误答案比固定话术伤害大
  • 🔴 阈值只在平台知识库节点设置:平台检索时已按阈值过滤(低于阈值不返回结果),代码节点直接消费过滤后的数组、取第一个结果,不再做二次阈值判断

7.2 固定话术

「非常抱歉,未能为您检索到对应答案。如需进一步帮助,欢迎您在工作日的9:00至18:00,通过“热线客户”联系保时捷融资租赁客户中心,按提示选择“3”,我们将竭诚为您服务。」

(用户 2026-08-04 提供;第二段代码已内置为 FALLBACK_TEXT,空集合/匹配不到时直接返回)

八、两段匹配代码(当前版本 V1.0)

两段代码由 qa_data.json(当前版本 QA)自动生成,字典同源,保证点选答案与知识库答案完全一致。

第一段:点选精确匹配(qa_match_part1.py)— 入口 data_process(df),输入 sys.query (String),输出 answer (String)
# -*- coding: utf-8 -*-
# ⚠️ 本文件由 generate_code.py 从 qa_data.json 自动生成,请勿手改。
# 更新 QA 后:替换 qa_data.json 重新运行生成脚本(或联系 Hermes 处理)。

"""
微信小程序问答机器人 · 第一段:点选精确匹配
================================================
用途:用户输入/点选的问题文本,先在预置问题里精确匹配。
  命中   -> 返回对应答案原文(原样输出,不做任何润色)
  未命中 -> 返回 __NO_MATCH__ 标识,由后续知识库节点接管

平台接入(titan 低代码平台代码节点约定格式):
  函数签名: def data_process(df: dict) -> dict
  输入: df["sys.query"] (String)   # 用户输入/点选的问题文本(开始节点 sys.query)
  输出: answer (String)            # 命中=答案原文 / 未命中="__NO_MATCH__"
"""
import unicodedata

# ================== QA 字典(自动生成) ==================
QA_MAP = {
    "有哪些还款方式": "我们为您提供了灵活的还款方式,您可通过自动扣款或手动汇款方式进行还款。",
    "自动扣款支持哪些银行": "我们的自动扣款支持多家主流银行的一类借记卡:\n•工商银行、招商银行 (适用于金额<100万的月还款、尾款、提前结清款、罚息)\n•交通银行、中信银行、平安银行、民生银行、广发银行、上海银行 (适用于金额<5万的月还款、罚息)",
    "最晚可以几点还款": "还款日当天我们将进行多轮款项处理:\n•如您通过扣款还款,我们将分别于9:30、15:30进行扣款处理,我们推荐您在还款日前一天将资金存入您的扣款银行卡/账户。如当天还款失败,我们将于次日再次尝试扣款。\n•如您通过汇款还款,我们将分别是9:00、15:00和20:30进行汇款款项处理,我们推荐您在还款日前一天操作汇款。",
    "可以通过汇款还款吗": "您可以通过手动汇款方式进行还款。我们为您配置了专属汇款账户,您汇款时无需备注,足额汇款即可自动入账。专属汇款账户信息可通过本小程序“服务”中的“还款账户查询”查看。",
    "我会收到提醒短信吗": "每期还款前我们都会提醒您还款日和还款金额,还款后我们也会通知您还款结果,方便您及时了解还款状态。另外,您也可通过本小程序中的“合同”-“查看详情”-“账单详情”查看。",
    "收到了余额不足还款失败短信": "请您尽快将足额资金存入您的扣款银行卡,我们将于15:30或次日9:30再次扣款。",
    "扣款银行卡发生限额、冻结、锁定": "考虑到银行卡状态恢复不便,我们推荐您先通过汇款方式完成当月还款,再联系银行恢复卡片状态。",
    "周末和节假日可以还款吗": "我们在周末和法定节假日均支持自动扣款和足额汇款的自动入账。",
    "如何查看还款计划": "您可通过本小程序“合同”中的“账单详情”查看您的还款计划,包括每期还款日,还款金额和还款状态等。",
    "如何查看汇款结余": "您可以在汇款到账提醒短信里找到结余金额。您也可以通过本小程序“服务”中的“还款账户查询”查看。",
    "个人客户,可以选择哪些银行卡": "我们支持多家主流银行一类借记卡变更:\n•工商银行、招商银行 (适用于金额<100万的月还款、尾款、提前结清款、罚息)\n•交通银行、中信银行、平安银行、民生银行、广发银行、上海银行 (适用于金额<5万的月还款、罚息)",
    "企业客户,可以选择哪些银行账户": "您可以选择企业工行账户进行变更(适用于金额<100万的月还款、尾款、提前结清款、罚息)。如企业没有工行账户,担保人可以操作银行卡变更。",
    "能自助办理吗": "合同激活后,您可通过本小程序 “服务”中的“变更银行卡”进行变更操作。",
    "承租人操作变更注意事项": "如是个人账户,请持卡人通过本小程序进行变更操作。如是企业工行账户,请先在网银中完成扣款绑定,再通过小程序进行变更操作。",
    "担保人操作变更注意事项": "请担保人通过本小程序进行变更操作。",
    "扣款过程变更了银行卡": "如完成变更时仍有待支付的款项且扣款尚未完成,本次仍旧通过变更前的银行卡进行扣款。",
    "如何查看变更后的银行卡信息": "您可以通过本小程序“服务”中的“还款账户查询”查看。",
    "银行卡挂失补办了,需要变更吗": "为保证扣款顺利,请您在补办后通过本小程序 “服务”中的“变更银行卡”进行变更操作。",
    "旧的银行卡如何解绑": "变更成功后,我们会协助您发起旧银行卡的解绑。如果是招行个人卡,工行企业账户,请您通过手机银行app或企业网银进行解绑。",
    "能再次发起变更吗": "变更成功后,您可以再次发起变更。为保证扣款顺利,如仍有待支付的款项且扣款尚未完成,请在本次扣款结束后再发起变更。",
    "我的车辆登记证保存在哪里": "办理完抵押登记后,您的机动车登记证由保时捷融资租赁公司保管。这期间,如您需要临时借阅,可向您的购车保时捷中心提出申请。",
    "哪些情况可以申请原件借阅": "在不涉及车辆抵押状态变更的情况下,您可借阅机动车登记证用于以下业务办理:\n•\t变更车身颜色(非同色系)\n•\t变更为市区号牌\n•\t变更发动机/车身/车架",
    "需要提供哪些材料申请原件借阅": "您无需向保时捷融资租赁提供证件或填写相关材料,保时捷中心会协助您提交借阅申请。",
    "最长能借阅多久": "您可以借阅的期限最长为30个自然日,如您因尚未完成相关事项办理需要延期,请向您的购车保时捷中心提出续借申请。",
    "是否需要支付费用": "您无需向保时捷融资租赁支付相关费用,机动车登记证借阅事宜由您的购车保时捷中心协助办理。",
    "可以委托其他人办理吗": "为保障您的财产安全,我们仅接受您本人向保时捷中心提出的借阅申请:\n•\t企业客户:由企业法定代表人提出申请\n•\t个人客户:由承租人提出申请",
    "借阅的原件,寄到哪里": "我们会将登记证寄送至您的购车保时捷中心,保时捷中心收到后会协助您办理相应手续。",
    "使用完毕后如何归还": "登记证使用完毕后,可直接归还至您的保时捷中心,保时捷中心会重新邮寄给保时捷融资租赁保管。",
    "扫描件自助下载": "为保障您的财产安全,您本人可通过本小程序“服务”中的“车辆登记证”查看和下载:\n•企业客户:可企业法人查看和下载\n•\t个人客户:可承租人查看和下载",
    "扫描件无法查看": "如您的车辆登记证还未寄给保时捷融资租赁有限公司归档,无法通过本小程序查看,请您及时配合完成归档。",
    "哪些费用可以开票": "目前支持开具电子发票的项目包括:\n•\t利息\n•\t违约金\n•\t提前结清手续费\n我们会为您开具增值税(普通)电子发票",
    "会在什么时候开具": "电子发票会在每月中旬及月底进行开具。若您的还款日未赶上当月发票开具批次,将自动纳入下一批次处理。如您有加急需求,请联系保时捷融资租赁客户中心,我们预计会在5个工作日内为您开具出相应发票。",
    "利息发票为什么来自两方": "您的利息发票会由我们和联合出租方上海畅途融资租赁有限公司分别开具,发票合计金额等于实际支付利息,均是有效票据。保时捷融资租赁会开具99%利息金额发票,剩余1%利息由上海畅途融资租赁开具。",
    "企业客户,能自助下载吗": "保时捷融资租赁开具的发票可通过本小程序“服务”中的“电子发票”查看和下载,我们也会将通过短信发送给您。联合出租方上海畅途融资租赁开具的发票会通过邮件发送给您。",
    "个人客户,能自助下载码": "保时捷融资租赁开具的发票可通过本小程序“服务”中的“电子发票”查看和下载。联合出租方上海畅途融资租赁开具的发票,您可联系保时捷融资租赁客户中心申请(400-820-5911,按提示选择“3”)",
    "发票信息有误怎么办": "如发票抬头、税号等信息有误,您可联系保时捷融资租赁客户中心400-820-5911,按提示选择“3”提交更正申请,我们将尽快为您处理。",
    "可以补开吗": "对于过往已支付但未开具发票的款项,您可联系保时捷融资租赁客户中心00-820-5911,按提示选择“3”提交补开申请,我们将在核实后为您尽快补开。",
    "小程序上能批量下载吗": "您可勾选单条、多条、点击“全选”,或通过右上角“筛选”选择指定年月的发票。点击“票据接收”,核对或编辑邮箱地址后,电子发票将发送至该邮箱。",
    "企业更名了,如何变更开票信息": "您可联系保时捷融资租赁客户中心400-820-5911,按提示选择“3”提交更名申请。更名成功后,会按照新的名称为您开具发票。",
    "企业更名了,已开具的发票能重开吗": "您可联系保时捷融资租赁客户中心400-820-5911,按提示选择“3”提交补开申请,我们将协助您进行处理。",
    "结清后需要做什么": "我们会协助您办理解除抵押,包括:\n1. 准备并寄出结清资料\n2. 联系您预约办理时间\n3. 协助您办理解除抵押\n4. 归还车辆登记证",
    "哪些材料会寄出": "寄出的结清材料包括您的车辆登记证,结清证明,以及其他车管所要求的办理解除抵押所需材料。",
    "材料多久会寄出": "合同结清后,我们将在7个工作日内向保时捷融资租赁指定服务商寄出结清资料。",
    "材料寄出能加急吗": "如您有加急需求,请在工作时间联系保时捷融资租赁客户中心400-820-5911,按提示选择“3”,我们将在合同结清后5个工作日内向保时捷融资租赁指定服务商寄出结清资料。",
    "多久联系我办理解除抵押": "保时捷融资租赁指定服务商收到资料后,预计三个工作日内和您联系。",
    "材料能直接寄给我吗": "目前大多数地区车管所不接受个人办理解除抵押业务。为了避免您白跑一趟,我们会将材料寄给保时捷融资租赁指定服务商,协助您办理解除抵押。",
    "办理解除抵押,需要我准备什么": "如您是个人客户,需提供身份证。如您是企业客户,需提供营业执照副本原件。",
    "办理解除抵押,需要我到场吗": "您可以和保时捷融资租赁指定服务商的员工共同前往办理。如时间不便,您也可以委托给保时捷中心或指定服务商的员工完成办理。",
    "车辆登记证如何给到我": "如您是共同前往办理的,机动车登记证在解除抵押完成后直接归还给您。如您是委托办理的,会在解除抵押完成后由保时捷融资租赁指定服务商通过邮寄方式归还。",
    "哪些情况无法申请提前结清": "租金还款日当天,还款期数未满1期,合同当前存在逾期或合同已违约,均无法申请提前结清。",
    "如何申请提前结清": "您首期租金成功还款后,且还款状态正常,可通过以下任一方式申请:\n•\t通过本小程序“服务”中的“提前结清”自助提交申请\n•\t联系购车保时捷中心工作人员协助提交申请\n•\t联系保时捷融资租赁客户中心协助提交申请",
    "收提前结清手续费吗": "需要您支付提前结清手续费,收取标准为:\n•\t如已支付租金未满12期,手续费为剩余未付本金的6%\n•\t如已支付租金满12期或以上,手续费为剩余未付本金的3%",
    "如何还提前结清款项": "若您绑定的扣款银行卡为:\n•\t工商银行、招商银行:如通过扣款还款。请提前在卡内预留足额资金,还款日当天将分别于9:30、15:30进行扣款处理;如通过汇款还款,请勿在卡内预留足额资金,并于当天20:00前还款至专属汇款账户\n•\t交通银行、中信银行、平安银行、民生银行、广发银行、上海银行卡:请于还款日当天20:00前还款至专属汇款账户。",
    "可以试算提前结清金额吗": "如首期租金已成功还款,且合同状态正常,您可通过本小程序“服务”中的“提前结清”试算金额。",
    "节假日可以申请吗": "周末和节假日,您可通过本小程序自助申请,或联系保时捷中心工作人员协助提交申请。工作日9:00至18:00,保时捷融资租赁客户中心可协助您提交申请。",
    "租金日可以申请吗": "租金日当天无法为您办理提前结清。",
    "当天最晚几点还款": "还款日当天我们将进行多轮款项处理:\n•\t如您通过扣款还款,请最晚于当天15:30前将金额存入扣款银行卡\n•\t如您通过汇款还款,请最晚于当天20:00前还款至专属汇款账户",
    "当天未还款,怎么办": "若当天未完成还款,提前结清申请将自动失效。您可重新提交申请,或继续按照合同原还款计划还款。",
    "只能承租人提交申请吗": "承租人和担保人均可提交申请。",
    "忠诚客户有哪些礼遇": "如您再次选择保时捷融资租赁方案,可享受全系车型额外1%的利率优惠。原保时捷融资租赁合同尚未结清,还可享受原合同提前结清费用减免、至高5000元还车账单减免优惠。礼遇详情可在本小程序的“首页”和“服务”中的“忠诚客户”查看。",
    "之前选的金融方案,也能享受吗": "如您是保时捷金融客户,在原业务尚未结清或结清时间不超过3年时,通过保时捷融资租赁方案重购,也可享受全系车型额外1%的利率优惠。",
    "保时捷金融客户介绍": "是指您曾通过保时捷金融服务提供方提供的金融方案购买保时捷 (保时捷金融服务提供方包括:中国银行、中信银行、平安银行、中国农业银行、大众汽车金融(中国)有限公司、德国大众汽车融资租赁(天津)有限公司)。",
    "如何查询我的客户身份": "您可以在本小程序“服务”中的“客户权益”通过车架号或证件号码进行查询。",
    "我有购车意向,如何提交": "保时捷融资租赁客户可通过本小程序“服务”中的“客户权益”提交期末购车意向。收到您的意向申请后,我们会通知保时捷中心联系您预约到店试驾。",
    "什么情况可以返还车辆": "如您选择的是保时捷融资租赁无忧先享产品,合同到期时可享受多种选择权,包括车辆购买、车辆返还、车辆置换。",
    "车辆返还步骤是什么": "车辆返还涉及如下步骤:\n1. 合同到期日10个工作日前,预约到店检测\n2. 合同到期日7个工作日前,完成车辆检测。如符合还车标准,将车辆进行归还\n3. 合同到期后30个工作日内,办理车辆解除抵押和车辆过户",
    "如何预约到店检测": "您可在本小程序“服务”中的“车辆返还”完成预约。预约成功后,保时捷融资租赁客户中心将与您取得联系,安排检测与还车事宜。您也可直接拨打保时捷融资租赁客服热线进行预约。",
    "预约后能改期吗": "您可在预约日期的前一天在本小程序“服务”中的“车辆返还”操作取消或改期。如您未及时取消或改期,会视为一次爽约,两次爽约后将失去还车资格,还请您提前操作。",
    "到店时需携带什么材料": "还请您一并携带好车辆相关材料,包括2把钥匙、车辆行驶证、车主身份证/营业执照原件、公章(仅企业客户)、进口单证等材料。",
    "哪些情况无法返还车辆": "需要至少满足以下情况可在期末返还车辆:\n1. 车辆无重大事故(结构性损伤)、水淹、火烧等情况,并在保时捷授权中心保养\n2. 当前还款不逾期\n3. 合同到期日7个工作日前经检测符合还车车况标准,归还车辆\n具体您可在本小程序“服务”-“车辆返还”-“还车指引”中的“还车标准”查看。",
    "对车况有什么要求": "还车车况需至少满足以下情况:\n1.车身无结构性损伤、车身外观及油漆无明显损伤、内饰无明显损坏痕迹\n2.电气可正常使用、车轮及轮胎无明显损伤、底盘和发动机无异常\n3.电池可正常充放电\n4. 车辆行驶里程不超过2万公里/年\n具体您可在本小程序“服务”-“车辆返还”-“还车指引”中的“还车标准”查看。",
    "检测结果我不满意怎么办": "车辆检测是由保时捷授权经销商或保时捷融资租赁授权的第三方检测机构完成,其检测结果专业且独立。如您对检测结果有异议,我们可安排第二次检测,这次检测需要您支付相关费用。",
    "还车账单包括哪些款项": "如车辆不符合还车车况要求,您可通过支付车辆复原维修费和超额里程费的方式继续归还车辆。您可在本小程序“服务”-“车辆返还”中的“账单支付”查看账单金额。",
    "车辆检测收费吗": "您享有一次免费的车辆到店检测服务,该服务由保时捷授权经销商或保时捷融资租赁授权的第三方检测机构完成。",
}

NO_MATCH = "__NO_MATCH__"

# 全半角/空白/标点/大小写归一化,保证用户带问号、空格、全角字符也能命中
def _normalize(s):
    if not s:
        return ""
    s = unicodedata.normalize("NFKC", s)   # 全角 -> 半角(含全角标点、空格)
    s = s.lower()                          # 大小写统一
    # 只保留中英文/数字(isalnum 对中文返回 True),标点/空格/符号全部丢弃
    return "".join(ch for ch in s if ch.isalnum())

# 归一化后的映射表(构建一次,查询 O(1))
_NORM_MAP = {_normalize(q): a for q, a in QA_MAP.items()}

def match_question(user_input):
    """点选/输入精确匹配。命中返回答案原文;未命中返回 NO_MATCH 标识。"""
    key = _normalize(user_input)
    if not key:
        return NO_MATCH
    return _NORM_MAP.get(key, NO_MATCH)

def data_process(df: dict) -> dict:
    """平台代码节点入口(titan 低代码平台约定格式)。

    输入: df["sys.query"] (String)  # 用户输入/点选的问题文本(开始节点 sys.query)
    输出: answer (String)  # 命中=答案原文 / 未命中="__NO_MATCH__"
    """
    user_query = df.get("sys.query", "") if isinstance(df, dict) else ""
    answer = match_question(user_query)
    return {
        "answer": answer,  # String
    }
第二段:知识库检索结果数组映射(qa_match_part2.py)— 入口 data_process(df),输入 ragQuestionArr (Array<Object>),输出 result (String)
# -*- coding: utf-8 -*-
# ⚠️ 本文件由 generate_code.py 从 qa_data.json 自动生成,请勿手改。
# 更新 QA 后:替换 qa_data.json 重新运行生成脚本(或联系 Hermes 处理)。

"""
微信小程序问答机器人 · 第二段:知识库检索结果数组 -> 答案映射
================================================
用途:知识库节点检索命中后,将检索结果数组(Array[Object])映射为答案原文。
  1. 直接取数组第一个结果(平台知识库节点已做检索 + 阈值过滤,传进来的就是 top1 命中)
  2. 解析命中条目 content(JSON 字符串,只含"问题"字段):
     - 🔴 主路径(用户 2026-08-04 确认):知识库条目**只存问题、不存答案**
       (带答案字段会影响检索准确率)→ 用同源 QA 字典按"问题"映射答案原文
     - 兼容分支:若条目未来加了"答案"字段,则直接输出该字段(零润色)
  命中   -> 返回对应答案原文(原样输出,不做任何润色)
  未命中 -> 返回兜底话术(由用户 2026-08-04 提供)

平台接入(titan 低代码平台代码节点约定格式):
  函数签名: def data_process(df: dict) -> dict
  输入: df["ragQuestionArr"] (Array<Object>)  # 知识库节点检索结果数组(已过滤 top1)
     每条形如:
     {
       "question": "",
       "content": "{\"问题\":\"我会收到提醒短信吗\"}",
       "file": [],
       "knowMeta": {"type":"doc","knowName":"保时捷小程序问答-问题知识库",
                    "tag":"","searchType":"mix","score":0.9728201981073603}
     }
  输出: result (String)  # 命中=答案原文 / 未命中=兜底话术,始终为字符串

说明:
  - 🔴 本段代码**不实现知识库检索、不做相似度匹配/阈值判断**——检索和阈值由平台知识库节点完成,
    本段只消费检索结果数组,取第一个结果映射答案。
  - 本字典与第一段代码同源生成(qa_data.json),保证点选答案与知识库答案一致。
"""
import unicodedata, json

# 兜底话术(用户 2026-08-04 提供)——未命中/空集合时返回
FALLBACK_TEXT = "非常抱歉,未能为您检索到对应答案。如需进一步帮助,欢迎您在工作日的9:00至18:00,通过“热线客户”联系保时捷融资租赁客户中心,按提示选择“3”,我们将竭诚为您服务。"

# ================== QA 字典(自动生成) ==================
QA_MAP = {
    "有哪些还款方式": "我们为您提供了灵活的还款方式,您可通过自动扣款或手动汇款方式进行还款。",
    "自动扣款支持哪些银行": "我们的自动扣款支持多家主流银行的一类借记卡:\n•工商银行、招商银行 (适用于金额<100万的月还款、尾款、提前结清款、罚息)\n•交通银行、中信银行、平安银行、民生银行、广发银行、上海银行 (适用于金额<5万的月还款、罚息)",
    "最晚可以几点还款": "还款日当天我们将进行多轮款项处理:\n•如您通过扣款还款,我们将分别于9:30、15:30进行扣款处理,我们推荐您在还款日前一天将资金存入您的扣款银行卡/账户。如当天还款失败,我们将于次日再次尝试扣款。\n•如您通过汇款还款,我们将分别是9:00、15:00和20:30进行汇款款项处理,我们推荐您在还款日前一天操作汇款。",
    "可以通过汇款还款吗": "您可以通过手动汇款方式进行还款。我们为您配置了专属汇款账户,您汇款时无需备注,足额汇款即可自动入账。专属汇款账户信息可通过本小程序“服务”中的“还款账户查询”查看。",
    "我会收到提醒短信吗": "每期还款前我们都会提醒您还款日和还款金额,还款后我们也会通知您还款结果,方便您及时了解还款状态。另外,您也可通过本小程序中的“合同”-“查看详情”-“账单详情”查看。",
    "收到了余额不足还款失败短信": "请您尽快将足额资金存入您的扣款银行卡,我们将于15:30或次日9:30再次扣款。",
    "扣款银行卡发生限额、冻结、锁定": "考虑到银行卡状态恢复不便,我们推荐您先通过汇款方式完成当月还款,再联系银行恢复卡片状态。",
    "周末和节假日可以还款吗": "我们在周末和法定节假日均支持自动扣款和足额汇款的自动入账。",
    "如何查看还款计划": "您可通过本小程序“合同”中的“账单详情”查看您的还款计划,包括每期还款日,还款金额和还款状态等。",
    "如何查看汇款结余": "您可以在汇款到账提醒短信里找到结余金额。您也可以通过本小程序“服务”中的“还款账户查询”查看。",
    "个人客户,可以选择哪些银行卡": "我们支持多家主流银行一类借记卡变更:\n•工商银行、招商银行 (适用于金额<100万的月还款、尾款、提前结清款、罚息)\n•交通银行、中信银行、平安银行、民生银行、广发银行、上海银行 (适用于金额<5万的月还款、罚息)",
    "企业客户,可以选择哪些银行账户": "您可以选择企业工行账户进行变更(适用于金额<100万的月还款、尾款、提前结清款、罚息)。如企业没有工行账户,担保人可以操作银行卡变更。",
    "能自助办理吗": "合同激活后,您可通过本小程序 “服务”中的“变更银行卡”进行变更操作。",
    "承租人操作变更注意事项": "如是个人账户,请持卡人通过本小程序进行变更操作。如是企业工行账户,请先在网银中完成扣款绑定,再通过小程序进行变更操作。",
    "担保人操作变更注意事项": "请担保人通过本小程序进行变更操作。",
    "扣款过程变更了银行卡": "如完成变更时仍有待支付的款项且扣款尚未完成,本次仍旧通过变更前的银行卡进行扣款。",
    "如何查看变更后的银行卡信息": "您可以通过本小程序“服务”中的“还款账户查询”查看。",
    "银行卡挂失补办了,需要变更吗": "为保证扣款顺利,请您在补办后通过本小程序 “服务”中的“变更银行卡”进行变更操作。",
    "旧的银行卡如何解绑": "变更成功后,我们会协助您发起旧银行卡的解绑。如果是招行个人卡,工行企业账户,请您通过手机银行app或企业网银进行解绑。",
    "能再次发起变更吗": "变更成功后,您可以再次发起变更。为保证扣款顺利,如仍有待支付的款项且扣款尚未完成,请在本次扣款结束后再发起变更。",
    "我的车辆登记证保存在哪里": "办理完抵押登记后,您的机动车登记证由保时捷融资租赁公司保管。这期间,如您需要临时借阅,可向您的购车保时捷中心提出申请。",
    "哪些情况可以申请原件借阅": "在不涉及车辆抵押状态变更的情况下,您可借阅机动车登记证用于以下业务办理:\n•\t变更车身颜色(非同色系)\n•\t变更为市区号牌\n•\t变更发动机/车身/车架",
    "需要提供哪些材料申请原件借阅": "您无需向保时捷融资租赁提供证件或填写相关材料,保时捷中心会协助您提交借阅申请。",
    "最长能借阅多久": "您可以借阅的期限最长为30个自然日,如您因尚未完成相关事项办理需要延期,请向您的购车保时捷中心提出续借申请。",
    "是否需要支付费用": "您无需向保时捷融资租赁支付相关费用,机动车登记证借阅事宜由您的购车保时捷中心协助办理。",
    "可以委托其他人办理吗": "为保障您的财产安全,我们仅接受您本人向保时捷中心提出的借阅申请:\n•\t企业客户:由企业法定代表人提出申请\n•\t个人客户:由承租人提出申请",
    "借阅的原件,寄到哪里": "我们会将登记证寄送至您的购车保时捷中心,保时捷中心收到后会协助您办理相应手续。",
    "使用完毕后如何归还": "登记证使用完毕后,可直接归还至您的保时捷中心,保时捷中心会重新邮寄给保时捷融资租赁保管。",
    "扫描件自助下载": "为保障您的财产安全,您本人可通过本小程序“服务”中的“车辆登记证”查看和下载:\n•企业客户:可企业法人查看和下载\n•\t个人客户:可承租人查看和下载",
    "扫描件无法查看": "如您的车辆登记证还未寄给保时捷融资租赁有限公司归档,无法通过本小程序查看,请您及时配合完成归档。",
    "哪些费用可以开票": "目前支持开具电子发票的项目包括:\n•\t利息\n•\t违约金\n•\t提前结清手续费\n我们会为您开具增值税(普通)电子发票",
    "会在什么时候开具": "电子发票会在每月中旬及月底进行开具。若您的还款日未赶上当月发票开具批次,将自动纳入下一批次处理。如您有加急需求,请联系保时捷融资租赁客户中心,我们预计会在5个工作日内为您开具出相应发票。",
    "利息发票为什么来自两方": "您的利息发票会由我们和联合出租方上海畅途融资租赁有限公司分别开具,发票合计金额等于实际支付利息,均是有效票据。保时捷融资租赁会开具99%利息金额发票,剩余1%利息由上海畅途融资租赁开具。",
    "企业客户,能自助下载吗": "保时捷融资租赁开具的发票可通过本小程序“服务”中的“电子发票”查看和下载,我们也会将通过短信发送给您。联合出租方上海畅途融资租赁开具的发票会通过邮件发送给您。",
    "个人客户,能自助下载码": "保时捷融资租赁开具的发票可通过本小程序“服务”中的“电子发票”查看和下载。联合出租方上海畅途融资租赁开具的发票,您可联系保时捷融资租赁客户中心申请(400-820-5911,按提示选择“3”)",
    "发票信息有误怎么办": "如发票抬头、税号等信息有误,您可联系保时捷融资租赁客户中心400-820-5911,按提示选择“3”提交更正申请,我们将尽快为您处理。",
    "可以补开吗": "对于过往已支付但未开具发票的款项,您可联系保时捷融资租赁客户中心00-820-5911,按提示选择“3”提交补开申请,我们将在核实后为您尽快补开。",
    "小程序上能批量下载吗": "您可勾选单条、多条、点击“全选”,或通过右上角“筛选”选择指定年月的发票。点击“票据接收”,核对或编辑邮箱地址后,电子发票将发送至该邮箱。",
    "企业更名了,如何变更开票信息": "您可联系保时捷融资租赁客户中心400-820-5911,按提示选择“3”提交更名申请。更名成功后,会按照新的名称为您开具发票。",
    "企业更名了,已开具的发票能重开吗": "您可联系保时捷融资租赁客户中心400-820-5911,按提示选择“3”提交补开申请,我们将协助您进行处理。",
    "结清后需要做什么": "我们会协助您办理解除抵押,包括:\n1. 准备并寄出结清资料\n2. 联系您预约办理时间\n3. 协助您办理解除抵押\n4. 归还车辆登记证",
    "哪些材料会寄出": "寄出的结清材料包括您的车辆登记证,结清证明,以及其他车管所要求的办理解除抵押所需材料。",
    "材料多久会寄出": "合同结清后,我们将在7个工作日内向保时捷融资租赁指定服务商寄出结清资料。",
    "材料寄出能加急吗": "如您有加急需求,请在工作时间联系保时捷融资租赁客户中心400-820-5911,按提示选择“3”,我们将在合同结清后5个工作日内向保时捷融资租赁指定服务商寄出结清资料。",
    "多久联系我办理解除抵押": "保时捷融资租赁指定服务商收到资料后,预计三个工作日内和您联系。",
    "材料能直接寄给我吗": "目前大多数地区车管所不接受个人办理解除抵押业务。为了避免您白跑一趟,我们会将材料寄给保时捷融资租赁指定服务商,协助您办理解除抵押。",
    "办理解除抵押,需要我准备什么": "如您是个人客户,需提供身份证。如您是企业客户,需提供营业执照副本原件。",
    "办理解除抵押,需要我到场吗": "您可以和保时捷融资租赁指定服务商的员工共同前往办理。如时间不便,您也可以委托给保时捷中心或指定服务商的员工完成办理。",
    "车辆登记证如何给到我": "如您是共同前往办理的,机动车登记证在解除抵押完成后直接归还给您。如您是委托办理的,会在解除抵押完成后由保时捷融资租赁指定服务商通过邮寄方式归还。",
    "哪些情况无法申请提前结清": "租金还款日当天,还款期数未满1期,合同当前存在逾期或合同已违约,均无法申请提前结清。",
    "如何申请提前结清": "您首期租金成功还款后,且还款状态正常,可通过以下任一方式申请:\n•\t通过本小程序“服务”中的“提前结清”自助提交申请\n•\t联系购车保时捷中心工作人员协助提交申请\n•\t联系保时捷融资租赁客户中心协助提交申请",
    "收提前结清手续费吗": "需要您支付提前结清手续费,收取标准为:\n•\t如已支付租金未满12期,手续费为剩余未付本金的6%\n•\t如已支付租金满12期或以上,手续费为剩余未付本金的3%",
    "如何还提前结清款项": "若您绑定的扣款银行卡为:\n•\t工商银行、招商银行:如通过扣款还款。请提前在卡内预留足额资金,还款日当天将分别于9:30、15:30进行扣款处理;如通过汇款还款,请勿在卡内预留足额资金,并于当天20:00前还款至专属汇款账户\n•\t交通银行、中信银行、平安银行、民生银行、广发银行、上海银行卡:请于还款日当天20:00前还款至专属汇款账户。",
    "可以试算提前结清金额吗": "如首期租金已成功还款,且合同状态正常,您可通过本小程序“服务”中的“提前结清”试算金额。",
    "节假日可以申请吗": "周末和节假日,您可通过本小程序自助申请,或联系保时捷中心工作人员协助提交申请。工作日9:00至18:00,保时捷融资租赁客户中心可协助您提交申请。",
    "租金日可以申请吗": "租金日当天无法为您办理提前结清。",
    "当天最晚几点还款": "还款日当天我们将进行多轮款项处理:\n•\t如您通过扣款还款,请最晚于当天15:30前将金额存入扣款银行卡\n•\t如您通过汇款还款,请最晚于当天20:00前还款至专属汇款账户",
    "当天未还款,怎么办": "若当天未完成还款,提前结清申请将自动失效。您可重新提交申请,或继续按照合同原还款计划还款。",
    "只能承租人提交申请吗": "承租人和担保人均可提交申请。",
    "忠诚客户有哪些礼遇": "如您再次选择保时捷融资租赁方案,可享受全系车型额外1%的利率优惠。原保时捷融资租赁合同尚未结清,还可享受原合同提前结清费用减免、至高5000元还车账单减免优惠。礼遇详情可在本小程序的“首页”和“服务”中的“忠诚客户”查看。",
    "之前选的金融方案,也能享受吗": "如您是保时捷金融客户,在原业务尚未结清或结清时间不超过3年时,通过保时捷融资租赁方案重购,也可享受全系车型额外1%的利率优惠。",
    "保时捷金融客户介绍": "是指您曾通过保时捷金融服务提供方提供的金融方案购买保时捷 (保时捷金融服务提供方包括:中国银行、中信银行、平安银行、中国农业银行、大众汽车金融(中国)有限公司、德国大众汽车融资租赁(天津)有限公司)。",
    "如何查询我的客户身份": "您可以在本小程序“服务”中的“客户权益”通过车架号或证件号码进行查询。",
    "我有购车意向,如何提交": "保时捷融资租赁客户可通过本小程序“服务”中的“客户权益”提交期末购车意向。收到您的意向申请后,我们会通知保时捷中心联系您预约到店试驾。",
    "什么情况可以返还车辆": "如您选择的是保时捷融资租赁无忧先享产品,合同到期时可享受多种选择权,包括车辆购买、车辆返还、车辆置换。",
    "车辆返还步骤是什么": "车辆返还涉及如下步骤:\n1. 合同到期日10个工作日前,预约到店检测\n2. 合同到期日7个工作日前,完成车辆检测。如符合还车标准,将车辆进行归还\n3. 合同到期后30个工作日内,办理车辆解除抵押和车辆过户",
    "如何预约到店检测": "您可在本小程序“服务”中的“车辆返还”完成预约。预约成功后,保时捷融资租赁客户中心将与您取得联系,安排检测与还车事宜。您也可直接拨打保时捷融资租赁客服热线进行预约。",
    "预约后能改期吗": "您可在预约日期的前一天在本小程序“服务”中的“车辆返还”操作取消或改期。如您未及时取消或改期,会视为一次爽约,两次爽约后将失去还车资格,还请您提前操作。",
    "到店时需携带什么材料": "还请您一并携带好车辆相关材料,包括2把钥匙、车辆行驶证、车主身份证/营业执照原件、公章(仅企业客户)、进口单证等材料。",
    "哪些情况无法返还车辆": "需要至少满足以下情况可在期末返还车辆:\n1. 车辆无重大事故(结构性损伤)、水淹、火烧等情况,并在保时捷授权中心保养\n2. 当前还款不逾期\n3. 合同到期日7个工作日前经检测符合还车车况标准,归还车辆\n具体您可在本小程序“服务”-“车辆返还”-“还车指引”中的“还车标准”查看。",
    "对车况有什么要求": "还车车况需至少满足以下情况:\n1.车身无结构性损伤、车身外观及油漆无明显损伤、内饰无明显损坏痕迹\n2.电气可正常使用、车轮及轮胎无明显损伤、底盘和发动机无异常\n3.电池可正常充放电\n4. 车辆行驶里程不超过2万公里/年\n具体您可在本小程序“服务”-“车辆返还”-“还车指引”中的“还车标准”查看。",
    "检测结果我不满意怎么办": "车辆检测是由保时捷授权经销商或保时捷融资租赁授权的第三方检测机构完成,其检测结果专业且独立。如您对检测结果有异议,我们可安排第二次检测,这次检测需要您支付相关费用。",
    "还车账单包括哪些款项": "如车辆不符合还车车况要求,您可通过支付车辆复原维修费和超额里程费的方式继续归还车辆。您可在本小程序“服务”-“车辆返还”中的“账单支付”查看账单金额。",
    "车辆检测收费吗": "您享有一次免费的车辆到店检测服务,该服务由保时捷授权经销商或保时捷融资租赁授权的第三方检测机构完成。",
}

NO_MATCH = "__NO_MATCH__"

def _normalize(s):
    if not s:
        return ""
    s = unicodedata.normalize("NFKC", s)
    s = s.lower()
    return "".join(ch for ch in s if ch.isalnum())

_NORM_MAP = {_normalize(q): a for q, a in QA_MAP.items()}

def _extract_qa(content):
    """从知识库条目 content 中提取 (问题, 答案)。

    🔴 平台确认(2026-08-04):条目 content 只含"问题"字段(如 {"问题":"..."}),
    不带答案——带答案字段会影响检索准确率。因此:
      - 正常情况:取到"问题" → 答案交给 QA_MAP 映射(主路径,与点选答案同源)
      - 兼容分支:若未来条目加了"答案"字段,直接返回该字段(零润色优先)
    解析失败或非 JSON 时,整段文本视为问题,答案交给 QA_MAP 映射。
    """
    if not content:
        return "", ""
    text = content.strip()
    try:
        obj = json.loads(text)
        if isinstance(obj, dict):
            q = obj.get("问题") or obj.get("question") or obj.get("q") or ""
            a = obj.get("答案") or obj.get("answer") or obj.get("a") or ""
            # 答案必须是 string:数字/dict/list 一律转成字符串(json.dumps 保形)
            if not isinstance(a, str):
                a = json.dumps(a, ensure_ascii=False)
            return q, a
    except Exception:
        pass
    return text, ""

def kb_results_to_answer(kb_results):
    """知识库检索结果数组 -> 答案原文(string)。未命中返回兜底话术(string)。

    🔴 直接取数组第一个结果(平台知识库节点已完成检索 + 阈值过滤,
    传进来的数组第一个就是 top1 命中,本段不做相似度匹配/阈值判断)。

    兼容平台两种输入形态:
      - Array[Object](真实格式):取第一个元素,解析 content 映射答案
      - 单个字符串(旧格式/测试):直接按标准问题查表
    所有返回路径都保证 str 类型。
    """
    if isinstance(kb_results, str):
        # 兼容旧格式:直接当标准问题查表
        key = _normalize(kb_results)
        return _NORM_MAP.get(key, FALLBACK_TEXT) if key else FALLBACK_TEXT
    if not isinstance(kb_results, (list, tuple)) or not kb_results:
        return FALLBACK_TEXT  # 集合为空 -> 兜底话术
    # 🔴 取第一个结果(平台已过滤 top1,不再比较 score)
    item = kb_results[0]
    if not isinstance(item, dict):
        return FALLBACK_TEXT
    content = item.get("content") or ""
    q, a = _extract_qa(content)
    if a:
        return a  # content 自带答案,零润色直接输出(已保证 string)
    key = _normalize(q)
    if not key:
        return FALLBACK_TEXT
    return _NORM_MAP.get(key, FALLBACK_TEXT)

# 兼容旧函数名:kb_to_answer(标准问题字符串)
def kb_to_answer(kb_question):
    return kb_results_to_answer(kb_question)

def data_process(df: dict) -> dict:
    """平台代码节点入口(titan 低代码平台约定格式)。

    输入: df["ragQuestionArr"] (Array<Object>)  # 知识库节点检索结果数组(已过滤 top1)
    输出: result (String)  # 命中=答案原文 / 未命中=兜底话术,始终为字符串
    """
    rag_arr = df.get("ragQuestionArr", []) if isinstance(df, dict) else []
    answer = kb_results_to_answer(rag_arr)
    return {
        "result": answer,  # String
    }

九、验收清单

#用例期望结果
T1点选问题 1返回问题 1 的答案原文,逐字一致
T2点选最后一个问题返回对应答案原文
T3自由输入与某 Q 高度相似(含问号/空格/全角)返回该 Q 对应 A 原文
T4自由输入与所有 Q 都不相似返回固定话术
T5任意输入返回内容不含润色痕迹(与 A 原文或固定话术逐字一致)
T6知识库 A 字段 vs 点选路径 answer同源一致(同 qa_data.json)
T7输入含「客服/电话」等 A 中常见词但语义不对应不误命中含该词答案的 QA(知识库只匹配 Q)
T8多结果检索场景只取第一个结果(平台已按 top1 排序),不拼接
T9点选传无效 question_id(防御)返回固定话术

注:验收前先用「② 扩写测试集」扫阈值 0.7 / 0.8,确认误命中为 0。

十、版本历史与 QA 更新机制

QA 更新机制:需求不变、只更新 QA 时,走固定流程:新 QA Excel → 提取为 qa_data.json → 重新生成两段代码 → 新增版本记录(versions.json)→ 重建本文档 → 重新部署。需求说明部分(一~九章)保持不变,仅第八章代码与第十章版本表更新。

版本QA 数据日期QA 条数Excel 下载说明
V1.0 (当前) 2026-07 75(唯一 74) ⬇ 下载 Excel 首版,8 业务场景,1 个重复问题「是否需要支付费用」

⚠️ 当前版本存在重复问题「是否需要支付费用」(车辆登记证版 / 结清寄送版,答案不同)。代码保留首条(车辆登记证版答案);如页面预置了两个相同文本问题,点选无法区分,建议改为可区分文案。

扩写测试集 · 设计方法论(对抗性把关)

本测试集用于评估机器人的问答效果,同时公开给合作方查看和使用。核心原则:没有真实用户数据时,盲目扩写会引入噪声反而影响效果——所以每条用例都带明确的「验证点」,没有验证点的扩写不进测试集。

正样本两型(验证机器人「该答的答得上」)

类型说明验证点
语义改写真人换说法/口语化问同一件事验证语义检索召回:语义等价应命中同一 QA
近义区分措辞靠近其他场景,语义仍是本条验证区分度/防串答:不能串到其他 QA

负样本三型(验证机器人「不该答的不答」)

类型说明验证点
无关输入与业务无关(天气/问候/其他业务)应返回固定话术,不编造答案
关键词陷阱含答案中常见词但语义不对应防撞车:不因「客服/电话」等词误命中(对应验收 T7)
跨场景混淆两个场景都有类似问题验证不串答:答非所问是最大伤害

⏳ 待补充:上线后从「运营管理-执行日志」(T+1)采集真实未命中 query,作为下一轮扩写的真实样本来源。

正样本:两型 75 组(225 条输入)

每组 = 标准 Q(基准)+ 2 条变体(改写/近义),变体为人工精编真人说法。每条变体标注验证点。

#场景标准 Q变体(类型 + 测试输入 + 验证点)期望结果
1 常规还款 有哪些还款方式
语义改写 还钱都有哪些方式呀
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 你们能自动扣款不
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
2 常规还款 自动扣款支持哪些银行
语义改写 哪些银行能办自动扣款
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 我这张卡能扣款吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
3 常规还款 最晚可以几点还款
语义改写 还款最迟到几点
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 今天几点前把钱存进去
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
4 常规还款 可以通过汇款还款吗
语义改写 能转账还款不
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 不绑卡直接打钱行不行
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
5 常规还款 我会收到提醒短信吗
语义改写 还款前会发短信提醒吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 有没有还款提醒
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
6 常规还款 收到了余额不足还款失败短信
语义改写 刚收到短信说我余额不够扣款失败了
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 扣款失败是卡里没钱怎么办
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
7 常规还款 扣款银行卡发生限额、冻结、锁定
语义改写 扣款卡被限额了咋整
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 银行卡被冻结了还能扣款吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
8 常规还款 周末和节假日可以还款吗
语义改写 周末能还款吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 法定节假日还款会顺延吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
9 常规还款 如何查看还款计划
语义改写 还款计划在哪看
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 怎么查我下期要还多少
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
10 常规还款 如何查看汇款结余
语义改写 汇款结余在哪看
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 账户里多汇的钱怎么查
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
11 变更银行卡 个人客户,可以选择哪些银行卡
语义改写 个人能换哪些银行卡
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 换卡有银行限制吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
12 变更银行卡 企业客户,可以选择哪些银行账户
语义改写 企业能换什么银行账户
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 公司账户能换成工行吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
13 变更银行卡 能自助办理吗
语义改写 可以自己在小程序上办吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 换卡必须去柜台吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
14 变更银行卡 承租人操作变更注意事项
语义改写 承租人换卡要注意啥
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 个人账户谁来操作变更
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
15 变更银行卡 担保人操作变更注意事项
语义改写 担保人换卡有什么要注意的
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 担保人能自己操作变更吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
16 变更银行卡 扣款过程变更了银行卡
语义改写 正在扣款时换了卡会怎样
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 变更后本期扣款用新卡还是旧卡
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
17 变更银行卡 如何查看变更后的银行卡信息
语义改写 换完卡去哪查新卡信息
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 变更后的卡号在哪看
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
18 变更银行卡 银行卡挂失补办了,需要变更吗
语义改写 卡挂失补办了要重新绑定吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 补办的新卡能正常扣款吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
19 变更银行卡 旧的银行卡如何解绑
语义改写 旧卡怎么解绑
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 换卡后旧卡会自动解绑吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
20 变更银行卡 能再次发起变更吗
语义改写 可以再换一次卡吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 变更成功后还能改吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
21 车辆登记证 我的车辆登记证保存在哪里
语义改写 大绿本在谁那儿保管
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 车辆登记证去哪了
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
22 车辆登记证 哪些情况可以申请原件借阅
语义改写 什么情况下能借登记证原件
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 想借大绿本办改色行吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
23 车辆登记证 需要提供哪些材料申请原件借阅
语义改写 借登记证要准备什么材料
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 借阅需要提交什么证件
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
24 车辆登记证 最长能借阅多久
语义改写 登记证最多能借多长时间
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 借期到了能续吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
25 车辆登记证 是否需要支付费用
语义改写 解除抵押收费吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 办理解除抵押要花钱吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
26 车辆登记证 可以委托其他人办理吗
语义改写 能让别人帮我借吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 家人可以代办借阅吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
27 车辆登记证 借阅的原件,寄到哪里
语义改写 借出的登记证寄到哪
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 原件是寄给我还是寄给店里
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
28 车辆登记证 使用完毕后如何归还
语义改写 用完了登记证怎么还
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 归还登记证需要自己寄吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
29 车辆登记证 扫描件自助下载
语义改写 登记证扫描件能自己下载吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 电子版登记证在哪下载
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
30 车辆登记证 扫描件无法查看
语义改写 扫描件看不了是咋回事
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 小程序里打不开登记证
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
31 电子发票 哪些费用可以开票
语义改写 什么费用能开发票
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 利息能开票吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
32 电子发票 会在什么时候开具
语义改写 发票什么时候开
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 开发票要等多久
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
33 电子发票 利息发票为什么来自两方
语义改写 为啥利息发票是两家开的
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 两家开的发票金额怎么算
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
34 电子发票 企业客户,能自助下载吗
语义改写 企业能自己下载发票吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 企业发票在哪拿
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
35 电子发票 个人客户,能自助下载码
语义改写 个人能自己下载发票吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 发票下载入口在哪
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
36 电子发票 发票信息有误怎么办
语义改写 发票抬头开错了咋办
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 发票信息错了能改吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
37 电子发票 可以补开吗
语义改写 以前没开的票能补吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 去年的发票还能开吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
38 电子发票 小程序上能批量下载吗
语义改写 能一次下载多张发票吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 发票能打包发邮箱吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
39 电子发票 企业更名了,如何变更开票信息
语义改写 公司改名了发票信息怎么改
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 更名后开票抬头要更新吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
40 电子发票 企业更名了,已开具的发票能重开吗
语义改写 公司改名后旧发票能重开吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 更名前的发票要作废重开吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
41 结清寄送 结清后需要做什么
语义改写 还完款之后要干嘛
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 结清后还有哪些流程
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
42 结清寄送 哪些材料会寄出
语义改写 会寄哪些资料给我
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 结清资料都有啥
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
43 结清寄送 材料多久会寄出
语义改写 结清材料多久寄出来
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 几天能收到结清资料
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
44 结清寄送 材料寄出能加急吗
语义改写 材料能加急寄吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 急用登记证能快点寄吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
45 结清寄送 多久联系我办理解除抵押
语义改写 什么时候有人联系我解除抵押
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 解除抵押要等几天
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
46 结清寄送 材料能直接寄给我吗
语义改写 能直接把材料寄给我吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 为啥材料不寄给我本人
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
47 结清寄送 办理解除抵押,需要我准备什么
语义改写 解除抵押我要准备啥
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 解除抵押要带什么证件
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
48 结清寄送 办理解除抵押,需要我到场吗
语义改写 解除抵押必须我去吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 能不能不去现场办解除抵押
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
49 结清寄送 是否需要支付费用
语义改写 解除抵押收费吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 办理解除抵押要花钱吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
50 结清寄送 车辆登记证如何给到我
语义改写 登记证怎么还给我
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 解除抵押后大绿本怎么拿
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
51 提前结清 哪些情况无法申请提前结清
语义改写 什么情况不能提前结清
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 刚还了第一期能提前结清吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
52 提前结清 如何申请提前结清
语义改写 提前结清怎么申请
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 想提前还清找谁办
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
53 提前结清 收提前结清手续费吗
语义改写 提前结清要手续费吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 提前还清有违约金吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
54 提前结清 如何还提前结清款项
语义改写 提前结清的钱怎么还
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 结清款能转账还吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
55 提前结清 可以试算提前结清金额吗
语义改写 能先算算提前结清要还多少吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 提前结清金额怎么算
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
56 提前结清 节假日可以申请吗
语义改写 周末能申请提前结清吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 节假日提交申请有人处理吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
57 提前结清 租金日可以申请吗
语义改写 还款日当天能申请吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 租金日能办提前结清吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
58 提前结清 当天最晚几点还款
语义改写 当天最迟几点前还
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 结清当天几点前要转钱
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
59 提前结清 当天未还款,怎么办
语义改写 当天没还上咋办
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 没赶上当天还款申请会怎样
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
60 提前结清 只能承租人提交申请吗
语义改写 只有承租人能申请吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 担保人能申请提前结清吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
61 忠诚客户权益 忠诚客户有哪些礼遇
语义改写 忠诚客户有什么优惠
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 老客户再买有折扣吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
62 忠诚客户权益 之前选的金融方案,也能享受吗
语义改写 以前用金融方案买的也能享受吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 保时捷金融老客户算忠诚客户吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
63 忠诚客户权益 保时捷金融客户介绍
语义改写 什么是保时捷金融客户
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 哪些银行的算保时捷金融
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
64 忠诚客户权益 如何查询我的客户身份
语义改写 怎么查我是不是忠诚客户
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 客户身份在哪能查到
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
65 忠诚客户权益 我有购车意向,如何提交
语义改写 想再买辆保时捷怎么留意向
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 购车意向在哪提交
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
66 车辆返还 什么情况可以返还车辆
语义改写 什么情况下能把车还回去
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 合同到期能还车吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
67 车辆返还 车辆返还步骤是什么
语义改写 还车流程是怎么样的
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 还车要提前多久准备
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
68 车辆返还 如何预约到店检测
语义改写 怎么预约还车检测
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 检测预约入口在哪
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
69 车辆返还 预约后能改期吗
语义改写 预约后咋改期
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 预约了检测想改时间行吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
70 车辆返还 到店时需携带什么材料
语义改写 去还车要带哪些东西
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 还车要带身份证吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
71 车辆返还 哪些情况无法返还车辆
语义改写 什么情况不能还车
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 车出过事故还能还吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
72 车辆返还 对车况有什么要求
语义改写 还车对车况有啥要求
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 有点小剐蹭能还车吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
73 车辆返还 检测结果我不满意怎么办
语义改写 对检测结果有异议咋办
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 检测不通过能重新检吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
74 车辆返还 还车账单包括哪些款项
语义改写 还车账单都收什么钱
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 还车要多付哪些费用
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA
75 车辆返还 车辆检测收费吗
语义改写 还车检测要钱吗
验证语义检索召回:真人换说法问同一件事,应命中同一 QA

近义区分 到店检测是免费的吗
验证区分度/防串答:措辞靠近其他场景,语义仍是本条,不能串答
命中该组 QA

负样本:三型 15 条

期望全部返回固定话术;任何一条被命中即为误命中(不可接受)。

#类型测试输入验证点期望结果
1 无关输入 今天天气怎么样 无关输入,应返回固定话术 返回固定话术
2 无关输入 你们老板是谁 无关输入,应返回固定话术 返回固定话术
3 无关输入 公司地址在哪里 无关输入,应返回固定话术 返回固定话术
4 无关输入 怎么投诉你们 无关输入,应返回固定话术 返回固定话术
5 无关输入 你们几点下班 无关输入,应返回固定话术 返回固定话术
6 无关输入 推荐一款手机 无关输入,应返回固定话术 返回固定话术
7 无关输入 我想买理财产品 无关输入,应返回固定话术 返回固定话术
8 无关输入 你们和银行有什么区别 无关输入,应返回固定话术 返回固定话术
9 无关输入 能帮我查一下我的征信吗 无关输入,应返回固定话术 返回固定话术
10 关键词陷阱 客服电话是多少 含A关键词「客服」但QA无此问题,验证不因关键词撞车(验收T7) 返回固定话术
11 关键词陷阱 提前结清的违约金电话咨询 关键词组合但语义不对应,验证防撞车 返回固定话术
12 跨场景混淆 还款提醒短信收不到 跨场景易混淆:提醒短信 vs 还款方式,验证不串 返回固定话术
13 跨场景混淆 发票丢了能补吗 跨场景易混淆:发票 vs 其他费用类,验证不串 返回固定话术
14 跨场景混淆 结清后车辆登记证什么时候给 跨场景易混淆:登记证 vs 结清寄送,验证不串 返回固定话术
15 跨场景混淆 逾期多久会收回车辆 跨场景易混淆:车辆返还相关,验证不串 返回固定话术

下载(公开版)

文件格式用途下载
testset-public.xlsxExcel(3 sheet:正样本/负样本/使用说明)合作方/内部人工查看与测试录入⬇ 下载 Excel
testset.jsonJSON(含 meta/类型/验证点)eval_bot.py 程序化评估⬇ 下载 JSON

⚠️ 使用方法:把「测试输入」逐条发给机器人,正样本看是否命中对应 QA 答案原文,负样本看是否返回固定话术。完整流程见「③ 评估与计划」。

评估方案

目标:机器人地址开放后,用测试集程序化评估效果,产出评估报告。

评估程序(eval_bot.py,已就绪)

  • 程序化评估(主):`python3 eval_bot.py --url <机器人API> --token --model model_a --run-dir runs/model_a`——逐条跑测试集,输出命中率/误命中数/漏报明细 + HTML 报告
  • 半自动兜底(平台无开放 API 时):`python3 eval_bot.py --gen-csv` 生成录入表(315 条),人工在平台测完录回,`--from-csv` 算分出报告
  • 双模型对比:模型 A/B 各跑一轮(--model + --run-dir),`--compare runs/model_a runs/model_b` 合并出综合对比报告

指标定义

指标定义合格线
正样本命中率正样本命中数 / 总输入数(225)越高越好,目标 ≥ 95%
负样本误命中数负样本中被返回答案而非固定话术的条数必须为 0(错误答案比答不上来伤害大)
分型命中率语义改写 / 近义区分 各自命中率定位薄弱环节(如近义区分低 → 知识库 Q 太抽象)
调用错误数接口调用失败/超时越低越好

⏳ 前置条件:① 测试集就绪 ✅ ② 机器人地址开放(待公司配置) ③ 双 embedding 模型可切换。

双模型对比

背景:知识库匹配有 2 个 embedding 模型可选。评估时在 titan 平台切换机器人使用的模型,同测试集各跑一轮,对比:

  • 总命中率:哪个模型召回更好
  • 误命中数:哪个模型更稳(都不能误命中)
  • 分型差异:近义区分能力是否不同(直接决定自由输入路径可靠性)
  • 差异行明细:同一输入在两个模型下结果不同的行,逐条人工复核

输出:综合对比报告(HTML)——逐模型指标表 + 差异行明细,供选型决策。

更新计划时间线

  • 2026-08-04
    ✅ 需求文档 v4 + 测试集 v2 就绪
    三型测试集(正 300 输入 / 负 15)+ 评估程序 eval_bot.py 完成
  • 2026-08-07(周五)
    ⏳ 合作方交付最新 QA
    最晚本周五收到最新 QA(可能含扩写,但扩写也是一行一个问答形式)→ 发来后走标准更新流程:提取 → 重新生成代码 → 新版本记录 → 重建文档
  • 待定
    ⏳ 机器人地址开放
    公司配置好机器人(含 embedding 模型选择)→ 开放访问地址
  • 地址开放后
    ⏳ 双模型评估 + 综合报告
    eval_bot.py 跑模型 A/B 各一轮 → --compare 出综合对比报告 → 定模型 + 定阈值(0.7/0.8 实测)
  • 上线后 1-2 周
    ⏳ 真实数据回灌
    从执行日志(T+1)采集真实未命中 query → 并入测试集 → 迭代扩写(保持三型把关)