/ Модель

Характеристики

Контекст
1 000 000 токенов
Лицензия
Apache 2.0
Архитектура
model2vec · dense
Базовая модель
pubmedbert-base-embeddings
Опубликована
3 янв 2025

pubmedbert-base-embeddings-1M

ЭмбеддингиТекст → embedding6 профессий

Англоязычная модель статических эмбеддингов медицинских текстов для семантического поиска, сравнения сходства и RAG.

391скачиваний за 30 дней2лайкавеса обновлены17 апр 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Публичные оценки24

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

  • PublicHealthQA

    main_score

    Результат

    0,0863

    Общий результат 0,4631Общий результат 0,4455Общий результат 0,2775
    MTEB

    Публичная таблицадругая ревизия

  • MedrxivClusteringP2P.v2

    main_score

    Результат

    0,3507

    MTEB

    Публичная таблицадругая ревизия

  • CUREv1

    main_score

    Результат

    0,02

    Общий результат 0,2552Общий результат 0,2441Общий результат 0,235
    MTEB

    Публичная таблицадругая ревизия

  • SciFact

    main_score

    Результат

    0,5161

    MTEB

    Публичная таблицадругая ревизия

  • STSB

    main_score

    Результат

    −0,0245

    Общий результат 0,0569
    MTEB

    Публичная таблицаревизия совпадает

  • OnlineShopping

    main_score

    Результат

    0,5016

    MTEB

    Публичная таблицаревизия совпадает

  • SciFact-PL

    main_score

    Результат

    0,1621

    MTEB

    Публичная таблицадругая ревизия

  • MultilingualSentiment

    main_score

    Результат

    0,3506

    Общий результат 0,3582
    MTEB

    Публичная таблицаревизия совпадает

  • MedicalQARetrieval

    main_score

    Результат

    0,3078

    MTEB

    Публичная таблицадругая ревизия

  • Waimai

    main_score

    Результат

    0,4639

    MTEB

    Публичная таблицаревизия совпадает

  • ATEC

    main_score

    Результат

    0,034

    MTEB

    Публичная таблицаревизия совпадает

  • AFQMC

    main_score

    Результат

    0,0244

    MTEB

    Публичная таблицаревизия совпадает

  • CMedQAv2-reranking

    main_score

    Результат

    0,0595

    MTEB

    Публичная таблицадругая ревизия

  • IFlyTek

    main_score

    Результат

    0,0566

    MTEB

    Публичная таблицаревизия совпадает

  • Ocnli

    main_score

    Результат

    0,5219

    MTEB

    Публичная таблицаревизия совпадает

  • Cmnli

    main_score

    Результат

    0,5269

    MTEB

    Публичная таблицаревизия совпадает

  • LCQMC

    main_score

    Результат

    −0,0071

    MTEB

    Публичная таблицаревизия совпадает

  • NFCorpus

    main_score

    Результат

    0,229

    MTEB

    Публичная таблицадругая ревизия

  • CLSClusteringS2S

    main_score

    Результат

    0,0454

    MTEB

    Публичная таблицаревизия совпадает

  • PAWSX

    main_score

    Результат

    0,0388

    MTEB

    Публичная таблицаревизия совпадает

  • QBQTC

    main_score

    Результат

    0,1009

    MTEB

    Публичная таблицаревизия совпадает

  • TRECCOVID-PL

    main_score

    Результат

    0,1199

    MTEB

    Публичная таблицадругая ревизия

  • MedrxivClusteringS2S.v2

    main_score

    Результат

    0,3013

    MTEB

    Публичная таблицадругая ревизия

  • TNews

    main_score

    Результат

    0,0936

    MTEB

    Публичная таблицаревизия совпадает

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

PubMedBERT Embeddings 1M — англоязычная модель статических плотных эмбеддингов для медицинских текстов, опубликованная NeuML. Это версия с сокращённым словарём: из PubMedBERT Embeddings 2M оставлена верхняя половина наиболее часто используемых токенов. Модель относится к семейству Model2Vec и может использоваться с txtai, Sentence-Transformers и Model2Vec.

