Jean's Blog

一个专注软件测试开发技术的个人博客

0%

RAG组件--向量嵌入之大模型时代的嵌入技术

MTEB排行榜

Hugging Face MTEB地址:https://huggingface.co/spaces/mteb/leaderboard

image-20250814090707154

  • 模型筛选工具: 在大语言时代嵌入模型选择过多的情况下,MTEB排行榜可作为基础过滤工具,帮助从开源嵌入模型中筛选合适的模型。
  • 四维度评估: 通过模型大小、能力分数、嵌入维度和最大token数四个维度进行综合评估。

模型大小维度

  • 参数规模范围: 从$1B$到$100B$不等,但主流模型多在$10B$以下。
  • 硬件适配性: 中等GPU配置(如双卡4090+32GB内存)即可运行大多数主流嵌入模型。
  • 开源特性: MTEB排行榜仅评估开源嵌入模型,不包括闭源商业模型。

模型能力维度

  • 评分机制: 通过58个数据集在8大类NLP任务上的平均表现(MAP)计算得出。
  • 任务覆盖: 包括分类、聚类、检索等多种任务类型,反映模型综合能力。
  • 专业模型特点: 某些模型可能在特定任务上表现突出,但排行榜显示的是平均能力。

嵌入维度大小

  • 可视化表示: 通过气泡图大小展示,维度越大表示能捕捉更细微的特征差异。
  • 参数关系: 通常参数越大的模型支持更大的嵌入维度,但存在例外情况(如某些$1B$参数的模型嵌入维度特别大)。
  • 典型范围: 小模型家族嵌入维度偏小,大模型家族嵌入维度偏大。

Max Tokens维度

  • 颜色编码: 通过不同颜色区分模型支持的最大token数(如7K、10K等)。
  • 实际应用建议: 虽然支持长上下文,但建议将文本切分为1000token以内的段落进行嵌入,更利于语义把握。
  • 重要性: 长上下文支持能力对某些应用场景(如文档整体嵌入)很关键。

MTEB划分任务类别 (八大任务)

image-20250814092155178

image-20250814092225655

聚类

  • 核心目标: 将语义相似的文本无监督地聚在一起。
  • 典型应用: 文档组织、主题发现。
  • 数据集示例: Arxiv、Biorxiv、Medrxiv等学术论文数据集,测试P2P(论文对)、S2S(句对)等聚类能力。

分类

  • 监督学习: 基于已标注数据训练,预测新文本类别。
  • 应用场景: 情感分析(如IMDB影评)、意图识别、话题分类。
  • 数据集: AmazonPolarity、Emotion、Banking77等。

双语挖掘

  • 任务特点: 跨语言句子对齐,用于机器翻译训练数据自动生成。
  • 数据集: BUCC、Tatoeba等双语平行语料库。

STS

  • 回归任务: 评估两个句子语义相似度(0-5分)。
  • 应用: 相似问句匹配、客服问答对匹配。
  • 数据集: STS12-16、STSBenchmark等。

对分类

  • 关系判断: 识别文本对间特定关系(如FAQ中的问题-答案对)。
  • 与大模型关系: 这类任务在大模型时代已变得相对简单。

检索

  • 核心应用: RAG系统、文档检索。
  • 数据集覆盖: HotpotQA、MSMARCO等,涵盖问答、科学文献多领域。
  • 任务整合: 可包含聚类、分类、STS等多种子任务。

摘要

  • 评估方式: 通过嵌入相似度比较生成摘要与参考摘要的一致性。
  • 数据集: SummEval等摘要质量评估数据集。

重排序

  • RAG关键环节: 对候选答案进行相关性重排序。
  • 数据集: AskUbuntu、StackOverflow等社区问答数据。

嵌入式模型排行榜

image-20250814092638532

  • 榜单概况:展示当前领先的嵌入式模型排名,包含模型性能指标如Zero-shot准确率、内存使用量等关键参数
  • 商业与开源区别:榜首gemini-embedding-001(Google)为商业API调用模型,不提供开源下载

其中的排名第六的gte-Qwen2-7B-instruct(千问系列的模型),基于290亿参数,支持4096维嵌入,Zero-shot准确率未标注(NA)

OpenAI嵌入式模型

image-20250814093506745

  • 产品矩阵:
    • text-embedding-3-small:性价比高(62.5页/美元),MTEB得分62.3%
    • text-embedding-3-large:高性能(9.615页/美元),MTEB得分64.6%
  • 成本计算:处理100万行医学名词数据约需1美元(small版更便宜)
  • 技术优势:受益于GPT家族语料积累,支持8191 tokens长文本输入

