面试问到chunk心慌慌?从企业开发者角度谈一谈具体的chunk策略选择

之前团队在做合同审查和研报问答两个 RAG 项目,踩了不少分块(Chunk)相关的坑。今天把这块经验整理一下,希望对正在做类似事情的朋友有点帮助。

先搞清楚 Token 这个概念

做 Chunk 之前,得先理解 Token。很多人把 Token 简单等同于"字"或"词",这不太准确。Token 是模型实际处理的最小单元,中文大约 1.5-2 个字对应一个 Token,英文则大约是 0.75 个单词一个 Token。

这件事为什么重要?因为不同类型的文档,Token 密度差异很大。我们实测过:一份 20 页的中文合同,大约 8000-12000 个 Token;一篇 8 页的学术论文(中英混排),Token 数可能到 6000-9000;而一份 30 页的分析报告,因为包含大量表格和数据描述,Token 数经常飙到 15000 以上。这意味着同样设 512 Token 的分块大小,在合同里可能刚好覆盖一个完整条款,在报告里可能只截到半张表格。所以分块参数不能一刀切,得结合文档特征来定。

六种分块策略到底怎么选

我把目前主流的六种策略做个对比。

固定大小分块是最简单的方案,按固定 Token 数切分,实现成本低、速度快。但它最大的问题是完全不管语义边界——一句话可能被拦腰切断,检索出来的片段答非所问。适合对精度要求不高的初期原型验证。

滑动窗口分块在固定大小基础上加了重叠区域(Overlap),相邻块之间共享一部分内容,一定程度上缓解了上下文断裂的问题。实现也不复杂,是固定分块的实用升级版。代价是存储量会膨胀,重叠区域设大了还会引入噪声。

自然结构分块利用文档本身的结构标记来切分——比如 Markdown 的标题层级、PDF 的章节目录、Word 的 Heading 样式。这种方式对格式规范的文档效果很好,每个块天然就是一个完整的语义单元。但现实中很多文档格式混乱,一旦结构缺失就会退化成一整块的大段文本。

递归分块是 LangChain 里比较常用的方案,它按分隔符优先级逐层递归切分:先按段落切,如果还太长就按句子切,最后按字符切。这种方式在大多数通用场景下表现都不错,是个稳健的"中间路线"。

语义分块更进一步,它用 Embedding 模型计算相邻句子的语义相似度,在相似度骤降的地方切分。这种方式最能保证每个块的语义完整性,但计算成本也最高——每次分块都要跑一遍 Embedding,对大批量文档来说不太现实。

混合分块顾名思义,组合使用以上策略。比如我们在合同项目中的做法是:先用自然结构把文档按条款拆开,对超长条款再用递归分块做二次切分,关键条款则加上语义分块保证完整性。灵活但实现复杂度高,需要针对具体业务做调优。

不同场景的实战选择

经过几个项目的摸索,我总结出来的经验大致是这样:

结构化程度高的文档(法律合同、技术文档、学术论文),优先用自然结构分块,配合递归分块做兜底。这类文档标题和层级信息本身就是很好的切分线索,别浪费了。

非结构化的长文本(会议纪要、访谈记录、邮件往来),语义分块或递归分块更靠谱。这类文档没有明确结构,强行按格式切只会乱套。

对实时性要求高、数据量大的场景(客服知识库、产品FAQ),固定大小加滑动窗口就够了。这类场景每条文档本身就不长,分块精度的收益远不如检索速度重要。

用动态路由自动化选择

如果你的系统要处理多种类型的文档,手动配策略迟早会崩。我们后来做了一层轻量的动态路由:文档进来后先跑一个分类模块,识别文档类型(合同/报告/通信记录等)和结构特征(有无标题层级、平均段落长度、是否含表格),然后根据预设的规则映射到对应的分块策略组合。

具体实现上,我们用了一个简单的决策树:先判断文档是否有清晰的结构标记,有的话走自然结构分块;没有的话看文档长度,短文档直接递归分块,长文档走语义分块。每条路径都有参数模板,比如合同类的块大小默认 384 Token、Overlap 设 64,报告类默认 512 Token、Overlap 设 128。

