每周一道 Agent 面试题 - chunk 怎么切

每周一道 Agent 面试题 - chunk 怎么切

开场

上一篇《每周一道 Agent 面试题 - Top K 怎么设》,我们聊了检索时该取多少段内容。K 调大以后,原来漏掉的信息有没有补回来,无关内容有没有变多,还得结合上下文预算和测试结果来看。

不过,判断 K 是否合适之前,还得看看取回来的每一段内容是怎么切出来的。

同样取 5 个 chunk,每块只有几句话,和每块包含一整节内容,交给模型的信息量就不一样。如果操作步骤和适用条件被切到了不同块里,只找回步骤,答案就可能漏掉限制。遇到这种情况,除了调整 Top K,还得检查文档切分和后面的上下文组装。

面试官也可能接着追问:

“你们 RAG 的文档怎么切 chunk?切多大,要不要 overlap,为什么这样设?”

你可能会先回答:“我们先切成比较短的块,相邻两块留一些重叠。”

这时,面试官再问“长度按字符还是 token 算”“为什么后来把块调大了”“重叠到底有没有用”,就得拿文档和测试结果来解释了。

这篇接着聊切法、大小和 overlap 的取舍,也看看短块找得准却答不全时,怎样补上缺少的上下文。

1、重点考的是什么

回答这道题,得能说出切分怎样影响检索和回答,尤其是信息被拆开以后,哪里会出问题。

第一层:切完以后,信息之间的关系还在不在

一段内容长度没有超限,并不代表它适合单独拿来回答问题。切分边界可能拆开条件和结论,也可能让一句话失去指代对象。

比如一份申请说明写着:

普通申请补齐材料后可以线上提交。特殊申请需要先完成审核,通过后才能提交。

如果两类申请被切到不同块里,用户问“申请怎么提交”时,系统只找回普通申请的那块,回答就可能漏掉特殊申请的审核要求。

审核要求还在知识库里,只是这次检索和上下文组装没把它带回来。切分改变了哪些信息会一起出现,也就影响了回答能不能说全。

类似的问题还有:

  • 步骤保留下来了,适用条件被切到另一块;

  • 表格数据和表头分开,只剩数字,看不出对应项目;

  • “上述情况”“该方法”出现在块的开头,缺少前文;

  • 代码和解释被分开,检索命中了代码,却没有带回使用限制。

拿这样的片段解释切分,比只报一个长度容易说清楚。哪些内容要尽量放在一起,已经拆开的怎么补回来,都能落到原文上。遇到漏信息,先确认解析后的文本有没有保留下来,再判断是否与切分有关。

第二层:切片大小怎么选

发现信息被拆开后,可以试着把 chunk 调大一点。不过,得看看多出来的内容是什么。

如果一段流程略长于当前长度,调大后能保留步骤和条件,就值得测试。多出来的内容要是已经转到另一个主题,命中这一块时,也会带回无关文字,占用上下文预算。

反过来,切得更短,某个定义或操作步骤可以单独被检索出来,但回答需要的其他信息也可能落在相邻块中。用户问的是整个流程,系统却只找到了其中一步,答案仍然不完整。

用户主要查字段含义、术语定义时,较短的块可能已经够用。经常问操作流程、适用条件和例外,就要检查这些内容有没有被拆散,检索能不能把它们找齐。

比较大小时,可以把同一段原文的两种切分结果摆在一起:短块的边界切断了什么?把块调大后,多保留了哪些内容?这些内容对回答有帮助吗,有没有混进其他主题?

对照这些片段,就能解释为什么从这个大小开始,后来调大或调小是为了修正哪类问题。

第三层:为什么需要 overlap,重叠多少才有用

块调大了,边界问题也未必消失。长文档仍然需要拆分,条件和步骤还是可能分到两块里,只是边界换了位置。

overlap 会让相邻块共享一部分内容,给跨边界的信息多一次一起被检索回来的机会。

假设原文有这样两句话:

以下提交流程仅限审核通过的申请。进入提交页面,填写信息并上传材料。

