Skip to content

13.1.2 文档清洗、切块、Embedding、入库、检索、生成分别怎么串起来? ​

先给结论:最小链路要做到“可追踪”。每一步都要能看到输入和输出,才能知道问题卡在哪里。

下面给出一条最小可用链路,把每一步如何连接说清楚。

1. 文档清洗 ​

目标是让文本“可切、可读、可检索”:

  • 去掉重复页眉页脚
  • 清理乱码与无意义符号
  • 保留标题与层级线索

产出:一份干净的原文档文本。

2. 切块 ​

切块要满足两点:

  • Chunk 有语义完整性
  • Chunk 可被检索命中

最小策略:

  • 长度 300-800 字之间
  • 适度重叠(50-150 字)

产出:一组 chunk 列表。

3. Embedding ​

对每个 chunk 生成向量表示。关键是:

  • 每个 chunk 有唯一 ID
  • 向量与原文一一对应

产出:(chunk_id, text, vector) 的记录。

4. 向量入库 ​

把向量存进向量数据库或向量索引系统。最小结构包含:

  • id
  • text
  • vector
  • metadata(来源、标题、页码等)

产出:可查询的向量索引。

5. 检索召回 ​

输入用户问题,召回 top-k chunk。最小策略:

  • k 取 3-5 先跑通
  • 返回 chunk 原文 + 元信息

产出:候选证据列表。

6. 生成答案 ​

把候选证据拼成上下文,交给模型生成答案。
最小目标:

  • 生成必须引用证据内容
  • 避免回答超出证据范围

产出:答案文本 + 引用片段。

一条最小可运行链路(伪代码) ​

python
docs = load_documents("./docs")
cleaned = clean(docs)
chunks = split(cleaned, size=500, overlap=100)
records = embed(chunks)
index = vector_store.upsert(records)

query = "用户的问题"
hits = index.search(query, k=5)
answer = generate(query, hits)

常见误区 ​

误区一:跳过清洗直接切块 ​

噪声会进入向量索引,导致召回不稳定。清洗是最低成本的质量提升。

误区二:切块没有标题信息 ​

没有标题与层级,检索会失去定位能力,尤其是长文档。

误区三:生成不看证据 ​

如果生成不强制依赖证据,你就无法判断检索是否有效。

自检清单 ​

  • 每一步是否都有可观察的输出?
  • 是否能从召回结果定位原文?
  • 生成答案是否能对应到证据片段?

一句话总结 ​

把最小链路跑通的关键不是“模型多强”,而是“每一步都可追踪、可验证”。