ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RAG知识库搭建全流程实战:从原理到部署的完整教程

RAG知识库搭建全流程实战:从原理到部署的完整教程 最近在给团队搭建内部知识库问答系统时又踩了一轮 RAG 的坑文档切得不合适检索结果乱七八糟向量模型选型不对召回率低到没法看等把流程跑通了又发现幻觉问题依然严重。网上关于 RAG 的资料确实很多但大部分停留在概念介绍或 Demo 阶段真正能结合企业级场景落地的完整教程并不多见。这篇文章我会从 RAG 的核心原理讲起再手把手带你完成一个完整的 RAG 知识库项目覆盖文档加载、文本切分、向量化、检索、重排、生成、评估和部署全流程。无论你是刚接触大模型应用开发的新手还是想在项目中落地 RAG 的开发者都可以按文章步骤复现。1. RAG 知识库到底是什么1.1 大模型的知识从哪里来先聊一个基础问题大模型为什么需要 RAG大模型LLM在训练时通过学习海量文本把知识压缩进了参数里。但这种方式有几个天然限制知识有截止日期。训练数据往往不是实时的ChatGPT 3.5 的知识截止在 2022 年初更早的模型就更不用说了。无法感知私域数据。企业内部文档、数据库、工单、合同这些数据根本不在模型的训练集里。存在幻觉问题。模型不知道答案时不会老老实实说“不知道”而是会一本正经地编一个看似合理的答案。把这几个问题放在企业场景里就非常致命了。你不可能每个月重新训练一次模型也不希望模型拿着自己编出来的答案去回复客户。1.2 RAG 的工作原理RAGRetrieval-Augmented Generation检索增强生成的思路是不改变模型本身而是在模型回答前先从一个外部知识库中检索出相关内容把检索结果拼接到提示词里再让模型基于这些材料生成答案。用一句话概括让大模型学会“先查资料再回答问题”。一个标准 RAG 流程包含两个阶段、五个核心模块索引阶段离线文档加载把 PDF、Word、Markdown、HTML 等原始文档读进来。文本切分把长文档切成合适大小的“块”这一步非常影响检索效果。向量化用 Embedding 模型把文本块转成向量。存储把向量和原文存入向量数据库。查询阶段在线查询向量化在向量库中做相似度检索。可选对检索结果做重排Rerank提升相关性排序质量。将检索结果和用户问题组装成 Prompt交给 LLM 生成回答。用户看到的是提问 → 得到答案。但答案背后其实经过了“检索—增强—生成”三步。1.3 RAG 与微调的区别很多初学者会把 RAG 和模型微调Fine-tuning搞混这里做一个明确区分对比维度RAG微调知识来源外部知识库动态更新模型参数静态固定更新成本低替换文档即可高需要重新训练幻觉控制较好答案有据可依有限取决于训练数据硬件要求普通服务器 API 即可运行需要 GPU 资源适用场景企业私有知识问答、实时信息改变模型风格、格式、领域能力实际项目中RAG 和微调并不是互斥关系。一个成熟的企业知识库系统通常先做 RAG 解决“知识来源”问题再考虑微调解决“问答风格”问题。本文重点讲 RAG因为它成本更低、见效更快。2. 环境准备与版本说明2.1 整体技术选型在动手前先确定技术栈。RAG 项目的技术选型非常灵活但核心组件是一致的模块可选方案本文使用开发语言Python / Java / TypeScriptPython 3.10RAG 框架LangChain / LlamaIndex / 自研LangChainEmbedding 模型OpenAI / 开源 BGE / M3EBGE-M3本地部署向量数据库Chroma / Milvus / Qdrant / FAISSChroma入门、Milvus生产LLMGPT-4 / 文心一言 / 通义千问 / 本地模型兼容 OpenAI API 的模型重排模型BGE-Reranker / Cohere RerankBGE-Reranker-V2-M3这里有一个很重要的选型思路开发阶段可以用最简单的组合快速跑通生产环境再替换成高性能组件。比如本地先用 Chroma Flask生产再换 Milvus FastAPI这样可以避免一上来就被复杂架构困住。2.2 版本依赖说明版本需要根据你的实际环境调整本文示例以 2026 年初比较稳定的版本组合为例# 创建虚拟环境 python -m venv rag_env source rag_env/bin/activate # Windows 使用 rag_env\Scripts\activate # 安装核心依赖 pip install langchain-core langchain-community langchain-text-splitters pip install chromadb pip install sentence-transformers pip install pymilvus pip install flask fastapi uvicorn pip install pypdf docx2txt如果你使用的是较新的 LangChain 版本部分 API 可能有所调整。比如旧的langchain.vectorstores已经被拆分到langchain_community.vectorstoreslangchain.document_loaders同样被拆分。遇到ModuleNotFoundError时优先检查包名是否已经迁移。2.3 模型准备本文示例使用 BGE-M3 作为 Embedding 模型它是开源模型中效果比较稳定的一个支持中文最长输入 8192 token支持稠密检索和稀疏检索。from sentence_transformers import SentenceTransformer # 首次运行会自动下载模型也可以手动下载后指定本地路径 model SentenceTransformer(BAAI/bge-m3)如果服务器无法访问 HuggingFace可以手动下载模型文件放到本地目录然后指定本地路径model SentenceTransformer(/data/models/bge-m3)大模型部分建议使用兼容 OpenAI API 格式的服务无论是官方 API 还是本地部署的 vLLM、Ollama都可以通过统一接口接入这样代码切换成本很低。3. 核心原理拆解每个环节都在做什么要做出一个可用的 RAG 知识库必须理解每一个环节的原理。这里不追求面面俱到只讲直接影响效果的几个关键点。3.1 文档加载格式多、结构杂怎么办企业里的文档格式五花八门有 PDF、Word、PPT、Markdown、HTML还有扫描图片。不同的格式需要不同的解析策略PDF 文本型直接用PyPDFLoader或PyMuPDFLoader提取文本。PDF 扫描型需要 OCR 识别推荐 PaddleOCR 或 Tesseract。Word 文档Docx2txtLoader可以读取.docx。Markdown / HTMLLangChain 提供了对应的 Loader。这里有一个常见的误区OCR 不应该是默认方案而应该是兜底方案。文本型 PDF 直接提取又快又准OCR 又慢又容易出错。先判断文档类型再选择解析器。from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader # 加载 PDF pdf_loader PyPDFLoader(docs/产品手册.pdf) pdf_docs pdf_loader.load() # 加载 Word docx_loader Docx2txtLoader(docs/需求文档.docx) docx_docs docx_loader.load() print(fPDF 解析出 {len(pdf_docs)} 页) print(fWord 解析出 {len(docx_docs)} 段)3.2 文本切分细节决定检索上限文本切分是 RAG 里最容易被低估的环节。切得太大检索到的东西太宽泛塞进 Prompt 后既浪费 token 又稀释重点切得太小语义不完整模型没法理解上下文。推荐的做法是按语义边界切分而不是简单按字符数硬切。LangChain 提供了多种切分器from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每块最大字符数 chunk_overlap50, # 前后块重叠字符数 separators[\n\n, \n, 。, , , , , , ], ) chunks text_splitter.split_documents(pdf_docs) print(f切分后得到 {len(chunks)} 个文本块)参数含义chunk_size每个文本块的目标长度。500 对中文来说是一个比较稳妥的起点需要根据文档类型调整。chunk_overlap相邻块之间的重叠长度。让上下文有一定连续性避免关键信息恰好被切断。separators切分优先级。优先在段落、句子边界切最后才在字符级别硬切。在实际项目中建议先抽样几个文档做切分人工检查切出来的块是否保持了语义完整再确定全局参数。3.3 向量化Embedding 模型怎么选Embedding 模型负责把文本映射到高维向量空间。两个文本越相似它们的向量距离越近。所以 Embedding 模型的质量直接决定了检索召回的上限。目前比较常用的选择BGE-M3开源中文效果好支持多粒度适合中文知识库。M3E中文场景友好体积小。OpenAI text-embedding-3英文效果好中文也可以但 API 费用需要评估。通义千问 text-embedding-v3国内访问方便中文效果好。调用方式很简单from sentence_transformers import SentenceTransformer embedding_model SentenceTransformer(BAAI/bge-m3) text RAG是一种检索增强生成技术 vector embedding_model.encode(text) print(f向量维度: {vector.shape})BGE-M3 会输出 1024 维向量。向量维度直接影响存储和检索成本维度越高信息越丰富但占用空间也越大。3.4 向量数据库存储和检索向量数据库负责存储海量向量并提供快速相似度检索。开发阶段用 Chroma 就够了它是嵌入式数据库零配置启动from langchain_community.vectorstores import Chroma vector_store Chroma.from_documents( documentschunks, embeddingembedding_model, persist_directory./chroma_db, # 持久化路径 ) retriever vector_store.as_retriever( search_typesimilarity, search_kwargs{k: 5} )k代表检索返回的候选条数。k越大召回越多但噪音也越多k越小结果越精准但可能漏掉相关文档。一般先设为 5再根据评估结果调整。生产环境建议更换为 Milvus 或 Qdrant它们支持分布式部署、混合检索和标量过滤性能和数据规模都更适合企业使用。3.5 重排Rerank检索结果精排向量检索是“粗排”能快速找到候选但相关性排序往往不够精细。企业级 RAG 通常会加一个重排阶段先用向量检索召回 20~50 条候选再用跨编码器Cross-Encoder模型逐条计算“问题—文档”的相关性得分取 Top 5 送入大模型。重排的核心优势是语义匹配更精确因为 Cross-Encoder 把问题和文档拼接在一起过模型能充分交互。from sentence_transformers import CrossEncoder reranker CrossEncoder(BAAI/bge-reranker-v2-m3) query 产品保修期是多久 documents [doc.page_content for doc in candidates] # 计算每条文档的相关性得分 pairs [[query, doc] for doc in documents] scores reranker.predict(pairs) # 按得分排序取 Top K ranked sorted(zip(documents, scores), keylambda x: x[1], reverseTrue) top_results [doc for doc, score in ranked[:3]]加上重排后检索精度通常会有明显提升。代价是多了一次模型推理延迟会增加几十到几百毫秒但在企业知识库场景下完全值得。4. 完整实战从零搭建企业级 RAG 知识库下面进入核心环节。我们将完成一个“员工手册智能问答”项目把企业员工手册 PDF 导入系统用户提问后返回基于手册内容的答案并且要求答案必须引用原文来源。4.1 项目结构设计先规划项目目录rag_project/ ├── app.py # Flask 或 FastAPI 服务入口 ├── config.py # 配置文件 ├── ingest.py # 文档导入脚本离线索引 ├── query.py # 查询脚本在线问答 ├── docs/ # 原始文档目录 ├── data/ │ └── chroma_db/ # 向量数据库存储 ├── models/ # 本地模型目录可选 └── requirements.txt # 依赖清单把索引和查询分开是必要的文档导入是低频操作问答是高频操作分开后可以独立部署和扩缩容。4.2 配置模块# config.py import os from pathlib import Path BASE_DIR Path(__file__).parent # 模型配置 EMBEDDING_MODEL_PATH os.getenv(EMBEDDING_MODEL_PATH, BAAI/bge-m3) RERANK_MODEL_PATH os.getenv(RERANK_MODEL_PATH, BAAI/bge-reranker-v2-m3) # LLM 配置兼容 OpenAI API 格式 LLM_API_KEY os.getenv(LLM_API_KEY, your-api-key) LLM_BASE_URL os.getenv(LLM_BASE_URL, https://api.openai.com/v1) LLM_MODEL_NAME os.getenv(LLM_MODEL_NAME, gpt-4o-mini) # 向量数据库配置 VECTOR_DB_DIR str(BASE_DIR / data / chroma_db) # 切分参数 CHUNK_SIZE 500 CHUNK_OVERLAP 50 # 检索参数 RETRIEVAL_K 10 RERANK_TOP_K 3用环境变量管理配置是基本的工程规范尤其是 API Key 这类敏感信息绝对不能硬编码在代码里。4.3 文档索引模块# ingest.py from pathlib import Path from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import Chroma from sentence_transformers import SentenceTransformer from config import EMBEDDING_MODEL_PATH, VECTOR_DB_DIR, CHUNK_SIZE, CHUNK_OVERLAP class TextEmbedding: 适配 LangChain 的 Embedding 封装 def __init__(self, model_path: str): self.model SentenceTransformer(model_path) def embed_documents(self, texts): return self.model.encode(texts).tolist() def embed_query(self, text): return self.model.encode([text])[0].tolist() def load_documents(docs_dir: Path): 加载目录下所有支持的文档 documents [] for file_path in docs_dir.iterdir(): suffix file_path.suffix.lower() if suffix .pdf: loader PyPDFLoader(str(file_path)) elif suffix .docx: loader Docx2txtLoader(str(file_path)) else: continue documents.extend(loader.load()) print(f已加载: {file_path.name}) return documents def main(): docs_dir Path(docs) embedding_model TextEmbedding(EMBEDDING_MODEL_PATH) documents load_documents(docs_dir) if not documents: print(未找到可加载的文档) return text_splitter RecursiveCharacterTextSplitter( chunk_sizeCHUNK_SIZE, chunk_overlapCHUNK_OVERLAP, separators[\n\n, \n, 。, , , , , , ], ) chunks text_splitter.split_documents(documents) print(f切分完成共 {len(chunks)} 个文本块) vector_store Chroma.from_documents( documentschunks, embeddingembedding_model, persist_directoryVECTOR_DB_DIR, ) vector_store.persist() print(f向量库已保存至: {VECTOR_DB_DIR}) if __name__ __main__: main()执行导入python ingest.py如果一切正常你会看到类似输出已加载: 员工手册.pdf 切分完成共 124 个文本块 向量库已保存至: /Users/rag_project/data/chroma_db4.4 问答模块含重排# query.py from langchain_community.vectorstores import Chroma from sentence_transformers import CrossEncoder from openai import OpenAI from config import ( EMBEDDING_MODEL_PATH, RERANK_MODEL_PATH, VECTOR_DB_DIR, LLM_API_KEY, LLM_BASE_URL, LLM_MODEL_NAME, RETRIEVAL_K, RERANK_TOP_K, ) from ingest import TextEmbedding class RAGQuery: def __init__(self): self.embedding_model TextEmbedding(EMBEDDING_MODEL_PATH) self.vector_store Chroma( persist_directoryVECTOR_DB_DIR, embedding_functionself.embedding_model, ) self.reranker CrossEncoder(RERANK_MODEL_PATH) self.client OpenAI(api_keyLLM_API_KEY, base_urlLLM_BASE_URL) def retrieve(self, query: str): 向量检索 重排 # 第一步向量检索粗排召回 TopK candidates self.vector_store.similarity_search_with_score( query, kRETRIEVAL_K ) docs [doc for doc, score in candidates] # 第二步重排精排 TopK pairs [[query, doc.page_content] for doc in docs] scores self.reranker.predict(pairs) ranked sorted(zip(docs, scores), keylambda x: x[1], reverseTrue) return [doc for doc, score in ranked[:RERANK_TOP_K]] def generate(self, query: str, contexts: list): 基于检索结果生成答案 context_text \n\n.join( [f【文档来源】{doc.metadata.get(source, 未知)}\n{doc.page_content} for doc in contexts] ) prompt f你是企业内部知识库助手。请基于以下资料回答用户问题。 资料 {context_text} 用户问题{query} 要求 1. 只能根据资料回答问题禁止编造。 2. 如果资料中没有相关信息请明确回复“资料中未找到相关信息”。 3. 回答结束时列出参考来源。 response self.client.chat.completions.create( modelLLM_MODEL_NAME, messages[{role: user, content: prompt}], temperature0.3, ) return response.choices[0].message.content def answer(self, query: str): contexts self.retrieve(query) if not contexts: return 未检索到相关资料请尝试更换问题表述。 return self.generate(query, contexts) if __name__ __main__: rag RAGQuery() while True: question input(请输入问题q 退出: ) if question.lower() q: break result rag.answer(question) print(\n回答:) print(result) print(- * 50)运行测试python query.py输入“新员工转正流程是什么”系统会先检索员工手册相关内容再交给大模型生成答案。如果手册中确实写了相关流程回答会包含具体步骤并且末尾附带文档来源。4.5 封装成 API 服务为了接入实际业务系统需要用 FastAPI 将问答能力封装成 HTTP 接口# app.py from fastapi import FastAPI from pydantic import BaseModel from query import RAGQuery app FastAPI(title企业知识库 RAG 服务) rag RAGQuery() class Question(BaseModel): question: str class Answer(BaseModel): answer: str sources: list app.post(/api/chat, response_modelAnswer) async def chat(req: Question): docs rag.retrieve(req.question) answer_text rag.generate(req.question, docs) sources list({doc.metadata.get(source, 未知) for doc in docs}) return Answer(answeranswer_text, sourcessources) if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)启动服务python app.py # 或 uvicorn app:app --host 0.0.0.0 --port 8000然后可以用 curl 测试curl -X POST http://localhost:8000/api/chat \ -H Content-Type: application/json \ -d {question: 请假超过三天需要什么审批流程}返回结果是一个 JSON包含 answer 和 sources 两个字段。这样前端、小程序、企业微信机器人等都能通过 API 调用问答能力。5. 企业级进阶RAG 项目如何做得更稳跑通一个 Demo 只需要几十分钟但要让 RAG 在企业环境稳定运行还有很多工程细节需要处理。5.1 文档增量更新企业的知识库是持续更新的每月甚至每周都有新文档产生。如果每次更新都全量重建向量库随着数据量增长会越来越慢。推荐方案是增量更新 批量重建结合新文档直接计算向量并写入向量库。文档更新先删除旧版本对应的向量再写入新版本。大版本调整如切分策略改变重建整个索引。Chroma 支持增量写入vector_store Chroma( persist_directoryVECTOR_DB_DIR, embedding_functionembedding_model, ) # 新增文档向量 vector_store.add_documents(new_chunks) vector_store.persist()删除指定文档vector_store.delete(ids[chunk_id_123])5.2 元数据过滤企业文档通常带有部门、发布时间、文档类型等属性。在检索时加上元数据过滤可以显著提升准确率。retriever vector_store.as_retriever( search_kwargs{k: 10, filter: {department: HR}} )实际效果是只搜索 HR 部门的文档不会把技术部的文档也召回进来。这在多部门共用一个知识库时非常有用。5.3 Prompt 优化Prompt 决定了模型如何使用检索结果。同一个检索结果Prompt 写得好不好回答质量差别很大。几条企业级实践明确角色告诉模型它是企业知识库助手。限制输出范围资料中没有的内容明确要求不要编造。要求引用来源让模型在回答中标注信息来源。控制温度知识问答场景temperature0.1~0.3比较合适温度越高越容易发散。5.4 知识库评估RAG 系统的效果不是靠感觉判断的。需要建立评估指标定期量化。常用指标包括指标含义说明召回率Recall相关文档被检索到的比例越高越好说明没漏掉该有的内容精确率Precision检索结果中相关文档的比例越高越好说明噪音少命中率Hit Rate答案所需的文档是否在 Top K 中理解最简单直观可解释MRR第一个相关结果的排名倒数评价“最相关结果排多前面”忠实度Faithfulness答案是否忠实于检索内容评价幻觉程度答案相关度答案是否回答了问题需要人工或模型评估最简单的评估方式是构建测试集准备 50~100 条“问题—标准答案—相关文档”三元组然后跑一套自动化评估脚本每次调整参数后对比指标变化。# 简单的命中率评估示例 test_questions [ {question: 年假可以累计吗, relevant_docs: [chunk_12, chunk_13]}, {question: 加班工资怎么计算, relevant_docs: [chunk_45]}, ] hit_count 0 for item in test_questions: retrieved_docs rag.retrieve(item[question]) retrieved_ids [doc.metadata.get(chunk_id) for doc in retrieved_docs] if set(item[relevant_docs]) set(retrieved_ids): hit_count 1 hit_rate hit_count / len(test_questions) print(fTop-K 命中率: {hit_rate:.2%})如果没有人工标注的答案也可以让 GPT-4 等强模型给答案打分LLM-as-a-Judge适合大规模快速评估。5.5 混合检索与 Agentic RAG纯向量检索依赖 Embedding 模型的语义理解能力对于精确匹配合同编号、人名、产品型号往往表现不佳。企业级方案通常是混合检索向量检索语义 BM25 关键词检索精确 重排融合。RagFlow、Dify 这类开源框架已经内置了混合检索能力。如果要自研可以同时跑两路检索再用 RRFReciprocal Rank Fusion合并结果。再进一步还可以做Agentic RAG让大模型在回答前自动决定去哪个知识库检索、需要检索几次、要不要追问用户。这种方式适合跨多个知识库的复杂问答场景但工程复杂度更高需要把 RAG 流程做成可编排的工具链。6. 常见问题与排查思路RAG 项目上线后遇到最多的不是“跑不起来”而是“效果不好”。下面整理高频问题排查清单。6.1 检索不到相关内容现象常见原因排查方向问题换个说法就检索不到Embedding 模型语义理解不够换更强的中文 Embedding 模型专有名词匹配不上向量检索不适配精确匹配加 BM25 关键词检索做混合检索相关文档排在很后面文本块太大或太小调整 chunk_size重新切分索引检索结果和问题无关知识库本身缺少对应内容检查文档是否入库、元数据过滤是否正确排查套路把检索结果打印出来看看。如果检索结果本身是准的问题出在生成如果检索结果就是偏的问题出在索引阶段。先定位是检索问题还是生成问题再优化相应环节。6.2 回答出现幻觉现象常见原因排查方向答案内容不在资料里Prompt 没有限制输出范围在 Prompt 中明确“禁止编造”答案和资料矛盾上下文噪声太多降低 RETRIEVAL_K或增强重排模型强行总结资料内容过少检查切分是否丢失关键信息根本思路是让模型尽量“照着念”而不是“自由发挥”。给模型足够的上下文同时要求答案必须有原文依据。6.3 响应延迟高现象常见原因解决思路接口整体耗时 10 秒LLM 生成占了大头换更快的模型、流式输出检索阶段耗时异常向量库数据量过大加索引、分片、换 Milvus重排阶段太慢重排模型推理开销减少粗排候选数量、换小模型实际项目中RAG 的响应时间模型通常是检索几百毫秒 重排几百毫秒 LLM 生成几秒。如果你的模型是远程 API网络延迟也要计算在内。6.4 文档更新后效果没变化问题基本出在缓存或未执行重新索引。Chroma 的 persist 机制需要注意修改文档后要重新执行 ingest且确认没有使用旧的持久化目录。另外不要忘记在更新后做一轮检索验证确保新文档真的能被检索到。7. RAG 框架对比怎么选日常交流中经常有读者问到底该用 LangChain 自研还是直接用 Dify、RagFlow我的建议是先看你的团队情况和需求复杂度。方案适用场景优点缺点LangChain 自研需要深度定制、团队有开发能力灵活度高可完全掌控流程开发成本高需要自己处理很多细节Dify快速搭建、低代码、业务人员参与开箱即用可视化编排复杂逻辑定制受限RagFlow文档解析要求高的场景文档深度解析能力强社区生态相比 LangChain 小一些LlamaIndex数据源复杂、需要多源索引数据连接器丰富概念较多上手成本不低如果你刚开始学习建议先用 LangChain 把 RAG 全流程手写一遍理解每个环节到底在做什么。理解原理之后再用 Dify 或 RagFlow 这种平台工具提升效率会顺手很多。8. 最佳实践几点工程建议结合企业落地经验补充几条比较重要的工程建议。文档管理按“知识源”组织而不是按文件堆。每个知识源应该有独立的命名空间或元数据标签方便日后定位“哪些文档影响了答案”。敏感信息过滤。导入知识库前做敏感信息检查身份证号、手机号、内部密钥、未公开财报等该脱敏的脱敏该拦截的拦截。RAG 系统本质上是一个数据开放接口权限控制必须前置。日志与审计。每次问答都应该记录用户问题、检索到的文档片段、生成答案、耗时和当时的系统版本。这不仅是排查问题的手段也是持续优化效果的数据基础。版本管理。知识库的向量索引、Prompt 模板、模型版本都应该有版本记录。同一个问题在不同版本的模型下回答不同如果没有版本追踪很难定位是哪个环节引入的回归。安全与合规。涉及生产环境变更时先在测试环境验证访问数据库或向量库时使用最小权限账号删除旧数据时先备份。这些是底线要求。性能监控。上线后重点监控四个指标检索耗时、重排耗时、LLM 生成耗时、接口成功率。任何指标异常都能快速定位到对应环节。9. 总结与下一步本文从 RAG 的核心概念出发完成了一个完整的 RAG 知识库项目文档加载、文本切分、向量化、向量存储、相似度检索、重排、LLM 生成再到 API 封装。这些步骤看着不多但每一步都有影响最终效果的细节值得反复调优。如果你是从零开始先把项目跑通理解全流程再去优化单个环节。不要试图一口气做到完美RAG 的优化是持续迭代的过程。接下来可以继续研究的方向本地部署大模型结合 vLLM 或 Ollama 把整套系统完全私有化。深入学习混合检索和重排的算法细节。构建一套完整的知识库评估体系用数据驱动优化。了解 Agentic RAG让检索从“一次查询”变成“多步推理”。如果本文对你有帮助可以收藏备用。动手跑一遍代码比看十遍教程都有用。有任何问题欢迎在评论区交流。
返回列表