如果边界落在两句话之间,后一块只有操作步骤。用户问“在哪里提交、怎么操作”时,可能命中后一块,但这一块没有带上审核条件。

加入 overlap 后,如果重叠范围覆盖了前一句,后一块就会同时包含审核条件和操作步骤。即使只找回后一块,也有机会给模型提供完整依据。

如果只复制了“申请”两个字,仍然补不回审核条件。重叠多少得看实际复制了什么,有没有覆盖完整句子,能不能带回缺失的前提。

overlap 能补充的范围也有限。如果例外要求在几页之后,复制相邻的一段话仍然找不到它。这种情况需要考虑父子分块或检索后的上下文扩展。

重叠过多,还可能让相邻块反复包含同一段内容。假如前几个检索结果都在讲相同的步骤,其他必要条件就可能没有进入最终结果。

测试时固定块大小,只调整重叠长度,把无重叠和几档重叠各跑一遍。对照实际片段,看原来漏掉的条件有没有回来、重复结果多了多少,以及去重后是否保留了完整证据。选定重叠范围,也就有了依据。

第四层:选好的切片,能不能完整进入模型

切分预览看着完整,也可能在后面丢信息。

比如,为了保留一段流程,你把块调大了。先得确认,这个长度按字符还是 token 算。

如果切分器按字符算长度,embedding 模型按 token 接收输入,两边的长度就不能直接对应。需要用实际模型的 tokenizer 检查,尤其是包含英文、数字或代码的文档。

还要看真正送去编码的文本。预览里的正文可能没有超限,但系统如果又加上文档名、章节标题等内容,输入长度就会继续增加。

如果超过当前服务允许的长度,具体实现可能报错,也可能截断。假如尾部恰好是“特殊情况需要先审核”,截断后,这条要求就没有参与向量编码。

只读预览,容易忽略这种截断:条件还显示在块里,却没参与向量编码。

同样,检索找回以后,也要检查实际交给生成模型的内容。父块返回或邻近扩展可能补齐条件,但组装时如果又因为预算裁掉了它,回答依然可能遗漏。

把编码输入、最终上下文和切分结果对照,才能分清信息是在切分时拆开了,还是在后续处理里丢了。

第五层:如何评估切片的效果

切完以后,先读预览,检查句子、条件和步骤是否完整。检索效果好不好,还得用具体问题测试。

可以用几类问题来测:

  • 查定义:某个字段是什么意思;

  • 查流程:申请需要经过哪些步骤;

  • 查条件:什么情况下可以直接提交;

  • 查例外:特殊申请和普通申请有什么不同。

这些问题会暴露不同的切分问题。只测试定义类问题,即使结果不错,也不能说明流程和例外都能找齐。

每个问题都要标出回答需要的证据。比如“申请怎么提交”,既需要普通申请的材料要求,也需要特殊申请的审核要求。只找回“提交”相关的内容,缺了其中一项,仍然算没找齐。

有了这份依据,就可以比较同一单位下的短块和较长的块,或者固定块大小后比较有无 overlap。先保持文档、解析方式、embedding 模型和检索流程一致,减少其他变化的干扰。

先看切分结果:必要信息分布在哪些块里?条件有没有和步骤分开?块能否独立读懂?

再看检索和最终上下文:需要的证据有没有找齐?结果是不是反复返回相同内容?补充或裁剪以后,关键条件还在不在?

最后看回答:是否交代完整流程和例外,引用能否对应原文。某个方案找回了相关块,却仍然漏掉必要条件,就需要继续定位原因。

比较大小时,还要留意实际输入量:返回数量相同,块更大的方案本来就会给模型更多文字。控制这部分影响的做法,见后面的评测部分。

重新切分后,相关证据也需要重新映射。旧方案里的一块,在新方案里可能变成两块,不能直接沿用旧 chunk 的标注。

证据覆盖、答案遗漏和重复内容,要和 token、延迟、索引成本一起比较。比如 overlap 补回了边界条件,却带来很多重复结果,就还得调整重叠范围或去重方式。记录哪类问题改善了、哪类仍在漏,下次才知道从哪里改。

