日期:2026-07-13
在 XpShop 电商系统上做智能客服,是我们今年一个很典型的私域知识落地场景。客户希望把商品手册、售后政策、订单 FAQ 这些散落在各部门文档里的知识,统一接进一个客服机器人,让买家问商品参数、退换货规则、订单状态时能直接得到回答,减少人工客服的重复劳动。
初版上线后问题很尖锐:买家问"这款洗衣机烘干容量多少",机器人答的是另一款的参数,答非所问;问"七天无理由退换是否包邮",机器人一本正经地编出"包邮且上门取件"的幻觉政策;还有大量问题直接转人工,机器人形同虚设。
我们复盘后发现,根子不在模型能力,而在 RAG 知识库层——文档切得乱、检索命中差、没有防幻觉闸门、知识更新靠全量重建。于是我们做了一轮以"检索质量"为核心的调优,这篇文章把工程细节摊开讲。
XpShop 的私域知识大致分三类,对应不同问答意图:
客服机器人在 XpShop 前端接待入口接住提问,先经意图识别,再走 RAG 检索私域知识,最后由生成模型产出带出处的回答;检索不到或置信度过低时,转人工并附带"已检索到的相关片段",让人接手有上下文。
① 文档解析与切片策略
初版我们用固定长度(如每 512 token 一刀切)切片,结果表格被拦腰截断、一条政策被拆成两半,检索自然命中差。改法是按语义而非固定长度切:对商品手册用"型号+参数块"为单位,对政策文档用标题层级与条款边界做语义分块,保留表格整体不切割;同时给每个 chunk 打上来源文档、章节、版本号元信息。切片粒度直接决定了检索上限——切太碎丢上下文,切太粗噪声大,这个参数我们调了好几轮才稳定。
② 检索质量:混合检索 + 重排
单纯向量检索对"精确条款编号""型号数字"这类关键词不敏感。我们上了混合检索:向量检索负责语义召回,BM25 关键词检索负责精确匹配,二者分数归一化融合取 top-k;再接一层 rerank 重排模型,对融合后的候选集做精细相关性打分,把真正命中的片段顶到最前。实测重排前后,相关片段进入 top-3 的比例有肉眼可见的提升。
③ 防幻觉:检索不到就拒答、答案引用出处
我们立了一条硬规矩:没有出处就不生成。生成模型的 prompt 强制要求"仅基于检索片段回答,片段未覆盖则明确告知并转人工";同时答案末尾附引用来源(文档名+章节),买家可点击溯源。对售后的敏感口径,我们还加了关键词红区校验,命中"包邮/赔付/免责"等表述时额外比对政策原文,避免模型自由发挥。
④ 时效:增量更新而非全量重建
商品上下架、大促政策变动频繁。初版每次更新都全量重建索引,耗时长、还导致服务中断。我们改成增量更新:文档中台推送变更事件(新增/修改/下线),知识库层只对受影响 chunk 做增删,向量库局部更新,分钟级生效,不再锁全量。
案例片段(已脱敏):重排前后 top-k 命中对比(节选)。
问题:"iPhone 保护壳是否支持 MagSafe 磁吸充电?" 重排前(top5 向量召回): [SKU-8821 参数, SKU-7710 说明, 通用FAQ, 不相关, 不相关] -> 命中 2/5 重排后(top3): [SKU-8821 参数(MagSafe段), 通用FAQ(MagSafe段), SKU-7710 说明] -> 命中 3/3 最终生成引用: 《商品手册-手机配件》§3.2 MagSafe 兼容说明案例片段(已脱敏):拒答触发逻辑(节选)。if max_retrieval_score < 0.42 or not has_policy_source(answer): return handoff_to_agent(reason="低置信/无出处", attach=top_chunks) # 转人工并附已检索片段 else: return render(answer, citations=chunk_meta) # 正常回答并展示出处
以下为脱敏示意值:
这套调优在其他"私域知识+客服/问答"场景基本能直接平移:
结语:RAG 不是把文档塞进向量库就完事。切片、检索、重排、防幻觉、更新,每一步都是工程活,调好了客服机器人才能真正替人干活。