
如果说 LLM 是大脑那向量就是它的「神经信号编码」。人类用文字交流计算机用数字计算而Embedding是连接这两个世界的桥梁。不懂向量就不懂 RAG不懂 RAG就没法让 LLM 真正落地到实际业务中。 目录Embedding文本嵌入文字变数字的魔法余弦相似度衡量「方向一致性」欧氏距离衡量「直线距离」向量检索从语义匹配到实际查询什么时候用什么度量Embedding文本嵌入文字变数字的魔法一句话定义把任意长度文本转换成固定长度的数字数组向量。语义相似的文本向量在空间中的距离也更近。本质大白话Embedding 文字的 GPS 坐标 想象一个多维空间比如 1536 维 「猫」 → [0.12, -0.34, 0.56, ...] ← 附近聚集着「小狗」「萌宠」 「狗」 → [0.15, -0.31, 0.52, ...] ← 跟「猫」很近都是宠物 「汽车」→ [-0.45, 0.78, -0.23, ...] ← 离「猫」「狗」很远 「公交车」→ [-0.42, 0.75, -0.20, ...] ← 跟「汽车」很近交通工具 关键洞察 Embedding 不是简单的编码而是把语义关系映射到几何空间 语义近 空间距短 | 语义远 空间距长Embedding 模型对比模型维度语言特点场景text-embedding-3-small1536多语效果好付费通用首选BGE-large-zh1024中英开源免费效果好中文首选M3E-base768中文轻量快速中文轻量E5-mistral1024多语多语言强国际化Cohere embed-v31024多语搜索专用搜索引擎fromopenaiimportOpenAIimportnumpyasnp clientOpenAI()defget_embedding(text,modeltext-embedding-3-small):responseclient.embeddings.create(modelmodel,inputtext)returnresponse.data[0].embedding# 1536维向量# 语义相似的文本向量接近texts[今天天气不错,天气很好,Python 编程教程]embs[get_embedding(t)fortintexts]defcosine(a,b):returnnp.dot(a,b)/(np.linalg.norm(a)*np.linalg.norm(b))print(f今天天气不错 vs 天气很好:{cosine(embs[0],embs[1]):.4f})# ~0.92print(f今天天气不错 vs Python:{cosine(embs[0],embs[2]):.4f})# ~0.15❌ 常见误区❌ Embedding 模型越大越好 — text-embedding-3-small 很多场景优于大模型❌ 同一 Embedding 通用所有任务 — 搜索和分类需要不同的 Embedding❌ 中文必须专用中文模型 — 多语言模型在中文上已经很出色余弦相似度衡量「方向一致性」一句话定义计算两个向量夹角的余弦值范围 [-1, 1]。越接近 1 表示方向一致语义越相似。本质大白话余弦相似度 忽略长度只看方向 两个人朝同一个方向走 A 走了100米B 走了1000米 方向一样 → 余弦 ≈ 1.0 A 往东走B 往西走 方向相反 → 余弦 ≈ -1.0 文本场景方向相同 语义相近不管文章长短 → 这就是为什么余弦成为文本相似度的默认选择cos_sim ( A , B ) A ⋅ B ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ B ∣ ∣ \text{cos\_sim}(A,B) \frac{A \cdot B}{||A|| \cdot ||B||}cos_sim(A,B)∣∣A∣∣⋅∣∣B∣∣A⋅Bimportnumpyasnpdefcosine_similarity(a,b):returnnp.dot(a,b)/(np.linalg.norm(a)*np.linalg.norm(b))vec_catget_embedding(可爱的小猫)vec_dogget_embedding(可爱的狗狗)vec_carget_embedding(一辆汽车)print(f猫 vs 狗:{cosine_similarity(vec_cat,vec_dog):.4f})# ~0.85print(f猫 vs 车:{cosine_similarity(vec_cat,vec_car):.4f})# ~0.20❌ 常见误区❌ 余弦 0.9 就意思一样 — 不同模型阈值不同不要迷信绝对数值❌ 余弦适用于所有场景 — 图像特征场景可能需要欧氏距离欧氏距离衡量「直线距离」一句话定义两个向量在多维空间的直线距离。越小越相似。余弦 vs 欧氏余弦欧氏关注点方向实际距离受长度影响否是范围[-1,1][0,∞)文本场景默认首选少数图像场景可能失效常用importnumpyasnpdefeuclidean(a,b):returnnp.linalg.norm(a-b)# 直观对比shortget_embedding(你好)long_textget_embedding(你好*20)print(f余弦:{cosine_similarity(short,long_text):.4f})# ~0.95 (方向一样)print(f欧氏:{euclidean(short,long_text):.4f})# 可能很大(长度不同)# 结论文本用余弦特征考虑欧氏向量检索从语义匹配到实际查询一句话定义给定查询文本转为向量后在向量库中找到 Top-K 条最相似记录的过程。RAG 的核心操作。检索流程用户提问「如何优化 MySQL 查询性能」 ↓ [Embedding 模型] ↓ 查询向量: [0.21, -0.15, 0.33, ...] ↓ ┌────────────────────────────────┐ │ 向量数据库 │ │ doc1 [0.20,-0.14,0.35,...] → 0.012 ★1 │ │ doc2 [0.55, 0.72,-0.11,...] → 0.892 │ │ doc3 [0.22,-0.13,0.31,...] → 0.025 ★2 │ │ doc4 [-0.81,0.33, 0.55,...] → 1.203 │ └────────────────────────────────┘ ↓ 返回 Top-K (doc1, doc3) 作为 LLM 上下文fromtypingimportListimportnumpyasnpclassVectorRetriever:def__init__(self,embedding_func):self.embed_fnembedding_func self.vectors[]self.documents[]defadd_document(self,text,metadataNone):vecself.embed_fn(text)self.vectors.append(vec)self.documents.append({text:text,metadata:metadataor{}})defsearch(self,query,top_k5)-List[dict]:q_vecself.embed_fn(query)scores[]forvinself.vectors:scores.append(np.dot(q_vec,v)/(np.linalg.norm(q_vec)*np.linalg.norm(v)))top_idxnp.argsort(scores)[::-1][:top_k]return[{doc:self.documents[i],score:scores[i]}foriintop_idx]# 使用retrieverVectorRetriever(get_embedding)retriever.add_document(MySQL 索引优化策略...)retriever.add_document(Redis 缓存使用指南...)resultsretriever.search(数据库太慢了怎么办,top_k3)❌ 常见误区❌ 向量检索 完美语义搜索 — 找不到精确关键词匹配型号编号、专有名词❌ Top-K 越大越好 — K 太大引入噪音K 太小漏信息。一般 3-10 合理❌ 只要向量就够了 — 生产环境通常需要混合检索详见 2.2什么时候用什么度量场景推荐原因文本语义检索余弦忽略长度关注方向图像特征比对欧氏特征幅度有意义归一化后的向量两者等效归一化后余弦欧氏异常检测欧氏远离聚类中心的点易识别推荐系统余弦关注偏好方向而非强度 本节知识地图┌────────────────────────────────────────────────────┐ │ 向量基础 — RAG 的地基 │ │ │ │ ┌────────────┐ ┌──────────────────────────┐ │ │ │ Embedding │──→ │ 相似度计算 │ │ │ │ 文本→向量 │ │ 余弦 ★ / 欧氏 ☆ │ │ │ └────────────┘ └──────────┬───────────────┘ │ │ │ │ │ ↓ │ │ ┌──────────────────┐ │ │ │ 向量检索 │ │ │ │ Top-K 返回 │ │ │ └────────┬─────────┘ │ │ ↓ │ │ ┌──────────────────┐ │ │ │ 2.2 RAG体系 │ ← 下节详解 │ │ └──────────────────┘ │ │ │ │ 一句话 │ │ Embedding转数字 → 相似度找最相关 → 检索返回 │ └────────────────────────────────────────────────────┘ 关联推荐1.1 模型本源→ Token 是 Embedding 的输入单元1.3 交互基础→ 检索结果是 Context 的重要来源2.2 RAG 体系→ 向量检索是 RAG 的第一步2.3 向量数据库→ 向量存在哪里怎么选型