三个坑:召回不准、更新滞后、权限穿透。 前两个是效果问题,第三个是事故。 召回不准的根子是「用户的说法」和「资料的说法」对不上——口语问「拖车」,资料写「道路救援」。 权限必须在检索之前过滤。靠提示词说「别答薪资问题」是劝,不是拦。
上一节做出了一个能跑的东西,这一节讲它为什么不靠得住。 三个坑的顺序是按「会不会出事」排的:召回不准只是效果差,更新滞后会答旧政策, 权限穿透是把不该给的东西给出去了。 这一节的第 5.1 节到第 5.5 节都会再提一次,因为它会把前面每一个「看着没问题」的地方戳破。
一、坑一:召回不准
根子在于用户的说法和资料的说法对不上。 用户问「拖车要不要钱」,资料里写「道路救援服务」,一个字都不重合。 演示里五个问题,口语问法 top1 只中 2 / 5;换成资料里的词,5 / 5。
「拖车」那一行算出来是 0.000——检索直接空手。这是纯字面检索的下限。 真平台用 embedding 模型,对同义能抓住一部分,但行业俗称、缩写、错别字照样翻车。
二、坑一的四种补法
一、混合检索。 向量召回加关键词召回,两路并起来再排。向量管同义,关键词管专有名词,互补。 二、同义词表。 把「拖车 = 道路救援」「首保 = 首次保养」这类列成表,检索前先扩展一遍。 土办法,很有效。 三、问题改写。 让模型先把用户的话改写成资料里的说法,再去检索。多一步调用,但能救回一大半。
四、把用户的话写进资料。 建库的时候顺手把「常见问法」加在每段后面。 这是最省事的一条,很多团队不做。 四条里第四条最便宜。资料不只是写给人看的,也是写给检索看的。
三、坑二:更新滞后
文档改了,索引没重建,答的还是旧政策。 演示里把保修从 3 年改成 4 年,旧索引还是答 3 年,新索引答 4 年。 这个坑最容易查——看知识库的更新时间就知道——但也最容易犯。
三条对策:改完立刻重建;给库设一个「最久多久必须重建」的规矩; 在答复里带上资料日期,让用户自己看出新旧。 第三条挺有用:答「根据 2026 年 3 月的保修政策」,用户自己会判断。不写日期, 答错了都不知道错在哪。
四、坑三:权限穿透
这是三个坑里唯一致命的。 演示里的库里同时有 HR 的薪资结构和产品的保修政策。 普通员工问「P5 职级月薪多少」,不过滤的话,检索照样把薪资那一块捞出来,分数 0.45,答得清清楚楚。 按权限过滤之后,库里根本没有那一块,检索空手,走兜底。
关键在于过滤发生在哪一步。必须在检索之前,不能靠提示词说「不要回答薪资问题」。 提示词是劝,过滤是拦。 用户换三种问法问三遍,劝就失效了。
五、权限怎么做才算数
一、分库。 公开资料一个库,部门资料一个库。这是最粗也最有效的做法。 二、给块打标。 每块资料带一个部门或密级字段,检索时按身份过滤。 三、接线上的账号体系。 智能体拿到的身份要对得上真人的身份, 不能让所有人都用一个「系统账号」去查。
三条里第三条最容易被凑合。凑合的结果是:过滤逻辑写了,但过滤用的身份是错的。 第 13 章讲多维表格与权限时会再碰到这件事,那时是在数据行这一级做过滤。
六、还有一个坑:不知道自己在编
这个坑不在教材那三条里,但落地时一样常见。 模型答完一段话,语气笃定,还带着出处编号——但出处那句其实不支撑这个结论。 对策只有一个:给人看的答复里带原始引用,让核的人能点开看原文。
还有一条工程习惯:把每次问答的「问题、召回的三段、答复」都记下来。 出问题的时候,这是唯一能复盘的东西。 没有日志的知识库,出了问题只能靠猜。
七、上线前的一张检查表
| 检查什么 | 不合格的表现 |
|---|---|
| 二十个真问题的命中率 | 该中的没中超过三成 |
| 不能答的题会不会硬答 | 答得很顺,但内容库里没有 |
| 答复有没有出处 | 说「根据资料」但指不出第几段 |
| 资料更新时间 | 显示的是三个月前 |
| 用普通账号问敏感问题 | 答出来了 |
| 换三种问法问同一件事 | 三种答案 |
六行里第五行是红线。这一行不过,别上线。 其余五行是可以边跑边改的。这一条判断很重要:不是所有问题都要在上线前解决。
八、动手 Demo:三个坑:召回不准、更新滞后、权限穿透
三个实验各对应一个坑。 第一个比对口语问法与资料用词,第二个比对旧索引与新索引,第三个用普通员工身份问薪资。
def top1(q, coll):
r = Q.retrieve(q, coll, top=1)
return (r[0][0], r[0][1]) if r else (0.0, u'')
# 坑一:同一件事,两种问法
for q, orig, key in PARA:
s0, t0 = top1(q, AUTO) # 用户口语
s1, t1 = top1(orig, AUTO) # 资料里的词
print(q, s0, key in t0, '|', orig, s1, key in t1)
# 坑三:权限必须在检索之前过滤
raw = Q.retrieve(ASK, [d for d, _p in KB], top=1) # 不过滤
view = [d for d, p in KB if p == u'public'] # 先过滤
safe = Q.retrieve(ASK, view, top=1, floor=0.10)
实跑输出:
--------------------------------------------------------------------
三个坑:召回不准、更新滞后、权限穿透
--------------------------------------------------------------------
① 召回不准:换个说法就找不到
--------------------------------------------------------------------
| 用户口语问法 | 分数 | top1 | 换成资料里的词 | 分数 | top1 |
|---|---:|---|---:|---|---:|
| 保养多久做一次 | 0.178 | 中 | 保养周期是多久 | 0.267 | 中 |
| 保修多长时间 | 0.112 | 没中 | 整车保修政策 | 0.466 | 中 |
| 拖车要不要钱 | 0.000 | 没中 | 道路救援服务 | 0.447 | 中 |
| 轮胎管不管 | 0.125 | 中 | 易损件保修范围 | 0.306 | 中 |
| 怎么约保养 | 0.109 | 没中 | 预约方式有哪些 | 0.255 | 中 |
口语问法 top1 命中 2 / 5;换成资料里的词 5 / 5。
五题里差了三题,全落在「用词不同」上。
注意「拖车要不要钱」那一行是 0.000——一个字都不重合,检索直接空手。
真平台用 embedding 模型能抓住一部分同义,但行业俗称、缩写、错别字一样抓不住。
所以成熟做法是混合检索:向量召回加关键词召回,两路并起来再排。
② 更新滞后:文档改了,索引没重建
--------------------------------------------------------------------
旧索引 → 保修政策:整车保修 3 年或 10 万公里,以先到为准。发…
新索引 → 保修政策:整车保修 4 年或 12 万公里,以先到为准。发…
文档改了,索引没重建,答的还是 3 年。这是知识库最常见的事故,也是最容易查的——看更新时间就知道。
③ 权限穿透:检索不认识你的工号
--------------------------------------------------------------------
问:P5 职级月薪多少(普通员工身份)
不过滤:召回到 0.45 分的一块 → 薪资结构:P5 职级月薪 18000 到 24000,年终…
按权限过滤后:没有召回,走兜底「这超出我能答复的范围」
! 权限必须在检索之前过滤,不能靠提示词说「不要回答薪资问题」。
提示词是劝,过滤是拦——用户问三遍,劝就失效了。
①坑一那张表五列。对照看两列分数:口语问法普遍低一截,「拖车要不要钱」是 0.000——一个字都不重合。 ②口语 2 / 5,换成资料里的词 5 / 5。差的这三分全靠用词。 ③坑二那两行最直观:旧索引答 3 年,新索引答 4 年。同一份文档,两个答案。 ④坑三最要命:不过滤时召回 0.45,把薪资结构答得清清楚楚;按权限过滤后库里没有那一块,只能走兜底。 ⑤最后那句是本节的结论:权限必须在检索之前过滤。提示词是劝,过滤是拦。
30 秒实验
- 拿五个真问题,用「用户的说法」和「资料的说法」各问一遍,看差几分。
- 查一下你的库上次重建索引是什么时候。超过一个月的,把重建排进日程。
- 用一个普通账号问一句只有管理层能看的资料。答出来了就是红线不过。
常见误区
- 「向量检索能理解同义,不用管用词。」抓一部分,抓不全。行业俗称照样翻车。
- 「提示词里写清楚不许答就行。」那是劝。用户换问法问几遍,劝就失效了。
- 「权限等上线后再加。」上线后再加等于所有人都已经看过一遍了。过滤要在检索前。
自测三问(点开对答案)
1. 召回不准的根子是什么? —— 用户的说法和资料的说法对不上。口语问「拖车」,资料写「道路救援」,字面零重合。 2. 权限过滤该放在哪一步? —— 检索之前。放在提示词里是劝,不是拦;放在生成之后是事后补救,已经漏了。 3. 上线前哪一行是红线? —— 用普通账号问敏感问题。答出来了就不能上线,其余五项可以边跑边改。知识库这条线走完了。下一章换一个角度:模型明明有资料,为什么还是答得不好。 答案在提示词里——那是唯一一个不花钱就能大幅提升的地方。
- ☐ (本篇完,下一篇 6.1 提示词的工作原理)
相关笔记
- 案例实战:打造汽车行业智能客服:那个能跑起来的客服
- 扣子知识库介绍:切分参数怎么定
- 15 数据库基础 · 索引
- 🐦 扣子开发 AI Agent · 索引