必须先做语义合理的Chunk切分,否则模型会因输入过长或内容断裂而报错;依据文档结构选择标题锚点、自然断点或字符长度切分,并验证每块是否句子完整、指代内聚、代码闭合。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当你把一份20页的技术白皮书直接喂给Grok模型,它只读到第3页就报错“Input too long”,不是模型不行,而是你没在输入前做语义合理的Chunk切分——这一步跳过,后续所有提示词优化、摘要生成、问答检索全都会卡在第一关。
先判断该用哪种切分逻辑
别一上来就写代码。打开你的原始文本,快速扫三眼:有没有清晰的章节标题?段落是否自然换行?关键句子是否被硬生生截断在行末?
如果文档结构松散(比如会议纪要、扫描PDF转出的乱序文字),【必须跳过语义切分,先用字符长度粗切】,否则连基本可读性都保不住。
如果文档带明确层级(如Markdown手册、带H2/H3标题的API文档),优先走标题锚点切分;若含大段代码块或表格,必须让切分点避开代码行中间——否则模型会收到一个不完整的函数定义,直接报语法错误。
按字符长度硬切:安全兜底法
方法一:用空字符作分隔符,强制连续切分
调用CharacterTextSplitter时,【separator=""必须显式设置】,否则默认按双换行\n\n切分,遇到无格式文本会漏切或切出超长块。
chunk_size设为800~1200字符(对应Grok-4 Turbo约300~450 token),chunk_overlap取chunk_size的15%~20%,例如size=1000则overlap=150。
这一步操作起来很简单,直接把文件拖进去就行。
按语义边界智能切分
第一步:识别自然断点
扫描全文,标记所有句号、问号、感叹号后紧跟换行的位置;再标出所有以“##”“###”开头的行;最后圈出所有以“```”起始和结束的代码块边界。
第二步:优先在这些位置切分
确保每个chunk结尾不是半截句子,也不在代码块中间——比如某段Python函数从def开始到return结束共32行,那就把它整个包进一个chunk,哪怕它有1100字符也比拆成两块强。
第三步:对剩余无法归入边界的长段落,回落到字符长度切分,但size降为600,overlap升至200,用重叠补偿语义断裂。
处理混合内容:代码+文字要分开对待
方法一:用正则预分离
先用re.split(r'(```[\s\S]*?```)', text)把代码块单独拎出来,文字部分走语义切分,代码块整体保留不拆。
方法二:用LangChain的RecursiveCharacterTextSplitter
设置separators=['\n\n', '\n', ' ', ''],让它逐级尝试更粗粒度的分割符,比硬切更懂“段落”概念;但注意【chunk_size必须比模型上下文少至少200 token】,留出系统提示词和输出空间。
验证Chunk质量的三个硬指标
打开切完的任意5个chunk,逐条检查:
① 是否每块都以完整句子开头和结尾?
② 是否没有孤立的“详见第5节”“如表3所示”这类指向外部的指代?
③ 代码块是否完整闭合?没有缺失缩进或漏掉return语句?
有一项不满足,立刻回溯调整切分策略,不要进入下一步向量化流程。


















