qinghuan
← 回到知识探索

AI 直觉 / 案例拆解

把说明书切成小块,会不会把条件切丢?

检索找到“最多三次”还不够,切分和取回上下文时要把它适用的条件一并保住。

展开本文目录
  1. 字数整齐,不代表意思完整
  2. 同一个命中,补回它所在的段落
  3. 重叠能缓解断句,也会带来重复
  4. 用带条件的问题检查切分结果
  5. 记住这三点
  6. 别把例子用过头
  7. 自己试一小步
  8. 查原始资料
  9. 找一份资料继续练
开始前,会这些就够了
  • 知道检索会从文档中找相关片段
遇到不熟悉的词,先看这 1 个解释
文档切块
把长文档分成便于检索和传入模型的小段。切在哪里,会决定规则的数字、条件和例外能否一起被找到,所以不能只检查每块字数是否整齐。
打开完整术语小抄 ↗

假设内部手册写着:“自动重试最多三次。仅适用于只读请求。”同事问接口失败后能重试几次,助手只取回前一句,回答“三次”。数字没有抄错,但如果这次是写入请求,关键条件已经在送给助手之前丢了。

知识库常先把长文档切成小块,英文叫 chunk,再分别建立检索索引。这样方便找具体内容,也便于控制送入模型的材料长度。切成块不是无损地装进小盒子:边界选在哪里,会影响后面能看到哪些信息。

字数整齐,不代表意思完整

固定长度切分很直接:每到指定字符数就切一刀。但一句规则的数字、适用对象、例外和时间范围,可能分散在相邻句子里。即使每句话都没切断,“仅限”“除外”“从下周起”这样的限定,也可能被放到另一个检索不到的块中。

按段落和标题切分更容易保留作者原来的组织方式,却也不是保证。一个超长段落仍可能超出预算,一张表里的列名可能在上一页,某个条件也可能写在本章开头。所以检查对象应是可回答的问题,而不只是切出来的块是否一样大。

同一个命中,补回它所在的段落

下面先按九个字符硬切,再用关键词“三次”找到一个小块;另一边展示这条规则所在的完整段落。程序只演示字符串边界,没有向量模型,也不会理解什么叫只读。本例已知规则在第一段,所以直接使用 paragraphs[0],并没有实现自动寻找父段落。

示例保留文档编号、版本和字符位置,便于回到原文核对。把 chunk_size 改为 7 时,“三次”本身也被切开,程序会提示没有命中。真实系统可以先用小片段定位,再按保存的关联信息补回同版本标题或父段落;补回后仍要检查长度和权限。

小实验 · python
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 数。

别把例子用过头

  • 按句子或段落切分也可能丢掉跨段落条件,不能承诺语义完整。
  • 本例只是确定性的字符串演示,没有测量真实检索召回率或模型回答质量。

自己试一小步

一份包含“仅限”“除外”和版本日期的手册,怎样切分才便于核对?

  1. 写三条带适用条件的虚构软件规则。
  2. 分别按固定长度和段落切分,给每个块记录来源与版本。
  3. 为每条规则提出一个例外问题,检查检索片段缺了什么。

做到这些,就算完成

  • 能否从片段回到同版本原文?
  • 是否检查了标题、条件和例外,而不只检查句子是否完整?
  • 证据不足时,是否留下继续检索或明确说明不足的路径?

查原始资料

想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。

找一份资料继续练

先选一项,按下面的范围继续学;不必从头读完整门课程。