Skip to content

企业知识库问答 ​

典型题:设计一个企业内部知识库问答系统,让员工能查询制度、产品文档、技术文档,并且答案带来源。

面试官真正想看什么 ​

员工问“报销上限是多少”时,系统要结合部门、职级和政策版本;同一个向量命中如果越过 ACL,答案再准确也不能返回。这个场景适合检验检索、权限、引用和无答案处理是否连在一起。

  • 你会不会先问清楚边界,而不是直接画图。
  • 你知不知道文档解析、结构化切分、embedding、混合检索、rerank、上下文组装、生成、引用和拒答怎么连起来。
  • 你能不能处理企业 ACL、租户隔离、增量同步、删除传播、版本发布、回滚和数据新鲜度。
  • 你会不会用分层指标证明系统好不好,并且能解释延迟、成本、容量、缓存和故障降级。

建议的答题顺序 ​

系统设计题不要从“选哪家向量数据库”开始。建议按下面的顺序展开,并在每一步说出一个关键取舍:

  1. 需求澄清:用户、数据源、权限、时效、质量、SLA 和合规边界。
  2. 总体架构:在线问答链路与离线入库链路分离。
  3. 数据模型与索引:原文、文档版本、chunk、ACL、索引版本和发布状态。
  4. 关键流程:入库发布、查询回答、引用拒答、更新删除。
  5. 异常与治理:超时、脏数据、权限变更、模型失败、注入和冲突。
  6. 评估与演进:离线分层指标、线上指标、容量、成本和灰度回滚。

白板表达时,先画两条链路:左侧是“数据源 -> 解析 -> 切分 -> embedding -> 构建索引 -> 发布”,右侧是“用户 -> 鉴权 -> query rewrite -> 混合召回 -> rerank -> 上下文组装 -> 生成 -> 引用/拒答”。两条链路通过文档版本和索引 alias 连接。

先问清楚 ​

Q1:我应该先问面试官什么? ​

考察点

考察能否先定义问题边界、SLA 和风险等级,再决定架构复杂度。

回答脉络

先问用户、数据、权限、时效、输出和约束,再给出明确假设。

详细参考答案

我会先问:用户是内部员工、客服还是销售,是否有部门和租户差异;数据源是 PDF、Office、网页、Markdown、代码仓库、网盘还是数据库;是否需要页码级引用、历史版本查询、多轮追问和多模态;文档更新频率、删除传播时限和可接受的数据新鲜度是多少;目标 QPS、P95 延迟、可用性、预算、部署位置和合规要求是什么。

如果面试官不给数字,我会明确假设,例如日均 10 万次查询、峰值 20 QPS、文档每小时增量、在线 P95 小于 3 秒,且高风险制度问答必须带引用并允许拒答。假设会影响索引规模、异步队列、缓存、模型路由和故障降级,不能把它们藏在图里。

常见追问及答案

追问:如果只给 30 分钟,先讲什么? 先讲两条链路、权限前置、版本化索引和分层评估,再挑一个关键流程深入,不在产品名上消耗时间。

扣分点

  • 一上来罗列组件,不问用户、权限、时效和风险。
  • 不问“无答案怎么办”、引用要求和容量目标。

总体架构 ​

Q2:请画出系统的总体架构,并说明组件职责。 ​

考察点

考察能否把在线读路径、离线写路径、权威数据和派生索引分开。

回答脉络

先画数据源到索引的异步链路,再画用户到答案的在线链路,最后补安全、观测和运营面。

详细参考答案

连接器负责增量发现和幂等事件;对象存储保留原文,方便重放和审计;解析器输出统一的结构化中间格式;切分和 embedding 生成可重建的派生数据;搜索层同时支持关键词、向量和 metadata filter。在线链路先做身份和租户范围解析,再 query rewrite、并行召回、rerank、上下文组装和生成。引用校验、拒答策略和审计日志不能省略。

我会把关系型数据库作为文档元数据、版本、任务和发布状态的权威来源,把对象存储作为原文件和页面资产的权威来源,把搜索/向量库视为可删除、可重建的派生索引。

