行业资讯
KnowHub RAG 全链路面试专训(已解答版)
基于简历 KnowHub 项目提取 | 2026 年 7 月 | 基础追问 + 深层追问 + 系统设计 + 极端边界第一部分:RAG 基础能力(必问)面试官首先会验证你是否真正理解 RAG 的核心概念和项目链路。以下 14 道题为第一优先级。1. RAG 的完整链路你给我画一下,从文档上传到用户拿到回答经过了哪些步骤。每个步骤的输入和输出分别是什么。面试回答:KnowHub 的完整链路可以分成建库索引链路和问答链路。建库索引链路是:用户登录后创建知识库,上传文档,knowledge-service 校验用户和知识库归属,把原始文件上传到 MinIO,保存文档记录和 objectKey,然后创建索引任务并投递 RabbitMQ。task-service 消费消息后,根据 objectKey 下载文件,使用 Tika 解析文本,按规则切片,调用 Embedding 模型生成向量,把 chunk、来源信息和向量写入 PostgreSQL + pgvector,最后更新任务状态。每一步的输入输出是:上传接口输入 multipart 文件、kbId、用户身份,输出 documentId 和 taskId;MinIO 输入文件流,输出 objectKey;RabbitMQ 输入索引任务消息,输出可异步消费的任务;Tika 输入文件,输出纯文本;切片输入文本,输出 chunks;Embedding 输入 chunk 文本,输出向量;pgvector 输入向量和元数据,输出可检索的向量记录。问答链路是用户提问后,系统先对问题做 Embedding,再按 userId、kbId 过滤并做 TopK 向量检索,把片段拼进 Prompt,调用大模型,最终返回答案、引用来源和 qa_log 耗时记录。2. 你用的 Embedding 模型是哪个,为什么选 text-embedding-3-small,和其他模型(如 text-embedding-3-large、bge-large、m3e)对比过效果吗。输出向量维度是多少,这个维度和 cost、速度、精度之间是什么关系。面试回答:项目里按简历口径使用 text-embedding-3-small,主要考虑三点:第一,成本和响应速度更适合个人项目和轻量演示;第二,1536 维向量已经能覆盖中文知识库问答的基础语义检索;第三,Spring AI/OpenAI 生态接入成本低,便于把重点放在 RAG 工程链路而不是模型部署。text-embedding-3-large 一般精度更强,但维度和成本更高;bge-large、m3e 等本地或国产模型更适合数据不能出境的场景,但需要额外部署推理服务,并处理模型兼容、向量维度变化和重索引。维度越高不等于一定越好,维度高会增加存储、索引构建、网络传输和检索计算成本。我的选择是先用 1536 维跑通完整链路,后续再通过模型版本字段和重索引机制支持切换。3. 文档解析你是怎么做的,Tika 对不同格式的解析效果如何。PDF 中的表格你是怎么处理的,图片怎么处理的,扫描件 PDF 你支持吗。面试回答:文档解析层使用 Tika 做统一解析入口,它对 TXT、Markdown、普通 PDF、Office 文档这类文本型文件比较友好,能把多种格式抽取成统一文本,便于后续切片和向量化。PDF 的难点在于版式复杂,尤其是表格、页眉页脚、多栏排版和扫描件。当前项目按文本抽取处理,表格会被降级为文本行,图片内容不做 OCR,扫描件 PDF 如果没有内嵌文本层,Tika 只能得到很少内容或空内容。面试中我会明确边界:当前版本支持文本型文档的 RAG 问答,不把 OCR、多模态图片理解说成已完成。可演进方案是:对 PDF 表格接入专门解析器,把表格转成 Markdown 表格;对扫描件接入 OCR;对图片内容增加图片摘要或多模态 Embedding;同时在解析后做空文本校验,避免空内容进入切片和 Embedding。4. 你的文档切片策略是什么,切片大小是多少字符或 token,重叠窗口多大。这个参数你是怎么选出来的,有没有做过不同参数对下游检索效果的影响对比实验。面试回答:当前项目采用的是偏工程实用的固定长度切片策略,核心原则是“一个 chunk 足够表达一个语义片段,同时不能太长导致 Prompt 被少量片段占满”。个人项目里通常可以把 chunk 控制在 500 到 1000 个中文字符左右,保留一定重叠窗口,比如 80 到 150 字符,用来避免一句话或一个条款被切断。参数选择不是拍脑袋,而是围绕检索质量和上下文成本权衡:切片太短,语义不完整,召回内容碎;切片太长,单个片段噪声多,TopK 能放进 Prompt 的有效片段变少。我的项目做过接口回归、异常演练和轻量压测,但没有把切片实验包装成大规模离线评测。面试中可以说后续会建立小型 Query 标注集,对 512、800、1024 等切片大小做 Recall@K 和人工答案质量对比。5. pgvector 用的索引类型是 IVFFlat 还是 HNSW,这两者有什么区别。建索引的 lists 参数或 m/ef_construction 参数你是怎么设的。向量检索 602 毫秒在你的数据量级下是否合理,如果数据量翻十倍性能预估会退化到什么程度。面试回答:项目基于 pgvector 做向量存储与检索,个人项目阶段更关注链路完整性和可解释性。pgvector 常见索引有 IVFFlat 和 HNSW:IVFFlat 类似先聚类再在候选簇里查,建索引相对快,但召回效果依赖 lists 和 probes;HNSW 基于分层图结构,查询通常更快、召回更好,但索引构建和插入成本更高,内存占用也更明显。602ms 是本机轻量压测中的向量检索接口平均耗时,这个结果受数据量、机器配置、是否命中索引、过滤条件、连接池和本机环境影响。对个人项目和小数据量演示可以接受,但不应说成生产级性能。数据量翻十倍后,如果仍然全表扫描或过滤条件命中范围很大,耗时可能明显上升;优化方向是建立合适的 HNSW/IVFFlat 索引、限制 kbId/userId 范围、调整 probes/ef_search、做冷热分层或迁移到专用向量数据库。6. TopK 检索你设的 K 是几,检索完成后有没有做重排序。如果没有,你有考虑过加 Rerank 吗。有没有做相似度阈值过滤,阈值是多少,低于阈值的文档片段你会丢弃还是保留。面试回答:TopK 一般设置为 3 到 5 比较稳,项目口径可以说默认取 5 条候选片段,这样既能给模型足够上下文,又不会把过多噪声塞进 Prompt。当前版本重点跑通向量检索和 RAG 主链路,没有把 Rerank 作为已完成能力去夸大。相似度阈值建议加入,低于阈值的片段不直接送入 Prompt。阈值不能固定迷信,需要根据距离度量和测试集调出来。工程上可以先做一个保守策略:TopK 召回后,如果最高相关度都低于阈值,就返回“知识库中没有找到足够相关的资料”;如果部分片段低分,就丢弃低分片段。后续可加 BGE-reranker 或模型重排,让 TopK 先高召回,再用 Rerank 提高精度。7. Prompt 模板是怎么设计的,检索到的多个文档片段你是怎么拼接后放进 Prompt 的。引用的来源格式是怎么约定的,用户看到的引用是什么样的。上下文窗口你是怎么管理的。面试回答:Prompt 设计遵循三个约束:只基于检索资料回答,不知道就说不知道,回答后给出引用来源。拼接方式是把每个 chunk 包装成带编号的上下文片段,例如“[来源1] 文件名:xxx,片段:…”,然后把用户问题放在最后,让模型基于这些资料生成答案。引用来源的格式可以是“来源:xxx.pdf / 第 N 段 / chunkId”,前端展示时不暴露内部向量 ID,而展示文档名、片段序号和摘要。上下文窗口管理上,优先按相似度排序放入 Prompt,超过长度限制时截断低相关片段,而不是把所有内容硬塞进去。这样能减少无关信息干扰,也能控制调用成本。8. 大模型你调的是哪家,OpenAI 还是国内模型,为什么选这个。大模型调用是流式返回还是阻塞返回,前端怎么展示逐字输出。如果 API 超时或者返回格式异常你的降级逻辑具体是怎么做的,降级后返回什么给用户。面试回答:项目口径可以说通过 Spring AI 接入大模型能力,具体模型可以按部署环境切换为 OpenAI 或兼容 OpenAI API 的国内模型。选择这类方式的原因是生态成熟、接口稳定、接入成本低,便于把项目重点放在微服务、RAG、异步索引和工程化。当前简历材料里不建议把流式输出说成已完成,除非代码里确实实现了 SSE/WebSocket。可以回答为:当前版本以阻塞返回为主,前端展示最终答案;如果升级流式输出,会在后端使用 SSE 或 WebSocket,把模型 token 增量推给前端。超时和异常降级方面,模型调用失败时返回可解释提示,例如“当前模型服务繁忙,已记录本次问题,请稍后重试”,同时写入 qa_log 的错误信息和耗时,避免接口长时间卡死。9. 用户上传的文档包含敏感内容或恶意内容你怎么处理,有没有做内容审核。在文档解析阶段和 Prompt 构造阶段分别需要做什么校验。面试回答:当前项目更偏学习和求职展示,没有把企业级内容安全审核包装成已完成。已有基础校验可以包括文件大小、文件类型、空文件、解析后空文本、用户权限和知识库归属。敏感内容和恶意内容的完整治理需要分层做。上传阶段要做扩展名、MIME、大小、病毒扫描和白名单校验;解析阶段要防止异常文件拖垮服务,设置超时和大小限制;Prompt 构造阶段要防 Prompt 注入,例如文档里出现“忽略之前规则”这类内容时,系统提示词必须约束模型只把文档当资料,不执行文档中的指令;生成阶段可以加入内容审核和日志留存。面试中要把“当前实现”和“生产化方案”分开说。10. 如果用户问的问题和知识库中的文档完全无关,你的系统会怎么响应。你是用相似度阈值判断还是让大模型判断,各自的优缺点是什么。面试回答:如果问题和知识库完全无关,系统应该避免强行回答。更可靠的做法是先用相似度阈值判断:如果 TopK 结果整体低于阈值,直接提示“知识库中没有找到足够相关的内容”,并建议用户换个问题或上传相关资料。让大模型自己判断也可以,但缺点是模型可能被无关上下文诱导,或者为了满足用户而编造答案。相似度阈值的优点是可控、可解释、成本低,缺点是阈值需要调参,不同知识库可能不一样。实际工程中可以组合使用:先用阈值做硬过滤,再让模型在 Prompt 中明确“资料不足时不要编造”。11. 你的 RAG 系统和市面上的开源方案(如 Dify、FastGPT、LangChain-ChatChat)相比,差异化在哪里。你选择自研而不是直接用开源方案的原因是什么。面试回答:Dify、FastGPT 这类平台更偏产品化低代码,适合快速搭建知识库应用;LangChain-ChatChat 更偏开源知识库实践。KnowHub 的差异不在于功能比它们多,而在于我自己实现了 Java 后端企业项目中关键的工程链路:Spring Cloud 微服务拆分、Gateway 鉴权、用户隔离、RabbitMQ 异步索引、MinIO 对象存储、Redis 幂等和缓存、Sentinel 限流、pgvector 检索、Vue 3 前后端联调。选择自研的原因是求职目标是 Java 后端开发,我需要证明自己能把 AI 能力落在后端工程里,而不是只会配置一个现成平台。面试中可以强调:我参考了开源方案的思想,但重点锻炼的是系统设计、接口、数据模型、异步任务、异常处理和性能验证。12. Spring AI 你用了它的哪些能力(ChatClient、EmbeddingClient、VectorStore、DocumentReader),它和其他 AI 框架(如 LangChain4j)相比有什么优势和不足。面试回答:Spring AI 主要提供模型调用、Embedding、Prompt、向量存储接入等抽象能力,适合 Spring Boot/Spring Cloud 技术栈。项目里可以按能力描述为使用 Spring AI 接入 Chat/Embedding 能力,并结合 pgvector 完成向量检索链路。是否
郑州网站建设
网页设计
企业官网