合肥优秀网站建设,个人网站免费域名注册,在线音乐网站源码,关于公司网站开发的事项文章分享了作者从初识RAG到深入理解的学习历程#xff0c;强调RAG核心在于检索环节#xff0c;详细探讨了检索管道优化和知识库构建等关键技术。作者提倡基于底层原理的自建方案而非简单依赖框架#xff0c;展望了Agentic RAG的未来发展#xff0c;强调了元认知在技术学习中…文章分享了作者从初识RAG到深入理解的学习历程强调RAG核心在于检索环节详细探讨了检索管道优化和知识库构建等关键技术。作者提倡基于底层原理的自建方案而非简单依赖框架展望了Agentic RAG的未来发展强调了元认知在技术学习中的关键作用。我的RAG爬坑与进阶之路一次元认知驱动的探索经验分享 文章目标本文主要面向对 RAG 技术感兴趣的实践者、学习者以及希望从浅层应用走向深入理解的技术爱好者希望帮助大家系统梳理一次从 RAG 初识、框架应用、遭遇瓶颈到深入原理、探索优化的个人学习与实践历程。深刻理解 RAG 的核心机制特别是检索管道与知识库构建中的关键挑战与应对策略。感受元认知在技术学习与问题解决中的驱动作用启发大家进行更深层次的技术探索。 小提示深刻理解 RAG 各环节的底层原理与相互关联是跳出“调包侠”困境、有效诊断问题并针对性地优化系统性能的关键前提。 本次主题本次主要和大家共同探讨我个人在学习和实践 RAG 技术过程中的关键认知转折点、技术难点探索、以及元认知驱动下的反思与对未来发展的畅想。 目录 文章目标 本次主题 前言 第一阶段初识RAG——从“听过”到“用过”的鸿沟最初的遇见与误解拥抱框架的“便捷”LangChain/LlamaIndex初体验 第二阶段反思与觉醒——元认知驱动下的认知重塑对框架的深度反思明确核心为何我坚信RAG的核心是检索⚙️ 第三阶段深入引擎——解构与优化检索管道RAG系统宏观架构回顾从用户查询出发理解与预处理核心检索与排序从词频到语义再到精准重排 第四阶段夯实地基——知识库构建挑战与工程实践知识库RAG系统的基石与信息源构建关键步骤与考量核心难点聚焦文件处理的挑战与务实应对 第五阶段元认知升华——总结、反思与前行未来展望Agentic RAG 与深度智能化的畅想最后的最后 总结与展望 往期精选 前言这篇文章便是我在这条RAG爬坑与进阶之路上一次由表及里、充满反思元认知驱动的学习、实践与思考之旅的粗糙纪录。希望能通过分享我的困惑、顿悟、踩过的坑以及对关键技术的理解为同样走在这条路上的朋友们提供一些参考和启发。✨ 你好我是筱可欢迎来到「筱可 AI 研习社」 标签关键词| AI 实战派开发者 | 技术成长陪伴者 | RAG 前沿探索者 | 文档处理先锋 | 第一阶段初识RAG——从“听过”到“用过”的鸿沟最初的遇见与误解回想最初接触RAG概念时坦白说我对其理解是相当模糊甚至错误的。我当时的认知停留在一种朦胧的想象中以为RAG是通过某种方式让经过Embedding处理后的知识向量直接参与到大模型的内部计算过程中从而影响模型的输出内容。这种理解现在看来显然是偏离了核心机制。直到后来深入了解我才恍然大悟原来RAG的核心机制并非如此。它的本质流程更为清晰和工程化当用户提出查询时系统首先利用Embedding等技术在外部知识库中进行检索Retrieval找到与查询最相关的若干文本片段然后将这些检索到的信息上下文与用户的原始查询一起增强Augmented成一个新的、信息量更丰富的提示Prompt最后将这个增强后的提示交给大语言模型进行生成Generation从而得到更准确、更贴合知识库内容的回答。这个“检索-增强-生成”的过程在当时大模型浪潮刚刚兴起的阶段着实让我眼前一亮。它似乎为构建一个智能问答系统提供了一条捷径让人觉得“做一个智能问答系统似乎很简单”。这种看似触手可及的“智能”让我对RAG充满了期待。拥抱框架的“便捷”LangChain/LlamaIndex初体验带着这份期待我自然而然地接触到了当时流行的RAG开发框架如LangChain和LlamaIndex。初次使用时这些框架提供的丰富组件和便捷的API确实让我感觉“如获至宝”。我一度认为要想“学会”RAG就必须熟练掌握这些库能够灵活调用它们的接口来实现各种功能。然而随着实践的深入问题逐渐暴露出来。我发现自己常常只是停留在“知道这个API可以实现这个功能”的层面对于其背后的具体实现逻辑、算法原理知之甚少。这种“知其然不知其所以然”的状态导致我在遇到实际问题时束手无策RAG系统的效果时好时坏但我完全不知道问题出在哪里更不用说如何进行针对性的优化了。为了打破这种局面我尝试过去深入阅读框架的源码希望能理解其内部运作机制。但以当时的LangChain为例其庞大的代码量、复杂的抽象层次以及各种设计模式对于软件工程能力尚未达到一定高度的我来说带来了巨大的认知负担。理解其内部逻辑成了一项极其困难的任务这也成为了我开始对其产生疑虑的起点。 第二阶段反思与觉醒——元认知驱动下的认知重塑对框架的深度反思深入源码的受挫经历以及在实际应用中遇到的种种问题促使我开始进行更深层次的反思特别是关于框架本身及其在不同场景下的适用性。框架依赖的挑战首先我意识到“封装好”并不等同于“逻辑优”。虽然框架提供了便捷的接口但其内部实现的算法、策略是否足够优秀和适用是需要打个问号的。尤其是在AI技术日新月异的背景下框架需要快速迭代以跟上最新的研究进展这使得我们对框架的认知也需要不断更新。其次这种快速迭代的特性恰恰与工业级应用对稳定性的核心需求产生了矛盾。在企业开发中我们往往需要的是稳定、可靠、行为可预测的系统。像LangChain这样快速变化的框架虽然适合快速构建原型、验证想法但在追求长期稳定性和可维护性的生产环境中其适用性值得商榷。在我看来这类框架更适合被定位为快速原型开发工具。更重要的是过度依赖框架会让我们失去对底层技术的掌控力。框架的抽象和封装虽然降低了入门门槛但也可能成为理解和优化的障碍。当我们需要根据特定业务场景进行深度定制、或者需要对性能进行极致优化时框架的“黑箱”特性往往会成为障碍。当然这并非全盘否定框架的价值。其中不乏设计精妙、值得借鉴的模块和思路。但经过反思我逐渐认识到对于需要长期维护和持续优化的RAG系统而言拥有一套自己能够理解、掌控和快速修改的代码基础至关重要。这种底层因素决定了完全依赖一个庞大且快速变化的外部框架大概率不会是我的最终选择。这也是我后来坚持要深入理解底层原理的重要原因。明确核心为何我坚信RAG的核心是检索在逐步摆脱对框架的盲目依赖开始回归第一性原理思考的过程中一个关键问题浮出水面RAG的核心到底是什么我的答案是检索Retrieval。RAG核心机制首先从其全称“Retrieval-Augmented Generation”检索增强生成来看“检索”被明确地放在了核心位置名字本身就昭示了他的重要性。其次从RAG系统的最小构成单元来看它包含检索器Retriever和生成器Generator。生成器通常是已经训练好的大型语言模型LLM虽然其能力是基础但在RAG的背景下我们通常不直接修改或重新训练它否则就变成了微调Fine-tuning。RAG的核心价值恰恰在于通过外部知识检索来增强这个预训练模型的表现以较低的技术成本相比于微调来降低模型的幻觉、提升回答的相关性和准确性。那么这个“增强”效果的好坏很大程度上就取决于“检索”这一步能否找到真正有用、准确、全面的信息。因此检索环节是RAG区别于单纯LLM应用、实现其核心价值的关键所在。我们可以将“检索”进一步拓展理解为构建一个“检索管道”Retrieval Pipeline或者说一个针对本地知识库的“搜索引擎”。这个管道的复杂程度可以根据具体需求来定制。最简单的例子就是联网查询用户的查询被发送给外部的搜索引擎如Google Search, Bing Search等搜索引擎扮演了检索器的角色从互联网这个巨大的“知识库”中查找信息然后返回给生成器。在这个过程中我们无需管理知识库的构建和索引只需调用API即可。这个例子清晰地展示了即使在最简化的RAG形式中检索也是不可或缺的核心环节。那么在更常见的场景下当我们希望RAG系统能够基于我们自己的私有文档、数据来回答问题时就需要构建一个属于我们自己的、针对本地知识库的“搜索引擎”。如何设计和优化这个内部的“检索管道”自然就成了构建高质量RAG系统的重中之重。⚙️ 第三阶段深入引擎——解构与优化检索管道既然认识到检索是RAG的核心那么深入理解和优化检索管道就成了我的下一个主攻方向。在深入探讨具体的检索算法之前我们有必要先回顾一下典型的RAG系统架构。RAG系统宏观架构回顾一个典型的RAG系统通常由三大核心组件构成知识库 (Knowledge Base): 这是系统的信息源泉可以是文档集合、数据库记录、网页内容等。原始数据需要经过预处理清洗、切分和索引通常是倒排索引还有hnswivf等等才能被检索器高效利用当然暴力搜索也是可以的只是速度会下降几个量级。检索器 (Retriever): 它的核心任务是根据用户的查询Query从知识库中快速、准确地找出最相关的若干信息片段Context。检索器的实现技术多样包括传统的关键词匹配如BM25、向量相似度搜索基于Embeddings或是更复杂的混合策略。生成器 (Generator): 通常是一个大型语言模型LLM。它接收用户的原始查询以及检索器找回的相关上下文然后基于这些输入“理解”并“综合”信息生成最终的答案。典型数据流如下 用户输入查询 - 检索器在知识库中搜索相关上下文 - 将上下文与原始查询构造成增强提示 - 生成器LLM基于增强提示生成答案 - 输出答案给用户。典型RAG系统这个“检索”“生成”的机制使得RAG能够在不重新训练模型的情况下有效利用外部知识提升回答质量。接下来我们将聚焦于这个流程的核心——检索管道的构建与优化。从用户查询出发理解与预处理用户的查询是检索流程的起点。一个好的RAG系统必须能够有效地理解用户的意图并对其进行必要的处理才能为后续的检索环节打下坚实的基础。我们可以将这一系列处理步骤视为检索管道的“前置处理层”。为何要如此重视用户查询的理解与处理呢在我看来理解并区分用户问题的类型和复杂度至关重要。这直接影响到我们如何设计检索策略、选择数据处理方式、乃至优化整个系统的性能。并非所有问题都生而平等有些是简单的“事实查找”而另一些则可能涉及跨文档的“复杂推理”或需要处理“模糊不清”的表述。这些差异对RAG流程中的检索器和生成器都提出了截然不同的挑战。如果我们不能有效地区分和应对这些不同类型的问题系统就很容易在检索时“大海捞针”却找不到关键信息或者生成时“胡言乱语”、产生幻觉。例如一个需要多步推理Multi-hop的问题如果用处理简单事实查找的方法去检索很可能只找到部分碎片信息导致答案不完整。一个措辞模糊或充满歧义的查询则可能让检索器完全“跑偏”取回一堆不相关的文档给后续的生成器带来巨大的“噪音”和干扰。因此深入理解用户查询的性质并进行针对性的预处理是避免在系统设计和性能调优上走弯路的关键一步。这不仅仅是简单的文本规范化更涉及到对问题背后意图、复杂度和所需信息类型的深层把握。问题的复杂性来自哪里除了传统问答系统也面临的挑战如事实查找、列表、定义、因果、假设等不同问题类型RAG因为引入了从外部知识库检索信息这一环节带来了额外的复杂度维度。我总结下来RAG中问题的复杂性主要源于以下几个方面查询本身的清晰度与明确性用户的提问往往是口语化、模糊不清、甚至带有歧义的比如“给我讲讲AI的最佳实践” vs “银行欺诈检测中的AI实践哪个更好”。这直接考验系统对用户真实意图的捕捉能力。所需信息的明确性与分布答案是直接存在于某段文本中的明确事实还是需要结合多个信息片段、甚至进行一定常识或逻辑推断才能得到的隐含信息或者答案根本就不在知识库里上下文不足推理的深度与广度回答问题是否需要连接来自多个文档的信息进行多跳Multi-hop推理或者需要进行比较、聚合等更复杂的操作主题的特异性与专业性查询是否涉及高度具体、小众或包含大量专业术语的主题这些术语可能在通用嵌入模型中代表性不足导致语义匹配困难。知识库的数据质量即便查询本身清晰如果检索到的知识片段充满噪声、相互矛盾或信息过时也会大大增加处理的复杂度甚至误导生成器。复杂性对RAG组件的影响这些不同层面的复杂性对RAG的两大核心组件——检索器和生成器——都提出了严峻的考验对检索器Retriever查找相关性面对模糊、多跳或包含专业术语的查询更难精确地找到所有必要且相关的文档片段。处理歧义需要更强的能力来解读意图避免因歧义而检索到无关内容。协调多步对于需要多步推理的问题简单的单次检索往往不够需要更复杂的检索策略如分解问题、顺序检索。应对知识限制如果知识库本身不完整或过时再好的检索器也无能为力。对生成器Generator / LLM抗噪能力如果检索器返回了大量噪声或矛盾信息LLM需要具备更强的能力来筛选、识别并基于可靠信息生成答案否则容易“迷失”或产生幻觉。上下文维持处理多跳问题或长对话时需要有效维持和利用跨轮次或跨文档的上下文信息。推理与综合对于需要推理或从隐含信息生成答案的查询要求LLM具备超越简单文本提取的复杂推理和综合能力。避免幻觉即使有上下文在信息不足、冲突或需要深度推断时LLM仍可能产生幻觉。这里存在一个典型的权衡Trade-off为了应对复杂问题尤其是需要多方面信息的问题我们可能倾向于让检索器召回更多候选文档追求高召回率但这又会增加噪声加大生成器的处理难度反之如果过于追求检索精度又可能漏掉关键信息导致生成器“无米下锅”或给出片面答案。这正是一些高级RAG技术如Self-RAG、CRAG、Adaptive RAG等试图通过更智能的检索、评估和生成协同来解决的问题。那么具体如何进行查询预处理呢认识到用户查询的多样性和复杂性后我们就可以更有针对性地应用一系列预处理技术将原始的、可能混乱的用户查询转化为更规范、更聚焦、意图更清晰的输入为后续的检索匹配打下良好基础。主要可以从两个层面入手层面一查询的规范化处理(Normalization)这主要解决查询在“表面形式”上的问题确保后续处理尤其是基于关键词的检索如BM25能顺利进行。常用手段包括拼写纠错自动修正输入错误避免因错别字导致检索失败例如将 “langchain” 的错误拼写 “langhchain” 改正。大小写转换通常统一转为小写以进行不区分大小写的匹配。但最好保留原始大小写副本供最终答案生成时参考。词干提取或词形还原将词语的不同形式如 “running”, “ran”归一为其基本形态“run”有助于扩大召回匹配文档中同一词根的不同变体。词形还原更准确但计算成本稍高。去除停用词移除 “的”, “是”, “和” 等常见但信息量低的词。需谨慎使用有时停用词对维持句子结构和语义尤其对于嵌入模型很重要。层面二查询意图的深度理解与增强(Intent Understanding Enhancement)这旨在更深层次地把握用户需求应对查询的歧义性、复杂性等挑战。关键词提取识别并提取最能代表查询核心意图的词语或短语去除口语化修饰如“我想问一下…”。命名实体识别(NER)识别查询中的人名、地名、组织名、技术术语等专有名词这对于需要精确匹配知识库中特定实体信息的场景尤其在有知识图谱支持时非常有价值。意图分类(Intent Classification)判断用户的查询类型是寻求定义、方法、比较还是其他不同的意图可能触发不同的检索策略或后续处理逻辑。例如识别出用户在“闲聊”可以直接由LLM响应无需启动RAG流程。查询重写/扩展(Query Rewriting/Expansion)对于过于模糊、简洁或复杂的查询可以利用LLM或其他技术进行改写使其更清晰、信息更丰富或者分解为多个子查询。例如可以加入同义词扩展召回范围或者将一个复杂的多跳问题分解成几个更简单的子问题逐步查询。通过这样从表层规范化到深层意图理解和增强的处理我们可以最大限度地提升查询质量为后续的核心检索与排序环节提供最好的起点。核心检索与排序从词频到语义再到精准重排优化检索管道经过预处理的查询接下来就进入了核心的检索与排序环节。我们如何从知识库中找到与查询最相关的文档片段并对其进行有效排序呢让我们从最简单的想法开始。最直接的方法是文本直接匹配只要文档片段中包含查询的关键词就将其返回。但这种方法的缺点显而易见我们无法对结果进行排序相关性强的和弱的混杂在一起。那么我们可以匹配多个关键词并按照匹配上的关键词数量进行排序吗命中的关键词越多排名越靠前。这确实在一定程度上解决了排序问题算是一个简单的排序方案。但继续思考如果一篇很长的文章仅仅因为他的长度优势包含了大量重复的关键词即使这些关键词只占文章很小一部分导致其命中数远超其他更相关但较短的文章怎么办看来我们需要引入文本长度作为影响因子。可以考虑对过长的文档进行一定的“惩罚”避免长度导致分数差距过大。但单纯扣分似乎也不太合理万一这篇长文确实通篇都在深入讨论这些关键词呢所以我们不仅要看长度还要看关键词在文档中的占比或分布。仅仅关注关键词数量、文章长度以及它们之间的关系似乎还不够精确和鲁棒。这里就引出了信息检索领域一个非常经典的算法——BM25Best Match 25。BM25 算法核心概念BM25是一种基于概率检索模型的排名函数它能够更精妙地平衡词频Term Frequency, TF、逆文档频率Inverse Document Frequency, IDF和文档长度来计算文档与查询之间的相关性得分。其核心公式如下其中是文档 相对于查询 的得分。是查询包含多个查询词 。是查询词 的逆文档频率衡量词语在整个文档集中的稀有程度越稀有越重要IDF值越高。是查询词 在文档 中出现的频率TF。是文档 的长度 是文档集平均长度。和 是可调参数。 控制词频饱和度词频很高时得分增长趋缓 控制文档长度归一化的程度 越大长文档的“惩罚”越重。简单来说BM25通过IDF衡量词的重要性同时考虑了词在具体文档中的频率以及文档相对平均长度奖励那些包含多个重要稀有查询词、且这些词出现频率适中、同时文档长度不过分长的文档。它是一种基于词频统计学的算法能够在很大程度上提供稳定且效果不错的排序结果。然而即使是BM25这样经典的算法也并非万能。因为它本质上还是基于词汇匹配它无法理解词语背后的语义。这就带来一个典型的问题如果用户输入的查询词和文档中的相关词语是同义词或近义词但字面上完全不同BM25就无能为力了。比如一个不熟悉“乌龟”学名的小孩子可能会搜索“王八”但如果我们的知识库文档里只写了“乌龟”那么基于BM25的搜索很可能什么也找不到。面对这种语义鸿沟我们该怎么办难道要用正则表达式写大量的同义词替换规则吗这显然不现实。或者用大模型先对用户问题进行改写让其表达更规范这或许可行但存在不稳定性模型可能改写错和成本问题调用大模型。这里我们需要引入一种能够理解文本深层含义、跨越字面障碍的技术——嵌入Embeddings技术。嵌入技术的核心思想是将文本词语、句子、段落等转换为高维数字向量这些向量能够捕捉文本的语义信息。关键在于语义上相似的文本在转换成向量后它们在向量空间中的距离会比较近。现在有许多强大的预训练嵌入模型如Sentence-BERT、OpenAI Embeddings、BGE系列等它们在大规模语料上学习到了如何将文本映射到能够反映其语义的向量空间。利用嵌入技术解决语义匹配问题的流程大致如下首先将知识库中的所有文档或切分后的块通过选定的嵌入模型转换成向量并存储在专门的向量数据库中。当用户输入查询时使用相同的嵌入模型将查询也转换为一个向量。然后计算查询向量与知识库中所有文档向量之间的相似度常用的是余弦相似度Cosine Similarity。最后根据相似度得分对文档进行排序得分最高的即为语义上最相关的文档。这样一来即使用户查询“王八”其生成的向量也能与文档中“乌龟”生成的向量在空间中距离很近因为它们在语义上高度相关从而实现有效的匹配。嵌入技术的优势在于它能超越关键词匹配理解词语和句子的深层含义较好地处理同义词、近义词甚至一定程度的多义词问题并且结合向量数据库能够高效地在大规模文档集上进行语义搜索。利用嵌入技术进行语义匹配的基本流程那么引入了强大的嵌入技术后我们是否就可以完全抛弃BM25这类传统算法了呢答案是否定的。原因有几方面首先嵌入模型的效果高度依赖于其训练数据如果训练数据与你的应用场景偏差较大其效果不一定优于基于明确规则的BM25。其次嵌入向量的生成推理需要消耗大量的计算资源。根据我的个人实验使用Ultra 7 155H处理器大致相当于i7 13代使用像BGE-M3这样的模型在不进行批处理的情况下生成单个向量大约需要0.2秒即使进行批处理每个向量也需要约0.02秒。这在需要快速响应的场景下是一个不可忽视的成本。更重要的是嵌入模型本身也存在其复杂性。例如不同的任务可能需要不同的嵌入模型才能达到最佳效果。我们常常需要区分问答匹配QA、查询-文档检索QD、**查询-查询相似度QQ以及重排序Rerank**等不同任务并选择针对性优化的模型。即便是专门调整过的模型其表现也并非总是完美模型的训练过程很大程度上像一个“黑箱”我们通过调整数据“炼丹”但难以完全保证其在所有情况下的稳定性和准确性。例如对于短文本和长文本的相似度计算或者对于细微语义差别的捕捉嵌入模型有时会给出不符合直觉的结果。相比之下BM25作为基于规则的算法其行为是稳定且可预测的虽然它无法跨越语义鸿沟但在处理字面匹配和基于词频统计的相关性判断上往往非常可靠。因此在实践中最佳策略往往是将BM25和嵌入向量搜索结合起来使用。我们可以同时使用两种方法进行多路召回分别找出各自认为最相关的文档然后将结果进行融合例如通过某种加权方式或排序算法合并两组结果。这样可以兼顾词法匹配的稳定性和语义匹配的灵活性。此外为了进一步提升最终排序的精度我们还可以在多路召回之后引入一个重排序Rerank环节。这个环节通常使用更复杂、更强大的模型例如基于Transformer的交叉编码器Cross-Encoders对初步召回的候选文档列表比如Top 50或Top 100进行二次精排。为什么需要重排序呢初步召回阶段使用的模型无论是BM25还是用于生成嵌入的Bi-Encoder模型为了追求效率其计算相对简单。而重排序模型如Cross-Encoder可以同时接收查询和单个候选文档作为输入进行更深层次的交互和语义关系判断从而给出更准确的相关性得分。因为它只处理少量候选文档所以即使模型更复杂总体开销也是可控的。可以将Rerank模型理解为一个加强版的相关性打分器它不需要区分QA/QD等任务而是能直接对输入对进行打分你可以理解他可以自己判断当前任务是什么。虽然它也依赖训练数据但由于模型结构的优势交叉注意力机制排序结果通常优于单独的BM25或基于向量相似度的排序。总结来说一个健壮的检索管道通常包含查询预处理 - 多路召回如BM25 向量检索- 结果融合 - Rerank 精排。通过这样层层递进、结合多种技术的策略我们可以在效率、成本和效果之间取得较好的平衡最大限度地提升检索结果的质量为后续的生成环节提供最优质的上下文信息。当然还有像ColBERT这样的多向量检索技术、MMR最大边际相关性搜索用于提升结果多样性等更高级的策略感兴趣的读者可以进一步探索。 第四阶段夯实地基——知识库构建挑战与工程实践理解了检索管道的复杂性后我们必须认识到再强大的检索能力也需要有高质量的数据才能发挥作用。这个就是RAG系统的另一个基石——知识库Knowledge Base。如果说检索是“如何找到信息”那么知识库构建就是“确保有好信息可供查找”。一个结构清晰、内容准确、易于检索的知识库是保证RAG系统输出质量的根本前提。知识库RAG系统的基石与信息源知识库构建指的是将原始数据如文档、网页、数据库记录等处理、转换并组织成一种结构化的、易于检索的格式以便RAG系统能够有效地从中提取信息的过程。这绝非简单地将文件堆砌在一起而是涉及一系列为了优化检索效果而进行的精心设计与工程实践。构建关键步骤与考量构建一个高质量的知识库通常需要经历下面的一些关键步骤每一步都伴随着挑战与决策或许很多环节做好了都能发不少论文首先是数据收集与加载Data Collection and Ingestion。我们需要明确知识的来源它可以是各种格式的文档PDF, DOCX, TXT, Markdown等、网页内容、数据库记录、API接口返回的数据甚至是结构化的表格。针对不同的数据源需要选择合适的工具或编写脚本Data Loaders来读取和加载数据。许多RAG框架如LlamaIndex, LangChain虽然提供了丰富的数据加载器但在实际应用中我发现它们的通用性往往有限特别是面对格式复杂或包含特殊元素的数据时但是效果可能不尽如人意。接下来是数据清洗与预处理Data Cleaning and Preprocessing。原始数据往往充满噪音需要进行细致的处理。这包括将不同格式的数据尽量统一为纯文本或某种标准格式去除不相关的元素如HTML标签、广告、页眉页脚、水印等对于来自扫描文档的数据可能需要修正OCR识别错误还需要处理特殊字符规范化或移除可能影响后续处理的字符。数据质量是根本“Garbage in, garbage out”这一步的质量直接影响后续所有环节。然后是至关重要的文本切分Chunking。为何分块如此重要主要原因有三一是克服大语言模型LLM的上下文窗口限制原始长文档必须切分成模型能处理的小块二是提高检索精度与效率小而美的、语义集中的块更容易被精确匹配和快速检索三是尽可能维护上下文完整性好的分块应避免在不恰当的地方断开保持信息单元的相对完整。分块的核心挑战在于在“检索精度”小块有利和“上下文完整性”大块有利之间找到最佳平衡点。实践中存在多种基础分块策略。固定大小分块(Fixed-size Chunking)是最简单的方法按固定字符或Token数切割通常带重叠Overlap以缓解边界问题但极易破坏语义忽略文档结构。 我在后续的实践中倾向于避免使用Overlap因为它可能引入冗余信息降低向量相似度的区分度。基于句子的分块(Sentence Splitting)试图尊重语言边界语义保持较好但块大小不均且对简单标点分割的准确性或NLP库有依赖我在示例代码中为简化未引入外部NLP库。递归字符分块(Recursive Character Text Splitting)是LangChain等框架常用的策略它按预设的分隔符列表如\n\n,\n, 空格等递归尝试分割试图在保持结构如段落的同时满足大小限制通用性较好。基于文档结构的分块(Document Structure-aware Chunking)利用文档固有结构如HTML标签、Markdown标题进行分割最能保持原文逻辑且方便附加结构化元数据但依赖清晰的文档结构且块大小可能极不均匀。为了结合不同策略的优点混合分块(Hybrid Chunking)应运而生。一种常见的思路是分层处理先利用文档结构如Markdown标题进行高级别、粗粒度的分割得到逻辑上相关的“大块”并保留标题等元数据然后如果这些“大块”仍然超出目标大小限制chunk_size再在内部使用递归字符分块等更细粒度的策略进行切分。我个人实践并实现过类似基于Markdown的混合分块策略它能在保留标题提供的上下文信息的同时通过递归分割确保块大小可控并特别注意保持代码块的完整性不对其进行切分。这种方式通常能产生质量更高、更适合RAG的文本块。当基础策略无法满足需求时还可以探索高级分块策略。语义分块(Semantic Chunking)利用Embedding向量计算相邻文本片段的语义相似度在“语义断裂点”进行切割理论上最符合人类理解但计算成本高依赖模型和阈值调整。分层分块(Hierarchical Chunking)系统地创建多层级块如章、段、句增加检索灵活性但索引更复杂。Small-to-Big / 父文档检索器(Parent Document Retriever)是一种检索策略它依赖于分层或父子块结构先检索精确的小块然后返回其对应的、包含更丰富上下文的父块给LLM。命题分块(Proposition Chunking)尝试用LLM/NLP将文本分解为原子事实粒度极细适合事实问答但成本高可能丢失信息。Agentic / LLM-based Chunking则更进一步让Agent或LLM根据内容理解来决策如何分块潜力巨大但复杂、昂贵且处于探索阶段。此外还有一种块优化策略上下文富化(Context Enrichment)。它在分块之后为每个块补充额外信息如相邻句子、摘要或父级标题元数据以增强上下文但需注意过度使用摘要可能降低块间区分度。选择哪种分块策略需要根据数据特性、应用场景、对质量的要求以及成本预算进行综合权衡如果追求非常快的速度以及相对较好的分割的效果我推荐使用混合分块的形式对应的讲解和代码在我的另外一篇文章里面。分块完成后需要进行嵌入生成Embedding Generation。选择合适的嵌入模型考虑语言、领域、精度、成本对所有文本块进行批量处理生成对应的向量表示值得注意的是需要考虑对应的模型性能问题或者对于你的领域是否适应因为每个模型训练的数据不一定包含你的领域数据我把这个效应叫做“水土不服”。紧接着是索引与存储Indexing and Storage。将文本块及其对应的嵌入向量存入专门的向量数据库如FAISS, Milvus, Pinecone, Qdrant, ChromaDB等这些数据库为高效的向量相似度搜索进行了优化。同时存储丰富的元数据Metadata至关重要例如源文件名、文档标题、章节信息、创建日期、关键词、块ID等。这些元数据不仅有助于后续的过滤和排序还能为用户提供答案溯源的能力。在构建大规模知识库时数据去重Data Deduplication不容忽视。重复内容浪费资源还可能导致检索偏见。可以采用基于哈希的去重算法如SimHash检测近似重复或MinHash快速估计Jaccard相似度。也可以借鉴成熟的论文查重算法如基于N-gram匹配或Winnowing算法。以知网为例他们做的就是分段检测、设定阈值如段落重复率低于5%忽略、基于连续字符匹配如连续13个字符重复的模糊匹配机制都为知识库去重提供了有益的参考。我建议在数据入库前进行查重检测并结合人工审核来处理重复或近似重复的内容更新旧数据。当然也可以考虑基于向量的语义查重但是效率会降低成本也会提升具体有多大的提升还有待验证。最后知识库还需要更新与维护Updating and Maintenance。当原始数据变化时需要能够高效地进行增量更新而非全量重建。对知识库进行版本控制便于追踪和回滚。还需要定期评估知识库的质量和检索效果并根据评估结果调整构建策略。核心难点聚焦文件处理的挑战与务实应对在知识库构建的诸多环节中文件内容的准确提取无疑是最为关键也最容易遇到陷阱的一步。无论后续的切分、嵌入、索引做得多么完美如果最初从源文件中提取出来的信息就是错误或不完整的那么整个RAG系统的效果都将大打折扣不打地基如建空中楼阁不做数据清洗garbage in 真的就是garbage out。不同格式的文件PDF、DOCX、网页、图片等内部结构千差万别这给通用化的内容提取带来了巨大挑战有的公司直接能依靠这项业务能挣的盆满钵满。特别是PDF文件复杂性尤为突出扫描版PDF需要OCR准确率受多因素影响复杂的排版多栏、图文混排、页眉页脚、水印干扰文本流提取表格和公式的结构化信息提取和正确识别是公认的难题还可能遇到特殊字体和编码导致乱码或字符丢失的问题。尤其需要强调的是对包含表格的文件特别是那些含有超长、复杂表格的PDF文件。根据我的经验和观察目前市面上绝大多数基于模型的自动提取方案在处理这类表格时效果往往不尽人意很容易出现错行、漏列、数据解析错误等问题。与其投入巨大精力去调试和优化模型提取效果有时不如考虑更务实的方法人工介入或采用更针对性的策略。对于这类包含复杂表格的文档我强烈建议对于内容较短、结构相对简单的表格可以考虑将他转换为Markdown或HTML格式的表格直接嵌入文本块中。而对于超长或结构复杂的表格更可靠的方案是首先通过人工或使用专门的工具将PDF或其他格式文件中的这些复杂表格准确地转换为结构化的数据格式如Excel表格或CSV文件。这个过程虽然可能耗费人力但能最大限度地保证数据的准确性和完整性如果是不干净的数据为什么还要去污染数据库的数据源呢对于知识库我们必须保持洁癖我认为既然是自己要建立的知识库那么就应该是一个第二大脑我们这种喜欢终生学习的人对于第二大脑应该不会陌生吧那么你能允许你的第二大脑被污染吗答案是显而易见的。然后将这些结构化的表格数据导入到关系型数据库或类似的结构化存储中。最后在RAG系统中当用户的查询涉及到这些存储在数据库中的表格数据时可以考虑采用Text-to-SQL的思路。即将用户的自然语言查询转换为SQL查询语句直接在结构化的表格数据中进行精确查找然后将查询结果可以是数据本身或对数据的描述融入到大模型的上下文中生成答案。这样做的好处显而易见数据准确性高人工保证检索精准SQL对结构化数据查询能力强有效避免模型幻觉直接从准确数据源获取信息。这也再次印证了我在反思框架时得出的结论尽管市面上存在便捷的RAG框架如LlamaIndex, LangChain它们在原型验证和快速搭建上很有价值。但在实际生产环境中面对复杂数据处理如难搞的PDF表格、追求极致性能和特定业务需求时这些框架的通用性往往难以满足要求。很多时候我们需要基于对底层原理的深刻理解自行搭建和维护更具针对性的服务。这意味着我们可能需要自己调用像MinerU、PaddleOCR通用管道或DocLing这样的专业文档解析工具来处理复杂文档甚至在某些对速度要求极高的场景下回归使用pymupdf(Fitz)这类传统库以牺牲部分版面分析精度换取更高效率。这种灵活选择和深度定制是通用框架难以全面覆盖的也是走向RAG实践深水区的必经之路。我觉得RAG工程上的工作越做越深最终大部分时间都会用来解决文档解析的问题。♂️ 入群交流公众号菜单点击「社群」扫码直接入群回复关键词「入群」添加作者微信人工邀请注意备注入群 第五阶段元认知升华——总结、反思与前行回顾整个RAG的学习与实践过程我深刻体会到元认知Metacognition——即对自身思考过程的认知和反思——在其中扮演的关键驱动作用。从最初对概念的误解到对框架的依赖与反思再到深入原理、攻坚克难每一步认知的提升都离不开对“我当前知道什么”、“我不知道什么”、“我为什么会卡住”、“如何才能更好地理解”这些问题的持续追问和审视。正是这种元认知驱动让我没有停留在API调用的表面而是主动去探究框架源码虽然一度受挫、去质疑现有方案的局限性、去思考更底层的原理、去寻找更适合特定场景的解决方案比如对复杂表格的处理。它帮助我识别知识的盲区调整学习的策略最终从一个被动的“工具使用者”转变为一个更主动的“问题解决者”以及“理论的探索者”。未来展望Agentic RAG 与深度智能化的畅想未来RAG系统的模块化agentic 工作流基于当前的实践和对技术发展趋势的观察我对未来RAG的发展充满期待特别是Agentic智能体化和深度智能化方向的潜力模块化 Agentic 工作流我构想未来的RAG系统其各个核心模块——如用户交互、查询理解、多路检索策略选择与执行、知识库的动态更新与维护、复杂文档的智能解析、乃至文本分块本身——都可能演变成由专门的Agent驱动的、具备局部回环Local Loop自我优化能力的工作流。每个Agent负责其特定领域并通过协同工作完成复杂的RAG任务。Agentic 用户交互与查询理解交互不再是被动的“一问一答”。Agent可以主动与用户进行多轮对话收集更丰富的背景信息、澄清模糊的查询意图从而更精准地把握用户需求再启动后续的检索流程。Agentic 智能检索检索过程将更加智能和动态。Agent可以根据初步分析自动进行多轮、自适应的问题改写或者生成假设性文档HyDE来辅助检索实现更强大的多路召回。不仅如此Agent还能对初步检索到的结果进行深度推理比如构建临时的关系网络图谱分析信息间的关联识别知识缺口并自主决定是否需要进行补充检索或提出进一步的问题Agentic 自维护知识库知识库将变得更加“鲜活”。当本地知识无法满足查询时Agent能自动触发互联网搜索当然这依赖于未来网络搜索质量和可靠性的提升智能筛选、验证网络信息并将确认有效的知识无缝整合到本地知识库中。同样在数据入库时Agent能自动执行更精密的查重处理新旧数据的冲突与更新持续自我维护知识库的高质量与时效性。模型驱动的无损文档解析对于文档处理这一痛点未来的多模态大模型或专门优化的小模型管道有望实现对各类复杂文档尤其是PDF的近乎无损的信息提取。这不仅包括精准的文本OCR还可能涵盖表格的完美结构化提取、图片内容的理解与描述甚至是对整个页面版面布局信息的把握我期待能出现直接输出带坐标的图文结构的单个模型而非仅仅是OCR文本也非仅仅是坐标而是一体化的模型因为一体化的模型能够减少流程中犯错之后难以修改举例来说表格区域如果判断错误那么表格内容提取的模型出错也是必定的流程越多错误发生的概率越高这是必然的。更进一步可以利用大模型对提取结果进行智能后处理如修复OCR识别错误、去除无关内容如页脚、意外提取的脚注、甚至根据语义和视觉信息优化排版。Agentic 智能文本分块文本分块也将摆脱固定规则的束缚。Agent能够根据内容的语义、上下文关联以及下游任务的需求动态、智能地决定最佳的分割点和分块策略。在分块过程中Agent还能主动进行去重、消除歧义表达、补充必要的背景元数据从而极大提升每个文本块的“信息纯度”和“自解释性”。又或者我们不需要分块了到时候embedding模型会不会已经达到超级长的上下文空间了又或者是对话的大语言模型直接就能够达到近乎无限的上下文空间呢。最后的最后行文至此本文的分享也临近尾声。然而RAG 的探索之路远未结束仍有诸多引人深思的议题值得我们进一步探究1. 何时以及如何对 Embedding 模型进行微调以适应特定领域2. 多模态 RAG 中的检索与数据处理应如何设计3. Agentic RAG 的引入其成本效益与传统的模型微调相比又将如何权衡4. 关于搜索你还有更多的答案吗这些开放性问题既是挑战也是机遇留待我们在未来的实践中共同求索与验证。我热切期待与各位同仁一道继续在这条充满魅力的 RAG 之路上并肩探索。希望愿在不远的将来当大家提及“筱可”便能联想到我是个RAG的探索实践者。 总结与展望核心要点回顾RAG核心机制RAG的本质是“检索Retrieval-增强Augmented-生成Generation”其核心在于通过高质量的外部知识检索来增强大语言模型的表现。检索为王在RAG系统中检索管道的质量直接决定了最终效果。优化检索是提升RAG性能的关键远比单纯调整生成模型更重要。检索管道关键技术一个健壮的检索管道通常包括查询预处理规范化、意图理解、多路召回如BM25的词法匹配 向量的语义匹配、结果融合与Rerank精排使用Cross-Encoder等模型提升精度。知识库构建是基石高质量的知识库是RAG系统的根基。关键环节包括数据清洗、精细化的文本切分推荐结合文档结构的混合分块策略、丰富的元数据、有效去重以及针对复杂文档特别是含表格的PDF的务实处理策略如人工介入或Text-to-SQL。框架与自建的权衡现有RAG框架适合快速原型验证但在生产环境中面对复杂需求和性能极致优化时基于底层原理理解的自建或深度定制往往是更优选择。元认知驱动学习在技术探索中持续反思自身的认知过程、识别知识盲区、主动探究原理是实现从“调包侠”到“问题解决者”转变的关键。Agentic RAG展望未来的RAG系统将更加智能化、自动化通过Agent驱动的模块化工作流实现更智能的用户交互、动态检索策略、自维护知识库以及无损文档解析与智能分块。最后我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我整理出这套 AI 大模型突围资料包✅AI大模型学习路线图✅Agent行业报告✅100集大模型视频教程✅大模型书籍PDF✅DeepSeek教程✅AI产品经理入门资料完整的大模型学习和面试资料已经上传带到CSDN的官方了有需要的朋友可以扫描下方二维码免费领取【保证100%免费】为什么说现在普通人就业/升职加薪的首选是AI大模型人工智能技术的爆发式增长正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议到全国两会关于AI产业发展的政策聚焦再到招聘会上排起的长队AI的热度已从技术领域渗透到就业市场的每一个角落。智联招聘的最新数据给出了最直观的印证2025年2月AI领域求职人数同比增幅突破200%远超其他行业平均水平整个人工智能行业的求职增速达到33.4%位居各行业榜首其中人工智能工程师岗位的求职热度更是飙升69.6%。AI产业的快速扩张也让人才供需矛盾愈发突出。麦肯锡报告明确预测到2030年中国AI专业人才需求将达600万人人才缺口可能高达400万人这一缺口不仅存在于核心技术领域更蔓延至产业应用的各个环节。资料包有什么①从入门到精通的全套视频教程⑤⑥包含提示词工程、RAG、Agent等技术点② AI大模型学习路线图还有视频解说全过程AI大模型学习路线③学习电子书籍和技术文档市面上的大模型书籍确实太多了这些是我精选出来的④各大厂大模型面试题目详解⑤ 这些资料真的有用吗?这份资料由我和鲁为民博士共同整理鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。所有的视频教程由智泊AI老师录制且资料与智泊AI共享相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念通过动态追踪大模型开发、数据标注伦理等前沿技术趋势构建起前沿课程智能实训精准就业的高效培养体系。课堂上不光教理论还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作把课本知识变成真本事如果说你是以下人群中的其中一类都可以来智泊AI学习人工智能找到高薪工作一次小小的“投资”换来的是终身受益应届毕业生无工作经验但想要系统学习AI大模型技术期待通过实战项目掌握核心技术。零基础转型非技术背景但关注AI应用场景计划通过低代码工具实现“AI行业”跨界。业务赋能 突破瓶颈传统开发者Java/前端等学习Transformer架构与LangChain框架向AI全栈工程师转型。获取方式有需要的小伙伴可以保存图片到wx扫描二v码免费领取【保证100%免费】**