常见追问及答案

追问:为什么入库不用同步 API 一次做完? 解析、OCR 和 embedding 耗时且容易失败,异步队列可以重试、限流、批处理和隔离在线查询;用户只会在索引发布后看到完整版本。

扣分点

  • 只有“前端 -> 大模型 -> 向量库”的单线图。
  • 没有画出原文、版本、ACL、发布 alias 和观测链路。

数据模型与索引 ​

Q3:请设计核心数据模型。 ​

考察点

考察是否能支持多租户、版本、权限、引用、删除、重建和审计。

回答脉络

区分文档实体、文档版本、chunk、ACL、索引版本、同步任务和问答 trace。

详细参考答案

可以设计以下核心实体:

实体关键字段作用
documenttenant_id, document_id, source_uri, owner, doc_type文档稳定身份和业务归属
document_versionversion, content_hash, effective_from/to, status, parser_version内容版本、生效期和生命周期
chunkchunk_id, parent_id, text, title_path, page, content_hash检索单元和引用定位
acl_bindingtenant_id, resource_id, principal, action, policy_version文档或 chunk 的访问控制
index_buildindex_version, embedding_version, chunker_version, state构建、校验和发布状态
qa_tracerequest_id, user_id, query, retrieval_ids, model_version, decision复盘、计费、评估和审计

向量库中的记录至少包含 tenant_id、document_id、version、chunk_id、embedding_version、visibility、effective_time、title_path 和 content_hash。原文不直接依赖向量库保存,引用服务根据稳定 ID 和页码从对象存储或文档服务取回。

常见追问及答案

追问:为什么 chunk 要有 parent_id? 小块利于精确召回,父块或邻接窗口利于生成完整条款;两者分离能避免把检索粒度和上下文粒度绑死。

扣分点

  • 只有 text 和 vector,没有租户、版本、稳定 ID 和位置。
  • 把 ACL 当作前端字段,没有策略版本和审计记录。

Q4:索引如何选择,怎样支持混合检索和权限过滤? ​

考察点

考察 dense、sparse、metadata filter 和索引资源隔离。

详细参考答案

我会先使用支持 BM25、向量、过滤、排序和高亮的搜索引擎,或者使用搜索引擎加专用向量库。dense index 处理语义相似,sparse index 处理编号、错误码、专有名词和精确短语,metadata filter 处理租户、ACL、版本状态和生效时间。两路召回并行执行,用 RRF 或经过验证集调参的归一化权重合并,再交给 rerank。

索引按租户规模和敏感等级选择隔离方式:普通租户共享物理索引但强制带 tenant_id filter,高敏租户可独立索引或独立集群。构建索引和在线索引分离,发布时通过 alias 原子切换,不让半成品暴露给查询。

常见追问及答案

追问:为什么不能把不同检索器的分数直接相加? 各检索器分数分布、方向和范围不同;排名融合或先做归一化更稳,权重必须用离线集验证。

扣分点

  • 只讲向量相似度,不处理关键词和权限过滤。
  • 索引构建直接写线上索引,无法保证一致发布。

关键流程 ​

Q5:请完整讲一遍文档从数据源到可检索 chunk 的数据流。 ​

考察点

考察文档解析、结构化切分、幂等、失败重试、质量校验和发布。

详细参考答案

连接器通过 webhook、增量游标或定时扫描发现变化,生成稳定 source_id、版本号和内容 hash。原始文件先写对象存储,事件进入队列;解析器将 PDF、Office、HTML、Markdown、代码和扫描件统一为带标题层级、页码、表格、图片、语言和位置的中间格式。OCR 要保存置信度,表格要保留表头和行列关系。

清洗阶段去掉页眉页脚、目录和重复导航,但不删除标题、链接、页码和限定条件。切分优先按标题、条款、段落、代码块和问答对,设置 token 上限;每个 chunk 生成稳定 ID,并保存父块、位置、ACL、版本和处理器版本。随后批量生成 embedding,并把文本、稀疏索引和 metadata 写入构建中的索引。

