Nexus Agent组合式切块引擎:结构、递归、语义与LLM四种切块策略如何协同
Nexus Agent组合式切块引擎:结构、递归、语义与LLM四种切块策略如何协同
Nexus Agent 是企业级 AI 智能体 Agent 平台,其文档知识库的核心能力之一,就是组合式切块引擎。它不再用固定长度"一刀切"文档,而是根据文档的标题结构、段落质量、内容主题,动态组合结构切块、递归分块、语义分块、LLM 智能切块四种策略,让切出来的每一个块都更适合 RAG 检索。这篇文章带你完整拆解:四种策略各自解决什么问题、它们如何按流水线协同、系统又是如何为每份文档自动推荐策略组合的。
为什么切块策略不能"一刀切"
在 RAG(检索增强生成)系统中,文档切块直接决定了检索命中率:
- 块太大:语义混杂,向量检索命中后模型拿到大量无关内容,回答失焦;
- 块太小:上下文断裂,关键信息被切散,召回的片段回答不了问题;
- 按固定长度硬切:标题、步骤、表格被拦腰截断,语义完整性全毁。
Nexus Agent 的解法是:四种策略不四选一,而是各司其职,组成组合式流水线。一句话概括:
结构负责保留文档天然边界,递归负责控制块大小,语义负责优化块边界,大模型负责处理疑难场景。
四种策略定义在 DocumentStrategyTypeEnum.java 中,每种策略在流水线里都有明确的角色(DocumentStrategyRoleEnum.java):
| 切块策略 | 角色 | 解决什么问题 | 触发时机 |
|---|---|---|---|
| 结构切块(STRUCTURE) | 🏛️ 主干 | 按标题/章节切成语义完整的块,保留天然边界 | 文档有明显的标题层级(如 PDF、Word、Markdown) |
| 递归分块(RECURSIVE) | 🛡️ 兜底 | 结构块太大时继续往下裁剪,控制块大小 | 文档较长或存在超长段落 |
| 语义分块(SEMANTIC) | ✂️ 优化 | 按主题相似度精修块边界,避免切碎话题 | 文本主题边界明确、质量中等以上 |
| LLM 智能切块(LLM) | 🧠 增强 | 大模型理解文本后切出语义完整片段 | 低质量或结构不稳定的疑难文档(默认关闭) |
自动推荐:系统怎么决定用哪些策略
上传文档后,Nexus Agent 不会让你盲选算法。系统先通过 Tika 解析出纯文本,再产出一份 DocumentAnalysisResult.java 分析结果,包含:字符数、标题数量、段落数、最长段落长度、结构级别、内容质量等级等指标。
随后,DocumentStrategyServiceImpl.java 中的 recommendStrategy 方法按规则打分推荐:
- 结构切块:文件类型为 PDF/Word/Markdown/HTML,且结构级别达到"中等"或标题数 ≥ 2 → 推荐为主干;
- 递归分块:总字符数或最长段落超过
recursive-max-chars(默认 800)→ 追加为兜底; - 语义分块:字符数达标、段落数 ≥ 3、质量等级中等以上 → 推荐做边界优化;
- LLM 智能切块:内容质量判定为"低"且开启
recommend-llm-when-low-quality→ 追加增强。
推荐结果会生成一份策略计划(Strategy Plan),附带每条策略的推荐原因,用户在管理后台可以查看并手动增删调整,确认后才真正执行。切块在整个入库流水线中的位置,由 DocumentTaskStageEnum.java 定义:文件上传 → 内容解析 → 策略路由 → 策略确认 → 切块执行 → 切块后处理 → 向量化 → 入库完成,每一步都有独立任务日志可追溯。
Parent-Child 双流水线:大块保完整,小块保命中
切块引擎最核心的设计是 Parent-Child(父子块)双流水线,两条流水线分别使用不同的策略组合:
| 流水线 | 目标粒度 | 策略组合逻辑 |
|---|---|---|
| 父块(Parent) | 较大语义单元(上限 2200 字符) | 有结构信号 → 结构切块主干;无结构 → 递归分块兜底 |
| 子块(Child) | 较小检索单元(上限 800 字符) | 低质量文档 → LLM 增强;否则语义分块优化;递归分块始终追加兜底 |
为什么这么分?因为检索和回答的需求是矛盾的:检索时希望块小、语义集中,向量命中率高;回答时希望块大、上下文完整,模型才好组织答案。父子块结构让两者兼得——向量检索命中 Child 小块后,系统自动聚合提升为对应的 Parent 大块,再交给模型生成回答。
流水线执行:四种策略如何串联
用户确认策略后,executePipeline 方法按 stepNo 顺序依次执行每一步策略,前一步的输出就是后一步的输入。四种策略的具体实现都在 DocumentStrategyServiceImpl.java 中:
1️⃣ 结构切块:按标题栈走
逐行扫描文本,识别标题行时压入"标题栈",维护一条形如 第一章 > 1.2 安装 的章节路径(sectionPath)。每个新标题出现时,把上一段内容 flush 为一个块。这样切出的块天然对齐文档的章节边界,且每块都携带自己的结构坐标,后续可关联 Neo4j 的 Document → Section → Item 结构图谱做章节定位。如果整份文档没识别出任何标题,会自动降级为递归分块,保证不会切不出结果。
2️⃣ 递归分块:多级边界 + 重叠保护
recursiveSplit 按"段落 → 换行 → 句子 → 固定窗口"的粒度逐级尝试切分:能用段落边界就切段落,段落还不够长就降级到句子,实在不行才按固定长度滑窗。相邻块之间保留 recursive-overlap-chars(默认 120 字符)的重叠前缀,把上一块的尾部内容补到下一块开头,缓解"关键信息正好落在切分边界"导致的上下文断裂。
3️⃣ 语义分块:按主题相似度断句
语义分块先按句子(中英文句末标点)切分,然后逐句累积。对每句提取词元(英文单词 + 单个汉字),与当前块的词元集合计算 Jaccard 相似度。当相似度低于 semantic-similarity-threshold(默认 0.18,说明话题已经切换),且块长达到 semantic-min-chars(默认 240)时,就在此处断开。块长同时受 semantic-max-chars(默认 700)约束。效果是:话题一致的句子合并成块,话题一换就断开,边界比纯长度切分更贴合语义。
4️⃣ LLM 智能切块:大模型处理疑难文档
当文档质量偏低(扫描件噪声、结构混乱)时,规则类策略往往力不从心。开启 llm-enabled 后,系统把文本(单段超过 llm-max-chars 3500 字符时先递归切小)交给大模型,提示词模板在 document-llm-split.st,要求模型输出语义完整、不丢信息的 JSON 数组片段。这条路径有双重保险:模型未配置或调用失败时,自动回退到语义切块,流水线不会中断。
LLM 策略默认关闭(成本考虑),只在文档质量被判定为"低"时才会被系统推荐追加。
关键参数速查表
所有切块参数集中在 application.yaml 的 app.manage.chunk 段,对应 DocumentManageProperties.java 的 Chunk 配置类:
| 参数 | 默认值 | 作用 |
|---|---|---|
recursive-max-chars |
800 | 递归分块单块最大字符数,过大块会被继续递归裁剪 |
recursive-overlap-chars |
120 | 相邻块重叠字符数,缓解边界上下文断裂 |
semantic-max-chars |
700 | 语义块目标上限,防止块过大 |
semantic-min-chars |
240 | 语义块目标下限,避免切得过碎 |
semantic-similarity-threshold |
0.18 | 主题相似度低于该值即在句间断开 |
llm-enabled |
false | 是否开启大模型智能切块(控制成本) |
llm-max-chars |
3500 | 单次送 LLM 切块的最大字符数 |
recommend-llm-when-low-quality |
true | 低质量文档时是否自动推荐 LLM 切块 |
协同全景:一次切块发生了什么
把整条链路串起来看,一份文档从上传到入库的切块过程是:
- 解析:Tika 把 PDF/Word 等格式转成纯文本;
- 分析:统计标题、段落、质量等级,产出文档画像;
- 推荐:按规则生成父块/子块双流水线策略组合 + 推荐理由,用户确认;
- 执行:
executePipeline按顺序串联四种策略,结构切块产出带章节路径的语义块 → 语义分块精修边界 → 递归分块控制块长并加重叠; - 去重清洗:每一步执行完都经过
cleanupChunkList按"章节路径 + 序号 + 文本"去重,空块剔除; - 聚合:子块挂回父块,形成 Parent-Child 结构;
- 入库:向量化后,子块写入向量库(PGVector)用于检索,关键词写入 ES 倒排索引,支撑双通道混合检索。
这套设计对新手有哪些启发
📌 策略不是单选,而是分工组合——每种算法只做自己最擅长的事,弱项交给下一个环节兜底; 📌 先分析再决策——用文档画像(标题数、段落长度、质量等级)驱动策略推荐,而不是全局一个固定配置; 📌 永远设计降级路径——结构切块找不到标题就降级递归,LLM 失败就回退语义,任何一环失败流水线都不中断; 📌 检索粒度与回答粒度解耦——Parent-Child 结构同时满足"命中率高"和"上下文完整"两个矛盾需求。
相关的核心源码入口:
- 切块引擎与策略推荐:DocumentStrategyServiceImpl.java
- 切块候选数据结构:ChunkCandidate.java
- 父块候选(含子块聚合):ParentBlockCandidate.java
- 切块实体:SuperAgentDocumentChunk.java
- 策略步骤实体:SuperAgentDocumentStrategyStep.java
- 策略确认接口:DocumentManageController.java
理解了这套组合式切块引擎,你就掌握了 Nexus Agent 知识库质量的第一道闸门——切块做得好,后面的混合检索、父子块聚合、证据生成才有发挥空间。