报错是这么冒出来的。用 RecursiveCharacterTextSplitter 按 chunk_size=512 切产品手册,一张 30 行参数表被切成三块,用户问某型号耐压值时命中的块只有表头没有数据行。

中间走过弯路,把「表格先被转成纯文本,行列对应关系丢了」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。切割器只在分隔符处断开,表格行之间没有可用的段落分隔。也可能是chunk_overlap 设成 0,切断处上下文接不上。

不容易想到的是,每个块单独 embedding,表格语义被拆散。

上来先确认表格在哪一步被拍平

python -c "s=open('manual.md',encoding='utf-8').read();print(s.count('|'),s.count(chr(10)))"

接着把表格整体转成 markdown 单独成块

python -c "import pandas as pd;print(pd.read_html('spec.html')[0].to_markdown(index=False)[:120])"

给表格块补上型号前缀与重复表头

python -c "print('型号 X200 | 耐压 | 10MPa')"

末了切分时禁止在表格内部断开

python -c "from langchain_text_splitters import RecursiveCharacterTextSplitter;s=RecursiveCharacterTextSplitter(chunk_size=512,separators=[chr(10)*2,chr(10)+'|','。'],keep_separator=True);print(len(s.split_text('a。b。')))"

别只看报错消失,验证要多做一步。问型号耐压时命中的块里同时出现型号、列名和数值,单块不超过 600 字,抽 20 个表格问题命中率超过 0.9。

容易忽略的是,表格块最好单独走一路索引,和正文混在一起时向量会被平均值拉偏,混合检索常常不如分开。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189