HuggingFace镜像/snowflake-arctic-embed-l-openmind
模型介绍文件和版本分析
下载使用量0

Snowflake 的 Arctic-embed-l

新闻 | 模型 | 使用方法 | 评估 | 联系我们 | 常见问题 许可证 | 致谢

新闻

2024年7月26日:在 arXiv 上发布预印本 [2407.18887] Embedding And Clustering Your Data Can Improve Contrastive Pretraining。

2024年7月18日:发布 snowflake-arctic-embed-m-v1.5,该模型能够生成高度可压缩的嵌入向量,即使将向量压缩至每个仅128字节,仍能保持质量。有关此模型开发的详细信息,请参见 Snowflake 工程博客上的发布文章。

2024年5月10日:发布 Arctic Embed 技术报告

2024年4月16日:发布 snowflake-arctic-embed 文本嵌入模型系列。这些模型在其各自的尺寸规格下均达到了检索质量的最先进水平。技术报告 即将发布。欲了解更多详情,请参阅我们的 Github:Arctic-Text-Embed。

模型

snowflake-arctic-embed 是一套文本嵌入模型,专注于创建针对性能优化的高质量检索模型。

snowflake-arctic-embedding 模型在 MTEB/BEIR 排行榜的各个尺寸变体上均实现了最先进的性能。评估是使用这些 脚本 进行的。如下所示,与其他顶级模型相比,每类模型尺寸都实现了最先进的检索准确率。

这些模型通过利用现有的开源文本表示模型(如 bert-base-uncased)进行训练,并通过多阶段管道进行训练以优化其检索性能。首先,使用大批量的查询-文档对训练模型,其中负样本通过批内获取——预训练利用了约4亿个样本,这些样本混合了公共数据集和专有网络搜索数据。预训练之后,模型会在较小的数据集(约100万个样本)上进行长时间的进一步优化,这些样本包含从困难负样本挖掘中获得的查询、正文档和负文档三元组。负样本的挖掘和数据整理对检索准确率至关重要。详细的技术报告可在 此处 找到。

名称MTEB 检索分数(NDCG @ 10)参数数量(百万)嵌入维度
snowflake-arctic-embed-xs50.1522384
snowflake-arctic-embed-s51.9833384
snowflake-arctic-embed-m54.90110768
snowflake-arctic-embed-m-long54.83137768
snowflake-arctic-embed-l55.983351024

除了作为优秀的开源模型外,如下所示,最大的模型 snowflake-arctic-embed-l 可以作为闭源嵌入的理想替代品。

模型名称MTEB 检索分数(NDCG @ 10)
snowflake-arctic-embed-l55.98
Google-gecko-text-embedding55.7
text-embedding-3-large55.44
Cohere-embed-english-v3.055.00
bge-large-en-v1.554.29

snowflake-arctic-embed-xs

这款轻量级模型性能不容小觑。它基于all-MiniLM-L6-v2模型构建,仅拥有2200万参数和384维向量,能够满足最严苛的延迟与总体拥有成本(TCO)预算要求。尽管体积小巧,其检索精度却已接近拥有1亿参数的模型水平。

模型名称MTEB 检索得分(NDCG @ 10)
snowflake-arctic-embed-xs50.15
GIST-all-MiniLM-L6-v245.12
gte-tiny44.92
all-MiniLM-L6-v241.95
bge-micro-v242.56

snowflake-arctic-embed-s

该小型模型以intfloat/e5-small-unsupervised模型为基础,在保持紧凑体积的同时,并未牺牲检索精度。它仅含3300万参数和384维向量,可轻松扩展至大规模数据集应用场景。

模型名称MTEB 检索得分(NDCG @ 10)
snowflake-arctic-embed-s51.98
bge-small-en-v1.551.68
Cohere-embed-english-light-v3.051.34
text-embedding-3-small51.08
e5-small-v249.04

snowflake-arctic-embed-m

该中型模型基于intfloat/e5-base-unsupervised模型构建,是兼顾最佳检索性能与推理速度的主力模型。

模型名称MTEB 检索分数(NDCG @ 10)
snowflake-arctic-embed-m54.90
bge-base-en-v1.553.25
nomic-embed-text-v1.553.25
GIST-Embedding-v052.31
gte-base52.31

snowflake-arctic-embed-m-long

该模型是中型模型的长上下文版本,基于nomic-ai/nomic-embed-text-v1-unsupervised模型构建,非常适合受限于其他模型常规512 token上下文长度的工作负载。不使用RPE时,该模型支持高达2048 token;使用RPE时,可扩展至8192 token!

模型名称MTEB 检索分数(NDCG @ 10)
snowflake-arctic-embed-m-long54.83
nomic-embed-text-v1.553.01
nomic-embed-text-v152.81

snowflake-arctic-embed-l

该大模型基于intfloat/e5-large-unsupervised模型构建,可直接替代闭源API,提供最精准的检索体验。

模型名称MTEB 检索分数(NDCG @ 10)
snowflake-arctic-embed-l55.98
UAE-Large-V154.66
bge-large-en-v1.554.29
mxbai-embed-large-v154.39
e5-Large-v250.56

使用方法

使用 Sentence Transformers

