AI大模型实战系列(三):数据重塑——文档解析、分块策略与向量化底层实操指南

在构建企业级 RAG(检索增强生成)系统的旅程中,很多开发者往往将绝大部分精力倾注于大语言模型(LLM)的微调或 Prompt 的打磨上。然而,无数惨痛的真实项目经验告诉我们:RAG 系统的天花板由数据管道(Data Pipeline)决定,而 LLM 只是去逼近这个天花板。 业界有一句名言:“Garbage in, garbage out(垃圾进,垃圾出)”。

本章,我们将正式进入 RAG 研究范式演进中的核心环节。我们将抛开表层的 API 调用,深入到 Naive RAG 的底层数据重塑过程:探讨企业各种格式的知识(txt、doc、html 等)如何被无损解析,长文档如何被科学分块(Chunking),以及这一切如何通过 Embeddings(向量化)技术转化为大模型能够理解的数学语言。


一、 文档解析(Document Parsing):从非结构化到纯文本的泥潭

在理想的 Demo 中,知识库往往是纯净的 .txt 文件。但在真实的一线商业项目中,企业积累的知识载体极为复杂,包括包含双栏排版的 PDF、嵌有表格的 Word、扫描版发票以及带有大量冗余标签的 HTML 网页。

1. 解析方案的工程化考量

