资讯动态

【0-1的agent进阶篇】RAG:从Embedding到检索增强生成的底层逻辑

发布时间:2026/8/16 3:49:14 来源:尧图企业网站定制
个人主页代码不加冰欢迎来访作者简介java后端学习者❄️个人专栏LeetCode刷题日记 苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺大家好我是代码不加冰好久没有发文章了最近开始回归更新让我们一起进步。这篇主要给大家分享一下RAG的相关内容。不是仅仅是一个词汇而是带你从项目的源码看起分析内部的逻辑。RAG 把用户的问题变成向量 → 去知识库找相关内容 → 把找到的内容塞回 Prompt → 再让大模型回答。而 LangChain4j 做的事情就是把这套流程拆成了一组非常清晰的抽象。而我们今天主要侧重第一步Embedding也就是文本向量化文字怎么变成向量刚听到这些词的时候我也会觉得莫名其妙这明明是毫不相关的领域到底是什么联系的这篇文章就带你深入了解。一、RAG 到底是什么RAG Retrieval-Augmented Generation翻译成人话先检索再增强最后生成。它解决的核心问题是LLM 的知识是死的训练数据截止日期之后的事它不知道但 RAG 可以在用户提问时从外部知识库实时检索相关信息塞进 Prompt让 LLM 基于这些信息回答。所以 RAG 不是重新训练 LLM而是给 LLM 配一个“外挂知识库”。二、RAG 整体链路RAG 有两条链路一上一下缺一不可text RAG │ ┌──────────┴──────────┐ │ │ Ingestion Retrieval 数据入库 数据检索链路一Ingestion数据入库—— 提前准备好知识text 公司员工手册.pdf ↓ Document ↓ DocumentSplitter切分 ↓ TextSegment文本片段 ↓ EmbeddingModel向量化 ← 这里就是 Embedding ↓ Embedding向量 ↓ EmbeddingStore向量数据库最终库里存的是text TextSegment: 员工请假需要提前3天提交申请... Embedding: [0.023, -0.182, 0.731, ...]Ingestion 的本质把人类能理解的知识转换成机器能进行语义检索的向量。链路二Retrieval检索增强—— 用户提问时实时检索text 用户“请假需要提前多久” ↓ UserMessage ↓ Query ↓ QueryTransformer查询改写 ↓ QueryRouter路由选择 ↓ ContentRetriever真正检索 ← 这里会用到 Embedding 进行相似度搜索 ↓ EmbeddingStore向量库 ↓ Top-K 相关内容 ↓ ContentAggregator汇总排序 ↓ ContentInjector注入 Prompt ↓ 增强后的 UserMessage ↓ ChatModelLLM ↓ Answer三、现在我们聚焦Embedding上面的链路中Ingestion 的 EmbeddingModel和Retrieval 的相似度搜索都围绕同一个核心概念Embedding文本向量化四、Embedding 到底是什么在 LangChain4j 源码中Embedding 就是一个float[]java public class Embedding { private final float[] vector; }例如一个 384 维的向量java float[] vector { 0.12f, -0.52f, 0.83f, 0.19f, ... }; // 长度 384Embedding ≠ 文本Embedding 是文本经过模型编码后得到的一组数字。维度取决于模型模型维度某些轻量模型384OpenAI text-embedding-ada-0021536Cohere 某些模型768所以text Embedding float[dimension]五、为什么一定要 Embedding这是最核心的问题。用户问“请假需要提前多久申请”知识库里可能根本没有这句话它写的是“员工休假须至少提前三个工作日提交审批。”如果用传统字符串匹配关键词搜索基本匹配不到。但如果用Embeddingtext 问题“请假需要提前多久申请” ↓ Embedding ↓ [0.21, 0.83, -0.14, 0.52, ...] 知识“员工休假须至少提前三个工作日提交审批。” ↓ Embedding ↓ [0.19, 0.79, -0.11, 0.48, ...]这两个向量在向量空间中距离很近所以能被检索到。text 请假需要提前多久 ↓ Embedding ↓ [0.21, 0.83...] ↓ 向量数据库进行相似度搜索 ↓ 找到“员工休假须至少提前三个工作日……”这就是Semantic Search语义搜索不是字面匹配而是意思匹配。六、CosineSimilarity怎么判断两个向量像不像向量数据库找到了候选结果但怎么排序呢靠相似度计算最常用的是余弦相似度。源码中的计算逻辑java double dotProduct 0.0; double normA 0.0; double normB 0.0; for (int i 0; i vectorA.length; i) { dotProduct vectorA[i] * vectorB[i]; normA vectorA[i] * vectorA[i]; normB vectorB[i] * vectorB[i]; } return dotProduct / Math.sqrt(normA) * Math.sqrt(normB);用人话翻译判断两个向量的“方向”有多一致。比如text A ──────────────── B ────────────── 方向非常接近 → 相似度高 ✅ text A ──────────────── B ──────────────── 方向相反 → 相似度低 ❌七、为什么用余弦而不是算距离因为 Embedding 关注的是语义方向而不是长度。举个例子textA [1, 1] B [10, 10]虽然|A| ≠ |B|长度不同但方向完全一样。余弦相似度textcos θ 1所以它认为A 和 B 非常相似这非常适合语义向量——“很小的事”和“很大的事”在语义上可能是同一类。八、为什么 LangChain4j 又搞了一个 RelevanceScore余弦相似度的范围是[-1, 1]但 RAG 开发中更希望看到[0, 1]。所以 LangChain4j 做了转换java return (cosineSimilarity 1) / 2;映射关系余弦相似度RelevanceScore-10-0.50.2500.50.50.7511然后就可以做阈值过滤java if (match.score() 0.7) { // 认为比较相关采纳 }九、不同 Embedding 模型为什么不能混用这是一个非常容易踩的坑。模型 A维度 1536模型 B维度 384如果你的向量数据库 Collection 定义的是dimension 1536却塞入 384 维向量text ❌ 报错可以这样理解text EmbeddingModel.dimension() 数据库表结构的 Schema就像age INT不能塞字符串一样向量维度必须严格匹配。十、Embedding 在 RAG 中的两个位置理解了 Embedding你就能看懂它在 RAG 中的两次出现text RAG │ ┌──────────┴──────────┐ │ │ Ingestion Retrieval │ │ ▼ ▼ 文档 → EmbeddingModel 问题 → EmbeddingModel │ │ ▼ ▼ Embedding Embedding │ │ ▼ ▼ EmbeddingStore 相似度搜索Cosine │ ▼ 找到相关内容阶段Embedding 的作用Ingestion把文档变成向量存入数据库Retrieval把用户问题变成向量去数据库里找最相似的十一、整体回顾text ┌─────────────────────────────────────────────────────────────┐ │ RAG 完整链路 │ ├──────────────────────────┬──────────────────────────────────┤ │ Ingestion │ Retrieval │ ├──────────────────────────┼──────────────────────────────────┤ │ │ │ │ PDF → Document │ 用户问题 → Query │ │ ↓ │ ↓ │ │ DocumentSplitter │ QueryTransformer │ │ ↓ │ ↓ │ │ TextSegment │ QueryRouter │ │ ↓ │ ↓ │ │ ★ EmbeddingModel ★ │ ContentRetriever │ │ ↓ │ ↓ │ │ ★ Embedding ★ │ ★ 相似度搜索Cosine★ │ │ ↓ │ ↓ │ │ EmbeddingStore │ ContentAggregator │ │ │ ↓ │ │ │ ContentInjector │ │ │ ↓ │ │ │ ChatModel → Answer │ └──────────────────────────┴──────────────────────────────────┘下一篇预告这一篇我们重点攻克了Embedding 是什么、为什么、怎么算相似度。下一篇继续深入向量数据库的存储与索引

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价