从 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大模型商业化落地方案作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量。

相关新闻

Redis数据库缓存数据

Redis数据库缓存数据

缓存课程表不用Redis数据库用户端数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力也会增大,系统响应慢、用户体验差用户-----》前端页面------》后端服务------》数据库使用Redis可以把数据缓存到内存中,减少数…

2026/7/21 20:08:49阅读更多 →
Nginx部署多个端口

Nginx部署多个端口

Nginx 是一个高性能的HTTP和反向代理web服务器,在开发时经常会使用它来部署项目,但是只有一个 nginx.conf文件,使用的是Nginx 的默认配置,其中所有站点配置都集中在这个文件中。在 Windows 上,Nginx 的默认配置文件通常…

2026/7/21 20:08:49阅读更多 →
PKUAutoElective测试与验证:如何确保自动选课工具的稳定性

PKUAutoElective测试与验证:如何确保自动选课工具的稳定性

PKUAutoElective测试与验证:如何确保自动选课工具的稳定性 【免费下载链接】PKUAutoElective 北大选课网补退选阶段自动选课小工具 项目地址: https://gitcode.com/gh_mirrors/pk/PKUAutoElective 在北大选课补退选阶段,PKUAutoElective自动选课工…

2026/7/21 20:08:49阅读更多 →
【爱马仕】Hermes 本地智能助手安装避坑大全,启动异常统一处理方案(含安装包)

【爱马仕】Hermes 本地智能助手安装避坑大全,启动异常统一处理方案(含安装包)

Windows 本地部署 Hermes 环境繁琐?整合部署包 5 分钟完成搭建 前言 不少用户想要体验 Hermes Agent 智能工具,但手动搭建环境的过程中极易出现各类阻碍。 手动安装各类依赖组件、调试系统运行环境、修正目录路径,操作过程中还会频繁出现命…

2026/7/22 0:05:18阅读更多 →
企业办公自动化 OpenClaw 一键部署流程,零基础快速上手(含安装包)

企业办公自动化 OpenClaw 一键部署流程,零基础快速上手(含安装包)

OpenClaw 一键安装包|可视化部署,简化复杂环境配置 适配环境与版本说明 适配系统:Windows10/11 64 位、macOS 12 及以上 当前整合版本:v2.7.9(虾壳云整合包) 压缩包体积:45.8MB,推…

2026/7/22 0:05:18阅读更多 →
同时维护多个项目,Plus 还够用吗?买 Credits 还是升级 Pro

同时维护多个项目,Plus 还够用吗?买 Credits 还是升级 Pro

同时维护前端、后端、脚本和个人项目时,Codex 需要反复读取不同仓库的目录结构、项目规则和测试命令,使用强度通常会明显增加。如果只是偶尔切换项目,例如月底集中处理一次版本更新,继续使用 Plus,并在额度不足时补充 …

2026/7/22 0:05:18阅读更多 →
Codex 测试总跑不完怎么办?补 Credits 还是升级 Pro

Codex 测试总跑不完怎么办?补 Credits 还是升级 Pro

使用 Codex 修改代码后,真正耗时间的往往不是生成代码,而是运行测试、分析失败日志并继续修复。如果经常在这个阶段触发限制,可以先判断是偶发超额,还是长期使用强度已经提高。**偶尔跑大型测试,更适合补充 Credits。*…

2026/7/22 0:05:18阅读更多 →
交通标识与信号灯数据集分享(适用于YOLO系列深度学习检测任务)

交通标识与信号灯数据集分享(适用于YOLO系列深度学习检测任务)

交通标识与信号灯数据集分享(适用于YOLO系列深度学习检测任务) 数据集下载 链接:https://pan.baidu.com/s/1Cih2VbAGbbuqZl92841VSA?pwdmpws 提取码:mpws 复制这段内容后打开百度网盘手机App,操作更方便哦 在智能驾驶与智慧交通的研究中&am…

2026/7/22 0:05:18阅读更多 →
2026最新8款个人AI编程免费工具深度实测

2026最新8款个人AI编程免费工具深度实测

作为一名全栈独立开发者,我最近半年一直在折腾副业项目,每个月在AI编程工具上的订阅费算下来其实也不算便宜。作为个人开发者,我们追求的就是用最少的成本获得最高效的开发体验。TRAE 基础版免费,字节跳动出品的国内首款 AI 原生 …

2026/7/22 0:03:17阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/21 0:51:49阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →