说明文档
Snowflake 的 Arctic-embed-m-long
<p align="center"> <p> <a href="#news">新闻</a> | <a href="#models">模型</a> | <a href="#usage">使用</a> | <a href="#evaluation">评估</a> | <a href="#contact">联系</a> | <a href="#faq">常见问题</a> <a href="#license">许可证</a> | <a href="#acknowledgement">致谢</a> <p> </h4>
新闻
2024/12/04: 发布 snowflake-arctic-embed-l-v2.0 和 snowflake-arctic-embed-m-v2.0,这是我们考虑到多语言工作负载的最新模型。这些模型优于 Arctic Embed 的先前版本,我们建议用这些替换之前的版本!
2024/07/26: 在 arXiv 上发布预印本 [2407.18887] Embedding And Clustering Your Data Can Improve Contrastive Pretraining。
2024/07/18: 发布 snowflake-arctic-embed-m-v1.5,它能够生成高度可压缩的嵌入向量,即使压缩到每个向量仅 128 字节也能保持质量。关于此模型开发的详细信息请参阅 Snowflake 工程博客的发布文章。
2024/05/10: 发布 Arctic Embed 的技术报告
2024/04/16: 发布 snowflake-arctic-embed 系列文本嵌入模型。这些版本在各自代表性尺寸档位中实现了检索质量的最新技术。技术报告即将发布。更多详情请参阅我们的 GitHub:Arctic-Text-Embed。
模型
snowflake-arctic-embed 是一系列专注于创建针对性能优化的高质量检索模型的文本嵌入模型。
snowflake-arctic-embedding 模型在 MTEB/BEIR 排行榜上实现了各尺寸变体的最新技术性能。使用这些脚本进行评估。如下所示,每个模型尺寸档位都实现了相较于其他顶级模型更高的 SOTA 检索准确率。
这些模型通过利用现有的开源文本表示模型(如 bert-base-uncased)进行训练,并采用多阶段训练流程来优化其检索性能。首先,模型使用大量查询-文档对进行训练,其中负样本来自批内——预训练利用了约 4 亿个公共数据集和网络搜索数据的混合样本。在预训练之后,模型进一步在较小的数据集(约 100 万个查询、正面文档和负面文档的三元组)上进行长期训练,这些样本来自难负样本挖掘。负样本挖掘和数据策展对检索准确性至关重要。详细的技术报告见此处。
| 名称 | MTEB 检索得分 (NDCG @ 10) | 参数数量(百万) | 嵌入维度 |
|---|---|---|---|
| snowflake-arctic-embed-xs | 50.15 | 22 | 384 |
| snowflake-arctic-embed-s | 51.98 | 33 | 384 |
| snowflake-arctic-embed-m | 54.90 | 110 | 768 |
| snowflake-arctic-embed-m-long | 54.83 | 137 | 768 |
| snowflake-arctic-embed-l | 55.98 | 335 | 1024 |
除了是优秀的开源模型外,最大模型 snowflake-arctic-embed-l 还可以作为封闭源嵌入的自然替代品,如下所示。
| 模型名称 | MTEB 检索得分 (NDCG @ 10) |
|---|---|
| snowflake-arctic-embed-l | 55.98 |
| Google-gecko-text-embedding | 55.7 |
| text-embedding-3-large | 55.44 |
| Cohere-embed-english-v3.0 | 55.00 |
| bge-large-en-v1.5 | 54.29 |
snowflake-arctic-embed-xs
这个小型模型表现出色。基于 all-MiniLM-L6-v2 模型,仅有 2200 万参数和 384 维度,这款模型应该能够满足最严格的延迟/总拥有成本预算。尽管尺寸较小,但其检索准确率更接近于具有 1 亿参数的模型。
| 模型名称 | MTEB 检索得分 (NDCG @ 10) |
|---|---|
| snowflake-arctic-embed-xs | 50.15 |
| GIST-all-MiniLM-L6-v2 | 45.12 |
| gte-tiny | 44.92 |
| all-MiniLM-L6-v2 | 41.95 |
| bge-micro-v2 | 42.56 |
snowflake-arctic-embed-s
基于 intfloat/e5-small-unsupervised 模型,这款小型模型在保持小尺寸的同时不牺牲检索准确率。仅有 3300 万参数和 384 维度,这款模型应该能够轻松扩展到大型数据集。
| 模型名称 | MTEB 检索得分 (NDCG @ 10) |
|---|---|
| snowflake-arctic-embed-s | 51.98 |
| bge-small-en-v1.5 | 51.68 |
| Cohere-embed-english-light-v3.0 | 51.34 |
| text-embedding-3-small | 51.08 |
| e5-small-v2 | 49.04 |
snowflake-arctic-embed-m
基于 intfloat/e5-base-unsupervised 模型,这款中型模型是提供最佳检索性能同时不减慢推理的主力模型。
| 模型名称 | MTEB 检索得分 (NDCG @ 10) |
|---|---|
| snowflake-arctic-embed-m | 54.90 |
| bge-base-en-v1.5 | 53.25 |
| nomic-embed-text-v1.5 | 53.25 |
| GIST-Embedding-v0 | 52.31 |
| gte-base | 52.31 |
snowflake-arctic-embed-m-long
基于 nomic-ai/nomic-embed-text-v1-unsupervised 模型,我们中型模型的长上下文变体,非常适合受其他模型常规 512 令牌上下文限制的工作负载。在不使用 RPE 的情况下,此模型支持最多 2048 个令牌。使用 RPE,它可以扩展到 8192 个!
| 模型名称 | MTEB 检索得分 (NDCG @ 10) |
|---|---|
| snowflake-arctic-embed-m-long | 54.83 |
| nomic-embed-text-v1.5 | 53.01 |
| nomic-embed-text-v1 | 52.81 |
snowflake-arctic-embed-l
基于 intfloat/e5-large-unsupervised 模型,这款大型模型是封闭 API 的直接替代品,提供最准确的检索体验。
| 模型名称 | MTEB 检索得分 (NDCG @ 10) |
|---|---|
| snowflake-arctic-embed-l | 55.98 |
| UAE-Large-V1 | 54.66 |
| bge-large-en-v1.5 | 54.29 |
| mxbai-embed-large-v1 | 54.39 |
| e5-Large-v2 | 50.56 |
使用
使用 Sentence Transformers
您可以使用 sentence-transformers 包来使用 snowflake-arctic-embed 模型,如下所示。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("Snowflake/snowflake-arctic-embed-m-long", trust_remote_code=True)
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.46484852 The Data Cloud!
0.3758855 Mexico City of Course!
Query: Where can I get the best tacos?
0.42407742 Mexico City of Course!
0.36740506 The Data Cloud!
使用 Huggingface transformers
您可以使用 transformers 包来使用 snowflake-arctic-embed 模型,如下所示。为了获得最佳的检索质量,请使用 CLS 令牌来嵌入每个文本部分,并在查询上使用以下查询前缀(仅在查询上)。
import torch
from transformers import AutoModel, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('Snowflake/snowflake-arctic-embed-m-long')
model = AutoModel.from_pretrained('Snowflake/snowflake-arctic-embed-m-long', trust_remote_code=True, add_pooling_layer=False, safe_serialization=True)
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)
documents = ['The Data Cloud!', 'Mexico City of Course!']
document_tokens = tokenizer(documents, padding=True, truncation=True, return_tensors='pt', max_length=512)
# 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)
如果您使用超过 2048 个令牌的长上下文模型,请确保按以下方式初始化模型。这将使用 RPE 以支持最多 8192 个令牌。
model = AutoModel.from_pretrained('Snowflake/snowflake-arctic-embed-m-long', trust_remote_code=True, safe_serialization=True, rotary_scaling_factor=2)
使用 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-m-long', {
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.36740492125676116, 0.42407774292046635]
常见问题
待定
联系
如果您对此项目有任何问题或建议,欢迎提交 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 基准的研究人员。 正是由于他们不懈努力定义什么是更好的,我们才能提高模型性能。
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=f528b5b4-2ba6-4fc6-8eed-259968d45577" />
Snowflake/snowflake-arctic-embed-m-long
作者 Snowflake
创建时间: 2024-04-12 13:52:31+00:00
更新时间: 2024-12-13 20:53:23+00:00
在 Hugging Face 上查看