Модель предназначена для построения векторных индексов, семантического поиска и извлечения релевантных материалов для RAG по медицинским публикациям и другим текстам на английском языке. В README приведены результаты сравнения на наборах PubMed QA, PubMed Subset и PubMed Summary; авторы указывают на небольшой компромисс в качестве относительно исходной модели. Контекстная длина в метаданных каталога — до 1 000 000 токенов.

Модель принимает текст и выдаёт векторные представления, применимые для сравнения сходства, поиска и кластеризации. Она ориентирована на медицинский текст и не предназначена для генерации ответов: качество результатов поиска зависит от корпуса, индексации и выбранного порога сходства. Лицензия — Apache-2.0.

Сценарии применения

  • семантический поиск по статьям PubMed
  • поиск ответов и длинных ответов в корпусе PubMed QA
  • сопоставление названий и текстов медицинских публикаций
  • поиск похожих аннотаций к научным статьям
  • индексация медицинских документов для RAG

Ограничения

Модель создаёт эмбеддинги, а не генерирует ответы. Сокращение словаря может ухудшать представление редких токенов; качество зависит от соответствия корпуса медицинской тематике и английскому языку.

Для каких профессий подходит6

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Также подходит для

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

PubMedBERT Embeddings 1M

This is a pruned version of PubMedBERT Embeddings 2M. It prunes the vocabulary to take the top 50% most frequently used tokens.

See Extremely Small BERT Models from Mixed-Vocabulary Training for background on pruning vocabularies to build smaller models.

Usage (txtai)

This model can be used to build embeddings databases with txtai for semantic search and/or as a knowledge source for retrieval augmented generation (RAG).

import txtai

# Create embeddings
embeddings = txtai.Embeddings(
  path="neuml/pubmedbert-base-embeddings-1M",
  content=True,
)
embeddings.index(documents())

# Run a query
embeddings.search("query to run")

Usage (Sentence-Transformers)

Alternatively, the model can be loaded with sentence-transformers.

from sentence_transformers import SentenceTransformer
from sentence_transformers.models import StaticEmbedding

# Initialize a StaticEmbedding module
static = StaticEmbedding.from_model2vec("neuml/pubmedbert-base-embeddings-1M")
model = SentenceTransformer(modules=[static])

sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)
print(embeddings)

Usage (Model2Vec)

The model can also be used directly with Model2Vec.

from model2vec import StaticModel

# Load a pretrained Model2Vec model
model = StaticModel.from_pretrained("neuml/pubmedbert-base-embeddings-1M")

# Compute text embeddings
sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)
print(embeddings)

Evaluation Results

The following compares performance of this model against the models previously compared with PubMedBERT Embeddings. The following datasets were used to evaluate model performance.

  • PubMed QA
    • Subset: pqa_labeled, Split: train, Pair: (question, long_answer)
  • PubMed Subset
    • Split: test, Pair: (title, text)
  • PubMed Summary
    • Subset: pubmed, Split: validation, Pair: (article, abstract)

The Pearson correlation coefficient is used as the evaluation metric.

ModelPubMed QAPubMed SubsetPubMed SummaryAverage
pubmedbert-base-embeddings-8M-M2V (No training)69.8470.7771.3070.64
pubmedbert-base-embeddings-100K74.5684.6581.8480.35
pubmedbert-base-embeddings-500K86.0391.7191.2589.66
pubmedbert-base-embeddings-1M87.8792.8092.8791.18
pubmedbert-base-embeddings-2M88.6293.0893.2491.65

As we can see, the accuracy tradeoff is relatively minimal compared to the original model.

Runtime performance

As another test, let's see how long each model takes to index 120K article abstracts using the following code. All indexing is done with a RTX 3090 GPU.

from datasets import load_dataset
from tqdm import tqdm
from txtai import Embeddings

