/ Модель

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

Контекст
512 токенов
Лицензия
Apache 2.0
Архитектура
distilbert · dense
Библиотека
sentence-transformers
Опубликована
17 июл 2024

opensearch-neural-sparse-encoding-doc-v2-distill

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

Разреженный энкодер OpenSearch на базе DistilBERT для семантического поиска документов и извлечения релевантных фрагментов.

28 577скачиваний за 30 дней19лайковвеса обновлены30 июн 2025

Бенчмарки

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

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

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

  • ProceduralMemBench

    main_score

    Результат

    0,5142

    MTEB

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

  • MemGovern

    main_score

    Результат

    0,871

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

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

  • TMD

    main_score

    Результат

    0,0369

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

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

  • CQADupstackGisRetrieval

    main_score

    Результат

    0,3529

    MTEB

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

  • EPBench

    main_score

    Результат

    1

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

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

  • NFCorpus

    main_score

    Результат

    0,3434

    MTEB

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

  • KnowMeBench

    main_score

    Результат

    0,2703

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

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

  • ReMe

    main_score

    Результат

    0,4587

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

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

  • Gorilla

    main_score

    Результат

    0,2905

    MTEB

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

  • ConvoMem

    main_score

    Результат

    0,352

    MTEB

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

  • LoCoMo

    main_score

    Результат

    0,2849

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

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

  • ESGReports

    main_score

    Результат

    0,4388

    MTEB

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

  • NQ

    main_score

    Результат

    0,5275

    MTEB

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

  • LongMemEval

    main_score

    Результат

    0,7802

    MTEB

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

  • DBPedia

    main_score

    Результат

    0,4177

    MTEB

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

  • CQADupstackPhysicsRetrieval

    main_score

    Результат

    0,4004

    MTEB

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

  • MemBench

    main_score

    Результат

    0,7298

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

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

  • DeepPlanning

    main_score

    Результат

    0,6057

    MTEB

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

  • QASPER

    main_score

    Результат

    0,493

    MTEB

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

  • REALTALK

    main_score

    Результат

    0,6446

    MTEB

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

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

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

Модель opensearch-neural-sparse-encoding-doc-v2-distill разработана участниками OpenSearch для поиска по документам. Это разреженный энкодер на базе DistilBERT с 67 млн параметров, обученный для поиска и извлечения документов. Он преобразует документ в разреженный вектор размерности 30 522: индексы ненулевых элементов соответствуют токенам словаря, а значения отражают их важность. Для запроса в описанном сценарии используется токенизатор и таблица весов, а релевантность вычисляется как скалярное произведение векторов запроса и документа.

Модель предназначена для семантического поиска и поиска фрагментов в корпусах документов, в том числе в OpenSearch с обратным индексом Lucene. В сравнении на подмножестве BEIR модель показала средний NDCG@10 0,528; результаты различаются по наборам данных. Поддерживается английский язык, контекст — до 512 токенов. Репозиторий предоставляет веса PyTorch и Safetensors, модель совместима с Sentence Transformers и API Hugging Face. Лицензия — Apache 2.0.

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

  • поиск релевантных документов в корпусе
  • поиск ответов и фрагментов для системы вопросов и ответов
  • семантический поиск в OpenSearch с обратным индексом Lucene
  • ранжирование документов по запросу через сходство разреженных векторов

Ограничения

Контекст ограничен 512 токенами; качество поиска зависит от набора данных и может различаться между предметными областями. В карточке приведены результаты бенчмарка на подмножестве BEIR, поэтому они не гарантируют аналогичного качества на других корпусах.

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

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

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

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

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

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

Открыть на Hugging Face

opensearch-neural-sparse-encoding-doc-v2-distill

Select the model

The model should be selected considering search relevance, model inference and retrieval efficiency(FLOPS). We benchmark models' zero-shot performance on a subset of BEIR benchmark: TrecCovid,NFCorpus,NQ,HotpotQA,FiQA,ArguAna,Touche,DBPedia,SCIDOCS,FEVER,Climate FEVER,SciFact,Quora.

Overall, the v2 series of models have better search relevance, efficiency and inference speed than the v1 series. The specific advantages and disadvantages may vary across different datasets.

