HTML 正文被改写
HTMLSemanticPreservingSplitter 把正文 PRESERVED_0 换成表格内容。避开固定占位符,明确取消整块保留的代价,按原文核对受影响检索分块。
HTML 正文写着 PRESERVED_0,经过 HTMLSemanticPreservingSplitter 后,这个字面文本却被替换成表格中的内容,表格还在后面再出现一次。分块没有报错,但用于检索的文字已经变了。
这一条件涉及 langchain-text-splitters 1.1.3,已核对的正式实现仍为待保留元素生成固定 PRESERVED_<n> 占位符,随后在整个分块字符串中 replace。原文里恰好相同的文字,也会被替换。
占位符与正文共用字符空间
例如正文是“see PRESERVED_0 here”,后面有待保留的 table。表格先被暂存为 PRESERVED_0,恢复时便同时改写正文中的同名文字和真正的表格位置。
文档、代码说明或日志中都可能合法出现这种字符串。它不是可以删掉的杂质,也不是检索模型胡编;应在 HTML 处理前后的完整内容里确认第一次变化发生在哪里。
旧的“PRESERVED_1 匹配进 PRESERVED_11”问题与它不同。按逆序恢复能缓解占位符之间的前缀冲突,却不能区分一个真实正文单词和相同的内部标记。
不需要整块保留时,避开这条替换路径
业务允许表格按普通内容处理时,可以明确取消元素保留,避免生成这组内部标记。下面只创建 splitter,不读取页面或写索引:
from langchain_text_splitters import HTMLSemanticPreservingSplitter
splitter = HTMLSemanticPreservingSplitter(
headers_to_split_on=[("h1", "H1")],
elements_to_preserve=[],
max_chunk_size=1000,
chunk_overlap=0,
)
配置中的标题层级和分块大小只是示例,应沿用原检索流程的要求。取消保留后,表格、列表等不再具有“作为完整元素留在一个块里”的约定,大表格可能被进一步拆分;这不是原配置的等价替换。
需要完整表格语义时,应先保留原 HTML 与表格数据,阻止受影响分块继续入库。再选择能明确区分原文与内部标记的处理实现,或把表格作为独立结构提取,并沿检索系统保留文档、位置与关联。不能仅因新分块数量正常,就宣布表格行列关系也保住了。
若采用占位符修订,标记需要与经过实际清洗、实体解码及自定义 handler 后的内容都不冲突,且不会在进一步分块时被拆坏。只改成“随机字符串”而没有检查转换后的输入和恢复边界,仍不足以保证正确。
验收内容,而不是分块数量
对照原文中的字面 PRESERVED_0、多个待保留元素和相似的数字后缀。确认原文字样没有被替换,真实表格的内容与位置符合所选处理契约,再检查长文进一步分块、重叠和 metadata。
已有索引若保存了改写结果,应从对应版本的原始内容重新整理受影响部分。不要在索引结果中把表格文字全局替换回 PRESERVED_0,它也可能是真实正文或另一个表格的数据。
这条处理针对内容碰撞,不证明恢复循环的性能问题也已解决。先保证被检索的文字忠于输入,再评估自己的文档规模与分块策略。


