← トップにもどる

無応答ゼロ化 — LINEのAI社員が「既読無視」しない仕組み

実体: templates/line-bot/(このキットのLINE公式アカウントAI社員bot金型)
実証: line-harness-oss(ai-shain.link で実運用中の「りんく」)

💬 まず、りんくに聞いてみる(人向け・やさしい説明)

りんく りんく
💬 ある日、こんなことがありました
今日は財布なくして何処にもなくて疲れた
財布なくして大変でしたね。今日はゆっくり休んでくださいね。財布を見つけるのを手伝うことや、他のことをお手伝いできることがあればお知らせください。

りんくは、ふだんは1番手のAI(Groq)が答えています。とても速くて、無料で、たいていの会話はこれで十分です。
でも、AIサービスにも「混んでいて返事が遅い」「一時的に調子が悪い」という日があります。 もし1番手が答えられなかったら、りんくは黙り込むのではなく、 こっそり2番手(Gemini)、それでもダメなら3番手(Cloudflare Workers AI)に聞きに行きます。 ユーザーからは「誰が答えたか」は見えません。見えるのは「ちゃんと返事が来た」ということだけです。

なぜこれが大事なのか: LINEでAIが無言のままだと、ユーザーには「壊れている」「無視された」としか見えません。 エラーメッセージも出ないので、運営側も気づくのが遅れがちです。1つのAI会社に全部を任せず、 「誰かが答えられなければ、他の誰かが答える」という体制にしておくことで、この一番気づきにくい壊れ方を防ぎます。

🛠️ 仕組み(AI向け・技術的な説明)

3段フォールバックチェーン

bot.config.jsonllm.chain に定義された順に試し、最初に成功した段の応答を採用する。全滅時のみ定型お詫び文言まで落ちる。

Groq
llama-3.3-70b
8秒
→ 失敗なら →
🔷Gemini
2.5-flash-lite
10秒
→ 失敗なら →
☁️Workers AI
llama-3.3-70b-fp8
8秒
役割特徴
1番手Groqふだんの主力最速。既存キャラプロンプトの調律先
2番手Gemini安定担当無料枠が寛大・可用性が高い。未設定でも自動スキップ
3番手Workers AI最終防波堤Worker内バインディング経由=外部ネットワーク障害の影響を受けない

replyToken失効(約60秒)への対策

LINEの返信トークンは発行から約60秒で失効する。各段には個別のタイムアウトがあり、 「残り時間が足りない段は丸ごとスキップして次へ」という残り時間駆動で動く。 前段の処理(友だち情報の取得・DB検索等)が想定外に遅延しても、必ずどこかの段か 定型文の床まで到達する。

送信側にも保険があり、replyMessage(返信トークン方式)が失敗した場合は、 自動でpushMessage(トークン不要、いつでも送れる)に切り替える。 これが効くのは、従来なら「例外を握りつぶして完全に無言化」していたはずの経路。

コスト

既定¥0/月。Gemini・Workers AIはGroq障害時にしか呼ばれないため、 通常運用では無料枠の範囲に収まる。全プロバイダが同時に不調な月でも、 従量課金化した場合の見積りは数百円規模にとどまる。

関連ファイル

📚 実例(実際に起きた障害と直し方)

事例: URLを含むメッセージの後、AI応答が完全に止まった

LINE公式アカウント「りんく」で、ユーザーが際どい話題を含むメッセージを送った直後から、 そのユーザー宛の返信が一切来なくなった。ログを見ると、受信は記録されているのに送信ログが1件も無い状態だった。

調べたこと(消去法)

  1. LINE公式アカウント管理画面の「応答メッセージ」設定 → 正常(OFF)。原因ではない
  2. キーワード自動返信ルール → このユーザーのアカウントには1件も登録なし。原因ではない
  3. ai_reply_mode(担当者引き継ぎフラグ)がhumanのまま固定されていないか → 確認したがbotのまま。原因ではない
  4. コードを読み直すと、AIがエスカレーション判定(担当者に確認が必要、という判定)を返したときに 本文が空だと無言のまま担当者引き継ぎモードに切り替わるだけというパスが実際に存在した
直したこと: エスカレーション時は本文が空でも「ちょっと待っててね、中の人につなぐね」という 一言を必ず返すよう修正。あわせてエスカレーション条件そのものも、「専門的だから」という理由だけでは 発動しないよう絞り込んだ(AIはまず自分で調べて答え切ることを優先する)。

その上で今回の無応答ゼロ化チェーンを実装。今後同種の問題(1社のAPI障害・タイムアウト・ コンテンツフィルタの不可解な挙動)が起きても、自動で次のAIに切り替わるため、 「気づいたら数日間ずっと無言だった」という事態を構造的に防げる。

出典: _docs/LINE-BOT-EXTRACTION-NOTES.md(移植判断の記録)/ line-harness-oss 実運用ログ(2026-07-16〜17)。

🚀 自分のアプリで使う

  1. app.config.jsonlineBot セクションを埋めて enabled: true
  2. templates/line-bot/ をアプリの line-bot/ にコピーし、{{...}} を置換
  3. Secretsを投入: LINE_CHANNEL_ACCESS_TOKEN / LINE_CHANNEL_SECRET / GROQ_API_KEY
  4. (強く推奨)GEMINI_API_KEY も投入する。Google AI Studioで無料発行できる。未設定でもGroq→Workers AIの2段構成として動く
  5. wrangler.toml[ai] バインディングはテンプレートに同梱済み。追加設定は不要

くわしい手順は templates/line-bot/README.md を参照。