ModelInference-free for RetrievalModel ParametersAVG NDCG@10AVG FLOPS
opensearch-neural-sparse-encoding-v1133M0.52411.4
opensearch-neural-sparse-encoding-v2-distill67M0.5288.3
opensearch-neural-sparse-encoding-doc-v1✔️133M0.4902.3
opensearch-neural-sparse-encoding-doc-v2-distill✔️67M0.5041.8
opensearch-neural-sparse-encoding-doc-v2-mini✔️23M0.4971.7
opensearch-neural-sparse-encoding-doc-v3-distill✔️67M0.5171.8
opensearch-neural-sparse-encoding-doc-v3-gte✔️133M0.5461.7

Overview

This is a learned sparse retrieval model. It encodes the documents to 30522 dimensional sparse vectors. For queries, it just use a tokenizer and a weight look-up table to generate sparse vectors. The non-zero dimension index means the corresponding token in the vocabulary, and the weight means the importance of the token. And the similarity score is the inner product of query/document sparse vectors.

The training datasets includes MS MARCO, eli5_question_answer, squad_pairs, WikiAnswers, yahoo_answers_title_question, gooaq_pairs, stackexchange_duplicate_questions_body_body, wikihow, S2ORC_title_abstract, stackexchange_duplicate_questions_title-body_title-body, yahoo_answers_question_answer, searchQA_top5_snippets, stackexchange_duplicate_questions_title_title, yahoo_answers_title_answer.

OpenSearch neural sparse feature supports learned sparse retrieval with lucene inverted index. Link: https://opensearch.org/docs/latest/query-dsl/specialized/neural-sparse/. The indexing and search can be performed with OpenSearch high-level API.

Usage (Sentence Transformers)

First install the Sentence Transformers library:

pip install -U sentence-transformers

Then you can load this model and run inference.

from sentence_transformers.sparse_encoder import SparseEncoder

# Download from the 🤗 Hub
model = SparseEncoder("opensearch-project/opensearch-neural-sparse-encoding-doc-v2-distill")

query = "What's the weather in ny now?"
document = "Currently New York is rainy."

query_embed = model.encode_query(query)
document_embed = model.encode_document(document)

sim = model.similarity(query_embed, document_embed)
print(f"Similarity: {sim}")
# Similarity: tensor([[17.5307]])

decoded_query = model.decode(query_embed)
decoded_document = model.decode(document_embed)

for i in range(len(decoded_query)):
    query_token, query_score = decoded_query[i]
    doc_score = next((score for token, score in decoded_document if token == query_token), 0)
    if doc_score != 0:
        print(f"Token: {query_token}, Query score: {query_score:.4f}, Document score: {doc_score:.4f}")

# Similarity: tensor([[17.5307]], device='cuda:0')
# Token: ny, Query score: 5.7729, Document score: 1.4109
# Token: weather, Query score: 4.5684, Document score: 1.4673
# Token: now, Query score: 3.5895, Document score: 0.7473

Usage (HuggingFace)

This model is supposed to run inside OpenSearch cluster. But you can also use it outside the cluster, with HuggingFace models API.

import json
import itertools
import torch

from transformers import AutoModelForMaskedLM, AutoTokenizer


# get sparse vector from dense vectors with shape batch_size * seq_len * vocab_size
def get_sparse_vector(feature, output):
    values, _ = torch.max(output*feature["attention_mask"].unsqueeze(-1), dim=1)
    values = torch.log(1 + torch.relu(values))
    values[:,special_token_ids] = 0
    return values
    
# transform the sparse vector to a dict of (token, weight)
def transform_sparse_vector_to_dict(sparse_vector):
    sample_indices,token_indices=torch.nonzero(sparse_vector,as_tuple=True)
    non_zero_values = sparse_vector[(sample_indices,token_indices)].tolist()
    number_of_tokens_for_each_sample = torch.bincount(sample_indices).cpu().tolist()
    tokens = [transform_sparse_vector_to_dict.id_to_token[_id] for _id in token_indices.tolist()]

    output = []
    end_idxs = list(itertools.accumulate([0]+number_of_tokens_for_each_sample))
    for i in range(len(end_idxs)-1):
        token_strings = tokens[end_idxs[i]:end_idxs[i+1]]
        weights = non_zero_values[end_idxs[i]:end_idxs[i+1]]
        output.append(dict(zip(token_strings, weights)))
    return output
    
# download the idf file from model hub. idf is used to give weights for query tokens
def get_tokenizer_idf(tokenizer):
    from huggingface_hub import hf_hub_download
    local_cached_path = hf_hub_download(repo_id="opensearch-project/opensearch-neural-sparse-encoding-doc-v2-distill", filename="idf.json")
    with open(local_cached_path) as f:
        idf = json.load(f)
    idf_vector = [0]*tokenizer.vocab_size
    for token,weight in idf.items():
        _id = tokenizer._convert_token_to_id_with_added_voc(token)
        idf_vector[_id]=weight
    return torch.tensor(idf_vector)

