> For the complete documentation index, see [llms.txt](https://yeasy.gitbook.io/context_engineering_guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yeasy.gitbook.io/context_engineering_guide/di-si-bu-fen-gong-cheng-shi-zhan-yu-wei-lai-yan-jin/14_practice/14.2_knowledge_base_vectorization.md).

# 14.2 知识库构建与向量化

高质量的数据是 RAG 系统效果的基石。本节我们将处理“垃圾进，垃圾出”（Garbage In, Garbage Out）的问题。

## 14.2.1 数据清洗与预处理

### 格式统一

不同来源的文档需要转换为统一的中间格式（各类 Parser）。

* **PDF**：使用 `PyMuPDF` 或 `Marker` 提取文本和表格。注意去除页眉页脚的干扰信息。
* **Markdown**：保留标题层级结构（Header Metadata），这对于后续检索至关重要。
* **Word/Excel**：使用 `python-docx` / `pandas` 提取内容。

### 清洗策略

* 去除乱码和不可见字符。
* 合并断行的段落（PDF 常见问题）。
* 去除无意义的短文本（如“版权所有”）。

## 14.2.2 文档分块

我们在第 5 章讨论过分块策略，这里的示例采用 **递归字符/结构切分 + overlap** 的组合策略。它不是完整语义分块器，但能保留段落和句子边界，适合作为第一版可运行管线。

```python
# 示例：RecursiveCharacterTextSplitter 默认按字符长度度量 chunk_size
from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=512,      # 字符级块大小；如需 token 级切分，应传入 tokenizer 版本的 length_function
    chunk_overlap=64,    # 字符级重叠部分，保证上下文连续性
    separators=["\n\n", "\n", "。", "！", "？"] # 优先按段落和句子切分
)
```

**实战技巧**：

* **父子索引 (Parent-Child Indexing)**：切分成小块（Child）用于向量检索，但检索到后返回其所属的大块（Parent）或全文给 LLM。这能兼顾检索的精准度和上下文的完整性。

## 14.2.3 向量化

### 模型选择

可参考公开的嵌入评测（如 MTEB 等）选择候选模型，并结合自身语料与任务评测集做最终选型。

* **开源方向**：中文/多语言嵌入模型、指令式嵌入模型等。
* **商用方向**：通用嵌入服务，按质量/成本/延迟权衡。

### 向量库写入

使用向量数据库或带向量扩展的数据库存储向量。务必为每个 Chunk 附带元数据（Metadata）：

* `source`: 来源文件名
* `page`: 页码
* `created_at`: 创建时间
* `category`: 文档分类（用于后续过滤）

```jsonc
{
  "content": "公司差旅报销标准...",
  "vector": [0.12, -0.05, ...],
  "metadata": {
    "source": "员工手册2026版.pdf",
    "page": 12,
    "category": "HR"
  }
}
```

## 14.2.4 本地实验入口

配套实验把本节的数据读取、分块和元数据保留落成了标准库实现，可先用小样本跑通接口边界：

```bash
python3 examples/enterprise_know/enterprise_know.py --query "差旅报销需要在多久内提交？"
```

实验代码位于 [`examples/enterprise_know/`](/context_engineering_guide/di-si-bu-fen-gong-cheng-shi-zhan-yu-wei-lai-yan-jin/14_practice/enterprise_know.md)，其中 `sample_docs/` 展示了带部门权限元数据的知识库文档。真实系统可以替换为 PDF/Office 解析器、领域嵌入模型和持久化向量库，但应保留来源、权限、版本和分块参数等元数据。
