Appearance
Q32 · 为什么企业项目里的 RAG 必须重视权限、版本和引用?
假设一家公司的客服正在回答:“订单 B204 的耳机签收 20 天了,还能无理由退货吗?”公司的知识库里同时有三份看起来相关的材料:面向客服的现行售后政策、已经失效的旧政策,以及只有财务部门能看的退款审批细则。如果只把“最相似的三段文字”塞进模型,模型可能拿旧政策里的“30 天”答应退货,也可能把财务细则写进公开回复。即使它最后附了一个链接,那个链接也可能指向过期文件,或根本支撑不了它说的结论。
这就是企业 RAG 必须解决的三个问题:这位用户有权看到什么?这笔业务现在适用哪一版?答案里的每个事实能否回到可核查的来源? 它们分别对应权限、版本和引用。检索命中很准,只能说明文字相关;不能代替这三项判断。下面沿 B204 的同一次咨询,把资料入库、检索和回答逐步走一遍。
术语与例子中的名字
| 词或名字 | 先用日常话理解 | 本文例子 |
|---|---|---|
| RAG | 先从资料库找依据,再把取回的依据交给大模型组织答案 | 查售后政策后回答 B204 |
| 大语言模型 / LLM | 读取输入并生成文字的模型;它本身不负责认证登录用户 | 根据已提供的订单事实和政策写答复 |
| 检索 / 命中 | 按问题从可搜索资料中找到候选片段;“命中”不等于“允许使用” | 搜到“7 天”“30 天”等条款 |
文档块 / chunk | 从原文切出来、可以单独搜索的一段资料 | 当前政策中关于无理由退货的整条规定 |
| 索引 | 供检索服务快速查找文档块的数据结构 | 售后政策与内部文件的搜索库 |
| 身份认证 | 确认发起请求的人是谁 | 服务端确认客服员工小周的登录身份 |
| 授权 / ACL | 判断已确认身份的人能看哪些资料;ACL 是“访问控制列表” | 小周可看公开售后政策,不可看财务细则 |
| 租户 | 共用系统但数据要彼此隔离的一家公司或组织 | A 公司客服不能搜到 B 公司政策 |
| 元数据 | 附在文档块旁边、供程序过滤与追溯的字段 | tenant_id、部门权限、版本号、生效日、来源页码 |
| 版本 / 生效时间 | 文档内容的具体修订版,以及规则何时开始适用 | 旧版 P-2026-06 与现行版 P-2026-09 |
| 引用 / citation | 指明答案里的事实来自哪份资料的哪个位置 | “P-2026-09,第 2 页,无理由退货条款” |
user_id | 经登录系统确认的用户标识,来自服务端会话 | 小周在系统中的账号标识 |
tenant_id | 用户和文档所属组织的标识 | A 公司 |
doc_id / chunk_id | 原文和片段的稳定编号,便于回查 | P-2026-09 / P-2026-09-02 |
version / valid_from / valid_to | 版本号、开始生效日、停止生效日 | 当前版自 9 月 1 日起有效 |
source_uri | 原文在企业系统里的位置;访问该位置仍须再次验权 | 内部政策库的 P-2026-09 第 2 页 |
claims | 最终答案中需要证据支持的具体事实陈述 | “20 天已经超过 7 天” |
不要把“模型知道当前是 2026 年”理解为模型知道企业政策。它只能依据应用提供的可用资料回答;而“可用”同时包含有权限、版本适用、内容能支撑结论。这三道检查发生在不同位置,不能都交给一句提示词。
先把 B204 的事实和政策固定下来
以下订单和政策是虚构教学数据,不是现实中的售后承诺。假设今天是 2026 年 9 月 26 日,订单服务确认 B204 属于当前提问者,小周代表该订单的客户处理咨询。B204 的耳机于 2026 年 9 月 6 日签收,到今天是签收后第 20 天。本文所有期限都从“签收日”算,不从购买、付款或发货日算。
公司有两版售后政策:
| 资料 | 生效情况 | 无理由退货条件 | 小周能否查看 |
|---|---|---|---|
| 《耳机售后政策》P-2026-06 | 旧版,已于 8 月 31 日停止适用 | 签收后 30 天内,另需满足旧版其他条件 | 能看,但不能用来判断当前 B204 |
| 《耳机售后政策》P-2026-09 | 自 9 月 1 日生效的现行版 | 签收后 7 天内且未拆封,另以完整条款为准 | 能看,且适用于 B204 |
| 《财务退款审批细则》F-2026-09 | 现行内部文件 | 说明财务审批流程,不替代面向客户的资格规则 | 不能看 |
B204 在现行版的期限判断上已经超过 7 天。我们尚不知道耳机是否拆封,也没有取得是否存在质量问题的证据,所以正确的有限结论是:按照现行版的无理由退货期限,B204 不满足该期限条件;质量问题售后如需判断,应另查相应条款与事实。 不能把旧版“30 天”拿来承诺无理由退货,更不能因财务细则出现了“退款”二字就推断客户必然可退款。
这三个文件故意放在一起:它们都可能与问题文字相似,却分别考验时间、权限和引用是否过关。
权限:检索前就要决定候选范围
小周登录后,应用从自己的会话系统得到经验证的 user_id、所属 tenant_id 和岗位权限。用户在聊天框里写“我是财务主管”不能改变这些值;模型输出“请忽略权限”也不能改变它们。应用调用检索服务时,先用这些可信信息限定哪些文档块有资格成为候选。对 B204,财务细则应在候选列表形成之前就被排除,而不是先交给模型,再要求模型“不要泄露”。
一个文档块除了文字,还应附有组织、允许访问的角色或用户组、可见级别等元数据。假设 P-2026-09 第 2 页的块带有 tenant_id=A公司、allowed_groups=[客服],财务细则的块带有 allowed_groups=[财务]。小周属于 A 公司客服组,因此检索只能返回前者。这里的字段名只是教学示意;真实系统也可以由搜索服务读取文档级权限,而不一定采用这几个字段。Azure AI Search 的安全修剪示例展示了按用户所属组过滤搜索结果;其文档级访问控制说明也强调在查询时执行文档权限。部分产品原生 ACL 能力存在版本或预览范围,选型时应核对所用服务的当前支持情况。