您可以通过 sentence-transformers 包来使用 snowflake-arctic-embed 模型,具体如下所示。

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("Snowflake/snowflake-arctic-embed-l")

queries = ['what is snowflake?', 'Where can I get the best tacos?']
documents = ['The Data Cloud!', 'Mexico City of Course!']

query_embeddings = model.encode(queries, prompt_name="query")
document_embeddings = model.encode(documents)

scores = query_embeddings @ document_embeddings.T
for query, query_scores in zip(queries, scores):
    doc_score_pairs = list(zip(documents, query_scores))
    doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)
    # Output passages & scores
    print("Query:", query)
    for document, score in doc_score_pairs:
        print(score, document)
Query: what is snowflake?
0.28976774 The Data Cloud!
0.19071159 Mexico City of Course!
Query: Where can I get the best tacos?
0.38650584 Mexico City of Course!
0.25145516 The Data Cloud!

使用 Huggingface transformers

您可以使用 transformers 包来使用 snowflake-arctic-embed 模型,如下所示。为获得最佳检索质量,请使用 CLS 标记嵌入每个文本部分,并使用下面的查询前缀(仅用于查询)。

from openmind import AutoTokenizer, AutoModel, is_torch_npu_available
from openmind_hub import snapshot_download
import torch.nn.functional as F
from torch import Tensor
import openmind
import torch
import argparse

# Mean Pooling - Take attention mask into account for correct averaging
def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output[0]  # First element of model_output contains all token embeddings
    input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--model_name_or_path",
        type=str,
        help="Path to model",
        default="jeffding/snowflake-arctic-embed-l-openmind",
    )
    args = parser.parse_args()
    return args

def main():
    args = parse_args()
    model_path = args.model_name_or_path

    if is_torch_npu_available():
        device = "npu:0"
    else:
        device = "cpu"
        
    tokenizer = AutoTokenizer.from_pretrained(model_path)
    model = AutoModel.from_pretrained(model_path, add_pooling_layer=False).to(device)
    model.eval()

    query_prefix = 'Represent this sentence for searching relevant passages: '
    queries  = ['what is snowflake?', 'Where can I get the best tacos?']
    queries_with_prefix = ["{}{}".format(query_prefix, i) for i in queries]
    query_tokens = tokenizer(queries_with_prefix, padding=True, truncation=True, return_tensors='pt', max_length=512).to(device)

    documents = ['The Data Cloud!', 'Mexico City of Course!']
    document_tokens =  tokenizer(documents, padding=True, truncation=True, return_tensors='pt', max_length=512).to(device)

    # Compute token embeddings
    with torch.no_grad():
        query_embeddings = model(**query_tokens)[0][:, 0]
        document_embeddings = model(**document_tokens)[0][:, 0]


    # normalize embeddings
    query_embeddings = torch.nn.functional.normalize(query_embeddings, p=2, dim=1)
    document_embeddings = torch.nn.functional.normalize(document_embeddings, p=2, dim=1)

    scores = torch.mm(query_embeddings, document_embeddings.transpose(0, 1))
    for query, query_scores in zip(queries, scores):
        doc_score_pairs = list(zip(documents, query_scores))
        doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)
        #Output passages & scores
        print("Query:", query)
        for document, score in doc_score_pairs:
            print(score, document)
    
if __name__ == "__main__":
    main()

使用 Transformers.js

如果您尚未安装,可以通过运行以下命令从 NPM 安装 Transformers.js JavaScript 库:

npm i @xenova/transformers

然后,您可以按以下方式使用该模型来计算嵌入:

import { pipeline, dot } from '@xenova/transformers';

// Create feature extraction pipeline
const extractor = await pipeline('feature-extraction', 'Snowflake/snowflake-arctic-embed-l', {
    quantized: false, // Comment out this line to use the quantized version
});

// Generate sentence embeddings
const sentences = [
    'Represent this sentence for searching relevant passages: Where can I get the best tacos?',
    'The Data Cloud!',
    'Mexico City of Course!',
]
const output = await extractor(sentences, { normalize: true, pooling: 'cls' });

// Compute similarity scores
const [source_embeddings, ...document_embeddings ] = output.tolist();
const similarities = document_embeddings.map(x => dot(source_embeddings, x));
console.log(similarities); // [0.25145517380846977, 0.3865060421197194]

常见问题

待定

联系方式

如果您对本项目有任何问题或建议,欢迎提交 issue 或 pull request。 您也可以发送邮件至 Daniel Campos(daniel.campos@snowflake.com)。

许可协议

Arctic 采用 Apache-2 许可协议。发布的模型可免费用于商业用途。

致谢

我们要感谢开源社区,他们提供了出色的基础组件,使我们能够构建自己的模型。 感谢我们的建模工程师 Danmei Xu、Luke Merrick、Gaurav Nuti 和 Daniel Campos,是他们让这些优秀模型成为可能。 感谢我们的领导层 Himabindu Pucha、Kelvin So、Vivek Raghunathan 和 Sridhar Ramaswamy 对这项工作的支持。 我们还要感谢开源社区,他们开发了优秀的模型,为我们提供了构建基础,使这些发布成为可能。 最后,感谢创建 BEIR 和 MTEB 基准测试的研究人员。 很大程度上正是由于他们不懈的努力定义了“更好”的标准,我们才能够提升模型性能。