最近又把 RAG 的完整链路从头到尾捋了一遍越做越觉得在 Agent 开发里真正决定体验下限的往往是知识召回这一块而不是模型本身。RAGRetrieval-Augmented Generation检索增强生成听起来挺唬人落地其实就三件事先给外部知识建好索引再在回答问题时把相关内容捞出来最后让大模型基于这些检索结果生成答案。这套机制解决的是大模型知识过时、会幻觉、拿不到私有数据这三大通病。这篇笔记我会按“建库 - 检索 - 生成”的完整链路来写中间穿插我在真实项目里踩过的坑、反复调过的参数、以及性能排查的思路。无论你是正在做 Agent 应用、知识库问答还是 ChatBI 类工具这期内容应该都能帮你省掉不少弯路。1. 内容整体设计与思路拆解1.1 RAG 在 Agent 开发里到底解决什么问题先聊一个被很多人忽略的前提Agent 应用和大模型裸调用的区别在于 Agent 需要与环境交互、需要工具、需要记忆也需要事实依据。如果没有额外机制大模型回答问题时全靠参数里压缩的知识知识截止日期一到就抓瞎碰到企业内部的私有数据更是直接不知道。RAG 的做法很朴素把回答问题的过程从“闭卷考”变成“开卷考”。闭卷的时候模型只能凭记忆写漏了关键知识点只能胡编开卷的时候你先把相关章节递给它让它照着材料答题。这个类比基本还原了 RAG 的本质——它不是让模型学得更聪明而是让模型在答题时手上真有参考资料。对应到 Agent 场景里RAG 通常会作为一类外部工具或知识技能存在。Agent 先判断当前用户问题是否需要查知识库需要的话就去向量库检索相关内容再把检索结果连同用户问题一起交给模型生成最终回复。这个过程中Agent 的规划能力决定了“什么时候查、查什么”RAG 链路的质量决定了“查得准不准、用得上用不上”。1.2 全链路架构建库、检索、生成三段式如果给 RAG 画一条完整数据流大致是这样的建库阶段Indexing文档加载 - 解析清洗 - 文本切分 - 向量化Embedding- 写入向量数据库。检索阶段Retrieval用户 Query 向量化 - 在向量库里做相似度检索 - 可选的关键词检索 - 可选的 Rerank 重排 - 返回 Top-K 文本块。生成阶段Generation把检索结果拼接成 Prompt - 构造指令约束 - 大模型生成 - 返回答案并附带引用来源。很多第一次做 RAG 的人容易把重心全放在 vector database 上以为装一个 Milvus 或者 Chroma 把所有文档灌进去就完事了。实际上我做过多个项目之后最直观的感受是建库、检索、生成三个环节都会拉低最终效果。检索不准生成拿不到好材料生成 Prompt 写得烂就算检索结果全对模型也可能答非所问。任何一环偏科整体体验都在及格线以下。1.3 为什么选 RAG 而不是微调总有朋友问既然模型能力不够干脆微调一个垂直模型不就行了我的回答通常是先确认你要解决的是“知识缺失”还是“行为风格不一致”。RAG 与 Fine-tuning 的对比我用一张表来区分对比维度RAG微调知识更新直接更新知识库即可分钟级生效需要重新训练或继续训练周期长可解释性可追溯来源答案有引用依据黑盒难以解释为什么这样答硬件成本无需模型训练主要成本在检索与存储需要 GPU 训练资源成本高适用场景事实性问题、私有文档问答、动态资料检索输出格式固定、领域术语、语气风格迁移幻觉控制控制相对容易只要检索到就能基本抑制如果知识不在参数里微调也很难无中生有一个相对务实的策略是先把 RAG 跑通再做一轮轻量微调来校正模型的回复风格和输出格式。微调的核心价值在于“教模型怎么说话”RAG 的核心价值在于“给模型找素材”。两者并不冲突但如果你追求快速落地RAG 的投入产出比明显更高。2. 核心细节解析与实操要点建库环节2.1 文档加载与清洗脏数据决定上限RAG 质量的上限从建库第一步就定死了。拿一堆 PDF、Word、HTML 往里灌之前得先想清楚解析链路。PDF 是这里最大的坑。市面上常见的 PDF 有两种文字版和扫描版。文字版可以直接抽取文本但表格、多栏排版、页眉页脚常常会抽乱。扫描版本质上是图片必须接 OCR否则抽出来的是一堆乱码。我在一个合同审核项目里踩过很深的坑——扫描件直接抽文本后向量库里的 chunk 全是乱码字符检索出来的结果完全没法用后来专门接了一层 OCR 预处理才恢复正常。Word 文档相比 PDF 好处理一些但要注意批注、修订痕迹、嵌入对象这些干扰项。HTML 则需要先去掉标签、脚本、样式只保留正文结构。还有一个高级技巧是“结构化降噪”。比如表格数据转成纯文本会丢掉结构信息效果反而不如转成 Markdown 表格。技术文档把标题层级抽出来保留 H1/H2 层级作为 chunk 的上下文前缀问答类数据按 Q/A 对切分合同条款按条切分。总之清洗规则不是越复杂越好关键是让每个文本块都保持语义独立、结构可读。实操建议写数据清洗脚本时先用 50 份代表性文档做小样本验证肉眼检查解析结果确认格式稳定再全量入库。否则你喂给 Embedding 模型的文本里带着页眉“第 1 页共 38 页”检索效果绝对好不了。2.2 文本切分策略chunk size 不是拍脑袋定的文本切分直接决定检索的精度。切得太碎每个块的信息量太少生成的上下文缺前缺后切得太大检索出来一大坨不相关内容浪费 token 还稀释精度。常用的粒度在 256~1024 个 token 之间。技术类文档我一般用 512 左右overlap 设 50~100短问答和对话类数据用 256 以内长报告类可能需要 1024 甚至更大但这种情况建议先按章节切再考虑大小。overlap重叠的作用值得多说一句。假设一句话跨了两个 chunk没有 overlap 的话检索时这句话的信息就是残缺的召回大概率漏掉。有了重叠区域同一句话会同时出现在两个 chunk 里命中率提升非常明显。代价是多占一点存储和 token整体来看完全值得。这里给一个直观的计算例子。假设一篇文档共 2000 字chunk_size 512overlap 100。那么第一个块覆盖 1~512 字第二个块从第 413 字开始覆盖 413~924 字第三个块从 825 字开始……依此类推最终大概会切出 5 个文本块。如果 overlap 设为 0切出 4 个块但边界处的语义就会被切断。切分策略还有一个容易忽略的点按固定字符切不如按“语义边界”切。直接把 Markdown 章节、段落作为切分单位再配合长度限制和递归拆分效果通常优于无脑按字数砍。LangChain 里的 RecursiveCharacterTextSplitter 就是这个思路先按大分隔符切超长再往下细化。2.3 向量化模型选型Embedding 模型负责把文本变成向量。向量质量直接决定检索时的相似度计算是否靠谱这步选型很关键。目前中文场景里我常用的几个选择模型特点适用场景BAAI/bge-large-zh-v1.5中文效果稳支持 512/1024 token通用中文知识库BAAI/bge-m3多语言、多粒度最长 8192 token多语言混合、长文档text-embedding-3-smallOpenAI 出品英文和代码效果好英文内容、海外业务M3E社区友好中文效果不错轻量场景、快速原型选模型的时候注意一个问题Query 和文档必须用同一个 Embedding 模型不能用户查询用 A 模型、建库用 B 模型。不同模型产生的向量空间不一致相似度计算没有意义。另外Embedding 模型的维度也会影响性能和存储。768 维是相对通用的选择维度越高通常表示信息越丰富但存储和计算开销也越大。如果只是几千条数据的小知识库低维模型完全够用没必要为了那一点点效果提升拉高基础设施成本。我自己的经验是先拿一批典型问题人工构造验证集分别用不同模型跑一遍召回看 Top5 里真正相关的比例。模型好不好跑过才知道别看排行榜。2.4 向量数据库选型向量数据库这块市面上的选择非常庞杂但核心评估维度就那么几个数据规模、查询性能、功能丰富度、部署成本。FAISSMeta 出品严格来说是库不是数据库适合在内存里做向量检索小数据量原型很香。Chroma轻量级向量数据库本地开发调试随手拉起适合项目跑通阶段。Milvus / Zilliz Cloud分布式向量数据库支撑亿级向量生产级规模和特性齐全。pgvectorPostgreSQL 插件直接在原数据库上做向量检索适合已经有 PG 技术栈、不想额外引入组件的团队。Elasticsearch自带向量检索能力如果现有搜索体系就是 ES合并关键词检索与向量检索很自然。选型没有绝对的“最优解”。我的建议是原型阶段用 Chroma 或 FAISS快速验证效果生产环境如果数据量几十万以内pgvector 就够规模再往上或者需要灵活的标量过滤、多租户隔离再考虑 Milvus。千万别一上来就整个分布式集群运维成本会吃掉你所有开发精力。索引类型方面HNSW 是默认优先选项。HNSW 有两个主要参数M 控制每个节点的最大连接数值越大召回越准但内存开销也越大efConstruction 控制建索引时的搜索范围越大索引质量越高。我常用的起点是 M 16efConstruction 200之后再根据召回率和延迟做微调。提示建库不是一锤子买卖。文档更新了、删除了索引要同步维护。增量更新比全量重建省很多事设计数据管道时把增量同步机制留好。3. 实操过程与核心环节实现检索与生成3.1 检索相似度计算与 Top-K 选择检索就是把用户的问题变成向量然后在向量库中找最相近的文本块。这一步里有几个细节值得琢磨。首先是相似度算法。常见的有余弦相似度、欧氏距离、内积。大多数向量数据库默认用余弦相似度因为它对向量模长不敏感更适合文本语义的场景。内积适合归一化后的向量欧氏距离在高维空间里没有肉眼看上去那么直观。实际使用中除非你有明确原因要换否则保持默认的余弦相似度就好。然后是 Top-K 的取值。K 太小容易漏关键信息K 太大无关内容混进来还会塞爆上下文窗口。我的经验是把 K 和 chunk_size 放一起看假设每块 512 字K5 意味着约 2500 字的参考资料这部分在模型上下文里已经占了不少空间。一般场景 K 取 4~10长文档问答可以适当调高但超过 20 我几乎不推荐。检索阶段还有个实操细节可以在向量检索之前先做一次粗筛。比如在元数据里记下文档来源、时间、权限范围检索时用 filter 先过滤掉用户无权访问的数据再算相似度。这样既保证了权限安全也减少了向量检索的数据范围响应速度更快。3.2 混合检索向量加关键词解决长尾问题向量检索擅长处理“语义相近”的查询但有一个明显的盲区专有名词、缩写、型号、编号这类字面很强的信息。用户问“A100 和 H100 的显存对比”如果库里的文档写的是“NVIDIA A100 GPU 配备 80GB HBM2e”向量匹配的效果很可能不如直接做关键词匹配。所以生产级 RAG 里混合检索几乎是标配一路走向量检索一路走 BM25 关键词检索最后把两路结果融合。BM25 是传统信息检索里的经典算法它根据词频、文档长度、逆文档频率来评估文档与查询的相关性。实现上可以用 Elasticsearch、OpenSearch或者轻量一些用 Tantivy。跨度没那么多数据量的话jieba 分词配合 BM25 公式手写也很快。融合算法里最常用的是 RRFReciprocal Rank Fusion。思路很简单针对每条结果取它在两路结果中的排名倒数之和排名越靠前权重越大。比如某条记录在向量检索里排第 2、在 BM25 里排第 5它的分数就是 1/2 1/5 0.7另一条只在向量检索里排第 3分数是 1/3 ≈ 0.33。最后按融合分数重新排序。RAG-Fusion 的思路在此基础上更进一步系统先拆解用户问题生成几个子查询分别做检索再用 RRF 融合所有结果。实测下来对复杂问题的召回提升很明显但代价是查询次数翻倍响应时间也跟着涨。小项目慎用。3.3 重排让精准的内容排到前面向量检索其实做的是“宽召回”它保证的是“相关的内容大概率被捞回来”但不保证顺序精细合理。真正要回答好问题还需要一个重排环节。重排阶段用的是交叉编码器Cross-Encoder典型代表是 BAAI 的 bge-reranker 系列。它把查询和每条候选文档拼在一起输入模型直接输出相关性分数。这种方式比双塔向量模型精确得多因为模型能看到查询和文档之间的完整交互缺点是速度慢每条候选都要过一次模型。实际操作中我通常把它放在最后一步先用向量检索召回 50 条候选再用 Reranker 从 50 条里选出最相关的 5 条。这个策略业内叫“Retrieve 50Rerank 5”效果和性能比较平衡。重排的成本也不能忽略。Reranker 模型的推理时间通常以百毫秒计如果并发量高需要走 GPU 独立部署或者做缓存。如果你的知识库规模很小、候选文档质量本身很高或者响应时间要求极苛刻可以先不加 Rerank用向量检索 关键词检索的 Top5 凑合效果不够再加。3.4 生成上下文组装与 Prompt 设计检索做得再准生成阶段 Prompt 写得模糊答案质量照样拉胯。生成阶段的核心是把“检索到的文本块”变成“模型能有效利用的上下文”。一个实用模板长这样你是一个智能问答助手。请严格根据下面提供的参考资料回答用户问题。 要求 1. 如果参考资料中包含答案请引用对应内容回答并在句末标注来源编号 [1]、[2]。 2. 如果参考资料中不包含答案请直接回答“根据现有资料无法回答”不要编造。 3. 不要复述与问题无关的参考内容。 参考资料 [1] 来自《xxx文档》第 3 章…… [2] 来自《xxx文档》第 5 章…… 用户问题……这里有两个点很关键。第一是“无法回答就直接说”这能显著减少幻觉用户也更能接受。第二是引用来源给每个 chunk 带上文档名和章节路径模型回答时就能把答案和来源对应起来方便用户追溯。上下文窗口管理也值得注意。当多个 chunk 拼接后接近窗口上限时我一般会做截断或压缩优先保留与 Query 相似度最高的 chunk或者对重复内容做去重合并。超长文档场景里可以先让模型对每个 chunk 做一次初步提炼再把提炼结果汇总二次生成虽然多了一轮调用但最终答案质量会好很多。3.5 与 Agent 框架的集成RAG 在 Agent 里通常不是常驻逻辑而是作为工具Tool或技能Skill暴露给 Agent 调用。Agent 拿到用户问题后先规划需不需要查知识库要查的话调用哪个检索工具拿到检索结果之后再结合结果生成最终回复。举个简单的注册示意tool def query_knowledge_base(query: str) - list[str]: 在知识库中检索与用户问题最相关的资料片段。 query_vector embed_model.encode(query) candidates vector_db.search(query_vector, top_k50) reranked reranker.rerank(query, candidates, top_k5) return format_chunks(reranked)这里有个容易混淆的概念RAG 知识和对话记忆。RAG 负责的是“外部事实知识”比如文档、规范、产品资料对话记忆负责的是“本次对话的上下文”比如用户刚才提到了什么。两者分开管理不要把对话记录塞进知识库也不要用知识库向量去存对话历史。热词里大家经常讨论 skill 与 agent 的区别放到这里理解就更清楚Agent 是决策体Skill 是能力单元知识检索这类能力适合沉淀成 Skill 供 Agent 按需调度。4. 常见问题与排查技巧实录4.1 检索结果不准先怀疑切分和向量化遇到“搜索结果明显不相关”的问题我的排查顺序是这样先拿一条已知答案的用户问题直接到向量库里搜看 Top10 返回什么。如果 Top10 里没有正确答案问题大概率出在建库阶段——要么文本解析乱码要么切分切断了关键语义要么 Embedding 模型不适合你的语言或领域。如果 Top10 里有正确答案但最终答案还是错问题就出在重排或生成 Prompt 上。曾经有个项目用户反馈“搜不到最新的政策条款”。排查后发现文档更新后建库任务失败了向量库里跑的还是旧版本。所以监控索引更新任务非常有必要最好能在入库后做一轮“抽样问答”验证确保新数据真的生效了。4.2 ES 向量检索太慢怎么办Elasticsearch 做向量检索时间过长是很多人都遇到过的问题。原因通常出在几个地方索引分片数设置不合理、内存不足导致缓存命中率低、HNSW 参数过于激进、没有使用 filter 提前缩小范围。我常用的优化手段在向量检索之前先用关键字或元数据过滤掉明显不相关的文档减少向量计算量。调整 HNSW 的 ef_search检索时调小 ef_search 会更快但召回率会略降可以接受的话先大幅降低索引里的向量总数试试。把向量字段单独拆到一个索引与普通业务字段分开避免大文档拖慢检索。增加节点内存让索引尽量驻留内存。如果经常出现慢查询与其优化 ES 到极致不如考虑把向量检索独立出去交给 Milvus 或者专用向量库处理ES 只负责传统关键词搜索。混用架构听起来复杂实际运维起来反而更清晰。4.3 生成答非所问先打印检索结果再判断“模型答得离谱”这个事情我每次都会提醒一句先打印出实际喂给模型的 chunks一条一条看。很多时候不是你 Prompt 写得不好而是喂进去的参考资料本身就文不对题。答非所问大致有这三种原因检索阶段就没找到正确的 chunk答案无从谈起。检索到了但 TopK 太靠前的结果被无关内容挤占了正确答案排在后面生成时没用上。chunk 上下文太碎正确信息只出现了一半另一半被切到别的块里模型基于残缺信息作答。针对第一种要改切分和向量化针对第二种引入 Rerank针对第三种调大 overlap 或者改切分的粒度。总之先定位到具体环节再动手改参数别一上来就换模型。4.4 知识库更新与数据治理知识库不是搭完就结束的静态资源。文档更新之后旧向量如果不清理用户会检索到过期内容文档删除之后向量如果还在等于信息泄漏这在企业场景里是没法接受的。增量更新的流程通常是监听文档库变更事件文件上传、替换、删除- 解析变更文档 - 重新切分和向量化 - 在向量库中删除旧 chunk 并写入新 chunk。为了优雅一点建议给每个 chunk 的元数据里都存文档 ID、版本号、更新时间。这样删除、更新、权限控制都能按文档 ID 精准操作。权限这块多说一句生产环境必须做。用户只能检索到自己有权限的文档这个过滤要在检索阶段就用元数据过滤完成不能等生成后再考虑。数据脱敏也一样敏感字段在入库前处理掉总比检索出来后后悔好。4.5 问题速查表症状可能原因排查与解决思路检索结果不相关切分不合理、Embedding 不匹配、文档解析乱码先检查 Top10 原始返回再调切分和向量化生成答非所问检索到的 chunk 质量差、Prompt 约束弱打印实际喂给模型的 chunks逐条核对明显幻觉、编造答案Prompt 没加“无法回答”约束、检索结果里没有相关知识在 Prompt 中强调“不知道就说不知道”加强检索质量内容过期索引未更新或增量任务失败监控入库任务按文档版本管理定期抽样验证查询响应慢候选集太大、Rerank 耗时、向量库配置不合理加预过滤、减少 TopK、用 RRF 融合前降级ES 向量检索超时分片过多、内存不足、HNSW 参数不优减少分片、调 ef_search、用 filter 先过滤最后的实操心得这套链路我自己跑过不止一遍最大的感受是RAG 项目做不好八成问题出在“数据太脏”和“切分太随意”上真正需要换模型、调框架的反而少。如果让我给一个检查清单大概是这样的先用 20 条真实用户问题做验证集建完库之后逐条看 Top5 召回准不准召回准了再看生成效果生成不对再调 Prompt不要一上来就折腾重排和混合检索。先把基础链路跑通、跑稳再逐步上复杂模块这个顺序能帮你少走我走过的弯路。
企业数字化 ERP 产品动态
相关推荐
基于VGG16的人脸表情识别:从模型改造到工程实战 简介:基于深度学习VGG16网络的人脸表情识别项目,面向Python开发者与图像识别初学者,解决六类人脸表情(愤怒、快乐、惊讶、厌恶、悲伤、恐惧)的分类建模问题。项目以VGG16为骨干网络,完整覆盖数据集整理、模… · 2026/9/23 5:17:12
ArcGIS Desktop 10.8 安装教程:环境配置、许可激活与 arcpy 验证 简介:ArcGIS Desktop 10.8 安装包面向地理信息科学、测绘、城乡规划等专业的学生与从业者,以及需要搭建 GIS 实验环境的自学者,帮助解决软件获取与部署问题。资源包内共 1 个 docx 文件,约 11KB,以文档形式整理安装包下… · 2026/9/23 5:17:12
LBM方法在三维两相流模拟中的关键参数控制 1. 项目概述LBM(格子玻尔兹曼方法)作为一种介观尺度的流体模拟方法,近年来在两相流模拟领域展现出独特优势。这个项目聚焦于三维两相流计算中的三个关键控制参数:相饱和度曲线、粘度比和接触角。通过LBM方法实现对这些参数的灵活调… · 2026/9/23 5:17:12
3步搞定农业b2b,图解原理让代码跑通 3步搞定农业b2b,图解原理让代码跑通 复制来的代码跑不通不知道怎么调?别慌,农业b2b系统搭建中,80%的新手卡在数据流断点上。今天用 图解原理 拆解核心逻辑,从Python后端到前端展示,带你从零搭出可运行的农产品撮合平台。… · 2026/9/23 6:59:42
e邮宝网点速查手册:源码级拆解解决代码跑不通难题 e邮宝网点速查手册:源码级拆解解决代码跑不通难题 复制来的代码直接跑不通,报错信息满屏红字却不知从何调起,这是无数开发者深夜里的真实噩梦。别再盲目堆砌日志或重启服务,你需要一本直击痛点的 e邮宝网点 级 速查手册 ,通过源码剖析找到断点。… · 2026/9/23 6:59:42
从零构建AI Agent:以Codex源码为教材的实战拆解 让 Agent 不再是玄学——我用 Codex 源码当教材,手把手拆给你看怎么从零构建一个真正能干活的 AI Agent。这两年 AI Agent 从概念火到了各种技术群里,但真到自己动手写的时候,很多人其实一头雾水:网上教程张口闭口都是 ReAct、多智… · 2026/9/23 6:59:36
周小四面试突击:3步搞定速查手册 周小四面试突击:3步搞定速查手册 官方文档动辄几千行,翻到第三页就头昏脑涨?别急,这套周小四速查手册帮你把重点压缩到10分钟内读完。针对转岗从业者,我们直接拆解高频考点,不再让你对着目录发呆。 考点梳理与题型拆解… · 2026/9/23 6:59:24
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29