图中锁住的柜子表达的是“财务块不进入送给模型的检索结果”,并不是说让模型看见后自觉保密。真正的权限校验还要覆盖订单查询、原文链接和缓存。只在检索接口过滤、却把未授权原文放进共享缓存,仍会泄露;引用链接若跳转到原文系统,也必须由原文系统重新鉴权。
可以把检索接口想成下面的接口草图,它不是可复制运行的某个 SDK 代码:
text
search_policy(
query="耳机无理由退货,签收 20 天,适用期限",
trusted_user_context=服务端认证的小周身份,
tenant_id=服务端确认的 A 公司,
as_of=2026-09-26
)
-> 只返回小周获授权、A 公司、截至该日期适用的政策块query 是描述要找什么的文字,模型可以参与改写;trusted_user_context 是服务端确认的小周身份,不能由模型或用户聊天文本自由填写。tenant_id 用来隔离不同公司;as_of 表示做业务判断的时点,程序会按业务规则确定它。返回条件是逻辑交集:属于本租户 ∩ 当前用户可看 ∩ 对这笔业务有效,然后才在这个集合里按相关性排序。AWS Bedrock 的 ACL 感知检索文档特别说明,检索层的 ACL 过滤不承担用户身份认证;调用方须提供已经验证的用户上下文。这个边界对自建系统也一样重要。
为什么不能只在结果出来后删除? 检索服务若先拿了无权块并把它送进模型上下文,即使最终界面没有展示原文,模型的生成仍可能受该块影响。若先在应用里粗略筛选,但重排器、缓存、日志或后续补查又看到原文,同样存在暴露面。应把权限条件放在可信检索链路里,并检查每个会接触原文的环节。
权限变更也要生效。 假设小周今天从客服岗位调离,昨天生成的搜索缓存、文档链接和会话摘要不能让他继续访问客服资料。权限撤销后至少要在下一次请求按当前身份重新过滤;对缓存设置与用户、权限版本相匹配的键和失效策略。这里没有通用的“立刻全系统同步”魔法:身份目录、搜索索引、缓存与原文系统的更新可能有延迟。高敏资料要定义可接受的撤销时延,并用测试验证;无法确认权限时采用拒绝访问,不要猜测“之前能看,现在大概也能看”。
版本:相关的旧条款仍然是错依据
如果只问“耳机、无理由、签收后多少天”,P-2026-06 中的“30 天”与问题非常相关。检索的相似度不会告诉我们这条政策已经失效。企业知识库还会有旧合同、新合同、地区补充条款、草稿、正式发布版和不同商品类别。它们常常使用几乎相同的词,只差一个数字或条件。版本判断必须来自可追踪的业务事实与文档元数据。
对 B204,程序先从可信订单服务拿签收日、商品类别、销售地区等事实,再按政策服务维护的适用规则,得到该订单应使用 P-2026-09。这里恰好“订单 9 月 6 日签收,当前版 9 月 1 日生效”,所以判断简单;真实政策可能按下单日或合同签署日锁定版本,甚至有过渡期。不能把“总是选最新版”写死在检索器里。应由业务负责人定义“哪个事件日期决定版本”,程序把得到的版本和判断依据一同记录,然后过滤检索。若版本规则不明确,停止资格判断并交由人工核实。
文档入库时,每个块至少应能追到原文 ID、版本、发布状态、生效时间、失效时间、商品或地区适用范围。若一份政策切成十个块,这些块都需要继承正确的版本信息;不能只给整篇文档一个标题,切块后丢掉时间与权限。知识库更新时还要让过期块退出“当前有效”集合,删除或修改源文件后使索引同步。Azure AI Search 关于索引器变更与删除检测的文档说明,源数据删除后的索引更新依赖相应的变更或删除检测配置;不能假定“原文件删了,搜索结果一定立刻消失”。

