5つの実験をつなげると、LLMへの入力はどう見えるのか? #06
ここまで5つの実験をしてきました。
今回は新しい実験をせず、一度ここまで見えたものをつなげてみます。
#01 LLMを動かして、外から観察する
「日本の首都はどこ?」
↓
LLM
↓
「東京です」
この時点では、
文字
↓
???
↓
文字
LLMの中は、ほぼ全部ブラックボックスでした。
#02 文字をToken IDにしてみる
「日本の首都はどこ?」
↓
Tokenize
↓
[131888, 106114, 15322, 130028, 11319]
逆方向も、
[131888, 106114, 15322, 130028, 11319]
↓
Detokenize
↓
「日本の首都はどこ?」
つまり、
文字
↕
Token / Token ID
LLMでは、文字をそのまま扱っているわけではなさそうです。
#03 Token IDはどこから来る?
"Hello"
↓
Tokenize
↓
9707
GGUFを見ると、
GGUF
↓
tokenizer.ggml.tokens
↓
[9707]
↓
"Hello"
つなげると、
GGUF
↓
tokenizer.ggml.tokens
↓
Token ↔ Token ID
TokenとToken IDの対応を、GGUFの中で確認できました。
#04 Token IDからTokenへ戻る処理を追う
9707
↓
?
↓
"Hello"
処理を追っていくと、
Token ID
↓
Token
↓
文字
つまり、
文字
↓
Tokenize
↓
Token ID
↓
Detokenize
↓
文字
Token IDから文字側へ戻る処理も存在していました。
#05 実際の推論でTokenを数える
入力
↓
Token
↓
tokens_evaluated
↓
???
↓
Token
↓
tokens_predicted
↓
出力
実際の推論でも、入力側と出力側のToken数を観察できました。
5つをつなげる
最初は、
文字
↓
???
↓
文字
でした。
5つの実験をつなげると、
入力文字列
↓
Tokenize
↓
Token
↓
Token ID
│
├──── GGUF
│ ↓
│ tokenizer.ggml.tokens
│
↓
tokens_evaluated
↓
???
↓
生成されたToken
↓
tokens_predicted
↓
Detokenize
↓
出力文字列
ブラックボックスだった部分の、
文字
↓
Token
↓
Token ID
そして、
Token ID
↓
Token
↓
文字
までは見えるようになりました。
ここまで分かったこと
文字
↕
Token
↕
Token ID
GGUF
↓
tokenizer.ggml.tokens
↓
Token ↔ Token ID
入力Token
↓
tokens_evaluated
生成Token
↓
tokens_predicted
そして、まだ見えていないのは、
Token ID
↓
???
↓
生成Token
ここです。
次は?
例えば、
"Hello"
↓
9707
↓
???
Hello → 9707 までは観察できました。
では、
9707 がLLMに入ったあと、最初に何が起きるのでしょうか?
次は、ここから続きを観察してみます。