2026/4/18 10:30:36
网站建设
项目流程
免费软件下载网站,做零食网站的首页模板,平面设计师资格证怎么考,做团购网站视频前言为什么 RAG 离不开 Embedding 与向量数据库#xff1f;在上一篇文章中#xff0c;我们已经讲过#xff1a;
RAG#xff08;Retrieval-Augmented Generation#xff09;本质上是“先找资料#xff0c;再让大模型回答问题”。而“找资料”这一步#xff0c;背后最关键…前言为什么 RAG 离不开 Embedding 与向量数据库在上一篇文章中我们已经讲过RAGRetrieval-Augmented Generation本质上是“先找资料再让大模型回答问题”。而“找资料”这一步背后最关键的两个基础设施就是文本嵌入模型Embedding Model向量数据库Vector Database如果说大语言模型LLM是 RAG 的“大脑”那么Embedding 是把语言变成大脑能理解的数学信号向量数据库则是 RAG 的“长期记忆系统”。这一篇我们就从最底层出发把这两块彻底讲透。一、文本嵌入模型连接文本与向量的桥梁1. 什么是 EmbeddingEmbedding嵌入本质是一种映射关系把「人类语言」映射成「高维向量空间中的一个点」举个最直观的例子假设我们有三句话「小猫在睡觉」「小狗在玩球」「量子力学中的薛定谔方程」Embedding 模型会把它们变成类似这样的向量小猫在睡觉 → [0.21, 0.87, 0.12, ..., 0.44] 小狗在玩球 → [0.19, 0.82, 0.15, ..., 0.41] 薛定谔方程 → [0.91, 0.02, 0.77, ..., 0.03]关键不在于数值本身而在于向量之间的“距离”「小猫」和「小狗」的向量距离更近它们和「量子力学」的向量距离更远Embedding 把“语义相似性”转化成“几何距离”2. 用“小猫 / 小狗”理解向量空间可以把 embedding 空间想象成一个巨大的多维空间相似语义 → 空间中距离近不相关语义 → 空间中距离远比如在一个简化的二维示意中动物 ▲ | 小猫 ● ● 小狗 | | ● 量子力学在真实系统中这个空间往往是768 / 1024 / 1536 维但原理完全一致。3. Embedding 的本质给语言编码Embedding 并不是“理解语言”而是为语言建立一种可计算、可比较的数学表示它解决了一个根本问题机器不懂“意思”机器可以比较“向量距离”这正是 RAG 能成立的前提。二、Embedding 工程不只是“调接口”1. Embedding ≠ 一行 API 调用很多教程会给出类似代码embeddings embedding_model.embed_query(什么是 RAG)但在真实系统中Embedding 是一个工程问题而不是 API 问题。Embedding 工程通常包括文本切分Chunking清洗与规范化批量嵌入版本管理向量一致性问题2. 为什么要切分文本Embedding 模型通常有最大 Token 限制但更重要的是语义密度问题。对一篇长文直接做 embedding 会导致一个向量包含太多语义相似度检索不精准实践经验技术文档300800 tokens对话/FAQ一个问题一个 chunk代码文档按函数 / 类拆分3. 主流 Embedding 模型的演进Embedding 模型的演进大致经历了三个阶段传统 NLP 向量TF-IDFWord2Vec / GloVe无法理解上下文效果有限句向量模型Sentence EmbeddingSentence-BERTUniversal Sentence Encoder开始具备语义能力大模型时代的 EmbeddingOpenAI text-embedding-3-largeBGE / E5 / GTE 系列多语言 / 指令微调 embedding当前 RAG 的主流选择三、LangChain 中的 Embedding 实践1. Embedding 接口设计思想LangChain 并不关心你用的是哪家模型它只定义了一个统一接口from langchain.embeddings import OpenAIEmbeddings embedding OpenAIEmbeddings() vector embedding.embed_query(RAG 是什么)核心抽象只有两个方法embed_query用于用户查询embed_documents用于知识库文本2. 一个完整的 Embedding 流程示例from langchain.embeddings import OpenAIEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter docs load_documents() splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50 ) chunks splitter.split_documents(docs) embedding OpenAIEmbeddings() vectors embedding.embed_documents([c.page_content for c in chunks])这一步的产出是一组文本 一组向量接下来就轮到向量数据库登场了。四、向量数据库RAG 的记忆基石1. 什么是向量数据库向量数据库是一种专门为向量相似度检索设计的数据库。它的核心能力只有一件事给定一个向量快速找到最相似的 K 个向量这正是 RAG 中「检索」阶段的核心能力。2. 向量数据库 vs 传统数据库对比维度传统数据库向量数据库查询方式精确匹配相似度搜索索引结构BTreeANN / HNSW数据类型标量高维向量典型场景OLTP语义检索RAG 场景中传统数据库完全不适用3. 相似性检索算法基础欧式距离L2distance √Σ(xᵢ - yᵢ)²距离越小 → 越相似适合未归一化向量余弦相似度Cosine Similaritycos(θ) (A·B) / (|A||B|)更关注方向而非长度Embedding 场景最常用4. 为什么不用全量扫描假设你有 100 万条向量每条 1536 维全量计算相似度 → 性能灾难因此向量数据库几乎都使用近似最近邻ANNHNSW / IVF / PQ 等索引结构牺牲一点精度换取数量级的性能提升五、Embedding 向量数据库 RAG 的地基将前面的内容串起来文档 → 切分 → Embedding向量 → 存入向量数据库用户问题 → Embedding向量检索 → TopK 文档构建 Prompt → 交给 LLM这套链路中Embedding 决定能不能找对向量数据库决定找得快不快总结Embedding把语言转成可计算的向量表示向量数据库为 RAG 提供高效、可扩展的语义检索能力RAG 的效果上限往往取决于这两块的设计质量