# load the model
model = AutoModelForMaskedLM.from_pretrained("opensearch-project/opensearch-neural-sparse-encoding-doc-v2-distill")
tokenizer = AutoTokenizer.from_pretrained("opensearch-project/opensearch-neural-sparse-encoding-doc-v2-distill")
idf = get_tokenizer_idf(tokenizer)

# set the special tokens and id_to_token transform for post-process
special_token_ids = [tokenizer.vocab[token] for token in tokenizer.special_tokens_map.values()]
get_sparse_vector.special_token_ids = special_token_ids
id_to_token = ["" for i in range(tokenizer.vocab_size)]
for token, _id in tokenizer.vocab.items():
    id_to_token[_id] = token
transform_sparse_vector_to_dict.id_to_token = id_to_token



query = "What's the weather in ny now?"
document = "Currently New York is rainy."

# encode the query
feature_query = tokenizer([query], padding=True, truncation=True, return_tensors='pt')
input_ids = feature_query["input_ids"]
batch_size = input_ids.shape[0]
query_vector = torch.zeros(batch_size, tokenizer.vocab_size)
query_vector[torch.arange(batch_size).unsqueeze(-1), input_ids] = 1
query_sparse_vector = query_vector*idf

# encode the document
feature_document = tokenizer([document], padding=True, truncation=True, return_tensors='pt')
output = model(**feature_document)[0]
document_sparse_vector = get_sparse_vector(feature_document, output)


# get similarity score
sim_score = torch.matmul(query_sparse_vector[0],document_sparse_vector[0])
print(sim_score)   # tensor(17.5307, grad_fn=<DotBackward0>)


query_token_weight = transform_sparse_vector_to_dict(query_sparse_vector)[0]
document_query_token_weight = transform_sparse_vector_to_dict(document_sparse_vector)[0]
for token in sorted(query_token_weight, key=lambda x:query_token_weight[x], reverse=True):
    if token in document_query_token_weight:
        print("score in query: %.4f, score in document: %.4f, token: %s"%(query_token_weight[token],document_query_token_weight[token],token))
        

        
# result:
# score in query: 5.7729, score in document: 1.4109, token: ny
# score in query: 4.5684, score in document: 1.4673, token: weather
# score in query: 3.5895, score in document: 0.7473, token: now

The above code sample shows an example of neural sparse search. Although there is no overlap token in original query and document, but this model performs a good match.

Detailed Search Relevance

ModelAverageTrec CovidNFCorpusNQHotpotQAFiQAArguAnaToucheDBPediaSCIDOCSFEVERClimate FEVERSciFactQuora
opensearch-neural-sparse-encoding-v10.5240.7710.3600.5530.6970.3760.5080.2780.4470.1640.8210.2630.7230.856
opensearch-neural-sparse-encoding-v2-distill0.5280.7750.3470.5610.6850.3740.5510.2780.4350.1730.8490.2490.7220.863
opensearch-neural-sparse-encoding-doc-v10.4900.7070.3520.5210.6770.3440.4610.2940.4120.1540.7430.2020.7160.788
opensearch-neural-sparse-encoding-doc-v2-distill0.5040.6900.3430.5280.6750.3570.4960.2870.4180.1660.8180.2240.7150.841
opensearch-neural-sparse-encoding-doc-v2-mini0.4970.7090.3360.5100.6660.3380.4800.2850.4070.1640.8120.2160.6990.837
opensearch-neural-sparse-encoding-doc-v3-distill0.5170.7240.3450.5440.6940.3560.5200.2940.4240.1630.8450.2390.7080.863
opensearch-neural-sparse-encoding-doc-v3-gte0.5460.7340.3600.5820.7160.4070.5200.3890.4550.1670.8600.3120.7250.873

License

This project is licensed under the Apache v2.0 License.

Copyright

Copyright OpenSearch Contributors. See NOTICE for details.

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

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

GPU в ailist

Универсальный рантайм · sentence-transformers

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

Первый модуль sentence-transformers (sentence_transformers.models.Router) рантайм не поддерживает.

Класс архитектуры
DistilBertForMaskedLM
Ревизия весов
8921a26

0 моделей