日期:2026-07-27
我们给一家大型制造企业的智能客服和内部知识助手做升级。初版是直接把用户问题拼进提示词、让大模型凭"记忆"作答,结果翻车频繁:问到具体的保修政策,模型编了一个根本不存在的条款;问到某型号配件的交期,它把一个旧数据当成现行政策。对外客服一句话答错就是客诉,对内知识助手答错就是误决策。根因很清楚——大模型的知识是训练时固化的,而企业的制度、手册、价格每天都在变,模型答的永远是"过时且虚构"的混合体。我们需要一套让答案"有据可依"的机制。
核心是用检索增强生成(RAG)把"凭记忆答"改成"凭资料答"。我们把企业内部的制度文档、产品手册、售后政策、订单 FAQ 做了解析—切片—向量化流水线,建成可检索的知识库。用户提问时,先检索最相关的若干片段,连同问题一起送给大模型生成答案,并要求答案必须引用检索到的片段编号;如果检索不到足够证据(比如问到一个知识库没覆盖的新政策),模型就直接拒答并提示"暂无权威依据",而不是硬编。答案下方附"引用来源",用户点开能看原文,做到可核验。
第一,切片粒度决定上限。太粗的切片塞不进上下文,太细的又丢失语义,我们按"自然章节+语义边界"双约束切,保证每段自包含。第二,检索与问题的对齐。纯向量检索容易召回到"词像但意不像"的片段,我们加了关键词 BM25 混合检索和重排,把最相关的顶到前面。第三,引用的真实性与可核验。我们要求模型输出带片段 ID,答案校验时反查该 ID 是否真在检索结果里,防止"引用一个不存在的编号"这种高级幻觉。第四,无证据拒答。我们设了一个置信度阈值,检索得分低于阈值或覆盖不足时强制走拒答话术,宁可少答不可错答。
案例片段(已脱敏): 答案引用校验与拒答的核心逻辑(示意):
python def 校验引用(answer, retrieved_ids): cited = 提取引用编号(answer) if not cited: return "拒答:答案未提供可核验来源" if any(c not in retrieved_ids for c in cited): return "拒答:引用了非检索范围内的来源" if 检索置信度 < 0.6: return "拒答:暂无权威依据,建议转人工" return answer # 通过,附引用来源
上线后我们拉了客服侧的对比:答案的"引用可核验率"(即答案标注的来源能反查到真实片段的比例)从初版的约四成提升到约九成以上;因编造政策/数据导致的客诉较之前下降约六成;转人工率在小问题上反而下降——因为能答准的问题变多了,复杂问题才转人工,整体平均处理时长缩短约两成。在内部知识助手场景,员工"问数答非所问"的吐槽明显减少。数字脱敏示意,口径一致。
RAG 落地的第一性原理:没有证据就不生成,引用必须先可核验——这是防幻觉的底线,不是锦上添花。第二,切片粒度决定检索上限,按"章节+语义"双约束切,比固定字数切靠谱。第三,检索要"向量+关键词"混合再加重排,单向量容易被字面相似误导。第四,引用校验要反查编号真实性,防"虚构引用编号"这种更隐蔽的幻觉。第五,无证据拒答要敢做,宁可少答不可错答,尤其对外场景。这套"切片—混合检索—引用校验—拒答兜底",是我们所有知识库问答项目的标配。
RAG 看似是"接个向量库"的小事,真正难的在"可溯源"三个字。我们踩过的坑里,最隐蔽的不是答错,而是"引用了一个不存在的编号"——答案看起来有出处,其实出处是编的,比没有出处更危险,因为它骗过了审核的人。所以引用校验必须反查编号真实性,这是底线,没有任何商量余地。
另一个体会是:无证据拒答要敢做。很多团队怕"答太少"被业务嫌弃,结果为了凑答案硬编,反而引发客诉和误决策。我们后来把"宁可少答"写进系统默认值,转人工率反而更健康,因为流出去的每句话都站得住脚。信任,是知识库问答最贵的资产,建立要很久、毁掉只要一次。把"有证据才说、没证据就转人"当成铁律,这套系统才配在客服和决策场景里被真正依赖。
从落地节奏看,我们建议知识库问答"先窄后宽":先挑一两个高价值、低风险的知识域(如售后政策)做透,跑通切片、检索、引用、拒答的闭环,再逐步扩展到全量知识。一上来就全量接入,切片质量参差不齐,反而把 RAG 的口碑做差了。我们那个客户就是先从售后政策切入,三个月后员工主动使用率上去,才扩到产品手册和内部制度。小步快跑,比大而全更稳,也更容易拿到业务方的信任。
还有一点想提醒做知识库的同学:切片和检索调优是长期活,不是上线就完。我们的客户每月都会根据新进文档和线上 bad case 回流,调整切片粒度和重排权重,半年下来检索命中率又涨了几个点。RAG 的效果曲线是"持续小步"而不是"一蹴而就"。我们也建议把线上拒答和转人工的 case 当成最宝贵的优化信号,用户问不到、答不准的地方,正好告诉你知识库缺了什么、切片错在哪。让线上问题反哺知识库,闭环才转得起来。