2、面试官的判分逻辑

“我们按标题切,超长条款再拆分,并保留一段适度重叠。”这样的回答交代了做法,面试官接着会问为什么。回答时,得把前面提到的问题放回具体文档里。

2.1、你说切分会拆散信息,具体会造成什么问题?

“条件和步骤分到两个 chunk 里,检索时多取几块不就行了吗?”

多取几块可以测试,但不能保证缺失的条件一定回来。

以前面的申请文档为例,操作步骤和审核要求被分到了不同块里。用户问“申请在哪里提交”,检索可能找回操作页面、上传材料等内容,却没有选中审核要求。增加 Top K 后,能否找回审核要求,仍然需要查看结果。

信息还在文档里,但被拆开后要分别参与检索。命中步骤的那块,不代表条件的那块也会跟着回来。

表格也是类似的问题。数据和表头分开后,即使检索找到了某个数字,模型也可能缺少判断它属于哪个项目的依据。带有“上述情况”的片段,则需要前文才能确定适用范围。

说“会破坏语义完整性”,面试官还不知道你遇到了什么。用原文指出互相依赖的内容、切完缺少的部分,以及答案可能漏掉的要求,才好继续讨论。

如果准备用父子分块或补充邻近段落来解决,还得说清楚会补回什么内容。

2.2、为什么从较小粒度开始,再逐步扩大?

“你们为什么从较小粒度开始?扩大切分范围以后会有什么变化?”

“短块更精准”是个判断,得有自己文档上的结果支持。

假设一段流程超过了当前长度,操作步骤在第一块,例外条件在第二块。如果调大后能把流程保留在同一块里,就减少了需要分别找回两块证据的情况。

还得检查多出来的内容是否仍然属于这个流程。如果已经包含另一个业务主题,每次命中这一块,也会带回无关文字。

比较时,把短块拆开的信息、调大后保留的内容和新增的无关文字标出来,取舍就容易解释了。

接着再看问题类型。如果用户主要查定义,较短的块可能已经够用;如果用户经常问完整流程,就要检查多个步骤和条件能否一起找回。

拿出两组切分片段,就能说明调整的理由。最终用哪组,还要看检索和回答结果。

2.3、为什么加 overlap,重叠范围怎么定?

“你已经按标题和段落切了,为什么还需要重叠?”

可以先讲当前切法留下的边界问题。比如,一个超长段落还得拆开,前一块末尾是适用条件,后一块开头是操作步骤。后一块单独被检索回来时,就可能缺少前提。

overlap 的作用,是把边界附近的一部分内容同时放进相邻块。如果重叠范围覆盖了完整条件,后一块便有机会同时带回条件和步骤。

但重叠范围有没有用,要看它实际包含什么。它可能覆盖完整句子,也可能只复制了一段没有独立含义的文字。所以别只看配置比例,把重叠后的片段调出来看。

“重叠加大以后,为什么结果反而不好了?”

先检查有没有重复召回。相邻块包含大量相同内容,前几个结果可能反复返回同一段步骤。数量没变,覆盖的独立信息却少了,其他条件可能因此没进入最终上下文。

如果条件补回来了,却被大段重复内容挤占了上下文,也不能直接说重叠有效。要检查去重之后的证据是否仍然完整。

如果相关条件在几页之外,overlap 通常够不到它,就得换一种补上下文的办法。

2.4、切分预览里内容完整,为什么还会漏?

“你已经确认条件和步骤在同一块里,模型为什么还是没用上?”

内容切在一起之后,还得经过编码、检索和上下文组装。

先看 embedding 阶段。切分器如果按字符控制长度,模型按 token 接收输入,两者不能直接对应。正文之外,如果又拼入标题等内容,编码长度还会增加。

如果实际输入超过服务限制,并被截断,那么预览里存在的尾部条件,可能没有参与向量编码。需要查看实际编码输入和截断配置,确认是不是这种情况。

