切块
检索的单位是 chunk(块),不是整份文件。块太大:一次召回塞进很多无关句子,LLM 被噪声带偏。块太碎:答案需要的前后句被切开,向量「不像」完整语义。
经验起点(再按你的语料调):
chunk_size 按字符数对中文够用;若你用 tokenizer 计 token,以嵌入模型的上限为准(常见 8k,但检索块应远小于上限)。
重叠(overlap)
相邻块共享尾巴,避免「答案正好卡在切口」。重叠大约是块长的 10%–20%。重叠过大:重复存储、检索重复;过小:跨段事实丢失。
这是滑动窗口,不考虑语义。下面用分隔符改进。
按结构切,再按长度切
Markdown 和制度文档应按标题切开,再对过长节做窗口切。伪代码:
元数据里保留 heading 和文件名,检索过滤和引用都用得上。
不要把「第 3 条」和它的款项拆到两个不相邻的块里还只索引其中一半。列表、步骤、问答对应尽量同块。
其它策略(知道何时用)
LangChain 的 RecursiveCharacterTextSplitter、LlamaIndex 的 node parser、Dify 的 General / Parent-child / Q&A 都是这些策略的产品名。原则相同,见 LangChain RAG、LlamaIndex、Dify 知识库。
中文注意
- 不要按空格切中文(常常没有空格)。优先句号、换行、标题。
- 「300 字符」大约是一段制度;英文 300 字符往往偏短。
- 专有名词(产品代号、条款号)不要从中间切开。
切完后人工抽查 20 块:有没有半截表格、半个函数、问在一块答在另一块。这比调向量库参数更值钱。
最小检查
块数突然上万:可能按字符切了整本小说且 overlap 太大。块数只有 1:可能忘了切,整文件当一块(只适合极短 FAQ)。
下一步
- Embeddings — 把块变成向量
- Chroma — 把块存进去
- 流水线