面试官:"你做的 RAG 知识库,用户问问题,你拿问题去向量库搜。我问你——向量是什么?"
候选人:"就是……把文字变成数字。"
"怎么变的?"
"用 Embedding 模型。"
"Embedding 模型做了什么?为什么'苹果'和'香蕉'的向量像,和'编程'不像?"
候选人开始冒汗。他调过 OpenAI 的 embedding 接口、用过 pgvector,但"向量是怎么来的"这个问题,他从没想过。
这是 AIGC 面试里最容易被问穿的基础题。因为 RAG 的整个地基就是 Embedding,你不懂向量从哪来,就不懂 RAG 为什么有效、什么时候失效。这篇一次讲透。
一句话:Embedding 是把语言变成坐标
Embedding(嵌入)的本质是:把一段文字(词、句、段)映射成一个高维向量(一串数字),让语义相近的文字,向量距离也近。
"苹果" → [0.12, -0.34, 0.56, ...](1536 维)
"香蕉" → [0.15, -0.30, 0.52, ...]
"编程" → [-0.41, 0.23, 0.08, ...]
你把这串数字想象成"语义坐标"。苹果和香蕉在坐标里挨得近,因为它们语义相近(都是水果);编程离它们远,因为语义无关。
为什么语义能用坐标表示?因为训练 Embedding 模型时,用了海量语料,让模型学会了"经常一起出现的词、用法相似的词,向量应该靠得近"。这是统计规律,不是人为设计的规则。
Embedding 模型是怎么训练的?三句话讲明白
不用背公式,理解思路就行。Embedding 模型的训练思想是对比学习:
1. 拿海量文本对,比如"苹果"和"香蕉"、"苹果"和"水果",这些是正样本(语义相关)
2. 拿"苹果"和"编程"这种,是负样本(语义无关)
3. 训练目标:正样本的向量距离拉近,负样本的向量距离推远
训练完,模型就学会了"什么样的文字在语义上相似"。你输入任何新文字,它都能给你一个符合这个规律的向量。
换个说法:Embedding 模型是一个"语义压缩器",把语言压缩成坐标。坐标的每个维度,可以理解为它学到的某个"语义特征"——但没人能说清每个维度具体代表什么,这就是它"黑盒"的地方。
相似度怎么算?三种算法一次讲清
向量有了,怎么判断"像不像"?三种主流算法:
余弦相似度(Cosine):看两个向量的"方向"是否一致,不管长度。
cos = (A·B) / (|A| × |B|)范围 -1 到 1,越接近 1 越相似。这是最常用的,pgvector、Milvus 默认支持。
内积(IP):直接算对应维度乘积之和。带长度信息,一般要求向量先做 L2 归一化(长度变成 1)再用。
欧氏距离(L2):算两个向量在空间里的直线距离,越小越相似。对向量长度敏感,适合长度有意义的场景。
面试怎么选?主流 Embedding 模型(OpenAI、BGE、m3e)的向量都建议用余弦相似度;如果向量做过归一化,内积和余弦等价。答"默认用余弦,归一化后内积也行"就够了。
向量库检索:十万条数据怎么秒回?
向量算好了,存哪?怎么搜?
暴力做法:把库里的向量全部算一遍距离,取最近的 Top-K。数据量小(10 万以内)完全够用,简单直接。
数据量大了就得建索引。主流两种:
HNSW(分层可导航小世界图):把向量组织成多层图,搜索时从顶层粗跳到底层细找。百万级数据毫秒返回,是目前最主流的 ANN(近似最近邻)算法。
IVFFlat(倒排文件):先聚类分桶,搜索时只查最近的几个桶。速度更快,但召回率略降,而且需要先训练聚类(数据要够多)。
-- pgvector 建 HNSW 索引 CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);// Spring AI 里指定检索算法 VectorStore vectorStore = PgVectorStore.builder() .dataSource(dataSource) .dimensions(1536) .distanceType(VectorDistanceType.COSINE_DISTANCE) .indexType(IndexType.HNSW) .build();记住一个关键点:向量检索是"近似"的。它返回的是"最像的",不是"精确的"。所以 RAG 的检索结果天然有噪声——这也是为什么后面要讲混合检索和重排(第 17 篇)。
Embedding 不止用于检索:四个应用场景
面试官问"Embedding 还能干嘛",你答出检索之外的应用,就是加分项。
场景一:文本聚类。把一堆客服工单向量化,聚类算法一跑,自动归成"物流问题"、"退换货"、"发票"几个簇,不用人工打标签。这是 Embedding 最成熟的应用之一。
场景二:语义去重。用户反馈"物流太慢了"和"快递怎么还没到",字面不同但语义相同。向量相似度 > 0.95 的归为重复,做舆情分析、评论聚合很实用。
场景三:推荐。用户的历史行为向量化,找"相似向量"的物品推荐。电商"猜你喜欢"的早期版本就是这么干的——用户向量和商品向量算相似度。
场景四:异常检测。正常文本的向量分布是集中的,突然出现一个离所有簇都很远的向量,大概率是异常输入(乱码、恶意 Prompt)。可以在入口做一道向量距离检查。
一个共通的面试话术:Embedding 把"非结构化文本"变成了"可计算的数字",所有传统机器学习的玩法(聚类、分类、去重、推荐)都能在向量上重做一遍。
维度越高越好吗?聊聊 1536 维的秘密
很多人以为向量维度越高越精确。对,也不对。
高维度的好处:能表达更丰富的语义细节,区分度更高。
高维度的代价:存储翻倍(1536 维 float 数组 = 6KB/条)、计算变慢、而且高维空间有"维度灾难"——维度高了之后,所有向量的距离都趋于相等,检索区分度反而下降。
所以 OpenAI 的 text-embedding-3 系列支持降维:1536 维可以降到 1024、512、甚至 256,效果损失很小。选维度的原则:够用就行,别盲目上高维。
面试官如果追问"维度怎么定",答:跟 Embedding 模型的输出一致(模型输出多少维就是多少维),想降维用模型自带的 dimensions 参数,别自己 PCA 硬降。
选 Embedding 模型:三个考量维度
面试官可能追问:"你项目里 Embedding 模型怎么选的?"
第一,语言支持。中文场景优先选中文表现好的模型:BGE(智源)、m3e、text-embedding-3(OpenAI 中文也还行)。英文场景 OpenAI 的 text-embedding-3-small 性价比高。
第二,维度与成本。维度越高信息越丰富,但存储和计算成本越高。1536 维是常见配置,OpenAI 支持把维度降到 256/512/1024 省成本。自部署 BGE 免费,数据不出内网(合规场景必须自部署)。
第三,向量一致性。这是最容易踩的坑:写入和查询必须用同一个 Embedding 模型。你建库时用 A 模型,查询时换了 B 模型,两个模型的向量空间不一样,检索结果全乱。换模型 = 全量重算向量。
🎯 面试官视角的标准回答
如果面试官问:"Embedding 是什么?RAG 为什么依赖它?"
Embedding 是把文字映射成高维向量的技术,核心特性是"语义相近的文字,向量距离也近"。比如"苹果"和"香蕉"的向量接近,和"编程"的向量远。<br><br>原理上,Embedding 模型通过对比学习训练:用语义相关的文本对当正样本、无关的当负样本,让模型学会把相近语义映射到相近坐标。训练完,输入任何文字都能得到符合这个规律的向量。<br><br>相似度计算最常用余弦相似度,看向量方向是否一致。向量库检索用 ANN 近似算法,HNSW 是主流,百万级数据毫秒返回。<br><br>RAG 依赖 Embedding 是因为:用户问题要变成向量才能去向量库检索,文档也要提前向量化入库。两边用同一个模型,保证向量空间一致。检索出相关片段后再交给大模型生成回答。<br><br>工程上注意三点:中文场景选 BGE/m3e,合规场景自部署;写入和查询必须用同一个 Embedding 模型,换模型要全量重算;向量检索是近似的,结果有噪声,生产上需要混合检索和重排来提升质量。
下一篇聊 RAG 检索质量的终极方案——混合检索 + 重排。BM25 保精确、向量保语义,RRF 怎么融合?为什么精排能让效果翻倍?这是 RAG 系列的收官之篇。