再看生成前的上下文组装。检索结果里已经有完整证据,但排序、选择或预算裁剪之后,关键内容可能没有进入最终输入。

最后才看回答。如果证据已经完整交给模型,仍然漏掉条件,就需要继续检查生成阶段怎样使用这些内容。

答案漏了条件,原因未必是 chunk 太小。把这几个阶段的实际内容对着看,才知道信息丢在哪一步。

2.5、怎么证明新的切法效果更好?

“你说扩大切分范围以后更好,具体好在哪里?怎么测出来的?”

准备一批问题,标好对应证据。问题不能全是查定义,还要覆盖流程、条件和例外,不然测不出信息被拆散以后会有什么影响。

比较切分方案时,可以只改大小,保持文档、解析方式、embedding 模型和检索流程一致。

同一份证据,在这几个位置分别检查:

查看哪里 要回答的问题
检索结果 回答所需的证据有没有找齐?
最终上下文 找回的证据有没有保留下来,是否被重复内容挤占?
模型回答 是否漏掉条件、步骤或例外,引用是否对应原文?

比如,加了 overlap 后,边界条件更容易进入检索结果,证据找齐率(recall)提上去了,答案里的对应遗漏也少了,这才有依据说它对这类问题有帮助。

换了切分方案,原来的 chunk 边界也会变化。评测标注应当依据源文档里的必要证据重新映射,不能直接沿用旧 chunk 的编号。

最后,再结合 token、延迟和索引成本决定是否采用。一个方案补齐了条件,但带来大量重复内容,可能还需要继续调整,而不是直接作为最终配置。

回答时把原来的错误、改后的片段和测试结果对应起来,也保留那些还没解决的问题。

3、怎么回答更稳

回答可以从自己的语料和用户问题讲起,说明怎么选切法、从什么配置开始测试,再用结果解释后续调整。

3.1、固定长度还是语义切分:先看文档结构

先打开文档。如果标题、条款、章节或函数边界很清楚,就可以从这些结构入手。一条规则的条件、步骤和例外,往往也能从排版和段落关系里看出来。

几种常见切法的区别如下:

切法 怎么理解 使用时要留意什么
固定长度切分 按设定长度划分内容 是否切断句子、步骤或条件
递归切分 优先保留较大的自然单元,太长再继续拆 分隔符是否适合当前文档
按文档结构切分 利用标题、章节、条款或函数边界 标题是否保留,超长单元怎么处理
语义切分 根据内容的语义变化寻找边界 额外计算成本、边界稳定性和实际收益

以递归切分为例,可以先尝试按段落拆,段落太长再按句子等更细的边界拆。LangChain 的官方文档也区分了按长度、文本结构和文档结构等切分方式。

这些方法可以组合使用。比如,先按标题拆成章节,再对超长章节做递归切分。

还以前面的申请流程为例:

普通申请可以线上提交,提交前需要补齐材料。特殊申请需要先完成审核,再进入提交流程。

如果用户问“申请怎么提交”,回答就可能需要同时交代普通申请和特殊申请的区别。

假设边界刚好落在特殊申请之前,检索只找回第一块,模型就可能漏掉审核要求。可以分别测试增加召回数量、调整边界或补充上下文,看哪种办法能补回来。

这两句话很短,未必真的会被拆开;这里只是假设边界落在中间,说明长文档里可能发生的情况。

读切分预览时,留意这些地方:

  • 条件和对应步骤有没有分开;

  • 表格的数据有没有带上表头;

  • 代码和解释是否还能对应起来;

  • “上述”“以下”“该情况”这些指代是否找得到对象。

换成语义切分后,也用这些问题做对照。原来的错误有没有改善,改善是否值得增加计算和维护成本,都要测。

3.2、切多大:如何逐步扩大切分幅度,先看单位和模型限制

切片长度的单位要先确认。同一个数值,在某个平台里指字符,在另一个平台里可能指 token,不能直接比较。

几份官方资料里的配置就不一样:

