ローカルLLMとYouTube APIを結合した自作ライブアシスタント「AIakagi76」の設計と実装アーキテクチャ

ライブ配信のコメント欄における荒らし対策や、自動モデレーションと有人監視のハイブリッド運用を効率化するため、ローカル環境で完結するYouTube Liveアシスタントボット「AIakagi76」を設計・実装しました。

本記事では、SaaS型ツールに依存せず、オンプレミス環境(Linuxサーバー)上でAIとAPIを結合させたシステムのアーキテクチャ、設計思想、および開発現場で直面した技術的課題の克服プロセスを玄人向けに解説します。

1. システムアーキテクチャ概要

外部クラウドの有料AI APIに依存せず、完全なローカル環境(自宅Linuxサーバー X9SRA)上で動作するスタンドアロンなデーモンとして設計しています。

  • ホスティング環境: Linux (Ubuntu系) + systemd によるデーモン化 (aiakagi76.service)
  • ランタイム: Python仮想環境 (aiakagi_venv)
  • チャット取得レイヤー: pytchat ライブラリによるリアルタイム・ポーリング
  • API書き込みレイヤー: Google API Client Library for Python (OAuth2 認証・token.pickle 永続化)
  • 推論エンジン: ローカルホスト上の Ollama (gemma2 モデル / http://localhost:11434/api/generate)
  • データ永続化: ローカルストレージ上の CSV (all_chat_log.csv, chat_log.csv)。cp932 エンコーディングによる文字化け防止と、30日間のスライディングウィンドウ型ログローテーションを実装。

2. コア設計:チャンネル別動的ポリシー制御 (CHANNEL_MODES)

単一のスクリプトプロセスで複数チャンネルを同時監視しつつ、配信の性質(自配信 vs 外部支援)に応じた挙動の乖離を安全に吸収するため、CHANNEL_MODES 辞書によるパーチャンネル・ポリシー制御を採用しています。

Python

CHANNEL_MODES = {
    "aaaaaaaaaaa": "full",    # 自主配信枠:対話・おみくじ・パトロール全開放
    "bbbbbbbbbbb": "patrol",  # 外部支援枠:NGワード検出・警告のみ(標準モデレーター)
    "xxxxxxxxx": "silent",   # 完全見守り枠:ログ記録のみ(書き込みゼロ)
}
  • 安全性の担保: 外部配信枠(patrol / silent)では、API書き込み関数(send_youtube_message)レベルでガードをかけ、誤爆によるスパム判定や配信者への迷惑行為を物理的に遮断します。
  • 多層防御のクールダウン機構: APIクォータ制限(Quota Limits)とチャット欄のインフレーションを防ぐため、複数のクールダウンを独立制御しています。
    • グローバルクールダウン(GLOBAL_COOLDOWN_SEC = 15)
    • ユーザー別クールダウン(USER_COOLDOWN_SEC = 30)
    • おみくじ専用クールダウン(OMIKUJI_COOLDOWN_SEC = 3600)

3. 実装上の技術的チャレンジとハック

① systemd 環境下における標準出力のバッファリング問題

  • 課題: systemd のサービスとしてバックグラウンド稼働させた際、Pythonの標準出力(print)がブロックバッファリングされ、journalctl にリアルタイムでログが流れない現象が発生。
  • 解決: 各ログ出力や例外処理の直後に sys.stdout.flush() を明示的に挿入し、デーモンプロセスの可観測性(Observability)を確保。

② シェルインジェクション汚染と SyntaxError の根絶

  • 課題: スクリプトのインライン更新時に、ターミナル用のシェルスクリプト(cat << 'EOF' やエコーコマンド)が誤って bot.py の1行目に混入し、Pythonインタープリタがパースエラー(SyntaxError: invalid syntax)で即座にクラッシュ、systemd の再起動ループに陥るトラブル。
  • 解決: シェル経由の直接流し込みを廃し、テキストエディタ(nano)による純粋なPythonコードブロックのベタ書き運用へワークフローを厳格化。

③ ローカルLLM(Ollama / gemma2)のフォールトトレランス

  • 課題: 大規模言語モデルの推論時に発生するレイテンシスパイクや、HTTPコネクションタイムアウト(60秒)による例外発生時、ボットのメイン監視ループ全体が巻き添えで死なない堅牢性が必要。
  • 解決: requests.post を try-except ブロックで完全にラップし、例外発生時やステータスコード異常時にはフォールバック文字列を返すか、例外をログに吐いてループを継続。さらに、出力文字列は強制的に50文字以内にスライス(text[:49] + "…")し、YouTubeチャットの視認性を最適化。

4. 運用モニタリングとデバッグ手法

実運用時のトラブルシューティングには、以下のコマンドチェーンを標準採用しています。

Bash

# リアルタイムログのテール監視(エラー・ステータスの追跡)
sudo journalctl -u aiakagi76.service -f --no-pager

# サービスの手動再起動
sudo systemctl restart aiakagi76.service

まとめ

AIによる自動モデレーション(コンテキスト解析・NGワード検知)と、配信者・モデレーターの意図的なポリシー切り替えをコードベースで統合したこの仕組みは、小規模から中規模のライブ配信において、極めて高い堅牢性とプライバシー(ローカルLLM完結)を両立する実践的なアーキテクチャと言えます。

タイトルとURLをコピーしました