模型库 / nomic-ai/nomic-embed-text-v1

nomic-embed-text-v1

nomic-ai sentence-similarity sentence-transformers en
nomic-ai/nomic-embed-text-v1
7,396,087
下载量
566
收藏数
21
浏览量
apache-2.0
许可

简介

nomic-embed-text-v1:一种可复现的长上下文(8192)文本嵌入器

模型卡片

许可协议 apache-2.0
语言
en
框架 sentence-transformers
任务 sentence-similarity
feature-extraction sentence-similarity mteb transformers transformers.js

模型配置

模型类型 nomic_bert
架构 NomicBertModel

模型详情

已翻译

nomic-embed-text-v1: 可复现的长上下文(8192)文本嵌入器

博客 | 技术报告 | AWS SageMaker | Atlas 嵌入与非结构化数据分析平台

nomic-embed-text-v1 是一个上下文长度为 8192 的文本编码器,在短上下文和长上下文任务上均超越了 OpenAI text-embedding-ada-002 和 text-embedding-3-small 的性能。

性能基准测试

名称 SeqLen MTEB LoCo Jina 长上下文 开放权重 开放训练代码 开放数据
nomic-embed-text-v1 8192 62.39 85.53 54.16
jina-embeddings-v2-base-en 8192 60.39 85.45 51.90
text-embedding-3-small 8191 62.26 82.40 58.20
text-embedding-ada-002 8191 60.99 52.7 55.25

激动人心的更新!nomic-embed-text-v1 现已支持多模态!nomic-embed-vision-v1 已与 nomic-embed-text-v1 的嵌入空间对齐,这意味着任何文本嵌入都是多模态的!

使用方法

重要提示:文本 prompt 必须包含一个任务指令前缀,以告知模型正在执行的任务。

例如,如果你正在实现一个 RAG 应用,你应该将文档嵌入为 search_document:,将用户查询嵌入为 search_query:

注意:从 transformers v5.5.0 和 sentence transformers v5.3.0 开始,trust_remote_code=True 将不再必要。目前仅纯文本系列支持此功能。

任务指令前缀

search_document

目的:将文本作为数据集中的文档进行嵌入

此前缀用于将文本作为文档进行嵌入,例如作为 RAG 索引中的文档。

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("nomic-ai/nomic-embed-text-v1")
sentences = ['search_document: TSNE is a dimensionality reduction algorithm created by Laurens van Der Maaten']
embeddings = model.encode(sentences)
print(embeddings)

search_query

目的:将文本作为待回答的问题进行嵌入

此前缀用于将文本作为可由数据集中文档解答的问题进行嵌入,例如作为 RAG 应用需要回答的查询。

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("nomic-ai/nomic-embed-text-v1")
sentences = ['search_query: Who is Laurens van Der Maaten?']
embeddings = model.encode(sentences)
print(embeddings)

clustering

目的:将文本嵌入以进行聚类分组

此前缀用于将文本嵌入,以便将其分组为聚类、发现共同主题或移除语义重复项。

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("nomic-ai/nomic-embed-text-v1")
sentences = ['clustering: the quick brown fox']
embeddings = model.encode(sentences)
print(embeddings)

classification

目的:将文本嵌入以进行分类

此前缀用于将文本嵌入为向量,这些向量将用作分类模型的特征。

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("nomic-ai/nomic-embed-text-v1")
sentences = ['classification: the quick brown fox']
embeddings = model.encode(sentences)
print(embeddings)

Sentence Transformers

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("nomic-ai/nomic-embed-text-v1")
sentences = ['search_query: What is TSNE?', 'search_query: Who is Laurens van der Maaten?']
embeddings = model.encode(sentences)
print(embeddings)

Transformers

import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel

def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output[0]
    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)

sentences = ['search_query: What is TSNE?', 'search_query: Who is Laurens van der Maaten?']

tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('nomic-ai/nomic-embed-text-v1')
model.eval()

encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')

with torch.no_grad():
    model_output = model(**encoded_input)

embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
embeddings = F.normalize(embeddings, p=2, dim=1)
print(embeddings)

该模型原生支持将序列长度扩展到 2048 token 以上。为此,

- tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
+ tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased', model_max_length=8192)

- model = AutoModel.from_pretrained('nomic-ai/nomic-embed-text-v1')
+ rope_parameters = {"rope_theta": 1000.0, "rope_type": "dynamic", "factor": 2.0}
+ model = AutoModel.from_pretrained('nomic-ai/nomic-embed-text-v1', rope_parameters=rope_parameters)

Transformers.js

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

// Create a feature extraction pipeline
const extractor = await pipeline('feature-extraction', 'nomic-ai/nomic-embed-text-v1', {
    quantized: false, // Comment out this line to use the quantized version
});

// Compute sentence embeddings
const texts = ['search_query: What is TSNE?', 'search_query: Who is Laurens van der Maaten?'];
const embeddings = await extractor(texts, { pooling: 'mean', normalize: true });
console.log(embeddings);

Nomic API

开始使用 Nomic Embed 最简单的方式是通过 Nomic Embedding API。

使用 nomic Python 客户端生成嵌入非常简单:

from nomic import embed

output = embed.text(
    texts=['Nomic Embedding API', '#keepAIOpen'],
    model='nomic-embed-text-v1',
    task_type='search_document'
)

print(output)

更多信息,请参阅 API 参考文档

训练过程

点击下方 Nomic Atlas 地图,可视化我们对比预训练数据的 500 万样本!

image/webp

我们采用多阶段训练流程来训练嵌入器。从长上下文 BERT 模型 开始,第一阶段的无监督对比学习在由弱相关文本对(例如 StackExchange 和 Quora 等论坛的问答对、Amazon 评论的标题-正文对以及新闻文章的摘要)生成的数据集上进行训练。

在第二阶段的微调中,我们利用更高质量的标注数据集,例如来自网络搜索的搜索查询和答案。数据整理和难例挖掘在此阶段至关重要。

更多详情,请参阅 Nomic Embed 技术报告 及相应的博客文章

用于训练模型的训练数据已完整发布。更多详情,请参阅 contrastors 代码库

加入 Nomic 社区

  • Nomic: https://nomic.ai
  • Discord: [https://discord.gg/myY5YDR8z8](https://discord.gg/m

标签

onnx nomic_bert feature-extraction mteb transformers.js custom_code en arxiv:2402.01613

操作


详细信息

厂商
nomic-ai
任务
sentence-similarity
框架
sentence-transformers
模型类型
nomic_bert
许可(HF)
apache-2.0
语言
en