Embedding 是什么?1536 维什么意思?


一则或许对你有用的小广告

欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书

  • 《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于 Spring AI + Spring Boot 3.x + JDK 21...查看介绍

  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...查看介绍;演示链接:http://116.62.199.48:7070/

  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/

  • 新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍

截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观

面试考察点

  1. 概念理解深度:不仅仅是背定义,而是能不能用自己的话解释清楚——文本是怎么变成数字的?这些数字代表了什么?为什么能用数字的 "距离" 来衡量语义的 "远近"?

  2. 维度的直觉理解:1536 维到底什么意思?为什么不是 10 维或者 10 万维?维度和语义表达能力之间是什么关系?这块答不清楚,说明只是记了个数字。

  3. 工程实践意识:实际用 Embedding 的时候怎么选模型?维度对存储和计算有什么影响?面试官想知道你有没有在真实项目里踩过坑。

核心答案

Embedding(向量嵌入) 就是把一段文本转换成一个浮点数数组(向量),这个数组是这段文本的 "语义指纹"。

比如你输入 "今天天气真好",Embedding 模型会输出类似这样的结果:

[0.012, -0.034, 0.567, -0.189, 0.423, ..., 0.078]  ← 共 1536 个浮点数

1536 维的意思是:这个浮点数数组有 1536 个元素。每个元素是一个 float 值,比如 0.012、-0.034。这 1536 个数共同编码了这段文本的语义信息。

核心逻辑:语义相近的文本,它们的向量在高维空间中距离也相近。 所以你可以通过计算两个向量的距离(余弦相似度)来判断两段文本在语义上有多相似——这就是 RAG 中向量检索的底层原理。

深度解析

一、从文本到向量——到底发生了什么?

很多人知道 "文本变向量",但具体怎么变的?来,我们一步步拆。

上图展示了 Embedding 的编码过程:

  • 输入:一段文本(比如 "怎么退货"),送入 Embedding 模型

  • 模型内部:文本先被切分成 Token 序列,然后经过 Transformer 编码器的多层注意力机制,逐层提取语义特征。这个过程是预训练好的,你不需要关心细节,只要调用 API 就行

  • 输出:一个固定长度的浮点数数组。用 OpenAI 的 text-embedding-3-small 模型,输出就是 1536 个浮点数

注意,你不需要手动去做这些操作。在实际开发中,不管是 Spring AI 还是 LangChain4j,调用 Embedding 模型就是一行代码的事。但理解这个过程有助于你明白为什么维度越高语义表达能力越强——因为更多的维度意味着模型能编码更多的语义特征。

二、1536 维——为什么是这个数字?

说实话,1536 这个数字本身没有特别的含义,它不是什么 "最优解",而是 OpenAI 在设计 text-embedding-ada-002 模型时选定的一个参数。后来 text-embedding-3-small 延续了这个维度。

但它背后的逻辑是有道理的:

维度 语义表达能力 存储成本 计算成本 适用场景
128~256 维 一般 简单分类、大规模初筛
768 维 较好 BERT 系列、轻量级 RAG
1024 维 BGE-M3,多语言 RAG
1536 维 很好 较高 较高 主流 RAG 系统
3072 维 极好 高精度场景
8192+ 维 极强 很高 很高 研究探索,极少生产使用

简单来说:维度越高,能编码的语义信息越丰富,但存储和计算成本也越高。 1536 维是当前 RAG 系统中性价比最好的选择之一。

举个直觉上的例子:假设用 3 维向量表示一个人 [身高, 体重, 年龄],只能编码很有限的信息。但如果用 100 维 [身高, 体重, 年龄, 收入, 学历, 兴趣1, 兴趣2, ...],就能更精确地区分不同的人。Embedding 的维度也是这个道理——1536 个维度就是 1536 个 "语义特征轴",足以精细地刻画文本的语义。

三、语义相似度怎么算?

有了向量之后,怎么判断两段文本是否语义相近?靠计算向量之间的距离。最常用的是余弦相似度

上图展示了余弦相似度的计算逻辑:

  • 文本 A "怎么退货" 和文本 B "退换货政策" 的余弦相似度是 0.96,说明语义非常接近。虽然字面差异很大,但 Embedding 模型理解了它们的语义是相同的
  • 文本 A 和文本 C "北京天气预报" 的余弦相似度只有 0.12,说明语义不相关,不会被错误地检索到

除了余弦相似度,还有欧氏距离(L2)和内积(IP)等度量方式。文本语义检索场景一般用余弦相似度,因为它关注方向而不是绝对大小,对文本长度不敏感。

四、用 Spring AI 实际感受一下 Embedding

光说不练假把式,来一段 Spring AI 的代码,直接看看 Embedding 到底输出什么。

Maven 依赖

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

配置 application.yml

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      base-url: https://api.openai.com  # 或换成国内代理地址
      embedding:
        options:
          model: text-embedding-3-small  # 输出 1536 维向量

Java 代码

import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.stereotype.Service;

@Service
public class EmbeddingDemoService {

    private final EmbeddingModel embeddingModel;

    public EmbeddingDemoService(EmbeddingModel embeddingModel) {
        this.embeddingModel = embeddingModel;
    }

