从 PDF 到向量检索:一个最简单的本地 RAG 入库案例
最近看了不少企业级 RAG 平台的源码,发现一个通病:一上来就是 Milvus Neo4j MinIO 好几个中间件一起怼,想学习文档怎么变成向量这个核心链路,反而被一堆基础设施绕晕了。这篇文章把这条链路拆到最简:解析 → 分块 → 向量化 → 入库,四步走完,全程本地跑,不需要任何服务器、不需要 Docker,一个 Python 脚本搞定。技术选型环节用什么为什么选它解析pymupdf4llm纯 Python 库,几秒装完,直接把 PDF 转成带标题结构的 Markdown分块按标题/段落切分不用额外依赖,几行代码向量化sentence-transformerstext2vec-base-chinese中文效果好,模型不大入库Zvec阿里开源的嵌入式向量库,pip install即用,不用起服务四个环节全是进程内跑的库,没有一个是要单独部署的服务。环境准备pip install pymupdf4llm sentence-transformers zvec --break-system-packagesStep 1:解析 —— PDF 转 Markdownimport pymupdf4llm def parse_pdf(pdf_path: str) - str: 把 PDF 转成保留标题结构的 Markdown 文本 md_text pymupdf4llm.to_markdown(pdf_path) return md_text markdown_content parse_pdf(sample.pdf) print(markdown_content[:500])为什么不直接用PyPDF2之类的库硬提取文字?因为那样会把标题、段落、表格全部拍扁成一坨纯文本,后面分块时没法按结构切,容易把一句话从中间切断。pymupdf4llm会保留 Markdown 的#、##这些标题标记,分块时可以按标题层级切,语义更完整。如果文档更复杂(扫描件、复杂表格、公式),可以把这一步换成 MinerU,接口不用改,只是解析函数内部实现不同。Step 2:分块 —— 按段落/标题切分from typing import List import re def split_into_chunks(markdown_text: str, max_chars: int 500) - List[str]: 按标题和段落切分,超长段落再按字数二次切分 # 先按标题切成大块 sections re.split(r\n(?#{1,3}\s), markdown_text) chunks [] for section in sections: section section.strip() if not section: continue # 段落内部再按空行细分,避免单块过长 paragraphs [p.strip() for p in section.split(\n\n) if p.strip()] buffer for p in paragraphs: if len(buffer) len(p) max_chars and buffer: chunks.append(buffer) buffer p else: buffer f{buffer}\n\n{p} if buffer else p if buffer: chunks.append(buffer) return chunks chunks split_into_chunks(markdown_content) print(f共切分为 {len(chunks)} 个 chunk) for i, chunk in enumerate(chunks[:3]): print(f[{i}] {chunk[:80]}...\n)Step 3:向量化 —— 文本转 Embeddingfrom sentence_transformers import SentenceTransformer embedding_model SentenceTransformer(shibing624/text2vec-base-chinese) def embed_chunk(text: str) - List[float]: embedding embedding_model.encode(text, normalize_embeddingsTrue) return embedding.tolist() embeddings [embed_chunk(chunk) for chunk in chunks] embedding_dim len(embeddings[0]) print(f向量维度: {embedding_dim})Step 4:入库 —— 写入 Zvecimport zvec # 定义 schema:一个存原文的字段 一个存向量的字段 collection_schema zvec.CollectionSchema( namepdf_kb, fields[ zvec.FieldSchema(nametext, data_typezvec.DataType.STRING), ], vectors[ zvec.VectorSchema( nameembedding, data_typezvec.DataType.VECTOR_FP32, dimensionembedding_dim, index_paramzvec.HnswIndexParam(metric_typezvec.MetricType.COSINE), ), ], ) # 本地建库,数据落在 ./pdf_kb_data 目录下 collection zvec.create_and_open(path./pdf_kb_data, schemacollection_schema) def save_to_zvec(chunks: List[str], embeddings: List[List[float]]) - None: for i, (chunk, embedding) in enumerate(zip(chunks, embeddings)): collection.insert( zvec.Doc( idstr(i), vectors{embedding: embedding}, fields{text: chunk}, ) ) collection.optimize() # 插入完成后构建索引,加速检索 save_to_zvec(chunks, embeddings) print(入库完成)验证一下:检索测试def retrieve(query: str, top_k: int 3) - List[str]: query_embedding embed_chunk(query) result collection.query( querieszvec.Query(field_nameembedding, vectorquery_embedding), topktop_k, ) return [doc.fields[text] for doc in result] results retrieve(文档里提到的核心观点是什么?) for i, chunk in enumerate(results): print(f[{i}] {chunk}\n)完整流程串起来def build_kb_from_pdf(pdf_path: str): markdown_content parse_pdf(pdf_path) chunks split_into_chunks(markdown_content) embeddings [embed_chunk(c) for c in chunks] save_to_zvec(chunks, embeddings) print(f处理完成:{pdf_path} - {len(chunks)} 个 chunk 已入库) build_kb_from_pdf(sample.pdf)小结这套流程的核心思路就四步:解析:把 PDF 转成保留结构的 Markdown,而不是拍扁的纯文本分块:按标题段落切,避免语义被硬切断向量化:用中文效果好的开源 embedding 模型入库:选一个不需要起服务的嵌入式向量库整个脚本没有 Docker、没有独立服务、没有云依赖,python build_kb.py直接跑完,数据全部落在本地目录里。如果以后需求变复杂了(海量文档、多租户、知识图谱),再往上叠 MinerU、Milvus 这些重组件也不迟——但对于个人项目或者快速验证一个想法,这四步已经够用。学习资源推荐如果你想更深入地学习大模型以下是一些非常有价值的学习资源这些资源将帮助你从不同角度学习大模型提升你的实践能力。一、全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取二、640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取三、AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取四、AI大模型商业化落地方案作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量。