BGE嵌入式模型

Github地址:https://github.com/FlagOpen/FlagEmbedding

  • 开发背景:由北京智源研究院(FlagOpen)推出的开源检索增强工具包
  • 核心功能:
    • 支持向量/密集向量混合检索
    • 包含Embedder和Reranker双模型系统
    • 多语言支持(含专门优化中文的版本)
  • 安装方式:
  • 最新进展:BGE-VL支持多模态嵌入,MIT许可证允许商业使用

Jina嵌入式模型

官方网址:https://jina.ai/models#catalog

  • v3版本特性:
    • 5.7亿参数
    • 支持8192 tokens长文本
    • 输出维度1024(可截断至32维)
  • 商业授权:提供标准企业许可证(5000美元/季度)和定制训练服务
  • 技术亮点:采用LoRA适配器,针对不同任务(检索/聚类/分类)优化

其他Embedding模型的供应商

选型的Tips

  • 口碑重要性:网络口碑是首要考虑因素,用户基数大的模型通常社区支持更好,长期维护更有保障
  • 评估维度:
    • 具体任务适配性:需考察模型在目标场景的实际表现
    • 实操体验:实际使用过程中的感受至关重要
    • 授权与成本:需权衡开源/商用、价格、计算资源需求、语言支持等因素
  • 口碑验证方法:通过技术社区讨论热度、持续维护情况、用户反馈等维度综合判断

国外的讨论社区

  • Reddit:https://www.reddit.com/

    • 例如查询模型r/LocalLLaMA等专业技术社区是获取真实使用反馈的重要渠道
    • 典型讨论方式:发起具体应用场景的技术咨询(如RAG场景下的embedding模型选择)
  • 模型使用案例:

    • all-mpnet-base-v2:早期经典选择,配合FAISS/KDTree效果稳定
    • BGE系列:虽benchmark表现优异但可能存在过拟合MTEB数据集的问题
    • 千问/Qwen系列:部分用户反馈其实际表现优于benchmark指标
  • 小型模型价值:
    • all-MiniLM-L6-v2等小型模型可作为baseline参考
    • 新模型需至少超越这些基础模型的性能表现
  • 评估建议:
    • 需结合具体业务场景测试(如新闻处理、客服知识库等不同场景需求差异大)
    • 注意chunk大小、查询生成方式等实施细节对效果的影响
    • 中文模型需特别注意benchmark分数与实际效果的差异
  • 典型技术讨论:
    • 维度问题:llama-2-7B的4096维可能因维度稀释导致近邻搜索效果下降
    • 模型类型:基础模型通常比对话模型更适合生成embedding
    • 规模影响:小规模测试(400条)与大规模应用(4万条)可能表现不同
  • 实用工具链:
    • 常用组合:SentenceTransformers+FAISS/Qdrant
    • 轻量方案:all-MiniLM-L6-v2+HyperDB适合文档量<10万的场景

文本嵌入模型评估与选择

网上公开的论文、文章等,例如:https://www.datastax.com/blog/best-embedding-models-information-retrieval-2025

image-20250814095224872

  • 评估背景:针对RAG(检索增强生成)任务,2025年最新研究对多种商业和开源嵌入模型进行了系统性评测
  • 测试对象:包含OpenAI、Gemini、Jina、Cohere、Voyage等商业模型,以及Stella、ModernBERT等开源模型

从以上文章和内容,我们可以得出一些信息:

模型对比与评估方法

  • 商业模型组:
    • OpenAI:text-embedding-3-large(3072维)和small(1536维)
    • Gemini:text-embedding-004(768维,通过API获取)
    • 第三方模型:Jina v3、Cohere v3、Voyage系列
  • 开源模型组:
    • Stella:测试400M和1.5B两个版本(MIT许可)
    • ModernBERT:Base和Large变体,基于Answer.AI技术
  • 评估创新点:
    • 数据集构建:采用ViDoRe图像搜索基准,通过GeminiFlash 1.5进行OCR转换
    • 避免数据泄露:刻意不使用常见文本数据集,确保模型面对全新数据
    • 多语言测试:包含英语和法语数据,检验模型泛化能力

Voyage-3-large的优势

  • 显著优势:
    • 在嵌入相关性任务中表现突出,明显优于其他商业模型
    • 支持2048维高精度输出,适合对质量要求严格的场景
  • 团队背景:由马腾宇团队开发,在reranker技术上有深厚积累
  • 性价比选择:Voyage-3-lite(512维)在低成本端表现同样出色