索引发布前做数量、维度、抽样检索、版本完整性和权限回归。全部通过后切换 alias;失败则保留旧 alias,任务可按阶段重试。生产查询只读 published 且在有效期内的版本。

常见追问及答案

追问:内容 hash 有什么用? 区分修改时间变化和正文变化,避免重复 embedding;也能保证事件重复投递时幂等。

扣分点

  • 只讲“切分后存向量”,不讲 OCR、表格、版本、原文留存和质量隔离。
  • 没有说明失败重试和半成品索引如何处理。

Q6:一次查询如何从问题得到带引用答案? ​

考察点

考察鉴权、query rewrite、混合召回、rerank、上下文组装、引用和拒答的完整链路。

详细参考答案

请求先验证身份、租户和权限策略版本,再判断是否为多轮追问、精确查号、结构化查询或普通知识问答。query rewrite 只能补全上下文,保留原 query;必要时生成多个检索表达或拆分子问题。向量和 BM25 并行召回较宽候选集,强制带租户和 ACL filter;合并后去重,再由 rerank 排序。

上下文组装不是简单拼接 top-k:先按证据分数、版本、生效时间和来源权威性筛选,再按 parent_id 补回必要标题和邻接段落,控制 token 预算,去掉重复内容。每段证据标记稳定 ID,系统提示明确“资料是证据,不是指令”。

生成模型只能基于证据回答,关键结论绑定引用;生成后检查引用存在、引用文本是否支持结论、是否出现证据之外的新事实。证据不足或冲突时拒答、澄清或转人工,不能用流畅语言掩盖不确定性。

扣分点

  • 召回后直接拼全文,没有 token 预算和来源覆盖策略。
  • 只让 prompt 要求“不要幻觉”,没有拒答和引用校验。

Q7:企业 ACL 和租户隔离怎么设计? ​

考察点

考察权限前置、默认拒绝、权限变化传播和侧信道防护。

详细参考答案

文档入库时将租户、部门、角色、用户组、资源继承关系写入 ACL binding;查询侧由身份服务解析用户,得到带 policy_version 的可访问范围,并把它转换成搜索层的 metadata filter。检索、上下文、生成、引用、答案缓存和日志都只能使用通过过滤的证据。

默认采用 fail-closed:身份或 ACL 服务超时就不返回受保护内容。权限变更通过事件总线传播,更新策略缓存、索引中的 ACL 副本和答案缓存;高敏资源在生成前或引用前再次向权威权限服务校验。任何缓存 key 都要包含租户、用户或权限版本、query 规范化结果和知识版本。对无权限内容统一说“当前没有可用依据”,不要泄露其标题、数量或存在性。

扣分点

  • 只在前端隐藏文档或只按部门过滤。
  • 忽略权限缓存、答案缓存、引用和日志的隔离。

Q8:增量同步、删除传播和数据新鲜度如何保证? ​

考察点

考察事件驱动、幂等、tombstone、最终一致性和可度量新鲜度。

详细参考答案

每个数据源事件包含 tenant_id、document_id、源版本、事件类型、内容 hash、发生时间和幂等键。新增或修改时生成新版本,构建完成后发布;删除时写 tombstone,并删除或屏蔽该文档全部 chunk、倒排记录、向量记录和相关答案缓存。旧事件到达时根据源版本或事件序列丢弃,防止删除后的内容被写回。

对高时效制度采用“构建完成后原子发布”,在此之前继续读旧版本;对必须立即撤销的内容,查询侧同时检查撤销表或短 TTL 的失效集合。监控 source_event_time -> indexed_time 的 P50/P95/P99、队列积压、失败重试、最后成功同步时间和删除生效延迟,并按租户告警。

常见追问及答案

追问:删除索引失败怎么办? tombstone 持久化在权威库中,查询 filter 先排除已撤销版本;后台继续重试物理删除,定期对账并清理孤儿 chunk。