相关新闻

swtpm完全指南:基于Libtpms的TPM模拟器如何彻底改变安全开发

swtpm完全指南:基于Libtpms的TPM模拟器如何彻底改变安全开发

swtpm完全指南:基于Libtpms的TPM模拟器如何彻底改变安全开发 【免费下载链接】swtpm Libtpms-based TPM emulator with socket, character device, and Linux CUSE interface. 项目地址: https://gitcode.com/gh_mirrors/sw/swtpm TPM(可信平台模…

2026/7/25 7:26:16 阅读更多 →
MySQL 开发避坑:NULL 和空值不是一回事

MySQL 开发避坑:NULL 和空值不是一回事

目录 一. NULL和空值定义上的区别 二. NULL和空值在表中显示的区别 三. NULL值和空值查询方式的区别 3.1 NULL 值的查询方式 3.2 空值的查询方式 3.3 查询NULL的方式可以查询空值 3.4 查询空值的方法不可以查询NULL值 四. 聚合函数会计算空值但不计算NULL值 一. NULL和…

2026/7/25 7:05:10 阅读更多 →
从告警疲劳到智能运维:Keep构建企业级AIOps监控新范式

从告警疲劳到智能运维:Keep构建企业级AIOps监控新范式

从告警疲劳到智能运维:Keep构建企业级AIOps监控新范式 【免费下载链接】keep The open-source AIOps and alert management platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep 在数字化转型浪潮中,企业监控体系正面临前所未有的挑…

2026/7/23 14:12:01 阅读更多 →

最新新闻

Dify实战教程:从零到一构建企业级AI应用,30+项目手把手教学

Dify实战教程:从零到一构建企业级AI应用,30+项目手把手教学

这次我们来看一个Dify的实战教程资源。这个资源不是一个新的开源项目,而是一套完整的视频课程,标题宣称“B站讲的最好的Dify入门到精通教程”,并承诺通过手把手教学,带练30+个企业级实战项目,目标是让学习者在一周内轻松搞定AI应用搭建。 对于任何想快速掌握Dify这个热门…

2026/7/25 22:41:56 阅读更多 →
Buzz项目管理:高效管理平台开发的方法与工具

Buzz项目管理:高效管理平台开发的方法与工具

Buzz项目管理:高效管理平台开发的方法与工具 【免费下载链接】buzz A hive mind communication platform 项目地址: https://gitcode.com/GitHub_Trending/buzz14/buzz Buzz作为一款高效的团队协作平台,为项目管理提供了全面的解决方案。无论是小…

2026/7/25 22:41:56 阅读更多 →
codebase-memory-mcp:为AI编程助手构建代码知识图谱,实现精准导航与高效分析

codebase-memory-mcp:为AI编程助手构建代码知识图谱,实现精准导航与高效分析

你是否遇到过这样的场景:当你向 Claude Code 或 Cursor 这样的 AI 编程助手提问“这个函数被谁调用?”或“这个 API 的入口在哪里?”时,AI 需要花费大量上下文 Token 去读取一个又一个文件,才能拼凑出答案。这不仅响应…

2026/7/25 22:41:56 阅读更多 →
垃圾回收机制GC——SSD如何在“不能覆写“的世界里清理空间?

垃圾回收机制GC——SSD如何在“不能覆写“的世界里清理空间?

摘要:NAND闪存有一个致命特性——写前必须擦除,且擦除的最小单位是"块"(Block),不能像HDD那样直接覆盖单个扇区。当空闲块不足时,SSD必须在后台执行垃圾回收(Garbage Collection&…

2026/7/25 22:41:56 阅读更多 →
【NVIDIA】NVIDIA k8s-device-plugin v0.19.3 系统级架构分析

【NVIDIA】NVIDIA k8s-device-plugin v0.19.3 系统级架构分析

NVIDIA k8s-device-plugin v0.19.3 系统级架构分析 分析对象: github.com/k8s-device-plugin-0.19.3 代码语言: Go (116个非vendor Go文件) 分析日期: 2026-07-25 目录 项目整体架构整体设计思路整体运行流程子模块/功能模块划分模块调用关系主流程详解 1. 项目整体架构 1.1 项…

2026/7/25 22:41:55 阅读更多 →
Userspace RCU在实时系统中的应用:低延迟高吞吐的秘密

Userspace RCU在实时系统中的应用:低延迟高吞吐的秘密

Userspace RCU在实时系统中的应用:低延迟高吞吐的秘密 【免费下载链接】userspace-rcu This repo is a mirror of the official userspace-rcu git found at git://git.lttng.org/userspace-rcu.git. liburcu is a LGPLv2.1 userspace RCU (read-copy-update) libra…

2026/7/25 22:40:55 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 5:08:22 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 5:13:53 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