壹号国际知识库:同一个退款问题存在三篇不同答案以后,AI到底应该相信哪一篇?
相似不等于权威
知识库积累到一定阶段后,几乎必然会出现同一个问题对应多篇文章的情况。举例来说,假设"退款政策"这个主题下,公司三年内因为业务调整、区域差异、措辞优化,陆续新增了三篇文章,但没有一篇被正式下线。客服系统接入检索增强生成(RAG)之后,系统做的事情是把客户问题转成向量,去知识库里找语义上最接近的段落,再把这段内容交给模型生成回答。这个过程能保证"找到的内容和问题有关",但保证不了"找到的内容现在仍然有效"。如果三篇文章写法接近、用词相似,向量检索甚至可能把最旧的一篇排在最前面,因为它的表述恰好和客户提问的句式更贴近。这里最容易被忽略的是:相似度是一个纯文本层面的指标,它不知道公司政策在去年三月做过调整。
这类重复内容通常不是一次性产生的,而是几种驱动力叠加的结果:区域团队为了适配当地法规和支付习惯,各自维护一份"本地化"退款说明;促销活动期间,客服负责人为了快速止损,直接新增一篇"活动期间特殊退款规则",活动结束后却没人记得把它下线;还有一部分纯粹是内容治理缺失。三种路径的共同结果是,知识库里同一个主题下堆积了写法接近、结论却不完全一致的多篇文章。
用字段把权威性显式写出来
如果不能指望检索模型自己判断内容是否过时,比较现实的做法是把权威性拆成几个可以被程序读取的字段。下表是一份知识文章的元数据结构示例:
| 字段 | 说明 |
|---|---|
| Article(文章编号) | 唯一标识,避免同名文章互相覆盖 |
| Topic(主题) | 用于聚类和检索范围限定,如退款政策 |
| Product(产品线) | 不同产品可能对应不同规则 |
| Region(适用地区) | 跨境场景下地区差异往往比产品差异更大 |
| Effective Date(生效日期) | 文章内容开始生效的时间 |
| Owner(责任人) | 谁有权确认这篇文章仍然准确 |
| Status(状态) | Current / Deprecated / Draft |
| Version(版本号) | 同一主题下的版本序列 |
把这些字段和正文分开管理之后,检索环节就可以先按Status过滤,再按语义相似度排序,而不是让相似度单独决定最终结果。即便字段设计得足够完整,实际运行中仍然会出现几种常见的失效方式:新文章发布时没有同步把被替代的旧文章状态改为Deprecated;Owner一栏填的是某个已经转岗或离职的人;Region字段填写笼统;Draft状态的文章因为内容写得比较完整,被内部同事误当作可以对外引用的正式内容。
一个假设场景:三篇退款政策文章同时存在
| 版本 | 状态 | 生效日期 | 适用地区 | 核心内容摘要 |
|---|---|---|---|---|
| V1 | Deprecated | 2022-01-01 | 全球 | 退款需在收货后7天内申请 |
| V2 | Current | 2023-11-15 | 东南亚地区 | 退款窗口延长至15天,需提供物流单号 |
| V3 | Draft | 尚未生效 | 欧洲地区 | 拟将退款窗口统一调整为30天,尚未审批通过 |
如果检索只看文本相似度,V1和V2的措辞可能都和客户提问高度相关,模型没有天然的理由排除V1。但只要系统读取Status字段,答案就应该来自V2:它是当前生效版本,且地区相符。V3虽然内容更新,但状态是Draft,不能作为回答依据。真正难的部分不是设计这套字段,而是维持它——比较可行的做法是把维护纳入固定的复核节奏,比如按季度由知识负责人逐条确认Owner和Status,而不是等到客户投诉或内部审计时才发现问题。
权威判定,不能只靠模型自己"投票"
有一种直觉做法是让模型在多个候选答案之间做二次判断,比如把三篇文章都喂给模型,让它自己"选出"最合理的一篇。这种做法看似聪明,实际上把权威判定这个本该由业务规则决定的问题,又交回给了同一个可能出错的模型——如果模型本身没有能力区分Deprecated和Current,多喂几篇候选内容也不会让它突然具备这个能力,反而可能因为V1和V3的写法更详细、更有说服力,被误判为"更权威"的一篇。权威判定应该在检索阶段就用结构化字段过滤掉,而不是留到生成阶段让模型去猜。
这套治理逻辑同样适用于多语言场景:同一主题的知识文章如果存在中文、英文、东南亚地区语言等多个语言版本,Region和Status字段需要按语言版本分别维护,而不是假设所有语言版本共享同一个状态。一篇中文版本已经更新为Current,对应的英文版本却还停留在Draft或者干脆没有同步创建,客服系统如果没有意识到这种语言间的状态差异,就可能对不同语言客户给出不一致的答案,而这种不一致往往比单一语言内部的版本冲突更难被发现,因为很少有人会同时对比多个语言版本的内容。