平台或资料 推荐值或默认值 单位
百炼知识库创建接口 建议从数百字符量级起步 字符
阿里云 Dify 部署 FAQ 建议从较小的数百字符区间起步 字符
QAnything v2 上传文件接口 默认处于数百 token 量级 tokens
RAGFlow Token Chunker 官方介绍 默认处于数百 token 量级 tokens

对应资料分别是百炼创建索引接口、阿里云 Dify FAQ、QAnything v2 API 文档和RAGFlow 数据处理流程介绍。

这些推荐值和默认值可以作为实验起点,但不同平台的配置并不统一,实际还得看语料。

Dify 的分段文档明确按字符配置最大分段长度和 overlap。使用其他框架时,也要检查它的长度计算方式。

结合 ModelScope 的模型页、模型卡和官方评测,文本 RAG 可以先测试 Qwen3-Embedding 系列。需要稠密、稀疏和多向量混合检索时,也可以把 BGE-M3 加进来比较。

优先候选 适合场景 官方输入与输出规格 选择依据
Qwen3-Embedding-8B 效果优先、多语和较复杂的检索任务 支持 32K tokens,输出维度可在 32 至 4096 之间调整 官方模型卡记录了 2025 年 6 月 5 日 MTEB 多语言评测成绩 70.58;这是当时的结果,不能直接当作当前榜单排名
Qwen3-Embedding-4B 效果与显存、延迟之间取平衡 支持 32K tokens,最高输出维度 2560 与 8B 使用同一系列能力和任务指令,适合作为效果优先方案的资源折中候选
Qwen3-Embedding-0.6B 本地部署、资源受限或需要更低延迟 支持 32K tokens,最高输出维度 1024 参数规模更小,适合先验证语料效果,再决定是否升级到更大模型
BGE-M3 需要混合检索或已有 BGE 生态的项目 支持 8192 tokens、100 多种语言,并支持稠密、稀疏和多向量检索 模型成熟、检索方式完整,适合作为 Qwen3-Embedding 系列之外的对照组

Qwen3-Embedding 系列的规格和版本关系见官方发布说明。模型卡里的成绩要连着评测日期一起看,ModelScope 的页面更新时间和下载量也不能当成效果排名。这些候选在自己的文档上表现如何,要用同一批问题比较,不能凭上表就认定哪个模型在所有语料上都最好。

输入上限说明模型能接收多长的文本,并不直接告诉你块该切多大。

如果模型的输入上限较短,更要把实际文本交给对应的 tokenizer 检查。平台按字符设的长度,未必能直接对应模型的 token 限制,中文、英文、数字和代码的分词结果也不同。

正文之外,拼进去的文档标题、章节路径和特殊 token 也可能占用输入长度。

用云端 embedding 服务时,确认具体接口和地域,还要看长度限制针对单条文本还是整个批次。百炼的 embedding 文档列出了不同接口的限制,某个接口的数字不能直接套到所有模型上。

确认这些限制后,可以从模型或框架的默认长度起步,在同一单位下逐步把块调大。每次保持解析方式、embedding 模型和检索流程一致,用同一批问题比较。

先看切分预览。短块如果把规则拆散了,调大后有没有保留完整段落,多出来的内容是不是仍在讲同一件事?再检查检索和回答,记录证据是否找齐、例外是否遗漏、引用是否对应原文,以及总输入 token 和延迟。

短块经常拆开完整步骤,调大后能保留它,就可以继续测试更大的块。如果原来的块已经够用,多出来的主要是其他主题,再调大就未必有收益。

3.3、要不要 overlap:检查边界损失,也检查重复成本

overlap 会把上一块末尾的一部分内容,保留到下一块开头。

它可以让靠近切分边界的信息出现在相邻块中。Dify 的分段文档也介绍了分段重叠的作用。

比如,前提在上一块结尾,步骤在下一块开头。加入适当重叠后,下一块就可能同时包含前提和步骤。

