1.2重BOS問題の注意
・Gemma, LLamaなどは設定通りに動かすとプロンプトの先頭にBOSが2つ付与されてご動作してしまうケースがある
・話題になった事はあるが、トレーニングツール、ベンチマークツール、インターフェースツールのいずれかが誤動作するので現在も解決していない
・最新モデルなどではBOSが不要になる可能性はあるが、歴史的な経緯をしらないと間違える可能性があるのでここにまとめます
2.BOSとは?
AIにある程度詳しい人ならばプロンプトという言葉は聞いたことがあると思います。
実はプロンプトはAIに渡す時に特定のフォーマット(プロンプトテンプレート)に整形して渡しています。
例: <s>[INST] こんにちは [/INST]
従来のLLM(Gemma, LLama)はプロンプトテンプレートの最初に、Beginning of Sentence(文頭)の意味でBOSを付けています。AIにとっての「開始の合図」です。
この開始の合図を2重になってしまう、アイキャッチ画像のようにヨーイドン!の合図がダブルになってしまうのが2重BOS問題です。
3.なぜ「2重」になるのか?
Gemma3やLLama3は
1)設定ファイル(tokenizer_config.json)内で”add_bos_token”: trueと設定しています
2)プロンプトテンプレート(chat_template)の中でも先頭にBOS(“chat_template”: “{{- bos_token }}\n…)を付けています
1)は歴史的な理由で主にベンチマーク系のツール/コマンドが使っています。
2)は歴史的な理由で主に推論系ツール系が使っています。
どちらかを一方を削除するとどちらかが誤動作する可能性があるので気軽には消せません。そして、素直に両方を見るツールもあるので、その場合に2重BOS問題が発生します。
この問題はそれなりに知られているのでツール側で自動対処/警告を出してくれる場合もありますが「フラグ管理はユーザーの責任」という考え方の元に、先頭に2つのBOSがついてしまうケースもあります。
2重BOS問題が発生しても100%出力がおかしくなるわけではなく「(主に小さいモデルで)繰り返し出力など稀に発生して出力の品質が悪くなる」と言うレベルなので、気づかずに使ってしまう時もあるかもしれませんが、FineTuneや量子化などを実行する際は注意してください
Webbigdataが直近作成した量子化モデル

は迷った末に1)の設定ファイル側でadd_bos_token: falseにしてあります。そのため、このモデルを使ってベンチマーク(llama-perplexity)などをする際は、何らかの形でadd_bos_tokenをtrueにしないと正確な計測できない事があるケースに注意してください
4. アテンションシンクとの関係性
なぜBOSが2つあるだけでAIはダメになるのでしょうか?ここに「アテンションシンク」という概念が関わります。
アテンションシンク(Attention Sink)とは:
最近のLLM(大規模言語モデル)の特性として、「最初のトークン(BOS)に、とりあえず強い注意(アテンション)を向ける」という傾向があります。そのため、BOSがないと、最初のトークンに必要のない注意を払う事になるので、最初のトークン、つまりBOSは、計算を安定させるための「キッチンの流し台(シンク)」や「錨(アンカー)」のような役割を果たしています。
2重BOSになると…:AIは「最初のBOSを錨にすべきか? 2番目のBOSを錨にすべきか?」と混乱します。想定外の挙動を起こし、回答の品質が劇的に下がったり、支離滅裂な文章を出したりします。
しかし、Qwen等のより新しいモデルではアテンションシンクを和らげる手法が発見されたため、あまり問題にならなくなってきています。これらはBOSトークンを必須としない設計、あるいはトークナイザーが非常に賢くなっており、空気を読んで処理します。
とはいえ、Gemma3もLlama3もまだまだ現役なので「なんか回答がおかしいな?」と思ったら、入力をトークン化してみて「BOSが2重になっていないか(add_bos_token=False にしてみる)」を確認してみてください