将这些企业知识源转化为大模型可读的文本,是 RAG 链路的第一道关卡。如果解析阶段丢失了关键信息(如 PDF 中的财务表格被解析成了错乱的乱码),后续的向量检索和 LLM 生成将毫无意义。

  • 常规文本解析:对于纯文本或标准的 Markdown,直接读取即可。
  • 复杂 PDF/Word 解析(行业干货补充):这是目前 RAG 数据处理的重灾区。
    • 基础方案:如 PyPDF2,仅能提取纯文本,极易丢失段落结构和表格信息。
    • 进阶方案:使用 PyMuPDF(即 fitz)或 pdfplumber,能够较好地保留页面布局、提取图像和还原基本表格。
    • 企业级终极方案:对于扫描件或极其复杂的研报,业内普遍采用结合 OCR(光学字符识别,如 PaddleOCR)与版面分析(Layout Analysis)技术的多模态解析模型(如 Unstructured 库或阿里 DocMind),将非结构化文档精准解析为结构化的 Markdown 格式。Markdown 的标题层级(#, ##)对后续的语义分块具有极高的指导价值。

二、 分块策略(Chunking):切割知识大象的艺术

大模型的上下文窗口(Context Window)是有限且昂贵的。即使模型支持超长上下文,一次性塞入过长的文档也会导致检索精度下降和严重的“注意力涣散(Lost in the middle)”。因此,我们必须将长篇大论切分成适合大模型吞吐的“文档块(Document Chunks)”。

1. 基础分块方法论

在 Naive RAG 中,存在几种主流的文本分块策略:

  • 按字符数切分:最简单粗暴的方法,设定一个固定长度(如每 500 个字符一刀)。缺点是极易将完整的句子拦腰截断,破坏语义完整性。
  • 按句子切分:利用标点符号(如句号、问号、叹号)进行切分,能保证单句语义的完整,但可能导致块(Chunk)过小,缺乏足够的上下文背景。
  • 固定字符数结合滑动窗口(Overlapping Window):为了弥补硬切分导致的语义断层,工程上通常会引入“重叠(Overlap)”机制。例如,块大小设为 500 字符,重叠设为 50 字符。这样 Chunk 2 的开头会包含 Chunk 1 的结尾,如同瓦片叠搭,最大限度保留了跨块的上下文连贯性。

2. 业界标配:递归字符文本分块(RecursiveCharacterTextSplitter)

这是目前 LangChain 框架中最推荐、也是适用性最广的分块器。它的底层逻辑是“逐级降级切分”:
它预设了一个分隔符列表,通常是 ["\n\n", "\n", " ", ""](即双换行、单换行、空格、无间隔)。系统会优先尝试用最高级别的双换行符(通常代表段落)来切分文本;如果切出来的块仍然超过设定的最大字符数,则降级使用单换行符(句子)继续切分该块,以此类推。这种递归方法能最大程度地将语义相关的文本(如同一个段落)保留在同一个块中。

3. 高阶分块策略(补充干货)

在复杂的商业项目中,基础的分块往往不够用,以下是几种进阶策略:

  • 语义分块(Semantic Chunking):不依赖物理标点,而是通过计算相邻句子的向量相似度,当发现前后两句语义发生突变时,才在该处“切一刀”。
  • 父子文档检索(Parent-Child / Small2Big):将文档切分成极小的 Chunk 用于精准的向量召回;但在真正交给 LLM 生成时,将该小 Chunk 所在的完整“父级段落”一并喂给大模型。这兼顾了检索的精度与生成的丰富度。

三、 向量化(Embeddings):文本的数学灵魂

切分好的文档块,计算机依然无法理解其语义。我们必须通过 Embeddings 技术,将文本转化为一组浮点数,映射到一个高维的数学空间中。

1. 从几何向量到语义向量

在数学中,向量(也称为欧几里得向量、几何向量)是指具有大小和方向的量,可以形象化地表示为带箭头的线段。例如,在二维平面上,“长沙”可以用坐标 [4,2][4, 2][4,2] 表示。

然而,文本的语义极其复杂,二维或三维空间根本装不下。在大模型语境下,向量化就是用一个高维数值向量“表示”一个对象(Object)的方法。
例如,经过特定模型的处理,“长沙”这个词(或一整段文本)可以被表示为由成百上千个浮点数组成的数组:
[0.8,−0.3,0.5,0.34,0.12,1.78,9.12,2.34,−0.23,0.5...][0.8, -0.3, 0.5 , 0.34 , 0.12 , 1.78 , 9.12 , 2.34 , -0.23 , 0.5 ...][0.8,0.3,0.5,0.34,0.12,1.78,9.12,2.34,0.23,0.5...]
在这个包含 768 维或 1024 维(取决于具体模型)的空间中,每一个数字对应一个维度,整个数组精确对应了该 nnn 维空间中的一个点。

2. 万物皆可 Embeddings

向量化并非文本的专利,图片、声音等非结构化数据同样可以进行数值化编码。
一个最直观的例子是“颜色”这种实体对象,我们可以用 (R,G,B)(R, G, B)(R,G,B) 这样一个三元素向量对其进行编码。例如,红色是 [255,0,0][255, 0, 0][255,0,0],绿色是 [0,255,0][0, 255, 0][0,255,0]。色彩的渐变与相似,完全可以通过这三个维度的数值差异来精确衡量。
同理,在文本的高维向量空间中,向量之间的距离远近,直接等价于对应文本的语义相似度大小。语义越相近的段落(如“如何报销”与“差旅费申请流程”),它们在这个空间中的坐标点就挨得越近。


四、 向量模型的选择与本地私有化部署(Ollama 实操)

那么,我们如何把文本转换为高质量的「词向量」呢?这并非由人工计算,而是由专门用于输出向量的神经网络模型——即嵌入模型(Embedding Model)来完成。不同的厂商由于训练语料和架构的不同,输出的向量维度和精度也会有所差异。

1. 在线 API 与本地部署的抉择

  • 在线向量模型:如 OpenAI 的 text-embedding-3-large,国内的通义或豆包系列向量模型。优势是免运维、接入速度快;劣势是企业必须将核心机密数据上传至云端进行计算,这在金融、政务等强合规场景下是绝对被禁止的。
  • 本地私有化部署:借助 Huggingface(或国内镜像地址)、魔搭社区(ModelScope)下载开源向量模型并在企业本地服务器运行,确保数据绝不出域。

2. Ollama 框架极速部署

直接基于代码部署模型通常需要配置复杂的 CUDA 环境并手写加载逻辑,比较繁琐。目前工程界最方便、最优雅的本地部署方案是借助 Ollama 框架。

Ollama 是一个开源框架,专为在本地机器上极其便捷地部署和运行大模型而设计。
Windows 环境保姆级部署步骤:

  1. 下载安装:访问官方网址 https://ollama.com/,下载适用于 Windows 的安装包(OllamaSetup.exe),双击运行并耐心等待安装完成。
  2. 验证安装:打开 Windows 的 PowerShell 终端,输入 ollama,若出现命令帮助画面,即代表安装成功。
  3. 选择并拉取向量模型:在 Ollama 官网的“Models”页面搜索,我们可以选择 nomic-embed-text,但这里更强烈建议使用 bge-m3bge-m3 是由智源人工智能研究院(BAAI)开源的顶级向量模型,其核心优势在于强大的多语言支持、多粒度能力以及出色的泛化表现。
  4. 一键拉取与运行:回到 PowerShell,执行命令:
    ollama pull bge-m3
    
    等待数 GB 的模型权重下载完毕。完成后,可通过命令 ollama list 查看本地已安装的模型列表。
    部署完成后,你的本地机器就变成了一个私有的、免费的 Embedding API 服务器,可以通过 Python 代码随时调用以获取海量文本的词向量。

五、 距离度量:向量间相似度的底层数学计算

当所有文档块和用户的查询问题都被转化为高维向量后,检索(Retrieval)的过程本质上就是一次数学计算:寻找空间中与“问题向量”距离最近的“文档向量”。

常用的向量相似度计算方法主要有以下三种:

  1. 欧式距离(L2 Euclidean Distance)
    这是最直观的空间距离度量,计算两个点在空间中的绝对直线距离。值越小,代表两者越相似。
  2. 余弦相似度(Cosine Similarity)
    这是文本检索领域最主流、最核心的计算方法。它不关注向量的绝对长度(模长),而是基于两个向量在空间中夹角的余弦值来衡量相似度。其数学公式为:
    cos⁡(θ)=A⋅B∣∣A∣∣∣∣B∣∣\cos(\theta) = \frac{A \cdot B}{||A|| ||B||}cos(θ)=∣∣A∣∣∣∣B∣∣AB
    夹角越小(余弦值越接近 1),代表两个向量的方向越趋于一致,语义越相似。这有效地抹平了文档长度差异带来的干扰(例如,一篇长文章和一句短查询在语义上可能高度匹配,但它们的向量模长差异巨大,此时余弦相似度依然能准确捕捉它们的语义相关性)。
  3. 点积(Dot Product)
    计算两个向量各维度对应元素的乘积之和。点积的计算速度极快,但前提是向量必须经过归一化(Normalized)处理。当向量的模长为 1 时,点积的结果在数学上等价于余弦相似度。

本章总结

从应对脏乱差的原始文档,到精准的切分策略,再到搭建基于 Ollama 的私有化 bge-m3 向量引擎,以及底层的空间距离计算——我们已经完整走通了 RAG 系统中最脏、最累、但也最能决定应用上限的“数据管道基建”。

然而,当海量的向量数据生成后,靠写循环用 CPU 去逐一计算余弦相似度是极其缓慢且无法支撑商业级并发的。我们需要专门的基础设施来存储和疾速检索这些高维数组。

在下一章中,我们将进入架构的核心区:深度解析专用向量数据库(如 Chroma、Milvus、Faiss)的选型对比,并揭秘其实现亿级数据毫秒级检索的底层索引机制。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