汪图南
  • RAG

    • RAG
  • 快速入门
  • 高级技巧
前端面试之道
  • 打包工具

    • Webpack
    • Rollup
  • TypeScript

    • TypeScript基础
    • TypeScript类型挑战
  • CSS预编译器

    • SASS
  • 自动化测试

    • Vue应用测试
  • Vue2.0源码分析
  • Vue3.0源码分析
  • 数据结构和算法(基础)
  • LeetCode(刷题)
  • JavaScript书籍

    • 你不知道的JavaScript(上)
    • 你不知道的JavaScript(中下)
    • JavaScript数据结构和算法
    • JavaScript设计模式与开发实践
    • 深入理解ES6
  • Git书籍

    • 精通Git
Github
  • RAG

    • RAG
  • 快速入门
  • 高级技巧
前端面试之道
  • 打包工具

    • Webpack
    • Rollup
  • TypeScript

    • TypeScript基础
    • TypeScript类型挑战
  • CSS预编译器

    • SASS
  • 自动化测试

    • Vue应用测试
  • Vue2.0源码分析
  • Vue3.0源码分析
  • 数据结构和算法(基础)
  • LeetCode(刷题)
  • JavaScript书籍

    • 你不知道的JavaScript(上)
    • 你不知道的JavaScript(中下)
    • JavaScript数据结构和算法
    • JavaScript设计模式与开发实践
    • 深入理解ES6
  • Git书籍

    • 精通Git
Github
  • RAG基础

    • 介绍
  • 简易RAG

    • 前置准备
    • LangChain实现RAG
    • LangGraph实现RAG
    • LangChain vs LangGraph
  • 数据导入(Loader)

    • 介绍
    • Document类型
    • 简单文本导入
    • JSON
    • HTML网页数据
    • Markdown
    • CSV
    • OCR
    • PDF
    • DataBase
  • 文本切块(Chunking)

    • 介绍
    • 分块方法
  • 数据嵌入(Embedding)

    • 介绍
    • 向量相似度计算
    • 稀疏嵌入
    • 密集嵌入
    • 混合嵌入
  • 向量存储(VectorStore)

    • 介绍
    • Chroma
    • Milvus

密集嵌入

密集嵌入(Dense Embedding):每个词或对象用一个低维、稠密向量表示。

特点

  • 维度:通常是几维到几千维,维度较低。
  • 可解释性:难以理解单个维度的含义,可解释性差。
  • 语义信息:通过模型训练出来的连续表示,包含语义信息。
  • 效率:适合用余弦相似度/点积做相似度计算,效率较高。
  • 上下文:包含上下文,例如BERT输出。

示例

  • 词嵌入模型:Word2Vec、GloVe。
  • 上下文模型:BERT、GPT(基于Transformer编码)。
  • 推荐系统:矩阵分解(MF)、深度神经网络(如YouTube DNN)。

应用场景

  • 文本处理:语义搜索、机器翻译。
  • 推荐系统:用户/物品的隐向量匹配。
  • 计算机视觉:CNN特征(如ResNet输出)。
  • 分类任务:深度学习模型(如BERT微调)。

实现案例

提示

FlagEmbedding 文档

from FlagEmbedding import BGEM3FlagModel

passage = ["猢狲施展烈焰拳,击退妖怪;随后开启金刚体,抵挡神兵攻击。"]
model = BGEM3FlagModel(
  model_name_or_path="BAAI/bge-m3",
  use_fp16=True
)

passage_embedding = model.encode(
  sentences=passage,
  return_sparse=True, # 返回稀疏嵌入
  return_dense=True # 返回密集嵌入
)

 # 分别提取稀疏嵌入、密集嵌入和多向量嵌入
dense_vecs = passage_embedding.get('dense_vecs')
sparse_vecs = passage_embedding.get('lexical_weights')

# 展示稀疏嵌入和密集嵌入的示例
print("密集嵌入维度:", dense_vecs[0].shape)
print("密集嵌入前10维:", dense_vecs[0][:10])  # 仅显示前10维

print("稀疏嵌入总长度:", len(sparse_vecs[0]))
print("稀疏嵌入前10个非零值:", list(sparse_vecs[0].items())[:10])  # 仅显示前10个非零值

输出结果:

密集嵌入维度: (1024,)
密集嵌入前10维: [
  0.0115688, 
  0.02439203,
  -0.02763909,
  -0.00984308,
  -0.04426071,
  -0.02911919,
  0.03953099,
  0.02165177,
  0.01074664,
  -0.03528614
]

稀疏嵌入总长度: 23
稀疏嵌入前10个非零值: [
  ('6', np.float32(0.07353998)),
  ('28323', np.float32(0.07607669)),
  ('8869', np.float32(0.15832466)),
  ('48124', np.float32(0.16404563)),
  ('213212', np.float32(0.20880711)),
  ('75133', np.float32(0.25368175)),
  ('4', np.float32(0.05709494)),
  ('31833', np.float32(0.111040354)),
  ('12461', np.float32(0.18773092)),
  ('101184', np.float32(0.18636838))
]
最后更新时间: 2025/5/31 05:05
贡献者: wangtunan
Prev
稀疏嵌入
Next
混合嵌入