固定长度滑窗和递归切分的 overlap,表现并不一样。按字符平移的固定窗口,每块开头复制上一块末尾,重复量比较均匀,大约是重叠长度占块长的比例。边界在哪里、重复多少,可以事先算出来。

递归切分按分隔符拆,保留下来的可能是前一块的整句或整段。重复集中在边界附近,具体位置取决于文本结构,得读切分预览才能确认。去重时尤其要留意:这段重复内容可能正是补回的前提,直接删掉,又会缺条件。

不过,重叠能带回多少信息,取决于它的范围。如果某条例外在很远的另一节里,复制相邻的一小段内容仍然不够。这时就需要考虑文档结构、父子分块或检索后的上下文扩展。

重叠也会让一部分内容重复进入索引。如果相邻块都被检索回来,模型上下文里可能出现大段重复文字,占用了本可以留给其他证据的位置。

测试时固定块大小,从不重叠开始逐步加大,单位与当前配置保持一致。尤其留意需要跨边界信息的问题,记录边界信息补全了多少、重复增加了多少,并检查去重后必要条件是否仍在。

如果完整条款或自然段已经保留了必要关系,也可以试试少量重叠,或者不重叠。

3.4、粒度与上下文完整性的矛盾怎么解

有时会遇到这样的情况:短块检索得挺准,但给模型的信息不够;把块放大以后,上下文多了,却又混进其他主题。

检索用的块和交给模型的内容,可以分开设计。

父子分块就是一种做法:用较短的子块匹配问题,命中后返回对应父块。Dify 的父子分段说明采用了这种思路。

回到前面的申请例子。一个子块可能只包含“线上提交”的步骤,便于匹配相关问题;返回父块时,再带上适用条件和审核要求,帮助模型形成完整回答。

父块的范围仍然需要控制。每次命中都返回很长的章节,可能又会增加无关内容和上下文成本。

另一个办法是扩展邻近段落。命中后,按需补充前后内容,让被拆开的步骤或条件一起进入上下文。

LlamaIndex 里也有这两类实现。sentence-window 检索单句,命中后带出周围的窗口;auto-merging 按层级组织块,子块命中得多就合并成父块返回。这类做法常统称 small-to-big,也就是用小块匹配,用大块回答。

补充多少要看文档结构和问题,并控制在上下文预算内。标题和路径也要保留。单独一句“需要先审核”,读者不知道它在说哪类申请;带上“特殊申请/提交流程”,就能看出适用范围,引用也更清楚。

除了检索后补上下文,也可以在索引阶段处理。

contextual retrieval(Anthropic 2024 年 9 月提出)会让 LLM 为每个块生成一段几十个 token 的说明,交代它在全文中的位置,拼在块前面再做 embedding。这段说明补上了“该方法”“上述情况”的指代对象,也可以用来建 BM25 索引。

官方在自家语料上报告,配合 BM25 和重排序,top-20 检索失败率最多下降 67%。这是他们的测试结果,换成自己的语料未必一样。成本在于索引时每个块都要调用一次 LLM,可以通过提示缓存减少开销。

late chunking(Jina AI 2024 年提出)则先编码,再按块池化。整篇文档送进长上下文 embedding 模型,拿到每个 token 的向量后,再按块边界池化成块向量。编码时每个 token 都能看到全文,指代和条件的上下文也参与了表示,不需要额外调用 LLM。

前提是模型的上下文能装下整篇文档(8K 以上)。文档超过这个范围,就不能直接这样处理。

这两种方法都在索引阶段调整。测试时比较指代类问题的 recall,再记录增加的索引成本和耗时,判断是否值得采用。

父块返回、邻近扩展和多次命中都可能产生重复,组装时还可能因为预算限制丢掉部分内容。最后检查去重、裁剪后的上下文,确认条件和步骤仍然在里面。

3.5、建立评测闭环,再与 Top K 联动

如果切法、embedding 模型和检索方式一起换了,即使结果变好,也很难知道哪项调整起了作用。比较时先只改切法或大小,其他条件尽量一致。

