跳到主要内容

向量维度

文档向量、查询向量和数据库向量字段,必须使用同一个 Embedding 模型并保持相同维度

  • 维度越高通常成本越大,但检索效果不一定单纯越高越好
  • 文档向量和查询向量、数据库向量字段维度
    • 文档向量:把知识库中的文档内容转换成向量
    • 查询向量:用户提问时,把用户的问题转换成向量
  • 文档向量和查询向量,在同一个向量索引中的数据必须保持维度一致
    • 不能出现混合向量维度,例如文档向量512,查询向量768,这是不行的,会导致向量检索会有问题,维度不同,就无法一一对应
  • 更换Embedding模型或者修改输出维度后,通常需要把原来的文档重新生成向量并重建索引

固定长度数组​

  • 长度固定,不管输入里的是一个字还是多个字,生成的向量长度也就是维度,是向量模型决定的,都是生成一样的长度
  • 长度由 Embedding 向量模型决定,不由输入文本长度决定
bash
“猫”
→ [0.12, -0.36, 0.08, ..., 0.51] // 固定 768 个数字

“猫是一种常见的家庭宠物”
→ [0.21, -0.15, 0.32, ..., 0.43] // 仍然是 768 个数字

常见的向量维度​

  • 常见的向量维度:384、512、768、1024、1536、3072、4096
  • 一般企业知识库,通常优先考虑中等维度:
    • 512 / 768 / 1024 / 1536
    • 检索效果与存储成本比较均衡
  • 高维向量
    • 2560、3072、4096
    • 可以表达更丰富的语义信息
    • 存储空间更大
  • 本地Demo可以使用512来调试测试
  • 大部分的通用 RAG 任务, 768 维到 1536 维是目前最常⻅且性能与成本平衡得最好的选择。如果你的数据非常专业、上下文极度复杂,可以考虑使用 3072 维的超大模型
向量维度常见定位代表模型
384轻量级、速度快、占用小all-MiniLM-L6-v2 输出384维。(Hugging Face)
512中文轻量级模型bge-small-zh-v1.5 输出512维。(Hugging Face)
768最常见的中等维度之一bge-base-zh-v1.5 输出768维;Gemini也推荐使用768维。(Hugging Face)
1024较大的开源Embedding模型bge-large-zh-v1.5 输出1024维;Qwen3-Embedding-0.6B也是1024维。(Hugging Face)
1536云端Embedding模型常见维度OpenAI text-embedding-3-small默认1536维;Gemini也推荐1536维。(OpenAI)
2560新一代较大Embedding模型Qwen3-Embedding-4B输出2560维。(Hugging Face)
3072高维、高质量模型常见OpenAI text-embedding-3-large最高3072维;Gemini默认3072维。(OpenAI)
4096大型Embedding模型Qwen3-Embedding-8B最高4096维。(Hugging Face)

探测向量维度​

  • 探测向量维度的目的,是确认 Embedding 模型实际输出多少维,避免模型、配置和向量数据库不一致
  • 探测就是在系统启动、初始化知识库或创建向量表之前,先调用一次 Embedding 模型来获取向量维度
python
# 探测向量
vector = embedding_model.embed_query("测试向量维度")
# 向量维度
dimension = len(vector)
print(dimension)
  • 为什么不推荐直接指定维度
    • 模型和维度配置可能不一致。例如更换成 1024 维模型,却忘记修改配置
    • 通过启动时自动探测维度,缺点是系统启动时会多调用一次模型;如果使用收费的远程 Embedding API,会产生一次很小的调用成本

向量维度越多越好吗​

  • 向量维度越多,不一定越好;高维只代表有更大的信息表示空间,不代表模型一定能有效利用这些维度
  • 维度越多,通常语义表达能力越强
  • 在复杂语义任务上的 召回率更高
    • 注意这里用召回率,而不是准确率
    • 召回率:检索出来文档结果
  • 维度越高,成本越高
    • 存储成本: 存储 3072 维的向量,占用的空间是存储 768 维向量的 4 倍。
    • 计算成本:维度越高,计算时间越⻓

注意问题​

  • Chroma 会在第一次写入向量时自动确认向量维度;pgvector 通常需要在建表时通过 VECTOR(n) 提前声明。更换 Embedding 模型后,无论维度是否变化,都需要重新文档向量,只有新模型维度发生变化时,pgvector 才需要调整向量字段
    • 模型变、维度不变:重新生成向量,字段维度不用改。
    • 模型变、维度也变:重新生成向量,同时新建向量字段、表或 Collection。