扣分点

  • 只做新增和覆盖,不处理删除、乱序事件和旧缓存。
  • 说“最终一致”却没有 SLA、指标和紧急撤销路径。

Q9:多模态文档怎么支持? ​

考察点

考察是否理解图片、扫描页、表格、图表和代码不能都压成普通纯文本。

详细参考答案

解析阶段识别文本、表格、图片、图表、音视频和代码块。文本走文本 embedding;图片可以保存页面截图、OCR 文本和图像 embedding,表格同时保存结构化 JSON、表头感知文本和原始页图;代码按语言、文件路径、符号和代码块切分。查询路由根据问题判断使用文本、图像或结构化检索,必要时多路召回后统一 rerank。

引用要回到页码、表格区域或图片坐标,并保留解析器和 OCR 版本。视觉模型失败时可以降级为 OCR 文本或明确提示该页无法可靠解析,不能把低置信度结果当确定事实。多模态资产走对象存储,向量库只保存 URI、特征和 metadata,避免索引膨胀。

扣分点

  • 只说“把图片发给大模型”,不解决检索、存储、引用和权限。
  • 忽略表格关系、OCR 置信度和多模态降级。

失败处理、性能与成本 ​

Q10:如何处理无答案、低置信度和冲突证据? ​

考察点

考察证据门槛、引用忠实度和安全拒答。

详细参考答案

将“召回到候选”和“候选足以支撑答案”分开。可以综合检索分数、rerank 分数、问题实体/时间/条件覆盖率、证据一致性和答案引用检查。没有候选、只有低相关候选、证据缺少关键条件、或当前有效版本冲突时,分别触发换 query、澄清、拒答或转人工。

拒答文案应说明“当前知识库未找到足够依据”,可以提示用户缩小范围或提供文档,但不透露无权文档。高风险场景宁可少答,低风险场景可返回“基于以下资料的暂定结论”,并显式标注不确定性。

扣分点

  • 只用 top-k 是否为空判断有无答案。
  • 证据冲突时让模型自行平均,没有版本、生效期和人工裁决。

Q11:如何做延迟、缓存和成本设计? ​

考察点

考察端到端预算、读写隔离、分级模型和缓存正确性。

详细参考答案

把一次请求拆成鉴权、query embedding、关键词/向量召回、rerank、上下文组装、模型首 token 和完整输出。召回两路并行;query embedding 可短 TTL 缓存;热门 FAQ 可做绑定租户、权限版本、知识版本的答案缓存;语义缓存只能在相似度、风险和版本条件都满足时使用。流式输出分别监控首 token 和完成延迟。

成本按 query/output token、embedding、rerank、重试、向量库、对象存储、日志和网络分摊计算。简单问题路由小模型,复杂或高风险问题使用更强模型和更多校验;入库 embedding 做批量、去重和结果缓存。删除或权限变化必须主动失效,缓存不能绕过 ACL 和版本校验。

常见追问及答案

追问:如果 rerank 或模型超时怎么办? 设置超时和重试上限;rerank 超时可使用融合后的召回排序,模型超时可返回检索片段和引用、切换备用模型或转人工,但不能静默生成无证据答案。

扣分点

  • 只说“加 Redis”,不说明 key、失效和权限。
  • 只计算模型 token,不算失败重试、索引和存储成本。

Q12:容量如何估算? ​

考察点

考察能否拆分查询流量、入库流量、存储、并发和峰值余量。

详细参考答案

先假设日均查询量、峰值系数、平均 chunk 数、更新比例和文档平均页数。日均 10 万次查询约为 1.2 QPS,按 10 倍峰值就是约 12 QPS,还要留 2 到 3 倍余量;入库是异步写流量,要单独估算解析、OCR、embedding 和索引构建吞吐。原文和图片放对象存储,元数据放关系库,向量和关键词索引按 chunk 数、向量维度、索引副本及过滤字段估算。

