事情本身不复杂,线索都在日志里。多租户知识库先取 top 20 再按 tenant 过滤,热门租户的数据占满候选,小租户经常只剩 1 条甚至 0 条,用户看到的是“没有找到相关内容”。
第一反应是「租户字段没有建索引,过滤只能后置」,验证下来不成立。
把日志和配置对完,能解释这个现象的基本就这几处。过滤发生在检索之后,候选被大租户占满。少数情况下是top_k 按全局设置,没有按租户数据量调整。
还有一种情况,缺少过滤后为空时的兜底策略。
先统计过滤后剩余条数的分布
python -c "import json;d=json.load(open('hits.json'));print(sorted(len(x['hits']) for x in d)[:20])"
再往下把租户条件下推到向量检索里
python search.py --collection faq --filter 'tenant=="t42"' --top-k 20
给过滤字段建索引
python index_field.py --collection faq --field tenant --type keyword
末了对比下推前后小租户的命中率
python recall_eval.py --tenants small --before hits.json --after hits_v2.json
恢复的判定其实很直接。小租户的平均候选数从 1.2 条回到 18 条,空结果比例从 21% 降到 0.5%,大租户的延迟没有变化。
容易忽略的是,后置过滤等于先浪费候选再丢掉,向量库支持带条件检索就用它;字段没索引时下推也会慢,索引和查询要一起改。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
