二週間ほど、Apple IntelligenceのオンデバイスLLM、Foundation Modelsを使うApplローカル翻訳アプリケーションを作っていました。
Qitta: Apple IntelligenceのFoundation Modelsを使うローカル翻訳アプリ
note: Pre-Babel Lensのv0.5.0を公開しました
note: iPhone版 Pre-Babel Lens 発売(なるか?)
これからのLLMプログラミングで注意した方がいいかなと思うようなことをいくつか学んだので、公開したいと思います。
- モデル組み込みのセーフガード
- コンテキスト爆発
- 解答の厳密さと負荷
モデル組み込みのセーフガード
前述の記事でも書いていますが、AppleはApple Intelligenceが安全に利用できるよう、細心の注意を払っています。それは利用規約に始まり、開発者向けのブログやドキュメントにも記され、そしてオンデバイスモデル(ローカル駆動モデル)、Foundation Modelsにはモデルそのものにセーフガードが組み込まれています。Apple Machine Learning Research, Apple Intelligenceの、中段にあるHuman Evaluation of Output Harmfulnessでは、Apple Intelligenceが他のモデルと比較して、暴力やプライバシー侵害などを出力しないで耐えられることを示しています。
ハッキングやチャレンジを避けるためでしょう。具体的な記述はありませんが、多くのサンプルを翻訳させると、概ね以下のような内容を出力しないように調整されていることがわかります。
- 未成年の行動
- プライバシー
- 暴力・虐待の具体的な描写
- 特定の政治的コンテンツ
私のアプリケーションで出力に上記の内容が含まれると、モデルから空の出力が返ります。これは単語レベルの検出にとどまりません。14yo(14歳)を含む文が翻訳できない時にその単語を削っても、それが未成年の行動に関することだと推察されれば出力が得られないことが、多々あります。中国をC国にしても、ガザやイスラエルを「ある国」「ある地域」にしても、文脈から出力できなくなることが多々あります。
翻訳アプリとしては困るので、機械学習ベースの翻訳エンジン、Apple Translaltion Frameworkで翻訳できなかったところは翻訳し直すことにしています。
青い部分が機械翻訳によるフォールバックサポートです。
面倒は面倒ですが、今後は他社のモデルでもガードレールが目立ってくることでしょうから、予行演習としてApple Intelligenceを触っておくのはいいかもしれません。
コンテキスト爆発
Apple Intelligenceのコンテキストは4096トークンまで、とされていました(v26で少し長くなったようですが)。コンテキストを超過するとcontext windowやexceeded model context window sizeとエラーが出たり、長い処理時間がかかったり、構造化出力が壊れたり、無限繰り返しストリームが現れたりします。
ここではこの症状をコンテキスト爆発と呼ぶことにします。そしてこれは、大きなタスクだけが原因とも限りません。例えば上記のセーフガードは、頻繁にコンテキスト爆発を引き起こします。
セーフガードの発動はApple Intelligenceに大きな負荷をかけるようで、まず普通の出力よりも処理時間がかかります。またセーフガードと思われる出力不能が出ると、わずかな処理しか行っていなくても、セッションからexceeded model context window sizeが出るようになります。
厳密解答と負荷
厳密タスクもコンテキスト爆発が起こることがあります。
例えば、100ワードほどの文書を与えて「記事」「文芸」「SNS」「技術文書」から選ばせるセッションを作ると、ただ一つのStringを返すだけの関数でも、高い確率でコンテキストを圧迫します。いきなりexceeded model context window sizeが出ることもしばしばです。
もちろん回避策はあり、文書のタイプとして二つ、あるいは三つの候補を、それっぽい順番で並べなさいと指示すると、翻訳と同時に実行してもコンテキストを削るようなことはなくなります。また、候補に「一般」があった時は、ほぼ全ての回答が「一般」になり、コンテキストの圧迫は起こりません。
当たり障りのない答えが選べる時はストレスがないということです。まるで人間のようで、実に微笑ましいです😤。
まとめ
遊んでみると面白いのですが、翻訳アプリには不適切なところも多いので、アプリの翻訳エンジンは機械翻訳ベースに差し替えました。これからは校正や執筆支援のために使う方法を考えてみたいなと思います。
ちょっとだけ、なんでも釘に見えてしまっていたようです。