容量结论必须通过压测验证:查询 P50/P95/P99、并发下的召回延迟、rerank 吞吐、模型限流、索引构建对在线流量的影响、队列恢复速度和故障时的降级容量。按租户或知识域分片,设置单租户配额,避免批量重建拖垮全局。

常见追问及答案

追问:为什么不直接给机器数量? 机器数量依赖向量维度、索引类型、过滤选择率、模型吞吐和副本策略;先给可验证的流量和延迟假设更可靠。

扣分点

  • 只按文档份数估算,不算 chunk、向量维度、副本和峰值。
  • 没有区分在线查询和离线构建资源。

Q13:依赖故障时如何降级? ​

考察点

考察系统在可用性、质量和安全之间的取舍。

详细参考答案

鉴权或 ACL 服务故障:对受保护数据 fail-closed;缓存仍在有效安全期限内时可以继续使用。query rewrite 超时:使用原 query。向量检索故障:切到 BM25;BM25 故障:只在有可靠向量结果时继续。rerank 故障:使用召回排名并减少上下文。大模型故障:切备用模型、返回已检索证据,或转人工。索引发布失败:继续读旧 alias;解析失败:隔离该文档,不影响已发布版本。

每种降级都要标记 degraded_reason,并在质量、延迟和安全指标中可见。不能为了返回 200 跳过租户过滤、引用校验或把不相关内容交给模型。

扣分点

  • 所有依赖都只设计重试,没有超时、熔断和替代路径。
  • 故障时为了可用性绕过 ACL 或无证据生成。

评估、发布与可观测性 ​

Q14:如何分层评估召回、排序和生成? ​

考察点

考察是否有可标注、可回放、能定位问题的离线和线上指标。

详细参考答案

离线集包含真实问题、标准答案、应命中的文档/chunk、用户身份、租户、时间范围、问题类型和不可回答标记。召回层看 Recall@k、命中文档比例、context recall;排序层看 MRR、nDCG、context precision 和 rerank 后前几条是否包含最佳证据;生成层看答案正确性、faithfulness、引用覆盖率、引用支持率、拒答准确率和冲突识别率;安全层看越权率、敏感信息泄露率和 prompt injection 拦截率。

线上看 P50/P95/P99 延迟、首 token、错误率、成本、缓存命中率、队列积压、数据新鲜度、用户追问率、人工纠正率、负反馈率和转人工率。LLM-as-a-judge 可辅助批量评估,但高风险样本必须人工抽检,并用规则检查引用和权限。

定位方法是:标准 chunk 没进候选,查解析、切分、embedding 和召回;候选正确但排序靠后,查融合和 rerank;证据正确但答案错误,查上下文组装、prompt、模型和后置校验。

扣分点

  • 只说最终答案“看起来不错”。
  • 把离线准确率、线上满意度、权限合规和成本混成一个分数。

Q15:如何灰度发布并快速回滚? ​

考察点

考察索引、模型、prompt 和切分策略的全链路版本化。

详细参考答案

解析器、chunker、embedding、检索参数、prompt、rerank 和生成模型都记录版本。新索引离线构建并做数量、维度、抽样问答、权限回归和删除回归;之后 shadow 回放历史流量,再按租户或部门 canary。灰度期间比较 Recall@k、引用支持率、拒答误答率、越权率、P95、成本和负反馈。

发布使用 alias 或路由配置原子切换,旧索引和旧配置保留可回切窗口。回滚必须能够同时切回索引、模型、prompt、检索参数和策略版本;对已删除数据,紧急撤销路径优先于普通发布。每个回答记录这些版本和 trace,便于定位发布影响。

扣分点

  • 只灰度模型,不灰度索引、prompt 和 ACL 策略。
  • 只说“观察一段时间”,没有停止阈值和回滚对象。

Q16:如何做可观测性和审计? ​

考察点

考察是否能从一次错误答案追溯到数据、索引、权限和模型版本,同时保护敏感数据。

详细参考答案

