企业软件 SaaS

多租户 RAG 助手,准确率 92% 且租户数据严格隔离

SaaS 场景的难点是多租户隔离:几千家企业客户的制度文档必须互不可见,同时还要保证检索质量。我们用租户级索引隔离 + 混合检索解决。

行业
HR SaaS
服务租户
3,200+ 企业
月问答量
约 140 万次
服务模式
AI 应用交付 + 持续优化

92%

答案准确率

300 题评测集

1.4s

首字延迟 P95

44%

推理成本下降

模型分层 + 提示词缓存

61%

人工客服工单下降

需求与约束

客户的 HR SaaS 产品里,每家企业都会上传自己的员工手册、考勤制度、报销规则。员工经常为「年假怎么算」「差旅住宿标准多少」这类问题咨询 HR,而答案其实都写在制度文档里。

产品侧想做一个内嵌的问答助手。核心约束有三个:一是不同企业的文档绝对不能串(一次泄露就是重大事故);二是答案必须带出处,员工能点开看原文,否则 HR 不敢用;三是成本要能覆盖,按每租户每月的定价倒推,单次问答成本有上限。

多租户 RAG 架构

接入

SaaS 前端嵌入 API Gateway 租户 JWT 鉴权 会话管理

编排

租户上下文注入 查询改写 混合召回 Rerank 答案生成

检索

OpenSearch(租户过滤) BM25 通道 向量通道 RRF 融合

模型

Haiku(意图分类) Sonnet(答案生成) Titan(向量化) Guardrails

数据

S3 租户前缀隔离 解析切分管道 增量索引 版本管理

运营

按租户 token 计量 反馈收集 评测集回归 审计日志

租户隔离做在三层:S3 前缀 + IAM 策略、OpenSearch 索引级过滤、以及应用层的强制 tenant_id 校验。任一层失效还有另两层兜住。

成本怎么控住

按定价倒推,单次问答的模型成本有明确上限。直接全部用 Sonnet 会超。我们的做法是分层:先用 Haiku 做意图分类和查询改写(便宜且够用),只有最终答案生成才用 Sonnet。

另一个大头是系统提示词与检索上下文。这部分内容在同一租户内高度重复,开启提示词缓存后命中率超过 70%,缓存部分的成本大幅下降。再配合严格控制注入的文档块数量(Top 5 而不是 Top 20),整体成本降了 44%。

  • 意图分类与查询改写走 Haiku,成本约为 Sonnet 的 1/12
  • 系统提示词与租户上下文启用提示词缓存,命中率 70%+
  • 召回 50 条后重排到 Top 5,控制注入 token 量
  • 简单问题(打招呼、无关问题)直接短路返回,不调用生成模型
  • 按租户计量 token,异常用量自动告警与限流
  • 分层路由节省约 28%
  • 提示词缓存节省约 12%
  • 上下文精简节省约 4%
  • 综合降本44%

准确率优化过程

阶段做法评测集准确率
基线纯向量检索 Top 5 + Sonnet 生成68%
加关键词通道向量 + BM25,RRF 融合79%
加重排召回 50 条后 Rerank 到 Top 587%
父子块策略小块检索、大块生成,保留上下文90%
表格单独处理表格解析成 Markdown 整块入索引92%

每一步都在同一个 300 题评测集上测量。没有评测集的话,这些优化根本无法验证是否有效。

上线前的隔离验证

我们做了专项的隔离测试:构造 200 组跨租户查询,验证任何租户的查询都不可能召回其他租户的文档。同时做了越权尝试测试(伪造 tenant_id、篡改 JWT)。这类测试必须在上线前做完,出事之后再补就晚了。

他们坚持要先做评测集再动手,当时我们觉得是浪费两周。后来每次优化都能看到准确率数字变化,才明白没有这个东西根本不知道自己在往哪个方向走。

客户产品负责人HR SaaS 产品线

技术栈

  • Bedrock
  • Claude
  • Titan Embeddings
  • OpenSearch Serverless
  • Lambda
  • Step Functions
  • DynamoDB
  • S3
  • API Gateway
  • Guardrails

下一步

把云的复杂度交给我们,你只管做业务

留下需求,沐杉云的解决方案架构师会在一个工作日内联系你,提供免费的现状评估、迁移方案草案与 TCO 测算表。