RAG启动:文档加载、分块策略、BGE-M3向量化与向量数据库建库

RAG启动:文档加载、分块策略、BGE-M3向量化与向量数据库建库 0. 上下文衔接前七天完成了第四章简历审查Agent——一个典型的线性工作流Agent,8个节点顺序执行,单次任务出结果。今天进入第五章RAG(Retrieval-Augmented Generation,检索增强生成)系统,复杂度上一个台阶:从"单输入单输出"变成"多轮对话+知识检索+条件分支+记忆机制"。为什么需要RAG?大模型有三个硬伤:知识截止:训练数据之后的新知识不知道幻觉问题:会一本正经地编造答案没有私有知识:企业内部文档、产品手册完全不了解RAG的核心思想:先检索,再生成。让大模型"开卷考试",根据检索到的知识片段回答问题,答案可溯源、可控制、减少幻觉。Day 9+ 在线查询Day 8 RAG离线建库Day 1-7 前序能力LangGraph状态机async异步体系LlamaFactory模型工厂Pydantic结构化输出1 文档加载PDF按页 / MD整体2 智能分块标题优先 + 二次切分3 BGE-M3向量化稠密+稀疏双向量4 向量数据库建库Milvus/Universe HNSW索引意图识别路由混合检索 + RerankLLM生成带引用答案多轮对话记忆RAG分两大阶段:离线建库(今天讲的5.2-5.5节):把文档变成向量存进数据库,一次性操作在线查询(后续5.6-5.10节):用户提问时实时检索+生成1. 文档加载:PDF vs Markdown1.1 两种加载器文档格式加载器Document粒度特点PDFPyPDFLoader(langchain_community)每页一个Document按页拆分,有页码metadataMarkdownTextLoader整个文件一个Document纯文本加载,后续用标题切分Document对象统一结构:page_content:文本内容(str)metadata:元数据字典(source路径、page页码等)# backend/rag/document_loader.pyfrompathlibimportPathfromlangchain_community.document_loadersimportPyPDFLoader,TextLoaderfromlangchain_core.documentsimportDocumentdefload_document(file_path:str)-list[Document]:"""统一文档加载入口:根据后缀自动选择加载器"""path=Path(file_path)ifnotpath.exists():raiseFileNotFoundError(f"文件不存在:{file_path}")suffix=path.suffix.lower()ifsuffix==".pdf":loader=PyPDFLoader(file_path)docs=loader.load()# 补充元数据:文件名(source默认是绝对路径)fordocindocs:doc.metadata["filename"]=path.namereturndocselifsuffixin(".md",".markdown"):loader=TextLoader(file_path,encoding="utf-8")docs=loader.load()# Markdown整个文件一个Document,补充元数据docs[0].metadata[