在处理数万字的长文本时,DeepSeek 报错“输入超出上下文窗口”,问题往往出在分段方式上——并非文本太长,而是切分方法没有对准语义边界。如果硬按字符切,很可能把“由于协议未校验签名”和“因此存在重放风险”拆成两段,模型根本看不出因果关系。本文就来聊聊,如何基于语义边界做更靠谱的分段,提升长文本处理效率。

按句末标点做语义断句
第一步:使用正则 r'(?<=[。!?])' 分割原文,确保每个切片以句号、问号或感叹号结尾,并且标点必须保留在前一句末尾。
第二步:逐句累加字符数,累计到 12000 字符左右(留出 prompt 和输出余量)时立即封箱,不等下一句——哪怕刚停在半句话中间也要截止,否则下一段开头就会缺少主语。
第三步:每段开头插入固定指令前缀:【请仅基于本段内容回答问题,不参考其他段落】。这句必须放在最顶行,不能换行,不能加空格,否则模型很可能直接忽略掉这句指令。
如果某单句本身超过 800 字,强制在最近一个逗号或分号处补切。这种长句往往嵌套从句,硬塞进一段会导致模型注意力分散,输出逻辑混乱。
带重叠的滑动窗口切分
方法一:基础长度设为 16000 字符,重叠取 20%,也就是 3200 字符。但重叠区必须落在完整句内——宁可少重叠 200 字,也不能截断句子。
方法二:每段末尾加唯一标识,比如【窗口#3-尾部重叠】,方便后期比对重复提取项。API 请求时,必须在 messages[0].content 中显式写入重叠部分,别指望模型能自动“记住”前文。操作起来其实很简单,直接把重叠文本粘贴到下一段开头就行,但很多人漏掉标识,导致合并结果时无法区分哪条信息来自哪个窗口。
依文档结构层级划分
识别中文标题,最稳的方式是用正则匹配:r'^(第[一二三四五六七八九十]+[章节]|[d.]+s+[^n]+)$'。具体格式需要根据实际文档微调——合同里常用“第一条”“第二章”,技术文档则多用“3.2 接口鉴权流程”。
每个标题块内部再校验长度:如果超过 18000 字符,回退到最近一个句号处分割——不能为了凑整章而牺牲句子完整性。
每块开头插入结构提示:【章节起始:4.1 错误码定义】,结尾加【章节终止】。DeepSeek V4 对 Markdown 标题解析不太稳定,必须靠预处理显式标记,否则它可能把“附录B”当成正文里的普通段落。
切分前务必清洗文本
PDF 转文本时,经常带出页眉“©2026 DeepSeek 文档库 第 3 页”、全角空格、乱码括号这些隐藏字符,它们会悄悄吃掉 5%~10% 的有效 token 配额。
在执行切分前,先跑一遍 clean_text() 函数:替换全角标点为半角、压缩连续空白、删除重复行。否则你自以为切了 5 段,其实第 3 段因为隐藏字符超标,已经被静默截断了。
说回正题——分段这件事,归根结底不是技术问题,而是对文本结构的理解。把语义边界、文档层级和预处理都做到位,模型才能像阅读一本逻辑清晰的书一样,逐段消化你的内容。
