🚀 opensearch-neural-sparse-encoding-v1
このモデルは、学習済みの疎行列検索モデルです。クエリとドキュメントを30522次元の疎ベクトルにエンコードし、OpenSearchの高レベルAPIを用いてインデックス作成と検索を行うことができます。
🚀 クイックスタート
モデルの選択
モデルは、検索の関連性、モデルの推論、および検索効率(FLOPS)を考慮して選択する必要があります。BEIRベンチマークのサブセットであるTrecCovid、NFCorpus、NQ、HotpotQA、FiQA、ArguAna、Touche、DBPedia、SCIDOCS、FEVER、Climate FEVER、SciFact、Quoraで、モデルのゼロショット性能をベンチマークしています。
全体的に、v2シリーズのモデルは、v1シリーズよりも検索の関連性、効率、および推論速度が優れています。具体的な利点と欠点は、データセットによって異なる場合があります。
📚 ドキュメント
概要
これは学習済みの疎行列検索モデルです。クエリとドキュメントを30522次元の疎ベクトルにエンコードします。非ゼロ次元のインデックスは語彙内の対応するトークンを意味し、重みはトークンの重要度を意味します。
このモデルは、MS MARCOデータセットで学習されています。
OpenSearchのニューラル疎行列機能は、Luceneの転置インデックスを使用した学習済みの疎行列検索をサポートしています。リンク: https://opensearch.org/docs/latest/query-dsl/specialized/neural-sparse/ 。インデックス作成と検索は、OpenSearchの高レベルAPIを使用して実行できます。
💻 使用例
基本的な使用法
import itertools
import torch
from transformers import AutoModelForMaskedLM, AutoTokenizer
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
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
model = AutoModelForMaskedLM.from_pretrained("opensearch-project/opensearch-neural-sparse-encoding-v1")
tokenizer = AutoTokenizer.from_pretrained("opensearch-project/opensearch-neural-sparse-encoding-v1")
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."
feature = tokenizer([query, document], padding=True, truncation=True, return_tensors='pt', return_token_type_ids=False)
output = model(**feature)[0]
sparse_vector = get_sparse_vector(feature, output)
sim_score = torch.matmul(sparse_vector[0],sparse_vector[1])
print(sim_score)
query_token_weight, document_query_token_weight = transform_sparse_vector_to_dict(sparse_vector)
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))
上記のコードサンプルは、ニューラル疎行列検索の例を示しています。元のクエリとドキュメントに重複するトークンがないにもかかわらず、このモデルは良好なマッチングを行います。
詳細な検索関連性
📄 ライセンス
このプロジェクトは、Apache v2.0 Licenseの下でライセンスされています。
著作権
Copyright OpenSearch Contributors。詳細はNOTICEを参照してください。