RAG篇(6):Elasticsearch的复兴:从BM25到ELSER,构建稀疏-稠密混合检索的“第二大脑”
导语:当向量检索“词不达意”时,谁来拯救你的RAG? 在上一篇章中,我们深入了Milvus的引擎室,驯服了HNSW这头性能猛兽,构建了一个强大的稠密向量检索系统。我们似乎已经拥有了捕捉“语义”的最强武器。我们的RAG系统能够理解“盈利能力”和“净利润率”之间的关联,这无疑是一次巨大的飞跃。然而,当你将这个看似完美的系统应用于更广泛、更真实的业务场景时,新的、令人困惑的问题开始浮现: 一位开发者在内部知识库中搜索一个特定的函数名 calculate_mrr_for_churned_users,结果返回的却是大量关于“用户流失分析”、“MRR计算方法”的通用文档,而包含那个精确函数定义的文档却排在几十名开外。 法务团队查询一个特定的法案编号 GDPR Article 17,系统却因为无法理解这个缩写词的“语义”,返回了一堆关于“数据隐私通用原则”的无关内容。 用户搜索一个独特的、新造的产品代号 Project Titan,由于这个词从未在通用语料中出现过,Embedding模型将其编码为一个无意义的向量,导致检索结果为零。 这就是稠密向量检索的**“阿喀琉斯之踵”:它擅长理...
RAG篇(5):深入Milvus:从Embedding微调到HNSW索引调优,构建企业级分布式稠密向量检索系统
导语:RAG的“引擎轰鸣”——当毫秒级的响应成为生死线 在前面的篇章里,我们已经像精密的工匠一样,完成了知识的“原料”准备。我们学会了如何听懂用户的真实意图,如何将混乱的PDF通过OCR解析为结构化的“玉石”,以及如何将这些玉石切割成语义完整的“知识单元”(Chunks)。我们的数据供应链已经就绪。 现在,我们面临一个更具速度与激情挑战的环节:检索。 想象一下这个场景:在一个高并发的在线问答系统中,用户的每一次提问,都要求你在毫秒之内,从一个可能包含数千万甚至数十亿个知识单元的巨大“仓库”中,精准地找到最相关的那几条信息。 任何超过200毫秒的检索延迟,都会让用户感受到明显的卡顿,直接扼杀用户体验。 任何一次错误的召回(召回了不相关的Chunk),都会导致下游的LLM产生“一本正经的胡说八道”,让系统的可靠性荡然无存。这就是RAG系统的“引擎室”——向量检索系统。它的性能,直接决定了你的AI应用是风驰电掣的“超级跑车”,还是停在原地无法启动的“老爷车”。在这个战场上,我们手中的核心武器,就是Embedding模型和向量数据库。 然而,90%的开发者对它们的使用,都停留在一种...
RAG篇(4):知识库的“数据供应链”——从高级Chunking到Table表格处理的深水区
导语:RAG的“隐形杀手”——一次糟糕的文本分块(Chunking) 在上一篇章中,我们借助DeepSeek-OCR等前沿工具,成功地将一份格式混乱的PDF“原始矿石”,打磨成了结构清晰、语义保真的“精美玉石”:一份高质量的Markdown或JSON。我们似乎已经解决了RAG流程中最棘手的数据输入问题。 然而,一个更隐蔽、也更致命的挑战,正悄然等待着我们: 想象一下,你拿到了一份完美的、包含章节标题、段落和表格的万字长文。现在,你需要将它“喂”给一个有上下文长度限制(如8K Tokens)的LLM。你无法将整篇文章一次性塞进去。你必须对它进行切分,也就是Chunking。 于是,你采取了最简单、最直观的方法:固定大小分块(Fixed-size Chunking)。你大刀阔斧地将文章每1000个字符切成一段。然后,你惊恐地发现: 一个关键的定义,它的前半句在Chunk A的末尾,后半句在Chunk B的开头。LLM在检索到任何一个Chunk时,都无法获得完整的语义。 一个完整的代码块或一段关键的法律条文,被无情地拦腰斩断。 一个巨大的表格,其表头在Chunk C,数据在Ch...
RAG篇(3):LLM原生OCR革命——从文字识别到DeepSeek-OCR视觉上下文压缩,深入RAG七层模型之解析层
导语:RAG的“阿喀琉斯之踵”——那份无法被完美解析的PDF 扩展:“阿喀琉斯之踵” (Achilles’ Heel) 源自希腊神话,指英雄阿喀琉斯身上唯一的致命弱点,即被母亲浸泡冥河时握住的未浸到水的脚后跟。这个典故现在比喻任何事物(包括国家、系统)或人看似强大却存在的致命、脆弱的环节或软肋,一旦被攻击就可能导致彻底失败。 让我们从一个你或许无比熟悉的场景开始: 经过数周的奋战,你和团队终于将一个基于RAG的智能知识库系统推上线。意图识别层精准无误,检索算法经过精心调校,LLM也选择了业界最顶尖的模型。你满怀信心地输入了第一个真正来自业务方的查询:“根据我们上一季度的财报PDF,分析一下‘XX业务线’的毛利率变化趋势及其原因。” 系统开始运转。几秒钟后,它返回了一个让你瞬间石化的答案:“根据提供的信息,无法找到关于‘XX业务线’毛利率的相关数据。” 你不信邪,打开调试日志,看到了RAG系统喂给LLM的“上下文”。那是一堆从PDF中提取出的、支离破碎的文本。原本清晰的表格变成了混乱的数字和字符的堆砌,跨页的段落被无情地切断,关键的图表和脚注则完全消失。LLM面对这堆无法理解的“...
RAG篇(2):智能总控的诞生——从意图识别到任务路由,深入RAG七层模型之意图层
导语:在“回答问题”之前,先要“听懂问题” 在上一篇中,我们对RAG的宏大演进史进行了一次深度穿越,并最终得到了一个清晰的结论:RAG的未来,是作为更高层智能体(Agent)的一个“可调用工具”。然而,一个幽灵般的问题随之而来:当一个用户的请求到达系统时,谁来决定应该调用哪个工具? 是调用RAG工具进行知识库查询,调用搜索引擎获取实时信息,调用API执行一个动作,还是直接让LLM进行一段轻松的闲聊? 让我们回到一个你或许无比熟悉的场景:一个刚刚上线的、看似智能的客服系统。 用户输入:“你好。” -> 系统应该礼貌地回应,启动闲聊模式。 用户输入:“你们最新的退货政策是什么?” -> 系统需要查询内部知识库,启动RAG流程。 用户输入:“帮我查一下订单号OD11-2345-6789的物流状态。” -> 系统需要识别实体、调用订单API,启 动MCP工具调用。 用户输入:“对比一下A和B两款手机的优缺点,顺便查下今天北京的天气怎么样。” -> 这是一个复杂任务,需要分解、并行执行、再汇总。 90%的AI应用之所以显得“笨拙”,其根源并非在于“回答”得不好...
RAG篇(1):RAG的星辰大海——从朴素检索到Agentic范式,重构企业级RAG的七层架构
导语:AI深水区的第一个“硬骨头”——连接悖论 我们将以“系统架构师”的视角,对检索增强生成(RAG)进行一次“法医级”的解剖。我们将从信息论的哲学高度出发,重新审视RAG的本质; 我们将站在传统信息检索(IR)巨人的肩膀上,看清向量检索的“理论贫困”; 我们将系统性地追踪RAG从朴素、高级、模块化到智能体(Agentic)的四次关键架构演进,并最终提出一个用于指导工业级实践的“七层RAG架构模型”。 这不只是一份技术指南,更是一场穿越AI“连接悖论”的思想探险,它将为你构建一个全景式的认知地图,让你看清RAG的过去、现在,并预见它的未来。 先让我们从一个你或许无比熟悉的场景开始: 你,或者你团队里那个最顶尖的工程师,刚刚完成了一次令人惊叹的技术壮举。你们废寝忘食,终于将公司最新的、拥有千亿参数的大语言模型(LLM)成功部署上线。在演示会上,它对答如流,引经据典,面对各种刁钻问题都展现出惊人的“智力”,赢得了满堂喝彩。老板拍着你的肩膀,眼中闪烁着对“AI赋能业务”的无限憧憬。 然而,当最初的兴奋褪去,庆功的香槟泡沫消散,一个幽灵般的问题开始在生产环境中萦绕: 当销售团...
PyTorch中对softmax函数有什么优化?
简单softmax函数实现:在处理大输入值或小输入值时可能会遇到数值稳定性问题,比如溢出和下溢。 12def softmax_naive(x): return torch.exp(x) / torch.exp(x).sum(dim=0) 数值稳定性问题(溢出与下溢)“Softmax 实现的数值稳定性问题”主要源于计算机处理浮点数的精度和范围限制。 Softmax 的公式是: $$\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}$$ 问题 A:溢出(Overflow) 原因: 当输入 $x_i$ 是一个非常大的正数时。 发生情况: $e^{x_i}$ 的值会迅速变得极大(呈指数增长)。如果这个值超过了计算机浮点数(如 32 位浮点数)所能表示的最大范围,就会导致 上溢(Overflow)。 结果: 结果变为 $\text{Inf}$ (无穷大),导致计算失败或返回 NaN。 问题 B:下溢(Underflow) 原因: 当输入 $x_i$ 是一个非常小的负数时。 发生情况: $e^{x_i}$ 的值会变得非常接...
向量的模长和勾股定理的关系是什么?
知识点一:二维空间中的直接关系在二维笛卡尔坐标系中,一个向量 $\mathbf{a}$ 可以表示为一个有序对 $\mathbf{a} = (x, y)$。 几何表示当我们从原点 $(0, 0)$ 画出向量 $\mathbf{a}$ 到点 $(x, y)$ 时,我们可以构造出一个直角三角形: 直角三角形的两条直角边: 长度分别为向量的两个分量 $x$ 和 $y$。 直角三角形的斜边: 就是向量 $\mathbf{a}$ 本身,其长度即为向量的模长 $|\mathbf{a}|$。 勾股定理的应用勾股定理指出:在一个直角三角形中,两条直角边的平方和等于斜边的平方。 $$\text{直角边}_1^2 + \text{直角边}_2^2 = \text{斜边}^2$$ 将我们的向量分量代入: $$x^2 + y^2 = |\mathbf{a}|^2$$ 向量模长的公式因此,向量 $\mathbf{a}$ 的模长 $|\mathbf{a}|$ 就是斜边的长度,由勾股定理直接得出: $$|\mathbf{a}| = \sqrt{x^2 + y^2}$$...
向量的模长是什么?
什么是向量的模长?定义向量的模长(Magnitude),也称为范数(Norm)或长度,是描述向量“大小”或“强度”的标量值。在几何上,它表示从向量的起点到终点的欧几里得距离。 对于一个 $ n $ 维实数向量 $\mathbf{v} = [v_1, v_2, \dots, v_n]$,其模长定义为: $$|\mathbf{v}| = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2} = \sqrt{\sum_{i=1}^{n} v_i^2}$$ 该公式来源于欧几里得范数(Euclidean norm),即 $ L^2 $ 范数。 几何解释 在二维空间中,向量 $\mathbf{v} = [x, y]$ 的模长是其在平面上的长度:$$|\mathbf{v}| = \sqrt{x^2 + y^2}$$这等价于直角三角形的斜边长度(勾股定理)。 在三维空间中,向量 $\mathbf{v} = [x, y, z]$ 的模长为:$$|\mathbf{v}| = \sqrt{x^2 ...
向量点积公式在自注意力机制中的应用?
在Transformer架构的自注意力机制(Self-Attention Mechanism)中,向量点积的几何意义——即衡量两个向量之间的相似性——被直接且核心地应用于计算注意力权重。该机制依赖点积来评估输入序列中不同位置之间的相关性,从而实现对上下文信息的动态聚合。 自注意力机制的基本原理自注意力机制的核心目标是:使序列中的每个位置能够根据语义相关性,动态地聚合序列中其他位置的信息。 例如,在句子 “The cat sat on the mat because it was tired” 中,模型需要确定代词 “it” 的指代对象。自注意力通过计算 “it” 与其他词之间的语义匹配程度,增强其与先行词(如 “cat”)的关联,从而实现指代消解。 点积在自注意力中的具体实现自注意力机制涉及三个线性变换后的向量:查询向量(Query, Q)、键向量(Key, K)和值向量(Value, V)。其计算过程如下: 第一步:生成 Query、Key 和 Value 向量对于输入序列中的每个 token,通过可学习的线性变换生成对应的 Q、K、V 向量: Query (Q):表示当前 ...