ds = load_dataset("ccdv/pubmed-summarization", split="train")

embeddings = Embeddings(path="path to model", content=True, backend="numpy")
embeddings.index(tqdm(ds["abstract"]))
ModelModel Size (MB)Index time (s)
pubmedbert-base-embeddings-100K0.219
pubmedbert-base-embeddings-500K1.017
pubmedbert-base-embeddings-1M2.017
pubmedbert-base-embeddings-2M7.517

Vocabulary pruning doesn't change the runtime performance in this case. But the model is much smaller. Vectors are stored at int16 precision. This can be beneficial to smaller/lower powered embedded devices and could lead to faster vectorization times.

Training

This model was vocabulary pruned using the following script.

import json
import os

from collections import Counter
from pathlib import Path

import numpy as np

from model2vec import StaticModel
from more_itertools import batched
from sklearn.decomposition import PCA
from tokenlearn.train import collect_means_and_texts
from tokenizers import Tokenizer
from tqdm import tqdm
from txtai.scoring import ScoringFactory

def tokenize(tokenizer):
    # Tokenize into dataset
    dataset = []
    for t in tqdm(batched(texts, 1024)):
        encodings = tokenizer.encode_batch_fast(t, add_special_tokens=False)
        for e in encodings:
            dataset.append((None, e.ids, None))

    return dataset

def tokenweights(tokenizer):
    dataset = tokenize(tokenizer)

    # Build scoring index
    scoring = ScoringFactory.create({"method": "bm25", "terms": True})
    scoring.index(dataset)

    # Calculate mean value of weights array per token
    tokens = np.zeros(tokenizer.get_vocab_size())
    for x in scoring.idf:
        tokens[x] = np.mean(scoring.terms.weights(x)[1])

    return tokens

# See PubMedBERT Embeddings 2M model for details on this data
features = "features"
paths = sorted(Path(features).glob("*.json"))
texts, _ = collect_means_and_texts(paths)

# Output model parameters
output = "output path"
params, dims = 1000000, 64

path = "pubmedbert-base-embeddings-2M_unweighted"
model = StaticModel.from_pretrained(path)

os.makedirs(output, exist_ok=True)

with open(f"{path}/tokenizer.json", "r", encoding="utf-8") as f:
    config = json.load(f)

# Calculate number of tokens to keep
tokencount = params // model.dim

# Calculate term frequency
freqs = Counter()
for _, ids, _ in tokenize(model.tokenizer):
    freqs.update(ids)

# Select top N most common tokens
uids = set(x for x, _ in freqs.most_common(tokencount))
uids = [uid for token, uid in config["model"]["vocab"].items() if uid in uids or token.startswith("[")]

# Get embeddings for uids
model.embedding = model.embedding[uids]

# Select pruned tokens
pairs, index = [], 0
for token, uid in config["model"]["vocab"].items():
    if uid in uids:
        pairs.append((token, index))
        index += 1

config["model"]["vocab"] = dict(pairs)

# Write new tokenizer
with open(f"{output}/tokenizer.json", "w", encoding="utf-8") as f:
    json.dump(config, f, indent=2)

model.tokenizer = Tokenizer.from_file(f"{output}/tokenizer.json")

# Re-weight tokens
weights = tokenweights(model.tokenizer)

# Remove NaNs from embedding, if any
embedding = np.nan_to_num(model.embedding)

# Apply PCA
embedding = PCA(n_components=dims).fit_transform(embedding)

# Apply weights
embedding *= weights[:, None]

# Update model embedding and normalize
model.embedding, model.normalize = embedding.astype(np.int16), True

model.save_pretrained(output)

Acknowledgement

This model is built on the great work from the Minish Lab team consisting of Stephan Tulkens and Thomas van Dongen.

Read more at the following links.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм

Нельзя запустить

Архитектура model2vec неизвестна transformers в образе рантайма.

Класс архитектуры
StaticModel
Ревизия весов
f099815

0 моделей