AI项目从入门到上线02-RAG到底是什么?——从“AI幻觉“到“先查资料再回答“的原理拆解
大模型不是搜索引擎它是个赌徒。赌徒凭感觉猜答案RAG让它学会先翻书再开口。这篇文章把向量检索、语义匹配、混合检索这些词掰开了揉碎了讲给你听。 目录1. 开篇那个让你血压飙升的AI幻觉2. 大模型为什么胡编乱造概率生成的边界2.1 大模型本质上在做什么2.2 幻觉的根因训练 ≠ 知识存储3. RAG的核心思想双引擎架构3.1 什么是RAG3.2 RAG解决的三个核心问题4. RAG三阶段详解索引→检索→生成阶段一索引Indexing——把知识变成可搜索的阶段二检索Retrieval——从向量库中海选相关内容阶段三生成Generation——把资料问题喂给模型5. Embedding文本如何变成数学向量5.1 类比给文字办身份证5.2 主流Embedding模型对比5.3 向量维度不是越高越好6. 向量相似度余弦相似度的几何意义6.1 高中数学秒懂版6.2 余弦相似度范围7. 检索策略大对决稠密 vs 稀疏 vs 混合7.1 三种策略一图对比7.2 混合检索是工业界标配8. RAG vs 微调什么时候用谁决策流程图9. 避坑指南 效率技巧⚠️ 避坑警告汇总 效率技巧汇总10. 总结与预告1. 开篇那个让你血压飙升的AI幻觉去年我让 ChatGPT 列出我的GitHub项目。它信誓旦旦地告诉我“你有一个叫awesome-ml-pipeline的项目3000 star。”我激动得差点从椅子上摔下来赶紧打开 GitHub——根本不存在。那一刻我悟了大模型不是在回答它是在猜。猜得自信猜得有理有据但就是——猜错了。这种现象有个专业名字AI幻觉Hallucination。 先记住一句话幻觉不是bug是feature。它是概率模型的必然产物。2. 大模型为什么胡编乱造概率生成的边界2.1 大模型本质上在做什么简单说给定上文猜下文。GPT、Claude、通义千问这些大模型本质是一个巨大的下一个token预测器。概念通俗理解Token文本的最小单元约等于0.75个英文单词或1.5个汉字概率分布模型计算下一个token是什么时给每个词一个概率分数自回归生成一个词接一个词地生成每一步都依赖前面所有步的结果graph LR A[输入: 中国的首都是] -- B[模型计算概率分布] B -- C[北京: 0.92] B -- D[上海: 0.03] B -- E[广州: 0.02] B -- F[...其他] C -- G[输出: 北京 ✅] style C fill:#4CAF50,color:#fff style D fill:#ff9800,color:#fff style E fill:#ff9800,color:#fff问题来了训练数据有截止日期有盲区。模型没见过你公司的内部文档、不知道今天刚发布的新闻、不记得你昨天跟它说的话除非在上下文窗口里。它只能硬猜。 想象一下考试遇到一道你完全没复习的题你会怎么办空着不大多数人的本能是——胡编一个看起来靠谱的答案。大模型也是这个德性。2.2 幻觉的根因训练 ≠ 知识存储flowchart TD subgraph 训练阶段 A[海量互联网文本] -- B[神经网络学习] B -- C[参数化的「世界知识」] end subgraph 推理阶段 D[用户提问] -- E[激活相关参数] E -- F[逐token生成] F -- G{知识在训练数据中?} G --|是| H[✅ 准确回答] G --|否| I[❌ 编造幻觉] end C -.-|模糊记忆| E style I fill:#f44336,color:#fff style H fill:#4CAF50,color:#fff模型的知识是训练时见过的东西的压缩版。打个比方你去年读过一本300页的技术书现在让你默写第127页第3段——你写不出来。但你大概记得那本书讲过Kafka的零拷贝原理。这就是参数化知识的本质模糊的、不可索引的、会出错的记忆。3. RAG的核心思想双引擎架构3.1 什么是RAGRAG Retrieval-Augmented Generation检索增强生成翻译成人话先查资料再回答。flowchart LR Q[用户提问] -- R[ 检索引擎] R -- D[外部知识库] D -- C[相关文档片段] Q -- G[ 生成引擎(LLM)] C -- G G -- A[✅ 准确回答] style R fill:#2196F3,color:#fff style G fill:#9C27B0,color:#fff这就像考试变成了开卷考试❌ 闭卷 纯大模型凭记忆瞎猜✅ 开卷 RAG先翻书找到相关章节再结合题目回答3.2 RAG解决的三个核心问题问题纯LLMLLM RAG幻觉编造事实严重大幅减少知识时效性训练截止日实时检索最新数据领域专业知识泛泛而谈精准引用企业文档可解释性黑盒可追溯引用来源 RAG不是让模型变聪明是给它配了个图书馆管理员。你不会的东西翻书不就会了4. RAG三阶段详解索引→检索→生成flowchart TD subgraph Phase1[阶段一: 索引 (Indexing)] A[ 原始文档] -- B[✂️ 文档切片 Chunking] B -- C[ Embedding向量化] C -- D[️ 存入向量数据库] end subgraph Phase2[阶段二: 检索 (Retrieval)] E[❓ 用户问题] -- F[ 问题Embedding] F -- G[ 向量相似度搜索] G -- H[ Top-K相关文档] end subgraph Phase3[阶段三: 生成 (Generation)] H -- I[ 构建Prompt] E -- I I -- J[ LLM生成] J -- K[✅ 最终回答(含引用)] end D -.- G style Phase1 fill:#E3F2FD,stroke:#2196F3 style Phase2 fill:#FFF3E0,stroke:#FF9800 style Phase3 fill:#F3E5F5,stroke:#9C27B0阶段一索引Indexing——把知识变成可搜索的通俗比喻给公司图书馆的所有书做标签和索引卡片。下次有人来找书不用一本本翻直接查索引卡片就定位到具体书架和页码。步骤拆解flowchart LR A[年报.pdfbr/50MB] -- B[Chunk 1br/1000字] A -- C[Chunk 2br/1000字] A -- D[Chunk 3br/1000字] A -- E[...] B -- F[向量 [0.12, -0.34, ...]] C -- G[向量 [0.45, 0.11, ...]] D -- H[向量 [-0.22, 0.67, ...]] F -- I[(️ 向量数据库br/Milvus / Qdrant / Pinecone)] G -- I H -- I style I fill:#4CAF50,color:#fff⚠️避坑警告 #1切片大小chunk_size是第一个雷。切太大检索精度下降切太小语义不完整。一般建议500-1500 tokens带10%-20%的重叠overlap。我见过有人用5000 token的chunk检索结果全是这个文档的一部分根本找不到具体答案。阶段二检索Retrieval——从向量库中海选相关内容把用户问题也向量化然后在向量库里搜谁跟它最像。这不像数据库的WHERE title xxx而是语义层面的意思相近。效率技巧 #1检索的Top-K不是越大越好。K3-5最合适。K20会把噪声也塞进上下文反而稀释了有效信息。LLM看到一堆无关内容就更容易跑偏。阶段三生成Generation——把资料问题喂给模型核心Prompts模板结构请根据以下参考资料回答用户问题。 【参考资料】 {检索到的文档片段} 【用户问题】 {用户原始提问} 要求 1. 只根据参考资料回答不要编造 2. 如果资料中没有相关信息请明确说未找到 3. 回答末尾标注引用来源⚠️避坑警告 #2别直接把检索结果塞进去就完了。要加指令约束“如果参考资料无法回答问题请明确告知”——否则模型还是会放飞自我把检索不到的内容也硬编出来。5. Embedding文本如何变成数学向量5.1 类比给文字办身份证把一句话变成一个固定长度的数字数组向量让计算机能算出两句话有多相似。“今天天气真好” →[0.12, -0.45, 0.78, ..., 0.33]“今日气候不错” →[0.14, -0.42, 0.75, ..., 0.30]这两组数字肉眼看着差不多但计算机能精确算出它们的距离。5.2 主流Embedding模型对比模型维度特点适用场景text-embedding-ada-0021536维OpenAI出品英文强通用场景英文为主BGE-M31024维BAAI出品中文好中文RAG首选BGE-Large-zh-v1.51024维中文专项优化纯中文场景Cohere Embed v31024维多语言支持好多语言混合场景幽默一刻1536维是什么概念你活在三维世界长宽高Embedding活在1536维空间。不是它比你高级是它比你单维——每个维度只负责一个语义特征。就像你不只用身高描述一个人还看体重、学历、爱好、口音、发型、星座……5.3 向量维度不是越高越好⚠️避坑警告 #3很多人觉得1536维比1024维好这是误区。维度高≠效果好。BGE-M3的1024维在中文场景完爆ada-002的1536维。选模型看任务和语言不看得分榜。6. 向量相似度余弦相似度的几何意义6.1 高中数学秒懂版两个向量的余弦相似度就是它们夹角的余弦值。cosine(A,B)A⋅B∣∣A∣∣×∣∣B∣∣\text{cosine}(A, B) \frac{A \cdot B}{||A|| \times ||B||}cosine(A,B)∣∣A∣∣×∣∣B∣∣A⋅B​一个字看方向不看距离。graph TD subgraph 余弦相似度示例 direction LR end想象两个人走在广场上余弦相似度看的是他们走向同一个方向吗欧氏距离看的是他们之间隔了几步在语义空间里方向一致远好过位置接近。句子对余弦相似度“今天天气真好” vs “今日气候不错”~0.92“今天天气真好” vs “Python是一门编程语言”~0.15“我喜欢猫” vs “我讨厌猫”~0.78方向相近“我喜欢猫” vs “猫喜欢吃鱼”~0.556.2 余弦相似度范围范围[-1, 1]值含义向量关系1.0完全相同方向→→ 重合0.7-0.9高度相似→↗0正交不相关→↑-0.5语义相反→←-1.0完全相反方向→← 反重合效率技巧 #2实际RAG应用中余弦相似度 0.5 的检索结果基本可以丢掉。低于这个阈值跟随机抓一篇文档差不多。 余弦相似度 ≈ 0.78 的我喜欢猫和我讨厌猫。这说明Embedding更多关注的是主题而不是情感倾向。想要区分情感需要专门的模型或做rerank。这也是RAG系统里**重排序(Rerank)**步骤存在的理由。7. 检索策略大对决稠密 vs 稀疏 vs 混合7.1 三种策略一图对比维度稀疏检索 (BM25)稠密检索 (Embedding)混合检索 (Hybrid)原理关键词匹配TF-IDF语义向量相似度两者加权融合优点精确匹配强快语义理解强兼顾精确和语义缺点不懂同义词可能漏掉精确词复杂度高搜索AI能匹配人工智能吗❌ 不能✅ 能✅ 能搜索RAG-2024技术报告.pdf✅ 精确找到⚠️ 可能偏✅ 精确找到7.2 混合检索是工业界标配flowchart TD Q[用户问题: 大模型幻觉怎么解决?] -- S[ 稀疏检索 BM25] Q -- D[ 稠密检索 Embedding] S -- S1[匹配: 幻觉 大模型] D -- D1[语义匹配: Hallucination mitigation] S1 -- F[⚖️ 融合排序 RRF] D1 -- F F -- R[ 最终Top-K结果] style F fill:#FF5722,color:#fff style R fill:#4CAF50,color:#fffRRFReciprocal Rank Fusion最简单的融合算法。每个文档在两个排序列表里排名越靠前最终得分越高。不要问为什么这么简单也好用——实践出真知。效率技巧 #3不要一开始就上混合检索。先用纯稠密检索跑通效果不够再加BM25做互补。过度设计是工程师的自我感动跑通了才是正义。8. RAG vs 微调什么时候用谁这是最常被问的问题。一句话RAG微调Fine-tuning原理检索外部知识改变模型参数知识更新实时改文档即可需重新训练幻觉控制强有引用弱融进参数了成本低API 向量库高GPU 数据标注适用场景知识问答、客服风格定制、领域术语决策流程图flowchart TD Start[需要定制AI能力?] -- Q1{需要实时更新的知识?} Q1 --|是| RAG[✅ 用RAG] Q1 --|否| Q2{需要改变模型输出风格?} Q2 --|是| FT[✅ 用微调] Q2 --|否| Q3{两者都满足?} Q3 --|是| BOTH[ RAG 微调组合拳] style RAG fill:#2196F3,color:#fff style FT fill:#FF9800,color:#fff style BOTH fill:#9C27B0,color:#fff 实际最佳实践RAG为主微调为辅。用RAG解决知识问题用微调让模型学会说您公司的格式术语。一个负责脑子里的知识一个负责说话的腔调。9. 避坑指南 效率技巧⚠️ 避坑警告汇总编号坑正确做法#1chunk_size乱设500-1500 tokens 10-20% overlap#2不约束LLM回答范围“如果资料中没有请明确告知”#3盲目追求高维Embedding按语言和任务选模型#4附赠忽略了文档预处理PDF解析失败、表格丢失 → 先做好清洗#5附赠检索全部塞进去Rerank用Cross-encoder二次精排 效率技巧汇总编号技巧收益#1Top-K设3-5减少噪音提升准确率#2丢弃相似度0.5的结果减少无关信息干扰#3先稠密再按需升级混合检索MVP快速验证#4附赠用LangChain / LlamaIndex做编排别从零写pipeline#5附赠向量库选 Milvus生产 或 Chroma原型避免选型纠结10. 总结与预告这篇文章我们掰开了RAG的三个核心阶段索引把文档切块 → Embedding → 存向量库检索问题向量化 → 向量搜索 → 取Top-K生成资料 问题 → Prompt → LLM → 可溯源的回答三句话记住RAGRAG让AI从闭卷考试变成开卷考试Embedding把文字变成向量余弦相似度量语义有多近混合检索是最佳实践但先用稠密检索跑通再说 源码获取本文配套的完整RAG Demo代码Python LangChain Chroma已开源 GitHub仓库github.com/your-handle/rag-from-scratch示例链接包含文档索引脚本、检索Pipeline、Prompt模板、完整可运行示例 思考题请你思考如果用户问去年Q3的销售额是多少而这个数据存在于多个文档的表格里——纯RAG能搞定吗如果不能需要什么额外的技术把你的答案写在评论区我下一篇会揭晓。 系列文章预告本系列是《AI项目实现步骤》专题手把手带你从零搭建企业级AI应用。篇目主题状态01你该从哪里入手——路线全景图✅ 已发布02RAG原理拆解本文✅你在这里03技术栈选型——大模型/向量库/框架/嵌入模型全对比 敬请期待04从0搭建RAG问答系统实战代码篇 撰写中05RAG系统优化——Rerank、HyDE、Self-RAG 撰写中标签#RAG#LLM#向量检索#Embedding#幻觉#检索增强#AI原理关注我下一篇《AI项目技术栈选型——大模型/向量库/框架/嵌入模型全对比》把所有技术选型的坑一次性讲透。

相关新闻