AI Agent 面试全攻略:文档ETL流水线代码解析,PDF解析、分块到向量化入库全链路
【免费下载链接】ai-agent-interview-guideAI Agent 面试全攻略:从零到Offer,包含200+面试题、企业级项目(Python/Java/Go)、简历模板、STAR面试稿、哆啦A梦漫画图解项目地址: https://gitcode.com/gh_mirrors/ai/ai-agent-interview-guide
AI Agent 面试中,RAG 检索增强生成的"离线索引"环节是高频考点。本文基于开源项目ai-agent-interview-guide(AI Agent 面试全攻略)中的三语言企业级实现,带你完整拆解文档 ETL 流水线的代码细节:PDF 解析、文档分块策略(Chunking)、向量化入库三大环节,并对照面试八股文中的标准答案,帮你在面试中讲透这条数据链路。
📌 项目内含 200+ 面试题、三语言企业级项目、简历模板与 STAR 面试稿,RAG 专项八股见 docs/01-面试八股文/03-RAG技术.md。
一、ETL 流水线是什么?一条文档的"入库之旅"
RAG 系统分两个阶段:
- 离线阶段:原始文档 → 解析 → 分块 → 向量化 → 存入向量数据库
- 在线阶段:用户提问 → 检索相似块 → 拼入 Prompt → 生成带引用的回答
其中离线阶段就是经典的ETL(Extract-Transform-Load)流水线,三个环节分别对应:
| 环节 | 职责 | 面试关键词 |
|---|---|---|
| E - Extract | 从 PDF/DOCX/TXT 中提取纯文本 | 解析器、Tika、pypdf |
| T - Transform | 长文本切分为 Chunk(含重叠) | chunk_size、overlap、递归分块 |
| L - Load | Embedding 向量化后写入向量库 | Milvus、Embedding 维度、元数据 |
Java 版实现把这条链路写进了注释,是理解全链路最快的入口:ETLPipeline.java
二、第一步 Extract:PDF 解析的三种写法
解析器的目标是按文件类型路由到不同策略,并控制输出长度。三个项目的思路各有侧重:
Python 版(轻量):按 MIME 类型分发,纯文本直接解码,PDF 用pypdf逐页抽取,且有两大工程细节——单页失败不中断(只记 warning)、全文截断 50 万字符防止内存爆炸。见 parser.py
for page in reader.pages: try: parts.append(page.extract_text() or "") except Exception as exc: logger.warning("单页 PDF 抽取失败: {}", exc)Java 版(通用):直接拥抱 Apache Tika,一行tika.parseToString(inputStream)就能解析 PDF、DOCX、HTML、Markdown 等几十种格式,再配合cleanText()清洗多余空白与换行。面试中"如何解析多种格式",答 Tika 是最标准的答案。见 DocumentParser.java
Go 版(结构化):把解析抽象成Parser接口,Markdown 解析会提取#标题层级,还原出 Section 结构——这为"按文档结构分块"打了基础,见 parser.go。
💡 面试加分点:PDF 本质是排版指令而非自然段落,多栏、页眉页脚都会干扰顺序,解析后要按逻辑顺序重组,否则分块会乱序(八股文第 2 节有专述)。
三、第二步 Transform:分块策略与关键参数
分块是 ETL 中最影响检索质量的环节。项目里实现了业界主流的三种策略:
3.1 固定长度分块(Fixed Size)
按窗口滑动切分,chunk_size - overlap作为步长,相邻块重叠 64 个 token,避免切断关键句:
start = end - self.chunk_overlap # 回退 overlap,保留上下文衔接见 chunker.py
3.2 递归分块(Recursive)——Python 版默认策略
按["\n\n", "\n", "。", ". ", " "]分隔符优先级依次尝试,超长片段用下一级分隔符继续细分,超过 24 层深度则退回固定窗口兜底。这是 LangChainRecursiveCharacterTextSplitter的同款思路:chunker.py
3.3 段落 / 语义分块
- Go 版提供
StrategySentence(按句子边界切分)与StrategySemantic(按双换行段落聚合),且用utf8.RuneCount计数,正确处理中文多字节字符:chunker.go - Java 版按
\n\n分段合并到目标长度,超长段落再强制滑动窗口切分,chunk-size/chunk-overlap可通过application.yml配置(默认 512/64):DocumentChunker.java
两个必须背下来的参数经验值(八股文 Q7 标准答案):
- chunk_size:应覆盖"完整命题",常见 512~1024 token
- chunk_overlap:一般为 size 的10%~20%,越大索引越臃肿
另外注意 Python 版用tiktoken的cl100k_base编码按真实 token 数计长,而非字符数——中英文混排时字符数严重低估 token 消耗,这是一个很容易拉开区分度的细节:chunker.py
四、第三步 Load:向量化与入库
分块完成后,每个 Chunk 需要过一遍 Embedding 模型生成向量,连同元数据写入向量数据库。
Java 版完整演示了入库逻辑:收集ids / vectors / contents三列,调用milvusService.insertVectors()写入 Milvus,并捕获异常包装为业务错误(演示阶段用 1536 维随机占位向量,生产应替换为真实 Embedding 调用):ETLPipeline.java
Go 版有两个值得学习的工程实践:
- 每条向量记录都带上
doc_id / title / chunk_index元数据,检索结果才能回溯到源文档 ProcessBatch批量处理时逐文档检查ctx.Done(),支持上下文取消,单个文档失败不阻断整批任务:pipeline.go
Python 版则把入库设计成可选异步回调on_chunks,流水线本身不依赖向量库,方便测试与替换:pipeline.py
五、三语言实现对照与面试表达
| 对比项 | Python | Java | Go |
|---|---|---|---|
| 解析器 | pypdf + 手写文本 | Apache Tika(格式最全) | 接口抽象 + Markdown 结构化 |
| 分块策略 | 固定 / 递归 / 段落 | 段落感知 + 强制切分 | 固定 / 句子 / 语义 |
| 长度计量 | tiktoken 真实 token | 字符数 | rune 数(Unicode 安全) |
| 入库方式 | 异步回调解耦 | Spring 事务式直写 | 带元数据 + 可取消批量 |
面试时建议用这条主线作答:"解析器按类型路由并容错 → 分块器按递归策略切分并保留 overlap → 向量化时挂载元数据,批量幂等入库",再指出自己项目中"用 token 而非字符计量""单页 PDF 失败不中断"这类细节,说服力会强很多。
六、学习路径建议
- 先读 docs/01-面试八股文/03-RAG技术.md 的"文档分块策略(Chunking)"一节,覆盖固定长度、递归、语义、父子块全部考点
- 对照 project-python/app/etl/ 目录的三个文件,理解最小可用实现
- 再横向对比 project-java/src/main/java/com/agent/platform/etl/ 与 project-go/internal/etl/,体会不同语言生态的工程取舍
- 结合 docs/02-企业招聘分析/README.md 中的岗位要求,准备"你如何设计文档入库链路"这类系统设计题
把这条 ETL 链路讲清楚,你就跨过了 RAG 面试题中最扎实的一关 🎯
【免费下载链接】ai-agent-interview-guideAI Agent 面试全攻略:从零到Offer,包含200+面试题、企业级项目(Python/Java/Go)、简历模板、STAR面试稿、哆啦A梦漫画图解项目地址: https://gitcode.com/gh_mirrors/ai/ai-agent-interview-guide
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考