Data Cloudで利用できる埋込モデルについて
ベクトル化の裏側を見てみよう
Data Cloudでベクトルデータベースを構築する際に、ベクトルを作成する埋込モデルは現在2種類利用可能となっています。
これらはいずれもHugging Faceで公開されています。
それではベクトル化の裏側を見てみましょう。
2種類のモデル
2つモデルがありますがe5-large-v2は英語のみ、multilingual-e5-largeは日本語を含む94の言語(94 Languageをクリックで展開されます)に対応していることが分かります。
トークン化とベクトル化を試す
実際にトークン化とベクトル化をPythonで試してみました。
対象のテキストはData Cloud画面中の「インデックス設定で各項目のチャンク戦略を設定します。必要に応じて項目を追加または削除するには、[項目を管理] をクリックします。」とします。
下記がコードです。
ライブラリインポート
import pandas as pd
import numpy as np
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline
text="インデックス設定で各項目のチャンク戦略を設定します。必要に応じて項目を追加または削除するには、[項目を管理] をクリックします。"
model_name = "intfloat/multilingual-e5-large"
get_vector = pipeline('feature-extraction', model=model_name)
vector_list = get_vector(text)[0][0]
tokenizer = AutoTokenizer.from_pretrained(model_name)
print(tokenizer.tokenize(text))
print(len(tokenizer.tokenize(text)))
print("ベクトルの長さ",len(vector_list))
print("ベクトル",(vector_list))
multilingual-e5-largeの出力結果
['▁', 'イン', 'デ', 'ックス', '設定', 'で', '各項', '目の', 'チャ', 'ン', 'ク', '戦略', 'を', '設定', 'します', '。', '必要', 'に応じて', '項目', 'を', '追加', 'または', '削除', 'するには', '、', '[', '項目', 'を', '管理', ']', '▁', 'をクリック', 'します', '。']
34
ベクトルの長さ 1024
ベクトル [1.4527733325958252, -0.2817598283290863, -1.4369463920593262, -1.3817939758300781,・・・・]
model_name = "intfloat/e5-large-v2"
get_vector = pipeline('feature-extraction', model=model_name)
vector_list = get_vector(text)[0][0]
tokenizer = AutoTokenizer.from_pretrained(model_name)
print(tokenizer.tokenize(text))
print(len(tokenizer.tokenize(text)))
print("ベクトルの長さ",len(vector_list))
print("ベクトル",(vector_list))
e5-large-v2の出力結果
['イ', '##ン', '##テ', '##ッ', '##ク', '##ス', '[UNK]', '定', 'て', '[UNK]', '[UNK]', '目', 'の', '##チ', '##ャ', '##ン', '##ク', '戦', '[UNK]', 'を', '[UNK]', '定', 'し', '##ま', '##す', '。', '[UNK]', '[UNK]', 'に', '[UNK]', 'し', '##て', '[UNK]', '目', 'を', '[UNK]', '加', 'ま', '##た', '##は', '[UNK]', '[UNK]', 'す', '##る', '##に', '##は', '、', '[', '[UNK]', '目', 'を', '[UNK]', '[UNK]', ']', 'を', '##ク', '##リ', '##ッ', '##ク', '##し', '##ま', '##す', '。']
63
ベクトルの長さ 1024
ベクトル [0.63310307264328, -1.109936237335205, 0.3408355712890625, -0.33901846408843994,,・・・・]
結果の解釈
実行結果を見ると、いずれもベクトル化はできていますが、multilingual-e5-largeと比べるとe5-large-v2にはトークン化されたテキストに[UNK]が多く出現しています。これはどういうことでしょうか。
Hugging FaceのTokenizersに下記の記載があります。
Finally, we need a custom token to represent words that are not in our vocabulary. This is known as the “unknown” token, often represented as ”[UNK]” or ”<unk>”. It’s generally a bad sign if you see that the tokenizer is producing a lot of these tokens, as it wasn’t able to retrieve a sensible representation of a word and you’re losing information along the way. The goal when crafting the vocabulary is to do it in such a way that the tokenizer tokenizes as few words as possible into the unknown token.
翻訳すると下記の通りUNKの出現は少ない方が良さそうです。
最後に、当社の語彙に含まれていない単語を表すカスタムトークンが必要です。これは「不明」トークンと呼ばれ、通常「[UNK]」または「<unk>」と表記されます。トークナイザーがこの種のトークンを大量に生成している場合は、一般的に良くない兆候です。これは、単語の適切な表現を取得できなかったことを意味し、その過程で情報が失われているからです。語彙を構築する際の目標は、トークナイザーが未知のトークンにできるだけ少ない数の単語をトークン化するような方法で行うことです。
よってあくまで一例/一文からの判断にはなりますが、multilingual-e5-largeを使った方がUNKの出現は少ないため、日本語を適切に処理できていると言えそうです。
気になる方はGoogle Colabなどでご自身の確認したいテキストを用いて、トークン化/ベクトル化の結果を確認してみてください。
※本記事は、私が所属する会社とは一切関係のない事柄です。
Discussion