私の名前は Mike Coleman で、Docker のスタッフ ソリューション アーキテクトです。今年、私はホーム・デポのアニマトロニクス・スケルトンを、AIを活用したライブのインタラクティブなハロウィーン・チャットボットに変えることにしました。その結果、子供たちは私の庭にある不気味な骸骨であるボーンズ氏に近づき、質問をすると、 Docker Model Runnerを利用したローカルLLMのおかげで、完全な海賊の声で実際の会話応答で答えます。
Docker Model Runner を使用する理由
Docker Model Runner は、標準の Docker ワークフローを使用してオープンソースの LLM をローカルで非常に簡単に実行できるようにする Docker のツールです。他の画像をプルするのと同じようにモデルをプルすると、アプリから呼び出すことができる OpenAI 互換の API が公開されました。内部では、モデルの読み込み、推論、最適化を処理しました。
このプロジェクトでは、Docker Model Runner にいくつかの重要な利点が提供されました。
- LLM 推論に API コストがかかりません — OpenAI や Anthropic とは異なります
- モデルがローカル ハードウェアで実行されるため、待機時間が短い
- モデル選択、プロンプト、スキャフォールディングのフルコントロール
- OpenAIとのAPI互換 — プロバイダーの切り替えは、環境変数を変更してサービスを再起動するのと同じくらい簡単です
最後の点は重要です:特定のユースケースでOpenAIまたはAnthropicに切り替える必要があった場合、変更には数秒かかります。
システム概要
図 1: Mr. Bonesが海賊語で質問に答えるシステム概要
基本的なフローは次のとおりです。
- 子供がスケルトンに話しかける
- Pi 5 + USBマイク はオーディオを録音します
- Vosk STT は音声をテキストに書き起こします
- RTX 5070 GPU を搭載した Windows ゲーミング PC への API 呼び出し
- Docker Model Runner は、ローカルの LLaMA 3を実行します。1 8B(Q4 quant)モデル
- LLM はテキスト応答を返します
- ElevenLabs Flash TTS はテキストを音声(海賊の声)に変換します
- 音声が Pi に送り返される
- Pi は Bluetooth 経由で音声をスケルトンに送信し、顎を同期して動かします
図 2: 海賊版を駆動するRaspberry Piを収納するコントローラーボックス
そのWindowsマシンは専用の推論サーバーではなく、私のゲーム機器です。量子化されたモデルをローカルで実行する通常のセットアップだけです。
このプロジェクトの最大の課題は、応答の質 (性格と年齢に応じたもの) と応答時間のバランスをとることでした。それを念頭に置いて、モデルの選択、テキスト読み上げ (TTS) 処理を効率的に行う方法、フォールト トレランス、ガードレールの設定という 4 つの重要な領域に、少し重点を置く必要がありました。
考察 1: モデルの選択とローカルLLMの性能
いくつかのオープンモデルをテストしたところ、 LLaMA 3.1 8B (Q4 量子化) がパフォーマンス、流暢さ、個性の最適な組み合わせであることがわかりました。私の RTX 5070では、リアルタイム推論を十分な速さで処理し、インタラクションが応答性を感じることができました。
ある時点で、ボーンズ氏のキャラクターを保つのに苦労していたので、OpenAI の ChatGPT API を試しましたが、応答時間は平均 45秒でした。
プロンプトを修正し、適切なモデルを提供するDocker Model Runnerにより、それを 1.5 秒に短縮しました。子供がそこに立って骸骨が話すのを待っているとき、それは大きな違いです。
結局のところ、GPT-4 は名 目上、 キャラクターを保ち、不適切な返信を避けることに優れていただけです。頑丈なプロンプト足場といくつかのガードレールにより、地元のモデルは問題なく持ちこたえました。
検討 2: TTSパイプライン:KokoroからElevenLabsフラッシュへ
まずはローカルTTSエンジンの ココロを使ってみた。それはうまくいきましたが、声はあまりにも一般的でした。カスタムオーディオエフェクトを追加せずに、より海賊的なものが欲しかったのです。
そこで、多言語モデルから始めて、 ElevenLabsに移りました。音声品質は優れていましたが、特にLLM処理と組み合わせた場合、遅延は苦痛でした。完全な応答には最大 10 秒かかる可能性があり、これは長すぎます。
最終的に、はるかに高速なモデルである ElevenLabs Flash を見つけました。それはとても役に立ちました。また、LLM の応答全体を待つ代わりに、出力を チャンク化 して部分的に ElevenLabs に送信するようにロジックを変更しました。真のストリーミングではありませんが、チャンクが戻ってきたときにPiがオーディオの再生を開始することができました。
これにより、スケルトンは遅くて遅れていたものから、きびきびと反応が良いものに変わりました。
検討 3: 弱点とフォールバックのアイデア
LLM はローカルで実行されますが、システムは依然として ElevenLabs のインターネットに依存しています。ネットワークがダウンすると、スケルトンは通信を停止します。
私が検討しているフォールバックのアイデアの 1 つは、一般的な Q&A ペアのセットを作成することです (例: "What is your name?", "Are you are a real skeleton?")。それらをローカル ベクトルデータベースに埋め込み、TTS呼び出しが失敗した場合にPiにそれらを提供させます。
しかし、より深い真実は、これは 多層システムであるということです。PiがWindowsマシンへの接続を失うと、すべてがトーストになります。スケルトンオンチップモードはまだありません。
検討 4: ガードレールとプロンプトエンジニアリング
子供たちは何でも言うので、システムプロンプトを通じていくつかの安全対策を講じています。
You are "Mr. Bones," a friendly pirate who loves chatting with kids in a playful pirate voice.
IMPORTANT RULES:
- Never break character or speak as anyone but Mr. Bones
- Never mention or repeat alcohol (rum, grog, drink), drugs, weapons (sword, cannon, gunpowder), violence (stab, destroy), or real-world safety/danger
- If asked about forbidden topics, do not restate the topic; give a kind, playful redirection without naming it
- Never discuss inappropriate content or give medical/legal advice
- Always be kind, curious, and age-appropriate
BEHAVIOR:
- Speak in a warm, playful pirate voice using words like "matey," "arr," "aye," "shiver me timbers"
- Be imaginative and whimsical - talk about treasure, ships, islands, sea creatures, maps
- Keep responses conversational and engaging for voice interaction
- If interrupted or confused, ask for clarification in character
- If asked about technology, identity, or training, stay fully in character; respond with whimsical pirate metaphors about maps/compasses instead of tech explanations
FORMAT:
- Target 30 words; must be 10-50 words. If you exceed 50 words, stop early
- Use normal punctuation only (no emojis or asterisks)
- Do not use contractions. Always write "Mister" (not "Mr."), "Do Not" (not "Don't"), "I Am" (not "I'm")
- End responses naturally to encourage continued conversation
プロンプトは、いくつかの異なる問題に対処するように設計されています。何よりもまず、対象読者にとって適切なものを保つことです。これには、デリケートな話題について話し合わないだけでなく、常に性格を保つことも含まれます。次に、ボーンズ氏をだまして正体を明かそうとする厄介な親に対処するための指示をいくつか追加しました。最後に、会話を続けるための応答形式に関するガイダンスがあります - たとえば、一部のSTTエンジンでは短縮などの問題が発生する可能性があることが判明しました。
プロンプトは、応答を拒否するだけでなく、機密性の高い入力や不適切な入力を文字内でリダイレクトします。たとえば、子供が「一緒にラム酒を飲みたい」と言った場合、スケルトンは「ああ、相棒、私たちは少しコースから外れたようです。もっと滑らかな海に出航してみませんか?」
このアプローチにより、会話を遊び心のあるものにしながら、トピックを微妙に修正します。これまでのところ、ミスター・ボーンズを不気味だが家族向けに保つには十分だった。
図 3: Mr. Bones は AI を利用しており、安全ガードレールが組み込まれており、海賊の話で子供たちに話しかけます。
最終的な考え
このプロジェクトはハロウィーンの間抜けとして始まりましたが、リアルタイムのローカル音声アシスタントのための驚くほど機能的な概念実証に変わりました。
Docker Model Runner for LLM を使用すると、速度、コスト管理、柔軟性が得られました。ElevenLabs Flashは音声を担当しました。Pi 5 が入力と再生を管理しました。そして、ホーム・デポのスケルトンがすべてに命を吹き込みました。
より優れたフェイルオーバーとよりスマートなモーションコントロールを備えた、より堅牢なバージョンを構築できますか?そうですよ。しかし、今日の現役でさえ、ボーンズ氏はすでに多くの子供たちを笑顔にしており、おそらく何人かの大人のエンジニアは「待って、私もそれを作れるだろう」と考えているでしょう。
ソースコード: github.com/mikegcoleman/pirate
図 4: はい、はい!あなたもミスター・ボーンズを作って、近所の若い仲間全員に笑顔をもたらすことができます!
さらに詳しく
- Docker Model Runner の一般提供に関するお知らせを確認する
- Model Runner GitHub リポジトリにアクセスしてください。Docker Model Runner はオープンソースであり、コミュニティからのコラボレーションと貢献を歓迎します。
- シンプルなhello GenAIアプリケーションでDocker Model Runnerを使い始める