鱼皮AI导航
鱼皮AI导航
  • 主页
  • 社区
  • AI工具
  • AI知识库
  • AI提示词
  • MCP
  • Skills
  • AI学习资源
  • AI资讯
  • GitHub开源
登录/注册
站长:程序员鱼皮 老鱼简历 商务合作 增值电信业务经营许可证
2026 鱼皮AI导航 | 沪ICP备19026706号-6
13
3
21

面试被问"设计一个企业级RAG知识库系统",我从文档解析的坑聊起拿到了Offer

科叼
科叼
2026-07-07 17:26
阅读 1515
科叼
2026-07-07 17:26
阅读 1515

上周面了一家做企业SaaS的公司,C轮融资,估值50亿,岗位是AI应用层后端架构师。 前两轮常规:分布式系统、微服务治理、数据库优化,答得中规中矩。 第三轮,CTO直接甩了一道2026年的新题型: "我们公司服务2000多家企业客户,每家都有海量内部文档——Word、PDF、Excel、PPT、甚至扫描件。设计一个企业级RAG知识库系统,要求:支持多格式文档解析、增量更新不重建、检索准确率>90%、响应延迟P99<2秒。"


我的切入角度:从"文档解析的坑"开始

我没有上来就画架构图。 先问了一句:"目前客户反馈最多的痛点是什么?" CTO说:"文档解析的准确率。尤其是那些图文混排的PDF和带复杂表格的Excel,解析出来全是乱的。" 我说:"那我从这个痛点切入。" RAG系统最被低估的环节,不是检索,不是生成,而是文档解析和分块策略。 大部分团队上来就关心用什么向量数据库、选什么Embedding模型。但实际上,你喂给系统的数据质量,决定了检索准确率的上限。Embedding模型再好,垃圾进垃圾出。


我的五层架构方案

第一层:文档解析引擎 这是整个系统的地基。

  • 多格式支持:PDF用自研的版面分析模型(基于LayoutLMv3微调),识别标题、正文、表格、图片、页眉页脚;Word直接解析XML结构;Excel按Sheet+单元格结构化提取;扫描件走OCR(PaddleOCR,中英文混合场景准确率97%+)
  • 表格还原:这是最大的坑。传统PDF解析把表格变成纯文本,行列关系全丢了。我们用一个两阶段方案——先用目标检测模型识别表格区域,再用图神经网络还原行列结构
  • 图文关联:图片不直接进知识库,而是用多模态模型(GPT-4o)生成文字描述,再和上下文关联 "为什么不用LangChain的默认解析?" "LangChain的默认PDF解析就是按页切文本,遇到双栏排版、跨页表格就崩了。企业客户的文档复杂度远超你的想象——一份50页的技术规范可能有30个表格、50张图、8种字体。"

对了。顺嘴提一句,技术大厂,前后端-测试机会,全国一线及双线城市均有坑位,待遇和稳定性还不错,感兴趣看看。


第二层:智能分块策略

文档解析完之后,怎么切分成检索单元?

  • 固定长度分块(baseline):512 token一块,50 token重叠。简单粗暴,但会切断语义
  • 语义分块(进阶):用句子嵌入模型计算相邻句子的相似度,在相似度骤降的地方切分。保留了语义完整性
  • 结构化分块(高级):根据文档的标题层级、章节结构来切分。每个chunk带有完整的层级路径(如"第三章>3.2节>性能指标") 最终方案是混合策略:先用结构化分块按章节切,如果单个章节超过1024 token,再用语义分块做二次切分。每个chunk保留元数据(来源文档、页码、章节路径、创建时间)。

第三层:向量化与检索

  • Embedding模型:选BGE-M3,支持中英文混合,1024维向量,在C-MTEB基准测试中排名前三
  • 向量数据库:Milvus 2.4,支持百亿级向量检索,HNSW索引,P99延迟<50ms
  • 混合检索:向量检索(语义相似度)+ BM25(关键词匹配),权重7:3。纯向量检索的召回率约85%,加上关键词检索后提升到93%
  • 重排序:检索后取Top-50,用Cross-Encoder(BGE-Reranker-v2)做精排,最终返回Top-5给生成模块

第四层:增量更新

这是企业客户最关心的功能。文档每天都在变,不可能每次更新都全量重建向量库。 方案:文档级增量更新

  1. 每篇文档有唯一ID和版本号
  2. 文档更新时,对比新旧版本的差异(用diff算法定位变化段落)
  3. 只对变化的段落重新做分块→向量化→写入
  4. 旧向量标记为软删除,后台异步清理 实测数据:一份1000页的知识库,更新10页内容,增量更新时间<30秒,全量重建需要15分钟。