这套东西不复杂,但上线后分块质量确实稳定了不少,也省去了每接一个新文档类型就要手动调参的麻烦。

说到底,Chunk 策略没有最优解。最重要的还是理解你的数据长什么样、你的用户会怎么提问,然后在效果和成本之间找到那个平衡点。

如果大家有需要,后续可以出一篇在极端情况下(如语义切块/自然结构分块时,段落长度差异巨大)的动态路由策略分享。

#AI求职实录#
全部评论
佬,可以讲一下rag的召回率和准确率这种评测是怎么做的吗,然后相关效果差的话,应该怎么样定位到是哪块出了问题
1 回复 分享
发布于 03-31 13:15 北京
切片切的好,token消耗少
点赞 回复 分享
发布于 03-03 17:22 北京

相关推荐

面试官喜欢问用过什么ai,这时候就不能局限于ChatGPT、DeepSeek、豆包这种网页版对话工具,这些只是基本操作。面试官更想知道的是,你有没有用过能直接赋能开发提效的 AI 工具(比如 IDE 集成类、代码专属 AI 工具),以及你如何通过 Agent 思维、精准提示词设计,把 AI 变成真正的生产力助手。比如,只说 “用过 ChatGPT 写代码”,远不如说 “用 Cursor 的实时代码补全功能重构过 Spring Boot 接口的冗余逻辑”“靠 Claude Code 分析 JVM 堆转储日志,定位了并发场景下的内存泄漏问题”“基于 LangChain 搭过简易的本地知识库 Agent,用来自动检索项目历史文档,解决跨模块接口调用的疑难问题” 来得有说服力。除此之外,“开发中遇到过 AI 幻觉吗?怎么解决的?” 也是高频追问。毕竟真实工作里,AI 生成的代码或方案并非万能,甚至会出现 “一本正经输出错误答案” 的情况。比如你让 AI 写一个基于 Redis 的分布式锁,它可能会漏掉 finally 块的解锁逻辑,导致死锁;或者让它优化 MySQL 慢查询,它给出的索引方案反而会让查询效率更低;更常见的是,遇到一些冷门框架的问题,AI 会拼接看似合理的解决方案,实则完全不适用。这些场景的核心矛盾,在于 AI 是基于海量语料的概率性输出,而非真正理解业务逻辑和技术原理。这时候,能讲清 “如何识别幻觉、如何解决幻觉”,远比单纯说 “用过 AI” 更能体现你的能力。比如可以说:“我会先交叉验证 AI 给出的方案 —— 对照官方文档、查看源码注释,或者搭建最小测试用例跑通验证;如果 AI 陷入错误循环,我会拆解问题,用更精准的提示词限定范围,比如明确‘基于 Redis 6.0 版本,用 SETNX + EX 命令实现分布式锁,必须包含超时兜底和解锁校验’;实在解决不了的,会放弃直接生成,转而让 AI 提供思路参考,再结合自己的技术积累完成落地。”说到底,面试官问 AI 相关问题,不是考你 “知道多少工具”,而是考你 “有没有把工具用出深度”—— 是否能借助 AI 提升开发效率,是否能分辨 AI 输出的对错,是否具备 “工具辅助 + 独立思考” 的复合能力。这才是校招和社招中,拉开候选人差距的关键。
在职牛马didi:总结得很到位,后端面试现在确实都在问AI。你提到的几个点很准:1.说"用过ChatGPT"vs说"用Cursor重构过SpringBoot接口",差距巨大2.AI幻觉识别和解决能力比单纯会用工具更重要3.交叉验证+精准提示词是核心技能我们团队招AI应用研发实习,工程能力+AI认知是重点。暑期实习还有HC,感兴趣可以看看:https://www.nowcoder.com/jobs/detail/440929?jobId=440929
面试官最爱问的 AI 问...
点赞 评论 收藏
分享
评论
7
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务