开始前,会这些就够了
- 知道检索会从文档中找相关片段
假设内部手册写着:“自动重试最多三次。仅适用于只读请求。”同事问接口失败后能重试几次,助手只取回前一句,回答“三次”。数字没有抄错,但如果这次是写入请求,关键条件已经在送给助手之前丢了。
知识库常先把长文档切成小块,英文叫 chunk,再分别建立检索索引。这样方便找具体内容,也便于控制送入模型的材料长度。切成块不是无损地装进小盒子:边界选在哪里,会影响后面能看到哪些信息。
字数整齐,不代表意思完整
固定长度切分很直接:每到指定字符数就切一刀。但一句规则的数字、适用对象、例外和时间范围,可能分散在相邻句子里。即使每句话都没切断,“仅限”“除外”“从下周起”这样的限定,也可能被放到另一个检索不到的块中。
按段落和标题切分更容易保留作者原来的组织方式,却也不是保证。一个超长段落仍可能超出预算,一张表里的列名可能在上一页,某个条件也可能写在本章开头。所以检查对象应是可回答的问题,而不只是切出来的块是否一样大。
同一个命中,补回它所在的段落
下面先按九个字符硬切,再用关键词“三次”找到一个小块;另一边展示这条规则所在的完整段落。程序只演示字符串边界,没有向量模型,也不会理解什么叫只读。本例已知规则在第一段,所以直接使用 paragraphs[0],并没有实现自动寻找父段落。
示例保留文档编号、版本和字符位置,便于回到原文核对。把 chunk_size 改为 7 时,“三次”本身也被切开,程序会提示没有命中。真实系统可以先用小片段定位,再按保存的关联信息补回同版本标题或父段落;补回后仍要检查长度和权限。
paragraphs = [
'自动重试最多三次。仅适用于只读请求。',
'写入请求:未携带幂等键时,不允许自动重试。'
]
document = '\n\n'.join(paragraphs)
chunk_size = 9 # Try another positive length, such as 7.
chunks = [(start, document[start:start + chunk_size])
for start in range(0, len(document), chunk_size)]
match = next(((start, text) for start, text in chunks if '三次' in text), None)
if match is None:
print('没有小块包含完整关键词;回到原文检查切分。')
else:
start, hit = match
print(f'小块 [{start}:{start + len(hit)}]: {hit}')
# This small example already knows that the rule is in the first paragraph.
print('同版本父段落:', paragraphs[0])
print('来源: retry-guide / v3 / 第一段')怎样运行:保存为 chunk_conditions.py,用 Python 3.10 或更新版本运行:python chunk_conditions.py。仅用标准库,不联网。
运行后对照结果
小块 [0:9]: 自动重试最多三次。
同版本父段落: 自动重试最多三次。仅适用于只读请求。
来源: retry-guide / v3 / 第一段重叠能缓解断句,也会带来重复
重叠是让相邻块重复带上一小段文本,像两张照片留一点共同画面,帮助接上前后关系。但条件如果离数字很远,一点重叠还是带不到;重叠开得很大,又会多存、多检索一批近乎相同的内容,挤占可用上下文。
大小也没有通用答案。短一点可能容易命中具体主题,却容易缺背景;长一点可能保留解释,却夹进不相关部分。字符数、字节数和模型的 token 数是不同单位,不能把“九个字符”的本地演示直接换算成线上模型的输入预算。
用带条件的问题检查切分结果
为知识库准备几类问题:只问数字、问例外、问某个版本才生效的规则,再人工核对取回材料是否够用。如果材料没有覆盖写入请求,就应继续找那条规则,或说明当前证据不足;补回父段落也只恢复了本段,不代表整个问题已经得到答案。
阅读 Azure 的中文切分指南时,先看固定大小、按结构和重叠的取舍;再读 LangChain 关于中文标点的说明,动手把本例的九改成其他长度。目标是发现什么情况下会丢条件,而不是从某个教程抄一个块大小当作永久最佳配置。
记住这三点
- 检索块要尽量保住规则、适用条件和例外之间的联系。
- 小块定位后补回同版本上下文是一种做法,仍要检查预算、权限和证据是否充分。
- 重叠和块大小需要用真实问题评测,字符数也不等于模型 token 数。
别把例子用过头
- 按句子或段落切分也可能丢掉跨段落条件,不能承诺语义完整。
- 本例只是确定性的字符串演示,没有测量真实检索召回率或模型回答质量。
自己试一小步
一份包含“仅限”“除外”和版本日期的手册,怎样切分才便于核对?
- 写三条带适用条件的虚构软件规则。
- 分别按固定长度和段落切分,给每个块记录来源与版本。
- 为每条规则提出一个例外问题,检查检索片段缺了什么。
做到这些,就算完成
- 能否从片段回到同版本原文?
- 是否检查了标题、条件和例外,而不只检查句子是否完整?
- 证据不足时,是否留下继续检索或明确说明不足的路径?
查原始资料
想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。
- Azure AI Search:拆分大型文档用于 RAG 和向量搜索 (新标签页)↗
固定大小、按结构切分、重叠的取舍,以及字符数与 token 数的区别。
- LangChain:递归文本切分 (新标签页)↗
分隔符顺序、长度函数、目标重叠,以及中文等无空格词界语言的标点处理。
找一份资料继续练
先选一项,按下面的范围继续学;不必从头读完整门课程。
Microsoft Learn:文档切块怎样保住上下文 (新标签页)↗
只读分块技术与内容重叠,用一条带“仅限”的虚构规则检查条件有没有被切丢,暂不配置云服务。
查看学习准备与访问说明 →