第五层:生成与评估

  • 上下文压缩:检索返回的5个chunk可能有5000 token,用长上下文压缩模型提取关键信息,压缩到2000 token以内
  • 引用溯源:生成的每句话都标注来源(文档名+页码+段落),用户可以点击查看原文
  • 幻觉检测:用一个轻量分类器判断生成内容是否有检索证据支撑,置信度低于阈值时返回"信息不足,建议咨询人工"

面试官的追问

追问1:多模态文档怎么处理?图文混排的PPT怎么检索? "PPT的特殊之处在于每一页信息密度很高但页面之间逻辑关系弱。我们的方案是:

  1. 每一页作为一个独立文档单元
  2. 文字部分走正常的文本向量化
  3. 图片/图表用多模态模型生成描述文本,也走向量化
  4. 页面之间的关联(如'下一页'、'补充说明')作为元数据保留,检索时可以作为上下文扩展"

追问2:2000家企业客户,数据隔离怎么做?

"租户级向量隔离:每个企业有独立的Collection(Milvus支持多租户),物理隔离。 权限控制:chunk级别权限——同一个文档库,不同角色能检索到的内容不同。在检索查询时注入权限过滤条件,Milvus的标量过滤性能很好,不影响向量检索延迟。 合规审计:所有检索和生成记录异步写入审计日志,支持90天回溯。"


追问3:检索准确率90%怎么衡量?怎么做质量评估?

"我们建了一套自动化评估体系:

  1. Golden Set:每个企业客户维护200-500条人工标注的QA对
  2. 自动化测试:每次模型或分块策略变更,跑一遍Golden Set,对比Recall@5和MRR
  3. 在线指标:用户点击'引用原文'的比率(>70%说明检索质量好)、用户标记'回答不准确'的比率(<5%)
  4. 人工抽检:每天随机抽100条问答,人工评估准确率 上线三个月,Golden Set的Recall@5从82%提升到了94%。"

面试结果

CTO面完说了一句话:"你是第一个从文档解析的坑切入RAG系统设计的候选人。大部分人上来就说用什么向量数据库。" Offer薪资比预期高25%。

AI
13
21
分享
操作
评论
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片

目录