每次请求生成 request_id 和 trace_id,关联鉴权结果、租户、策略版本、原始 query、改写 query、召回器、候选 ID 和分数、rerank 结果、最终证据 ID、拒答原因、模型版本、token、耗时和降级原因。默认不记录敏感原文;需要审计时记录加密引用或受控摘要,并限制日志访问。

核心告警包括:权限拒绝异常下降或越权上升、引用支持率下降、拒答率突变、P95 超标、模型错误率、索引新鲜度超时、删除延迟、队列积压、缓存命中率和单租户成本异常。运营后台提供按版本、租户、文档类型和问题类型的回放能力。

扣分点

  • 只有应用错误日志,没有检索候选、引用、版本和权限判定。
  • 为了方便排查把所有敏感原文写入普通日志。

关键取舍与扩展 ​

Q17:如何支持多轮追问,又避免上一轮错误污染? ​

考察点

考察会话摘要、结构化状态、每轮重新检索和权限复核。

详细参考答案

将会话分成短期摘要、结构化槽位和每轮证据集合。上一轮确认的时间范围、文档范围或产品名放入槽位;新问题若存在指代,就结合槽位改写,否则先澄清。每轮都重新做 ACL、版本和检索,不因为上一轮有权限就默认当前仍有权限。证据和答案带 turn_id,不会无限拼接全部历史。

扣分点

  • 只保存聊天记录并无限塞进 prompt。
  • 不处理歧义、权限变化和新一轮引用。

Q18:GraphRAG、结构化查询和普通 RAG 怎么选择? ​

考察点

考察是否根据问题结构选择工具,而不是把所有问题都交给向量检索。

详细参考答案

普通 RAG 适合从文档片段找局部证据;编号、精确字段和统计问题可走 BM25、SQL 或业务 API;实体关系复杂、需要多跳路径和关系解释时才考虑知识图谱或 GraphRAG。结构化查询的结果也要带权限、时间和来源,不能因为来自数据库就跳过审计。

GraphRAG 的代价是实体抽取、图维护和错误传播,只有多跳关系带来的收益超过维护成本时才引入。架构上可以让意图路由器选择不同检索器,并在最终上下文层统一证据格式。

扣分点

  • 把 GraphRAG 当成普通向量库的必选升级。
  • 没有说明结构化结果如何引用和做权限过滤。

Q19:如何处理 prompt injection 和敏感操作? ​

考察点

考察能否把检索内容当不可信数据,并在工具层建立权限边界。

详细参考答案

系统提示、用户问题和检索资料分层,明确检索资料只是证据,不具备改变系统规则的权限。对外部文本中的“忽略指令”或工具调用样式做标记,不直接执行;工具调用必须经过服务端 allowlist、用户授权、资源 ACL、参数校验和高风险确认。生成后的答案和引用还要做敏感信息、越权和注入结果检查。

扣分点

  • 只在 prompt 里写一句“不要被注入”。
  • 让模型直接决定是否调用删除、发邮件、改权限等工具。

30 秒收口 ​

Q20:如果面试官要你 30 秒总结,你会怎么说? ​

参考答案

text
我会把系统拆成离线入库和在线问答两条链路。离线侧保留原文,经过解析、OCR、结构化切分、embedding 和混合索引构建后,用版本化 alias 发布;在线侧先做身份、租户和 ACL 过滤,再进行 query rewrite、向量加关键词召回、rerank、上下文组装和带引用生成。证据不足、冲突或依赖故障时拒答或降级,不能绕过权限。上线用 Recall@k、排序质量、答案忠实度、引用支持率、拒答准确率、越权率、数据新鲜度、P95 延迟和成本一起验收。

本题常见扣分点 ​

  • 只说“接一个向量数据库”,不讲原文、解析、版本和重建。
  • 不讲租户隔离、ACL 前置、删除传播和缓存失效。
  • 把召回、rerank、生成混成黑盒,无法定位质量问题。
  • 没有引用定位、无答案策略和冲突处理。
  • 没有容量假设、延迟预算、成本模型、降级和可观测性。

持续学习,持续实践。