密ベクトルは現在ではText Embeddingサービスやvllm
などを使えば簡単に生成をてきる。
疎ベクトルは色々と探しましたが、直接利用できるサービスがあまりはない、自分で用意しなければならない。
Qdrant
が提供するfastembed
は利用できますけど、対応している疎ベクトルモデルが少ないため、最後的にsentence_transformers
のSparseEncoder
を利用することにしました。
例えば、以下のようなドキュメントがあるとします:
docx = [
"test1",
"test2",
"test3",
"test4",
]
戻り値の形式がわかりにくく、少し混乱しました:
document_embeddings.coalesce().indices().cpu().numpy() =
[[ 0 0 0 0 1 1 1 2 2 2 3 3 ] [ 5 25 29 56 4035 4038 4059 1 2 3 98 67 54]]
document_embeddings.coalesce().values().cpu().numpy() =
[0.03429046 0.02966345 0.03258647 0.03258648 0.03258649 0.03137818 0.0306967 0.04750843 0.0475084 0.0475085 0.03258612 0.03137328]
Qdrant疎ベクトル形式の引数要求は以下のようになります:
indices = [ 5 25 29 ... ]
values = [ 0.03429046 0.02966345 0.03258647 ... ]
最後はなんとかわかりました、実は:
indices
の1次元目が0
の要素が、docs[0]
(“test1”) に対応します。indices
の1次元目が1
の要素が、docs[1]
(“test2”) に対応します。- …
したがって、疎ベクトルは以下のようになります。