最新动态 | 模型介绍 | 使用方法 | 性能评估 | 联系我们 | 常见问题 许可协议 | 致谢
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)进行训练,并通过多阶段 pipeline 优化其检索性能。首先,使用大批量的查询-文档对训练模型,其中负样本通过批内获取——预训练利用了约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 |
这款轻量级模型性能相当出色。它基于仅有2200万参数和384维度的all-MiniLM-L6-v2模型构建,能够满足最严苛的延迟和总拥有成本(TCO)预算要求。尽管体积小巧,其检索精度却接近拥有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 |
该小型模型基于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 |
该中型模型基于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 |
该模型是中型模型的长上下文变体,基于nomic-ai/nomic-embed-text-v1-unsupervised模型构建,非常适合受限于其他模型常规512 token上下文长度的工作负载。在不使用RPE的情况下,该模型支持多达2048个token;使用RPE时,可扩展至8192个token!
| 模型名称 | MTEB 检索分数(NDCG @ 10) |
|---|---|
| snowflake-arctic-embed-m-long | 54.83 |
| nomic-embed-text-v1.5 | 53.01 |
| nomic-embed-text-v1 | 52.81 |
该大模型基于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 包来调用 snowflake-arctic-embed 模型,如下所示。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("Snowflake/snowflake-arctic-embed-s")
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.533809 The Data Cloud!
0.49207097 Mexico City of Course!
Query: Where can I get the best tacos?
0.56592476 Mexico City of Course!
0.48255116 The Data Cloud!您可以使用 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-s-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()如果您尚未安装,可以通过运行以下命令从 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-s', {
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.48255123876493394, 0.5659250100112143]待补充
如果您对本项目有任何疑问或建议,欢迎提交 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 基准测试的研究人员。 正是由于他们不懈的努力,定义了“更好”的标准,我们才能够提升模型性能。