Gemini 004的特点

  • 核心优势:
    • 价格接近免费,速率限制合理(1500RPM)
    • 768维输出平衡了性能与成本
  • 局限性:
    • 仅支持英语处理
    • 无法通过付费提升吞吐量
    • 企业版text-embedding-005尚未开放API访问

开源模型表现

  • Stella亮点:
    • 400M版本在MTEB检索榜表现优异
    • 商业友好(MIT许可),张盾团队提供详细白皮书
    • 1.5B版本未显著提升准确率,建议优先使用400M
  • ModernBERT不足:
    • 实际表现低于预期
    • 期待下一代改进版本

评估建议与实践方法

  • 自制数据集:
    • 重要性:避免公开数据集的训练泄露问题
    • 实践方案:即使少量数据(几十个样本)也能进行基本效果验证
  • 评估维度:
    • 准确性:使用未见过的测试数据
    • 成本效益:参数规模与价格比值
    • 语言支持:多语言场景下的表现
  • 失败案例:
    • Jina v3和Cohere v3性价比不足
    • 相同预算可获得更好性能的其他模型

向量嵌入应用案例

游戏推荐系统

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import json

import numpy as np
import openai
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

# 读取用户评价数据集
df = pd.read_csv("../data/灭神纪/用户评价.csv")

# 读取游戏描述文件
with open("../data/灭神纪/游戏说明.json", "r") as f:
game_descriptions = json.load(f)


# 定义函数获取嵌入向量,注:text-embedding-3-small模型需要付费使用
def get_embedding(text, model="text-embedding-3-small"):
response = openai.embeddings.create(
input=[text],
model=model
)
return response.data[0].embedding


# 获取所有游戏的嵌入向量
unique_games = df['game_title'].unique().tolist()
target_game = "Killing God: Hu Sun" # 目标游戏名称更改
if target_game not in unique_games:
unique_games.append(target_game) # 确保目标游戏在列表中
game_embeddings = {}
for game in unique_games:
description = game_descriptions[game]
game_embeddings[game] = np.array(get_embedding(description))

# 计算用户评价的嵌入向量(该用户评价过的所有游戏描述嵌入向量的平均值)
user_vectors = {}
for user_id, group in df.groupby("user_id"):
user_game_vecs = []
for idx, row in group.iterrows():
g_title = row['game_title']
g_vec = game_embeddings[g_title]
user_game_vecs.append(g_vec)
user_vectors[user_id] = np.mean(np.array(user_game_vecs), axis=0)

# 获取“灭神纪·猢狲”的嵌入向量
target_vector = game_embeddings[target_game]
# 计算每个用户评价的嵌入向量与目标游戏的嵌入向量的余弦相似度
results = []
for user_id, u_vec in user_vectors.items():
u_vec_reshaped = u_vec.reshape(1, -1)
t_vec = target_vector.reshape(1, -1)
similarity = cosine_similarity(u_vec_reshaped, t_vec)[0, 0]
results.append((user_id, similarity))

# 排序并找出最可能喜欢“灭神纪·猢狲”的用户
result_df = pd.DataFrame(results, columns=["user_id", f"similarity_to_{target_game}"])
result_df = result_df.sort_values(by=f"similarity_to_{target_game}", ascending=False)
print(f"\n最可能喜欢{target_game}的前5位用户:")
print(result_df.head())
  • 系统架构:基于OpenAI Embedding构建的游戏推荐系统,核心功能是找出最可能喜欢特定游戏的目标用户
  • 数据准备:
    • 用户评论数据(CSV格式):记录用户对各类游戏的评价
    • 游戏描述数据(JSON格式):包含游戏详细说明,如案例中的”灭神纪”游戏
  • 核心算法:
    • 向量生成:使用OpenAI的text-embedding-3-small模型将文本转换为向量
    • 偏好建模:通过用户评价过的游戏描述向量的平均值表示用户偏好
    • 相似度计算:采用余弦相似度比较用户偏好向量与目标游戏向量
  • 技术实现:
    • 使用numpy进行向量运算和均值计算
    • 利用pandas进行数据处理和结果展示
    • 通过sklearn的cosine_similarity计算相似度
  • 工作流程:
    • 加载所有游戏描述并生成嵌入向量
    • 为每个用户计算偏好向量(评价游戏向量的均值)
    • 计算目标游戏与所有用户偏好的相似度
    • 按相似度排序输出前5位潜在用户
  • 实践建议:
    • 可替换OpenAI模型为国产开源模型(如支持中文的嵌入模型)
    • 类似思路可用于其他推荐场景(如电影、商品推荐)