先说一个反直觉的事
接手这个项目时,所有人的第一反应都是“模型不行”。
但把 badcase 一条一条归因完之后,真正的大头不在生成环节,
而在模型根本没拿到对的知识。检索没命中,后面再强的模型也只能编。
命中失败的真实原因:人不按全称说话
知识库里存的是产品全称,而一线人员在客户面前从来不说全称。
他们说俗称、说简称、打错字,还有很大一部分是语音转文字——
转错的比例比想象中高很多,而且错得很有规律(同音、近音、方言口音)。
我们加了一层改写:把用户问题里能识别到的产品指代,
统一换成最短别名并用方括号包裹,再送去检索。
方括号不是装饰,它给下游一个明确信号:这几个字是实体,不是普通词。
- 为什么用最短别名而不是全称。全称里的修饰词(终身、终身寿险、终身寿险 A 款)会干扰向量相似度,反而把不同产品拉到一起。
- 别名表是手工维护的。没有自动方法。我们从真实问题日志里扫高频写法,一个一个归到主实体上。这是脏活,但回报最高。
- 停售产品不能删。客户手里拿着十年前的保单来问,知识库里没有就只能编。
切片这件事没有通用答案
条款文件不能按字数硬切。保险条款的语义单元是“责任项”,
一个责任项可能只有两行,也可能带三层例外说明。硬切会把“免赔情形”和它修饰的责任切开,
结果就是模型告诉客户“这个赔”,而下一句的免责条款它根本没看到。
这类错在保险业务里不是“答得不好”,是合规风险。
所以我们把切片规则写成了文档,固定下来:以责任项为最小单元,
例外与免责必须随主体一起入片,跨页的责任项手工合并。
这份文档后来成了团队里其他人做知识入库的依据。
让知识库自己长大
一万多条 FAQ,靠人海补是补不完的。我设计了一条闭环:
用户点踩 → 自动生成质检任务 → AI 训练师处理 → 知识优化 → 下次命中。
关键在最后一步:修完要能验证。
很多团队做到“收集反馈”就停了,反馈进了表格就再没人看,那不叫闭环。
对练功能为什么不能只做“能聊”
对练的底层是四维客户标签生成人设,实时对话用 Redis 管上下文,
对话日志进 ES。但技术不是重点,重点是评价。
如果只给一个总分,用户练一次就不练了——他不知道该改什么。
所以评价拆成通用与产品两个维度,分开给建议。
这个项目里我最意外的一件事
产品名归一化这么“土”的一层,对命中率的提升比换模型、调参数都明显。
它不需要任何前沿技术,需要的是有人愿意去看一万条真实提问。
这让我彻底改了习惯:看指标不行时,先去翻日志,不要先去看模型。