图中 B204 的“20 天”与现行条款的“7 天”是同一时间起点的比较。旧版“30 天”被标为失效,提醒我们它可能被搜索到,却不应参与当前结论。右侧来源标记应能回到 P-2026-09 的具体页面;仅有“来源:政策”四个字无法让人复核哪版、哪条。
为什么版本号还不够? 若两份文件都叫 V2,却分属不同地区;或者现行 V2 是 9 月 1 日发布、9 月 15 日才生效,只记录 version=V2 仍不足以判断 B204。检索至少要结合发布状态、生效区间、适用商品和地区。对于正在追溯“去年某笔订单为何这样处理”的问题,as_of 还可能是去年业务发生时,而不是今天。回答里应明确是在“今天的现行规则”还是“当时的适用规则”下判断。
如果旧新版本在索引里同时出现怎么办? 先看这是为历史查询有意保留,还是同步遗漏。历史版本可以留在库中供审计,但当前业务查询应按适用规则过滤。若系统在同一业务范围同一时点找到两个互相冲突、都标为有效的条款,不要让模型按文字流畅程度选一条;应标记冲突并查政策发布记录。来源冲突是数据治理问题,不是提示词能“推理”出权威性的地方。
引用:答案要能回到支持它的原文
有权限、版本正确之后,还要防止“看过资料却说了资料没有说的事”。检索返回 P-2026-09 第 2 页的“签收后 7 天内且未拆封可申请无理由退货”,模型可以据此计算 20 大于 7;它不能据此说“第 20 天一定能申请质量问题退款”。后者需要另一条质量问题售后政策和对应事实。引用的任务是把答案中的具体事实与真实证据连起来,方便用户复核,也方便维护者定位错误。
一个可用的检索结果应保留原文片段 text、doc_id、chunk_id、version、章节或页码 section、原文位置 source_uri,还可记录检索时确认的权限与适用条件。最后展示给用户的引用应指向他也有权打开的原文位置;不能把模型生成的“[1]”当作证据本身。AWS Bedrock 的引用结构文档把生成回答中的片段与取回的来源资料关联起来;这说明引用至少要有“答案位置→检索来源”的映射,但映射存在不保证逻辑推断正确。
对 B204,可把答案拆成三个可检查的陈述:
| 答案中的陈述 | 需要的事实或证据 | 能否现在说 |
|---|---|---|
| “B204 已签收 20 天” | 订单服务中的签收日,以及今天的日期 | 订单核验成功后可以 |
| “现行无理由退货期限是签收后 7 天内” | P-2026-09 有效版第 2 页原文 | 查到并确认适用后可以,附来源 |
| “B204 一定能因质量问题退款” | 质量问题条款、故障认定、处理结果 | 目前证据不足,不可以 |
因此,合适的答复可以是:“系统记录 B204 于 9 月 6 日签收,到 9 月 26 日已 20 天。按目前适用的《耳机售后政策》P-2026-09 第 2 页,无理由退货需在签收后 7 天内且满足其他条件;B204 已超过这一期限。若你想咨询质量问题售后,我需要再核对相应规则和耳机情况。”用户能看到政策的具体版本和位置;订单信息则来自经核验的订单系统,不应被伪装成政策引用。
应用还应做一次引用校验:引用的 chunk_id 是否真的来自本轮获授权且有效的检索结果?标注的版本与页面是否匹配?答案中的“7 天”“签收”是否确实能由该片段支持?前两项适合程序做确定性检查,后一项可能需要规则、人工抽检或有据性评测。不要让模型随手编造一个看起来真实的政策编号。Microsoft 的 RAG 提示词工程指南强调给模型明确来源和在信息不足时说明不足;对不同时间版本资料相互矛盾的情况,也需要先处理证据质量。
引用不是授权令牌。 小周在系统内能打开政策原文,不代表客户可以打开内部地址。面向客户的界面可以展示可公开的政策页;如果来源仅内部可见,可展示经过批准的条款摘要并给客服留内部追溯编号。点击来源时,原文系统仍要按点击者身份检查权限。不同用户看到的“可引用资料集合”可能不同。
把三道检查放进同一条请求链
下面按实际执行顺序回放 B204。顺序很重要:若先让模型看见所有候选,再过滤输出,就已经晚了。
- 接收请求并认证。 应用确认小周登录,得到可信
user_id和 A 公司tenant_id;从订单服务确认 B204 的归属、签收日及商品信息。用户聊天文本里的身份声明只作为普通文字,不覆盖会话身份。 - 确定要查的规则。 根据商品、地区和签收事实,政策服务确定本次“截至 2026 年 9 月 26 日的无理由退货判断”适用 P-2026-09。记录版本判定所依据的业务日期;若订单系统超时,不能凭用户说“20 天”直接保证资格。
- 执行受限检索。 检索器在 A 公司、小周可看、当前有效、耳机商品适用的块里搜索。旧版 P-2026-06 和财务 F-2026-09 都不能进入本次候选。即使它们文字更像用户问题,也不能抢占答案依据。
- 交给模型组织回答。 只把必要的订单事实和 P-2026-09 第 2 页原文交给模型。提示它区分已证实事实与未知条件,必要时补查质量问题条款;模型没有权力扩大检索权限或宣布另一个版本生效。
- 校验并展示。 应用确认最终引用确实指向本轮允许的 P-2026-09 块,数字和条件没有被改写,链接对目标读者可用。若证据缺失、来源打不开或条款矛盾,输出“目前无法核实完整资格”,转人工或重试数据同步,而不是生成一个完整但无法追溯的承诺。
这个流程里的“可信事实”来自订单、身份、政策发布系统;“生成文字”才是模型的工作。把角色分清,才能定位错在权限过滤、版本判定、索引更新,还是模型对证据的理解。Q31说明了 Agent 怎样决定是否补查;无论 Agent 怎么选择,以上权限与有效性限制都应由应用执行。
三种经常发生的失败,以及该怎么处理
员工权限已撤销,索引或缓存仍返回原文。 例如小周 9 月 26 日离职,但客户端沿用 9 月 25 日的检索结果。若只在文档入库时写“客服可见”,没有按当前会话与权限变更重新核验,就会泄露。应使缓存按身份与权限版本隔离,敏感资料在读取缓存后仍验权;权限同步不确定时拒绝回答敏感内容,并监控撤销生效时间。若原文链接可绕过应用直接打开,还要修复原文系统的权限检查。
新政策已发布,旧块还被当成现行。 例如 P-2026-09 已生效,但旧版的元数据没有失效日期,或更新索引的任务失败。模型若拿“30 天”作答,流畅程度会掩盖错误。应在发布流程里同步更新原文、索引与失效标记;用 B204 这类边界样本做回归;检索日志保留本次使用的 doc_id、版本与时间。若检索同时返回相互冲突的两版且无法确定权威版,应停止自动判定。文档的物理删除、索引删除和应用缓存删除可能有不同延迟,不能把一次“上传新版”当成全链路完成。
答案写了引用,却引用错条款。 例如模型写“20 天内可无理由退货〔P-2026-09 第 2 页〕”,而第 2 页实际写 7 天。链接是真的,结论仍是假的。可先程序检查引用是否来自本轮合法结果,再针对重要结论做有据性校验;必要时让人工复核。若缺少能支撑结论的段落,就明确说“目前找到的条款不足以判断”,不要用不相干的链接填空。对外承诺、费用、资格等高风险回答应有更严格的校验和人工兜底。
还要测一个常被忽略的组合:正确的旧资料 + 错误的时间问题。如果用户明确问“2026 年 7 月签收的订单当时按什么政策处理”,旧版可能正是应该检索的资料。系统不能简单“永远删光旧版”;它要理解查询时点、订单适用规则和历史审计目的。版本过滤不是按文件新旧粗暴排序,而是按这次业务问题选对生效范围。
怎样设计可验证的测试
只测“模型回答得像不像人”无法发现这类问题。最少准备以下成对样本,让相似的提问在不同身份、日期或证据状态下得出不同结果:
| 测试变化 | 期望观察 |
|---|---|
| 小周与财务员工问同一 B204 问题 | 两人的检索可见集合不同;小周结果中没有 F-2026-09 |
| 把小周改成 B 公司账号 | A 公司政策和订单都不可见;不能靠用户自报“我在 A 公司”绕过 |
| B204 签收日由 9 月 6 日改为 8 月 20 日 | 按真实版本适用规则重新判断;不能机械套现行政策 |
| 发布 P-2026-09 后旧版仍在索引 | 当前咨询不引用旧版;历史追溯仍可按授权找到旧版 |
| 把 P-2026-09 的来源链接改成无权或失效 | 界面不展示不可用的伪引用,回答标记来源暂无法核实 |
| 只检索到无理由条款,用户追问故障退款 | 不把无理由条款当质量退款依据;补查或转人工 |
评测时分别看四项:越权召回率(不该看的块是否进入结果,目标为零)、有效版本命中(该用的版本是否找到)、结论有据性(答案的事实是否被来源支持)、引用可回查率(目标读者是否真能打开对应版本和位置)。也要观察索引更新与权限撤销的延迟,以及出现问题时是否安全停止。具体指标定义与阈值按业务风险定;不要用单一“回答满意度”掩盖泄露或过期政策。
日志记录一次请求的身份与权限判定结果、版本判定、候选块编号、模型使用的证据和最终引用,方便追踪。但日志本身也可能包含私人订单和内部原文,应控制保存范围、访问权限和保留时长。审核时可用稳定编号关联原文,而不必把整份敏感文件复制到每条日志里。
面试时怎样回答
可以这样说:“企业 RAG 不只是把相似片段给模型。首先,应用从登录会话取得可信身份,在检索时按租户和文档权限过滤;模型不能自己决定用户能看什么。其次,文档块要带版本、生效时间和适用范围,结合订单等业务事实选本次应使用的规则,并处理旧版、索引更新和缓存失效。最后,回答要引用本轮获授权且有效的具体原文位置,校验结论确实被该段支持,链接也要让目标读者有权打开。比如耳机订单签收 20 天,旧版写 30 天、现行版写 7 天时,要按业务时间选现行适用版,不能因为旧版更相似就承诺退货。查不到有效依据、权限不明或版本冲突时,我会让系统停止资格判断并补查或转人工。”
面试官若继续问“检索后的 Prompt 写‘不要泄密’能否代替权限过滤?”,答案是不能:敏感片段一旦进入模型上下文就已经越过了访问边界,必须在可信检索链路中过滤。问“引用了来源是否就保证答案正确?”,也不能:来源可能是旧版,或根本不支持结论;要核对版本、权限和每个关键陈述与原文的关系。问“旧版政策要不要删除?”,可答:历史审计往往需要保留,但当前查询必须按生效规则排除旧版;删除与保留由业务和合规要求决定,不能让它意外混入当前答案。