评测问题里,有些一句话就能回答,有些需要完整步骤,还有些必须同时看到条件和例外。表格和代码是否要测,则看实际语料。

如果测试集只有“查一个定义”这类问题,就很难发现流程被拆散以后会造成什么影响。

标注时,尽量记录答案对应的源文档证据。重新切分后,再把证据映射到新 chunk,才能比较不同方案有没有找回同一份必要信息,减少边界变化的干扰。

找回一个相关 chunk 后,还得检查证据是否完整。步骤找到了,例外没找到,答案仍可能漏信息。

给每个问题标好必要证据,就可以统计找回了多少,而不只是看结果是否相关:

指标 怎么算 什么时候用
hit rate 前 K 个结果里,至少找回一条必要证据的问题占比 快速粗看;问题只依赖一条证据时够用
recall@K 每个问题命中的必要证据占比,再对所有问题求平均 一题需要多条证据时,看找齐了多少
MRR 第一条命中证据的排名取倒数,再求平均 看证据排得靠不靠前
nDCG@K 命中按排名位置折减,再累加 能区分"很相关"和"沾边"时才有价值

比如“差旅报销怎么提交”需要两条证据:审批条件和提交步骤。只找回步骤,这个问题的 hit rate 已经满分,recall@K 却只有一半。所以一题需要多条证据时,还得看 recall@K。

方案 A 和方案 B 用同一批问题、同一份证据标注,映射到各自的 chunk 后分别计算。比较两组 recall,比“看着找齐了”更容易说明变化,也能发现退步。如果某类问题的 recall 降了,再查看对应的检索结果,通常能看出是边界重新拆开了证据,还是排序变了。

回答也可以检查漏项。把每个问题的必要条件列成清单,答案没交代就记一项,再统计漏项率。问题多了,可以让 LLM 按清单判断。RAGAS 这类框架也用于自动评测,faithfulness 看答案是否依据给出的证据,answer relevancy 看是否切题。自动判分可能出错,需要抽一批结果人工核对。

recall 低,说明证据没找全,先查切分和检索;recall 不低,漏项率却高,问题多半在上下文组装或生成。数字能帮助确定先查哪里,具体原因还得沿着第四部分的流程检查。

切片大小变化后,上一篇讨论的 Top K 也要一起考虑。先固定 Top K,看每组配置在相同返回数量下的表现;再把上下文 token 预算控制到相近水平,检查改善是否主要来自更多的输入内容。

比如,调大块以后回答更完整,可能是边界更合适,也可能是同样的 K 给模型提供了更多文字。控制上下文预算,可以帮助区分这两种情况。

涉及父子分块或邻近扩展时,不能只用 K 乘平均 chunk 长度估算。需要统计组装、去重后的实际输入:

最终组装后的检索内容 token 总量 ≤ 可用上下文预算

还要留意,embedding 模型和生成模型的 tokenizer 可能不同。编码时没有超限,不代表生成阶段的 token 数可以按同一个结果计算。

保留这两轮结果,面试时就可以说明当前方案的依据,再结合错误类型和成本,解释还需要调整什么。

3.6、约 90 秒的面试口述答案

下面以报销制度知识库为例,示范怎么回答。实际面试时,换成自己做过的项目、配置和测试结果。

我会先看文档和用户常问的问题。比如报销制度里,普通报销要补齐材料后提交,差旅报销还得先审批。审批条件和提交步骤如果分在两块里,问“差旅报销怎么提交”时只找回步骤,就会有漏答审批要求的风险。

我会按标题和条款切,太长的条款再按句子拆。先确认长度单位是字符还是 token,从短块开始逐步调大,看能不能把条件和步骤留在一起,同时用对应模型的 tokenizer 检查有没有超限。

漏答如果集中在边界附近,就固定块大小,对比有无 overlap。重叠能不能把“差旅报销需先审批”带到下一块,带回来以后是否少了漏答,相邻块会不会重复太多,都得看结果。