    /**
     * 演示 Embedding 编码过程
     */
    public void demo() {
        // 1. 把文本编码成向量
        String text1 = "怎么退货";
        String text2 = "退换货政策";
        String text3 = "北京天气预报";

        float[] vector1 = embeddingModel.embed(text1);
        float[] vector2 = embeddingModel.embed(text2);
        float[] vector3 = embeddingModel.embed(text3);

        // 2. 看看向量的维度和内容
        System.out.println("向量维度:" + vector1.length);  // 输出:1536
        System.out.println("前5个值:" + java.util.Arrays.toString(
            java.util.Arrays.copyOf(vector1, 5)));
        // 输出示例:[0.012, -0.034, 0.567, -0.189, 0.423]

        // 3. 计算余弦相似度
        double sim12 = cosineSimilarity(vector1, vector2);  // ≈ 0.96
        double sim13 = cosineSimilarity(vector1, vector3);  // ≈ 0.12

        System.out.println("'怎么退货' vs '退换货政策' 相似度:" + sim12);
        System.out.println("'怎么退货' vs '北京天气预报' 相似度:" + sim13);
    }

    /**
     * 计算余弦相似度
     */
    private double cosineSimilarity(float[] a, float[] b) {
        double dotProduct = 0.0, normA = 0.0, normB = 0.0;
        for (int i = 0; i < a.length; i++) {
            dotProduct += a[i] * b[i];
            normA += a[i] * a[i];
            normB += b[i] * b[i];
        }
        return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
    }
}

运行结果大概是这样:

向量维度:15365个值:[0.012, -0.034, 0.567, -0.189, 0.423]
'怎么退货' vs '退换货政策' 相似度:0.962
'怎么退货' vs '北京天气预报' 相似度:0.118

看到没?"怎么退货" 和 "退换货政策" 的相似度高达 0.96,虽然字面上差别很大,但 Embedding 模型理解了它们的语义是相同的。这就是向量检索比关键词检索强大的地方。

五、常见误区

这块有几个面试中常踩的坑,提前避一下:

误区一:"维度越高越好"

并不是。维度越高语义表达能力越强,但存储和计算成本也越高。1536 维的向量,每个 float 占 4 字节,一条就是 6KB。百万级文档就是 6GB 的纯向量数据。选择维度要在效果和成本之间找平衡点。

误区二:"Embedding 只能处理文本"

不是的。Embedding 是一个通用概念,文本、图片、音频、视频都可以做 Embedding。只不过在 RAG 场景下,我们主要用文本 Embedding。多模态 Embedding(如 CLIP)可以把图片和文本编码到同一个向量空间中,实现 "以图搜文" 或 "以文搜图"。

误区三:"所有 Embedding 模型输出都是 1536 维"

不是。不同模型的输出维度不同:BERT 输出 768 维,BGE-M3 输出 1024 维,text-embedding-3-small 输出 1536 维,text-embedding-3-large 输出 3072 维。而且 OpenAI 的新模型支持通过参数 "截断" 维度——比如把 3072 维截断为 512 维,牺牲一点精度换取更低的存储成本。Spring AI 中可以通过 dimensions 参数来控制。

六、Embedding 模型怎么选?

模型 维度 特点 适用场景
text-embedding-3-small(OpenAI) 1536 性价比高,英文优秀 英文 RAG、快速验证
text-embedding-3-large(OpenAI) 3072 语义表达最强,可截断 对精度要求高
bge-large-zh(BAAI) 1024 中文优化,开源免费 中文 RAG 首选
bge-m3(BAAI) 1024 多语言 + 多粒度 + 多功能 多语言混合场景
text-embedding-v3(通义千问) 1024 中文优秀,阿里云 API Spring AI Alibaba 项目

选型建议:中文场景用 bge 系列开源模型省钱又好用;项目已经在用 OpenAI API 的直接用 text-embedding-3-small 最方便;用 Spring AI Alibaba 的直接用通义千问 Embedding 最省事。

面试高频追问

  1. 追问一:余弦相似度和欧氏距离有什么区别?RAG 中一般用哪个?

    余弦相似度关注向量方向(角度),不受向量长度影响;欧氏距离关注绝对位置差异,受向量长度影响。文本语义检索一般用余弦相似度,因为文本长度不应该影响语义相似度的判断。

  2. 追问二:Embedding 模型可以微调吗?什么时候需要微调?

    可以,但大部分场景不需要。只有当通用 Embedding 模型在你的垂直领域表现不好(比如大量专业术语、行业黑话),才考虑微调。微调需要准备大量的 "相似文本对" 和 "不相似文本对" 作为训练数据。

  3. 追问三:向量维度可以降低吗?降低后效果差多少?

    可以,OpenAI 的新模型支持通过 dimensions 参数截断维度(Matryoshka 原理)。比如把 3072 维截断到 512 维,存储成本降低 6 倍,精度只下降几个百分点。对存储敏感、数据量大的场景可以考虑。

常见面试变体

  • "什么是向量嵌入?为什么 RAG 需要它?"
  • "Embedding 模型的维度越高越好吗?为什么?"
  • "你知道哪些主流的 Embedding 模型?怎么选?"
  • "余弦相似度和欧氏距离有什么区别?"

记忆口诀

Embedding 本质:文本变数字,数字表语义,语义近则距离近。记住 "文本 → 浮点数组 → 距离 = 相似度"。

1536 维:1536 个浮点数,就是 1536 个 "语义特征轴"。维度越高特征越精细,但成本也越高。记住 "维度 = 语义精度,和成本正相关"。

总结

Embedding 就是把文本编码成浮点数数组(向量),1536 维表示这个数组有 1536 个浮点数。语义相近的文本向量距离近,语义不同的距离远——这就是 RAG 向量检索的底层原理。维度越高语义表达越精细但成本越高,1536 维是当前主流的性价比之选。面试时如果能结合 Spring AI 的代码示例说明,会更有说服力。