知识库回答漏掉一句限制条件时,原因未必是模型“没理解”。原文可能在两个切片之间被截开,检索只拿到前半句;也可能切片重复太多,让同一段说明挤占了其他证据的位置。切片大小与重叠长度需要一起检查,不能只把重叠调大。
本篇用一份极小的本地练习,观察一条限制语句如何跨越切片边界。最终得到切片起止位置、重复字符数量,以及限制语句能否完整出现在单个片段中的检查结果。适合正在搭建RAG知识库、排查回答缺条件的读者。
下文程序是本站编写的字符窗口示例,已用本地Python验证;它没有调用模型、向量数据库或收费接口,也不是LangChain递归切分器的重新实现。关于真实切分器参数的解释,参考LangChain官方源码;示例结果只用于理解边界,不代表线上检索效果。
一、先把三个长度分清楚
原文长度是整份资料的大小。切片大小是希望每个片段容纳多少内容。重叠长度是相邻片段共享的部分,用来降低上下文被边界切断的风险。
这里的“长度”必须先说清单位。Python的len对于字符串计算的是Unicode码点数量,既不等于UTF-8文件字节数,也不等于模型的token数量。中文、英文、表情和组合字符的计数可能呈现不同关系,不能把“十二个字符”宣传成“十二个token”。
LangChain文本切分器允许通过length_function决定长度测量方式。其递归字符切分器还会考虑分隔符,尽量按更自然的边界拆分,而不是永远严格每隔固定数量切一刀。本篇先采用简单窗口,是为了让起点、终点与重复量能直接算清。
切片设置属于资料处理环节,不是生成模型的上下文窗口设置。模型能接收很长文本,并不说明检索阶段一定能找到所需片段。
二、准备一个不会涉及业务资料的练习
准备Python 3环境和一个空文件夹,不需要安装第三方依赖。若电脑尚未安装Python,从其官网获取适合系统的版本;安装后用python --version确认命令可用。某些系统使用python3命令,后续相应替换即可。
练习文本由十个“甲”、一句“不可外借”和十个“乙”组成,共二十四个字符。重复字只是占位,让读者容易看到边界,不是建议拿这样的文本建立真实知识库。
关键语句“不可外借”位于从零开始的第十到第十三号位置。采用左闭右开的区间表示法,其范围是[10,14)。我们将切片大小设为十二,比较重叠为零与四的两种情况。
不要从这个四字符示例推出真实业务的最佳参数。真实文档中,限制条件可能跨段、跨页或依赖表头,几十个字符的重叠也不一定能保留完整语义。
三、保存并运行字符窗口程序
将下面内容保存为chunk_demo.py,编码选择UTF-8。程序只打印结果,不读取或修改其他文件。
def windows(text, size, overlap):
if not isinstance(text, str):
raise TypeError("text must be str")
if type(size) is not int or type(overlap) is not int:
raise TypeError("size and overlap must be integers")
if size <= 0 or not 0 <= overlap < size:
raise ValueError("require size > 0 and 0 <= overlap < size")
result = []
start = 0
while start < len(text):
end = min(start + size, len(text))
result.append((start, end, text[start:end]))
if end == len(text):
break
start += size - overlap
return result
if __name__ == "__main__":
text = "甲" * 10 + "不可外借" + "乙" * 10
for overlap in (0, 4):
chunks = windows(text, 12, overlap)
extra = sum(len(c[2]) for c in chunks) - len(text)
found = any("不可外借" in c[2] for c in chunks)
print("overlap=", overlap, "extra=", extra, "found=", found)
for start, end, content in chunks:
print(start, end, content)在文件所在目录打开终端,运行:
python chunk_demo.py本程序要求重叠严格小于切片大小,是为了保证窗口每次前进。不要据此断言所有框架都采用完全相同的参数校验;使用真实产品时应查看该版本的文档与实现。
四、对照两组实际边界
重叠为零时,程序输出两个区间:[0,12)和[12,24)。第一个片段以“不可”结束,第二个以“外借”开始。单独查看任意一个片段,都没有完整的“不可外借”。因此本练习的found为False,额外字符数为零。
重叠为四时,步长变为八,得到[0,12)、[8,20)、[16,24)三个区间。中间片段完整保留关键语句,found为True。切片长度总和为12加12加8,即32,原文长度24,因此额外字符数为8。
这里的“额外字符”是片段累计长度超过原文的部分,便于看重复量。它没有计入标题、元数据、向量存储结构与索引开销,不能直接当作账单或磁盘占用量。如果按token收费,还必须使用对应模型的计数方法估算。
同样,found为True只代表某个片段包含这段连续字符串。它不保证该片段会被检索选中,也不证明模型会遵守限制。真实验收还应检查检索结果、证据引用和最终回答。
五、把边界练习迁移到一页业务文档
准备一份脱敏的设备借用制度,保留标题、适用范围、借用期限和“设备不可外借”等限制。先只处理这一页,不立即重建整个知识库。
第一步,查看平台提供的切片预览,找到限制条件所在片段。记录片段编号、起止位置、标题与来源版本。若平台不展示字符位置,至少保存可追溯的段落编号。
第二步,分别尝试两组切分配置,观察同一句话有没有被拆开、表格标题有没有与数值分离。若切分器使用段落或句子分隔,实际重叠可能不是每一对片段都精确相同,应以预览内容为准。
第三步,提出两个具体问题:“设备能借给其他团队吗?”以及“内部借用期限是多久?”前者检查限制,后者检查另一条独立信息。不要只测一个恰好靠重叠改善的问题。
第四步,保留相同问题、相同检索条数和相同模型设置,只变更切片策略。否则同时改变模型与检索参数,无法判断差异来自哪里。
这套步骤是迁移建议,不是本站已在你的知识库执行的记录。平台需要上传文件或开通服务时,先确认资料权限与当前账号权益;本地小程序本身不需要开通云服务。
六、重叠过大为什么也会出问题
当多个相似片段都进入检索前几名,结果看起来很多,实际可能围绕同一段内容重复。原本应该补充期限或例外条件的片段没有进入候选,回答仍不完整。
排查时先统计命中片段的来源位置,看看相邻切片是否占了大部分名额。然后检查是否需要按文档位置去重、适当扩大候选范围,或在重排阶段增加多样性。不要直接删除所有重复词,因为同一句限制在不同文档版本里可能有不同效力。
有些问题并不适合靠重叠解决。表格缺少表头,需要处理表格结构;页眉混入正文,需要先清洗;制度版本混用,需要版本过滤;关键限制根本没有进入资料库,需要补齐来源。先看原文与切片证据,再决定调哪个参数。
七、完成后的验收与排错
- 本地程序应产生两组输出,零重叠的found为False,四字符重叠为True。
- 两组额外字符数量应分别为0和8,不能把原文长度误写成切片累计长度。
- 空文本应返回空列表;size为0、重叠等于大小或负重叠应被本示例拒绝。
- 真实知识库需要同时检查关键条件完整、来源可追溯、结果不过度重复,以及另一条独立信息仍能召回。
- 中文显示异常时先检查文件编码与终端编码,不要为消除乱码修改业务原文。
最终记录一份简短配置说明:资料类型、长度单位、切分方式、重叠设置、固定测试问题、观察结果与未解决问题。下一次更换文档或模型时,用同一组问题复查,而不是沿用一个没有证据支持的“万能重叠比例”。
八、给配置变更留一份可以比较的记录
记录时把“看起来更好”替换为可检查的观察。例如,配置甲的前五个结果中,三条来自同一段相邻区域,而配置乙只有一条;或者限制语句虽然完整,却排在实际送入模型的范围以外。这样的记录能够指导下一步处理,单纯说回答更流畅则不能说明证据是否改善。
每次修改前保留旧配置,给新旧切片集合使用不同的测试标识。若平台重新索引需要时间,等索引完成再比较,不要把新旧数据混合返回的短暂状态当作最终结果。若同一文档存在多个版本,同时记录版本号,避免旧制度与新制度各召回半句后拼成一个并不存在的规则。
完成一次小范围比较后,再决定是否扩大处理范围。更新知识库时还要考虑已有引用的位置是否改变、历史链接能否回查,以及访问权限是否跟随切片保留。这里只讨论切片边界,不建议为了便于对比取消访问控制。
可以让AI辅助整理观察记录,但原始片段和测试问题要留底。让它先列出每个结论所依赖的片段,再由人对照原文确认;如果找不到证据,就把该项记为尚未验证。这样调参记录才不会变成一份只有自信结论、没有资料依据的报告。

还没有公开评论,欢迎分享你的想法。