各组都用同一批报销问题测,比较证据的 recall、审批条件的漏答情况,以及实际上下文 token 和延迟。短块找得准却答不全时,我会试着返回父块或补上邻近段落。还要把 Top K 一起考虑,在相近的上下文预算下再比一遍,确认改善是不是主要来自多放了文字。

4、再遇到这个问题的解答思路

遇到答案漏信息,可以沿着这条链路检查:

原文 → 解析 → 切分 → 检索 → 上下文 → 回答。

模型漏掉特殊申请的审核要求时,可以按这个顺序查。

先看原文里有没有这条要求,解析后的文本有没有保留下来。如果解析时已经丢了,调整切片大小也补不回来。

然后看切分结果。审核要求被放在哪一块?它有没有和对应申请类型分开?有没有出现缺少指代对象的片段?embedding 时是否发生截断?

再看检索。对应证据有没有进入候选结果,排在哪里,最终是否被选中?

检索已经找到了证据,就查上下文组装:父块或邻近内容有没有补回来,去重和预算裁剪有没有删掉关键要求?

证据完整进入模型输入后,回答仍然漏项,再检查生成阶段怎么使用这些证据。

找出信息丢在哪一步,再决定改哪里,避免反复试 chunk 大小却没解决问题。准备面试案例时,保留这几个阶段的结果,追问到某个判断,就能拿出对应片段解释。

5、哪些知识需要形成肌肉记忆

这几类问题,可以记住各自从哪里查起:

遇到什么问题 先检查什么
chunk 粒度如何逐步扩大 单位、文档结构和用户问题类型
模型支持 8192,能不能切更长 模型限制、实际编码长度和任务需要
回答漏掉条件或例外 信息在哪个阶段丢失
检索结果重复很多 overlap、相邻块内容和去重方式
块变大以后效果更好 是否同时增加了上下文总量
怎么证明新切法更好 证据标注、recall 和漏项率
块里的指代缺上下文 标题路径、contextual retrieval、late chunking、邻近扩展
要不要使用语义切分 当前切法的问题,以及候选方案的验证结果

字符和 token 不能按固定比例换算,要检查实际文本在对应 tokenizer 下的长度。

平台里的最大长度是配置上限,实际切出来的块可能更短,以切分预览为准。

模型规格和部署配置也要分别检查。模型支持的长度,未必就是当前服务实际采用的长度。

检索单元和最终上下文单元可以不同。使用父子分块、邻近扩展以后,要重新检查实际返回内容、去重和预算。

复习时,试着用自己的文档回答:为什么从当前大小开始?怎么确认没有截断?漏信息时先查哪里?换了切法,拿什么结果判断它更好?卡住的地方,回去补原文片段或测试记录。

6、下篇预告

下一篇:《每周一道 Agent 面试题 - 现在市面上的 Embedding Model 怎么选择》。

切片能完整送进 embedding 模型之后,还要看这个模型能不能把自己的文档检索好。

面试官可能会问:“你们为什么选这个 Embedding Model?比较过哪些候选,依据是什么?”模型名字和榜单名次之外,还得说说它在自己语料上的表现。

下一篇会聊模型在中文、英文和代码语料上怎么测,输入长度与切片怎么配合,以及向量维度、部署方式、延迟和成本的取舍。换模型后怎么验证检索效果、什么时候需要重新选型,也会一起讨论。

7、结束语

准备这道题时,可以找一篇熟悉的文档,里面有完整步骤、适用条件和例外就更好。先切成短块,再逐步调大,保持单位一致,用同一批问题测试。

把切分预览、检索结果、实际模型输入和最终答案放在一起看。条件被拆开了没有?相关内容有没有找齐?前几个结果是不是重复?组装后的上下文还保留了哪些证据?记录这些变化,也记录仍然出错的问题。

调 chunk 的时候,也留意上一篇的 Top K。取回多少块、每块多大、边界在哪里,命中后又补了什么内容,都会影响模型最后看到的文本。

面试官追问配置的依据时,就用这些片段和测试记录回答:当时遇到了什么问题,怎么改的,哪些结果支持这个选择,还有什么情况需要继续调整。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容