
“退款多久到账”和“退货后钱什么时候回来”可能共享答案“我的退款到账了吗”却需要当前订单状态。向量相似度很高不代表两次请求具有相同的业务答案。语义缓存最难的部分通常不是找近邻而是判断能不能安全复用。先选适合缓存的任务我会优先考虑低时效、无个人状态、答案来源明确的说明类问题。库存、余额、审批结果、个人健康或财务决策不应因为语句相近就复用旧答复。即使FAQ适合缓存也要把政策版本、语言和产品范围放进有效条件。Qdrant的多租户文档展示了按payload过滤和分片组织数据的方式。对语义缓存而言tenant字段只是数据必须在受信的查询层应用过滤不能期待写入一个字段就自动完成授权。多租户文档图里先限定范围再寻找候选最后核对TTL、引用证据与访问权限。相似度只负责提出候选不承担最后裁决。若缓存原回答引用的文件已失效即便TTL未过也应拒绝复用。用可复现的反例检查过滤顺序下面省略向量模型直接使用固定候选分数重点验证安全过滤。真实检索层必须在同一租户范围内召回例子再次检查范围作为防御措施。高分不覆盖租户错误、版本错误或过期。def select(candidates, tenant, version, now, threshold0.9): valid [c for c in candidates if c[tenant] tenant and c[version] version and c[expires] now and c[evidence_valid] and c[score] threshold] return max(valid, keylambda c: c[score])[answer] if valid else None base dict(tenanta, versionv2, expires200, evidence_validTrue, score0.95, answercurrent FAQ) rows [dict(base, tenantb, score0.99), dict(base, versionv1, score0.98), dict(base, expires50, score0.97), base] assert select(rows, a, v2, 100) current FAQ assert select(rows[:-1], a, v2, 100) is None assert select([dict(base, evidence_validFalse)], a, v2, 100) is None print(tenant, version, expiry and evidence filters passed)这段例子没有连接向量库、嵌入模型或Redis。它只证明筛选函数会拒绝三个无效候选。真正上线时还要测试权限变化、证据撤回、删除请求和并发更新避免旧条目长期滞留。别把缓存命中叫作零消耗命中仍可能消耗嵌入计算、向量查询、存储、网络与审计资源某些供应商也对缓存输入收费。成本应按一次有效完成计算并包含未命中后继续生成的路径。布隆过滤器也不能提供语义等价或权限判断。概率成员测试与假阳性应记录的量它回答什么有效复用率有多少请求通过全部条件错误复用率高相似但答案不适用的比例证据失效清理时间政策变更多久能生效完成任务总成本命中与回退都算进去是否划算阈值需要用业务样本校准。先用影子模式只记录候选而不返回缓存对比人工判断再让低风险小流量使用保留一键关闭。缓存越接近答案出口越需要把“拒绝复用”做成正常路径。