【0-1的agent进阶篇】RAG:从Embedding到检索增强生成的底层逻辑
个人主页代码不加冰欢迎来访作者简介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 是什么、为什么、怎么算相似度。下一篇继续深入向量数据库的存储与索引

相关新闻

AI总乱改代码?一个规则文件帮你搞定!99%的人都没设置!附万能模板!

AI总乱改代码?一个规则文件帮你搞定!99%的人都没设置!附万能模板!

大家好,我是卡卡罗特。 如果你的 Agent 总是不听话,经常忘了你定的规则,胡编乱造,bug 越改越多,那多半是你少了这个规则文件。这篇文章就教你怎么生成一份能指导 Agent 工作的规则文件,让你的 Agent 越来越…

2026/10/26 4:47:46 阅读更多 →
DOTween动画:TweenManager深度解析

DOTween动画:TweenManager深度解析

TweenManager 是 DOTween 动画引擎最核心的数据中枢与底层调度器。TweenManager 是控制所有动画生命周期、内存池、帧更新与批量操作的“大脑”。它采用全静态架构,通过原生数组与自定义算法实现了极致的 零 GC(垃圾回收) 和高效的内存复用。…

2026/10/24 22:58:39 阅读更多 →
DeekSeek harness安装插件后报Failed to load plugins

DeekSeek harness安装插件后报Failed to load plugins

DeekSeek harness安装插件后报Failed to load plugins如图所示修复方法(提示哪个插件就卸载哪个插件):如图所示 web页面无法使用 根因:Cordis 插件系统的 UI 插槽冲突。 插槽:conversation.composer.dock(对话输入框右侧停靠面板…

2026/10/21 5:25:44 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/30 0:01:36 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/30 9:20:34 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/30 10:19:21 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/30 0:01:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/30 10:19:39 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/30 9:21:37 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 17:01:10 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 10:28:40 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 0:01:33 阅读更多 →