Appearance
13.1.2 文档清洗、切块、Embedding、入库、检索、生成分别怎么串起来?
先给结论:最小链路要做到“可追踪”。每一步都要能看到输入和输出,才能知道问题卡在哪里。
下面给出一条最小可用链路,把每一步如何连接说清楚。
1. 文档清洗
目标是让文本“可切、可读、可检索”:
- 去掉重复页眉页脚
- 清理乱码与无意义符号
- 保留标题与层级线索
产出:一份干净的原文档文本。
2. 切块
切块要满足两点:
- Chunk 有语义完整性
- Chunk 可被检索命中
最小策略:
- 长度 300-800 字之间
- 适度重叠(50-150 字)
产出:一组 chunk 列表。
3. Embedding
对每个 chunk 生成向量表示。关键是:
- 每个 chunk 有唯一 ID
- 向量与原文一一对应
产出:(chunk_id, text, vector) 的记录。
4. 向量入库
把向量存进向量数据库或向量索引系统。最小结构包含:
idtextvectormetadata(来源、标题、页码等)
产出:可查询的向量索引。
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)常见误区
误区一:跳过清洗直接切块
噪声会进入向量索引,导致召回不稳定。清洗是最低成本的质量提升。
误区二:切块没有标题信息
没有标题与层级,检索会失去定位能力,尤其是长文档。
误区三:生成不看证据
如果生成不强制依赖证据,你就无法判断检索是否有效。
自检清单
- 每一步是否都有可观察的输出?
- 是否能从召回结果定位原文?
- 生成答案是否能对应到证据片段?
一句话总结
把最小链路跑通的关键不是“模型多强”,而是“每一步都可追踪、可验证”。