从零构建生产级 RAG 系统:Chunking 策略、向量检索、重排序与 RAGAS 评估的全链路实战 从零构建生产级 RAG 系统:Chunking 策略、向量检索、重排序与 RAGAS 评估的全链路实战核心痛点:RAG 教程遍地都是,但从零搭建真正可用的生产级 RAG 缺少完整实操指南。适配人群:有 Python 基础的 AI 应用开发者、RAG 系统后端工程师、ML 工程师。收获能力:独立搭建可运行的生产级 RAG 系统,掌握五种 Chunking 策略,理解混合检索工程细节,会用 RAGAS 量化评估。技术背景与演进逻辑RAG 为什么成为 LLM 应用的标配架构:LLM 的固有局限:知识截止日期 + 幻觉 + 无法访问私有数据。RAG 通过外部知识检索补齐这三块短板。微调 vs RAG:微调更新知识需重新训练(成本高、周期长);RAG 更新知识只需更新数据库(实时、低成本)。RAG 核心公式:Answer = LLM(Query + Retrieved_Context)。检索质量直接决定回答质量。RAG 技术栈分层:层级功能主流方案本文选择文档处理解析/分块Unstructured / LlamaIndex / LangChainLangChain + 自研 splitterEmbedding文本向量化BGE / E5 / Jina / OpenAIBGE-M3 (多语言, 1024d)向量存储向量索引与检索Milvus / Qdrant / Chroma / FAISSChroma检索策略召回方式向量检索 / BM25 / 混合混合检索 (向量 + BM25)重排序精排优化BGE-Reranker / Cohere / JinaBGE-Reranker-v2-m3LLM生成回答GPT-4o / Claude / Qwen / DeepSeekDeepSeek-V3 (API)评估质量量化RAGAS / TruLens / DeepEvalRAGAS演进时间线:2020 Lewis et al. 提出 RAG 概念 - 2023 LangChain/LlamaIndex 生态爆发 - 2024 混合检索 + 重排序成为标配 - 2025 Agentic RAG + 多模态 RAG 前沿探索。核心原理深度解析Chunking 策略:RAG 管线的第一道关卡五种主流 Chunking 策略:固定大小分块(Fixed-size):按 token 数切分,最简单,但在句子中间切断导致语义不完整。典型参数:chunk_size=512, chunk_overlap=50。递归字符分块(Recursive Character):按分隔符优先级依次尝试 ["", "", " ", “”],优先在段落边界切。LangChain 默认策略,生产推荐起点。语义分块(Semantic):计算相邻句子的 embedding 相似度,相似度骤降处切分。块内语义高度一致,但计算开销大。句子窗口分块(Sentence Window):每个块以目标句子为中心 + 前后 N 句为上下文。检索时用中心句,生成时展开完整窗口。LlamaIndex 特色方案。层级分块(Hierarchical):父子块结构,父块存完整语义,子块用于精确检索。先检索子块,生成时取父块完整上下文。LangChain ParentDocumentRetriever 方案。五种策略对比:策略检索精度上下文完整性实现复杂度推荐场景固定大小2/52/5极低快速原型递归字符3/53/5低通用文档(生产默认)语义分块4/53/5中高质量文档句子窗口5/55/5中QA/客服系统层级分块5/55/5高复杂文档/长文本本文选择:递归字符作为基础策略(覆盖 80% 场景)+ 层级分块作为高级方案。向量检索 + BM25 混合检索:互补才能完整向量检索(Dense Retrieval):语义相似,“北京的天气"能匹配到"首都今日气温”,强在语义理解。本质是 query 和 doc 分别过 embedding 模型,计算余弦相似度,取 Top-K 最近邻。BM25 检索(Sparse Retrieval):关键词匹配,“Error code E1004” 精确匹配文档中的 E1004,强在精确召回。本质是 TF-IDF 的改进,基于倒排索引。混合检索:取两者并集,用 RRF(Reciprocal Rank Fusion)融合排序。公式:score_rrf(d) = sum of 1/(k + rank_i(d)),k=60 是经验最优值。重排序(Re-ranking):让最相关的排在前面Cross-Encoder vs Bi-Encoder:Bi-Encoder 独立编码 query 和 doc,快但精度一般;Cross-Encoder 联合编码,慢但精度极高。BGE-Reranker 工作流程:[Top-100 候选文档] - [query+doc 拼接输入 Cross-Encoder] - [输出相关性分数] - [按分数重排] - [取 Top-5 送入 LLM]。为什么需要重排序:向量检索的 Top-20 中通常只有 5-8 个真正相关,重排序将其精准过滤,RAG 回答质量提升 20-40%。核心模块与流程机制详解完整 RAG 管线流程文档加载 - Chunking分块 - Embedding向量化 - ChromaDB存储 - 混合检索(向量+BM25) - Reranker重排序 - LLM生成回答 - RAGAS评估 - 结果输出项目结构rag-from-scratch/ - data/ - knowledge_base/ # 存放原始文档 - src/ - loader.py # 文档加载与解析 - chunker.py # Chunking 策略实现 - embedder.py # BGE-M3 embedding - vector_store.py # ChromaDB 操作 - retriever.py # 混合检索(向量+BM25) - reranker.py # BGE-Reranker 重排序 - generator.py # LLM 生成 - pipeline.py # 完整管线编排 - evaluator.py # RAGAS 评估 - config.yaml - requirements.txt - main.py核心代码1:Chunking 模块fromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromtypingimportListclassDocumentChunker:def__init__(self,chunk_size=512,chunk_overlap=50):self.splitter=RecursiveCharacterTextSplitter(chunk_size=chunk_size,chunk_overlap=chunk_overlap,separators=["", "", ".", "", ""])defchunk(self,documents:List[str])-List[str]:chunks=[]fordocindocuments:chunks.extend(self.splitter.split_text(doc))print(f"Chunked{len(documents)}docs -{len(chunks)}chunks")returnchunksdefchunk_hierarchical(self,documents,parent_size=2048,child_size=512):parent_splitter=RecursiveCharacterTextSplitter