🔥 热门文章
1
离谱,DeepSeek 崩了 5 小时,大家却喊:梁圣恩情还不完??
450
2
B 站上 DeepSeek 闹鱼灾了,我发起《大肥鱼清除计划》!
410
3
DeepSeek 全新模型发布,性价比最高的一集!
410
4
自己学习ai,直接买cursor 的套餐,还是买gpt 或者claude 的套餐?
370
5
又一个国产版 Codex 神器,也来卷办公了!
340
6
Vibe Coding 实战:从零构建现代专业级 AI 搜索引擎
330
7
day3-如何写出一个高质量的 Skill(组内分享) 高质量 Skill 不是“一个调得很顺的巨型 Prompt”,而是一个可验证、可回归、可维护的能力包。 先定义“什么算好”,再实现“怎么做好”。评估体系先于 Skill 本身成型。 下面用“故障诊断 Markdown 转 YAML”作为例子,但方法是通用的。 --- 一、先想清楚:Skill 到底是什么 一个 Skill 至少包含四部分: 部分 作用 接口 输入什么、输出什么、边界在哪 流程 分几步做,每步的产物是什么 规则 硬约束、经验规则、失败模式 降级策略 不确定时怎么办,而不是硬编一个看似合理的结果 高质量 Skill 的共同点:职责单一、接口清晰、规则可定位、输出可验证。 反例:把几十条经验全塞进一个主 Prompt,改一条规则要重调整个 Prompt,评估时也不知道是哪条规则退化。 --- 二、核心方法:先建评估,再写 Skill 不要先写转换器再补测试。正确顺序是: 1. 定义输出契约:什么算合法、什么算合格; 2. 建金标准集:一小批人工认可“可放行”的样本; 3. 先写评估 Skill:让它在金标准集上跑出基线; 4. 再迭代生成 Skill:每次修改跑同一套评估,无退化且目标维度提升才算正向。 这就是评估驱动开发:评估是 Skill 的单元测试,金标准集是回归锚点。 --- 三、评估 Skill:三层门禁,逐层递进 前一层不过,后一层不跑。每层留可追溯证据。 第 1 层:确定性硬门禁 用解析器、Schema、校验器完成,不消耗模型成本。 · 输出可解析; · 必填字段齐全,类型/枚举合法; · 引用目标存在,无悬空引用、无不可达节点; · 关键路径至少有一条能到达预期出口。 不通过直接打回。 第 2 层:语义断言 用脚本 + 结构遍历检查“逻辑对不对”,仍然保持确定性。 通用检查项: · 覆盖率:源材料里的关键步骤、分支、条件,输出里是否都有对应? · 完整性:每个判断节点是否都有明确出口?有没有死胡同? · 可达性:每条路径是否都能到达预期终点?有没有无出口循环? · 顺序与依赖:有先后依赖的操作,是否保留了顺序?有没有被拍平成无序列表? 例子:故障诊断转换中,检查“每个判断项是否有是/否/异常出口”“每条路径是否能到根因”。 第 3 层:LLM-as-Judge 只处理解析器表达不了的维度:忠实度、完整性、可执行性。 但 Judge 会漂移,不能单独放行,必须建立在第 1、2 层之上。Judge 的 Prompt、rubric、模型版本都要版本化,换模型必须用金标准集重新校准。 通用 Judge 维度: 维度 问什么 忠实度 输出是否忠实源材料意图?有没有自行发明内容? 完整性 关键步骤、条件、证据是否保留?隐式知识有没有被压成空话? 收敛性 输出是否仍指向原目标,而不是发散? 可执行性 下游不依赖源材料能否直接使用? --- 四、金标准集:回归测试的锚点 不需要一开始就标注几百份。用已认可的样本当种子,扩到 15~30 份,覆盖失败模式而非随机抽样: · 完整正例:典型流程; · 边界/异常分支:异常路径、循环、前置失败回退; · 已知易错模式:实际踩过的坑; · 留出集:不参与调优,只用于最终验收,防过拟合。 金标准不需要完美,只需要当前标准下认可可放行。 回归指标:关键路径用 pass^k(k 次全过),稳定性用 pass@k。 --- 五、工程约束:让批量产出可重放 · 幂等:同输入 + 同 Skill 版本 + 同规则 → 输出一致,否则无法判断变好是 Skill 改了还是随机波动; · 隔离不阻断:单份失败进隔离队列,记录失败层和原因,不阻塞其余; · 版本绑定:规则、rubric、金标准集进 Git;每份报告绑定“源版本 + 生成 Skill 版本 + 评估 Skill 版本 + Judge 模型版本”; · 抽样人工复核:Judge 临界样本 + 易错模式,人工抽检结果反过来校准 rubric。 --- 六、Skill 本身怎么写 · SKILL.md 控制篇幅,写清:输入约定、输出契约、分步流程、硬规则、降级策略; · 经验规则放 references/ 或 rules/,按失败模式分类,不要全塞进主 Prompt; · 不确定时标 needs_review: true,不要硬编看似合理的结果; · 迭代由评估报告驱动:报告告诉你哪层挂了、哪类失败模式,你改对应规则文件,而不是漫无目的调 Prompt。 --- 七、落地顺序(不要反过来) 1. 固化输出契约:Schema + 结构约束; 2. 建金标准集:从已认可的 + 最易出错的样本开始; 3. 先写评估 Skill:跑出基线报告; 4. 再迭代生成 Skill:每次修改对比逐项通过率,无退化且目标提升才算正向; 5. 批量运行 + 隔离回放:失败进队列,结束后人工抽检; 6. 评估 Skill 自身版本化:换 Judge 模型必须重新校准。 --- 八、给组员的三条硬要求 1. 不许凭感觉说“变好了”:每次修改必须附评估报告对比,逐项通过率说话。 2. 不许跳过确定性门禁直接看 Judge 分数:前两层挂了,Judge 分数没有意义。 3. 不许把规则堆进主 Prompt:规则按失败模式分文件,评估报告要能定位到具体文件。 --- 一句话收尾 生成 Skill 决定“能不能做”,评估 Skill 决定“敢不敢用”。 先让评估体系站稳,再让生成器迭代。这样交付的不是一堆“看起来还行”的产出,而是一套可证明、可回归、可交接的 Skill 质量体系。
320
8
我的第一个出海产品!7 天 2 万
310
9
WorkBuddy 本地 API 桥 + dsh 插件:把你的 WorkBuddy 额度,变成手边随手可用的模型
310
10
什么是LLM
300
🔥热门工具
朱雀AI检测朱雀AI检测
朱雀AI检测助手朱雀AI检测助手
LovartLovart
老鱼简历老鱼简历
WritePass官网WritePass官网
面多多面多多
CursorCursor
星月写作星月写作
零感AI零感AI
墨得问题墨得问题