> For the complete documentation index, see [llms.txt](https://orderbook-trade.gitbook.io/agent/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://orderbook-trade.gitbook.io/agent/rag/1.1-wen-dang-chunk-he-pdf-parser.md).

# 1.1 文档chunk 和PDF Parser

既然要做 Agent，我们就理解一个最简单的一个流程。

其实它和之前数据库读写是一样的，本身它就是一个 Agent，把我们想让它去读的一些数据交给它，然后给它一些命令，让它去操作它，让它做一些我们想让它做的东西。

### 为什么要 Chunk？

PDF 是非结构化的，LLM 有 context window 限制，不可能把整本文档塞进去。所以我们要做的事情是：

1. **解析** PDF，把每页文字提取出来， 拿到对应的内容和一些PDF中间的页码、页眉这些周边的context数据。
2. **切块（Chunk）**，把长文本切成固定大小的小片段
3. 每个 chunk 带上元数据：来自哪个文件、第几页、是第几个 chunk

这就是后续向量检索的基础——检索的最小单位不是"一篇文档"，而是"一个 chunk"。

### PyMuPDF 解PDF

用 `fitz`（PyMuPDF）打开 PDF，逐页提取文本。每一页返回一个 dict，包含文件名、页码、文本内容。

```python
def load_pdf_by_page(file_path: str) -> List[Dict[str, Any]]:
```

这里把 PDF 拿到之后，加载这个文件。加载完就可以通过 fitz 这个工具，把 PDF 解析成 text、source 和 page。

然后用 dict 的一个 map 去存它们，存完之后就能拿到这样一个 list，包含某一个 year、某一个文对应的一些页脚和页面的内容。

## Chunk 切块

拿到这些原始文案之后， 然后就可以开始Chunk这个了text 了。

每个 chunk 有唯一的 `chunk_id`，格式是 `文件名:p页码:c序号`，方便后续追踪来源。

```
Chunk ID: project.pdf:p14:c0
Source: project.pdf
Page: 14
Text: 图二 - 进行PESTLE 分析时要考虑的因素概述 
 
PESTLE 分析可能会提供大量信息，所以重要的是要考虑哪些发现对采购方案有实际意义。 无
论是正面的或负面的，首要工作是确定可能会对采购方案产生影响的因素，同时从这些信息
中得出结论，为正在设计和细化的PPSD 提供信息。 
 
```

### Chunk\_size 和  Overlap

Chunk size 是表明按照每个切块（chunk 本身就是切的意思）多大的方式去切。

Overlap 就是相邻 chunk 之间有多少个重叠，避免一句话被切断后上下文缺失，从而让检索片段的语义更加完整。

* 但如果 overlap 过大，会把内容弄得混乱频繁检索出来
* 如果过小，则有可能会导致语义不太完整。
