JOURNAL

AI LINE Botを作った話 — Claude・ChatGPT・Geminiを切り替えられる設計にした理由

Simple Line Botの次に手を出したのが、AIと会話できるAI LINE Botです。設計段階で一番こだわった、というか意地になったのは、特定のAIサービスに縛られない作りにすることでした。

今のAI業界、正直言って動きが早すぎます。今日の最新モデルが半年後には型落ち扱いされてたりするので、Claude・ChatGPT・Geminiのどれでも動かせるように、AIプロバイダーごとの処理を独立したモジュールに切り分けました。

プロバイダー提供元
ClaudeAnthropic
ChatGPTOpenAI
GeminiGoogle
API設定ファイル
▲ 設定ファイルから簡単にAPIの設定ができます。

設定ファイルでどれを使うか切り替えるだけで、コード本体には手を入れなくていい構造にしています。

「気に入らなくなったら乗り換えられる」を最初から前提にしておかないと、AIの進化スピードは目まぐるしいものがあります、進化に合わせて使うAIを変えていくことは当然の選択なのです。

単に雑談ができるだけだと正直ちょっと物足りない気がしたので、設定例として、店舗の情報(営業時間や商品情報とか)をプロンプトに組み込んで、実際の業務っぽい場面でも使えるようにしています。設定ファイルを差し替えれば、別の店舗・別の用途にも流用できる作りです。

「特定のAIに依存しない」というのは正直今のところ余計な手間が増えるだけの選択です。それでも、長く付き合っていくことを考えると、ここはケチっちゃいけない部分だと思っています。

各社の応答形式の違いは、緩い規約レベルで吸収

ai_providers/フォルダの中にclaude.phpopenai.phpgemini.phpを置いて、それぞれ同じ入出力の形の関数として実装しています。

function callClaudeAI($systemPrompt, $history, $userMessage, $apiKey, $model)  // 戻り値は常に文字列
function callOpenAIAI($systemPrompt, $history, $userMessage, $apiKey, $model)
function callGeminiAI($systemPrompt, $history, $userMessage, $apiKey, $model)

webhook.php側はこの関数さえ呼べば良いので、プロバイダーが変わってもほぼ手を加える必要がありません。ただ正直に言うと、これはPHPのinterfaceabstract classを使った正式な抽象化ではなく、「関数のシグネチャを揃える」という緩い規約レベルの共通化です。各社固有の差異は、関数の中身で個別に吸収しています。

プロバイダーsystem指定認証方式備考
Claudesystemパラメータが独立x-api-keyヘッダー
OpenAImessages配列内にrole: systemとして混在Authorization: Bearer
Geminisystem_instructionが独立x-goog-api-key発言ロール名がassistantではなくmodelという独自仕様があり、変換処理が必要

APIキーはconfig.php直書き。.envは使っていません

このツールは「初心者が一般的なレンタルサーバーにアップロードするだけで使える」ことを最優先にしているので、.envは採用していません。.env+非公開領域への配置は、SSHやサーバー設定の変更が必要になるケースが多く、想定している利用者層には少々面倒が増えてしまうと判断しました。

かわりに、別に設定を設けてそちらから行って頂く仕様にしています。
いずれにしましても、API利用の際には必ず金額の上限値と通知の設定を行うようにしてください、これに関しては設定ファイル内やREADMEにも何度も記載をさせて頂いております。この部分、特に重要です。

会話履歴はファイルベースで保持

ユーザーごとにstorage/{md5(userId)}.jsonというJSONファイルを作成し、直近MAX_HISTORY_TURNS(初期値6往復)分だけ保持しています。データベースを使わずファイルベースにしたのも、一般的なレンタルサーバーでもDBのセットアップなしにそのまま動かせるようにするためです。HISTORY_RETENTION_HOURS(初期値6時間)を超えた履歴は、Webhookが呼ばれたタイミングで自動削除される仕組みにしています。

Docker含む実環境で動作確認済み

Docker環境を含めた実際のサーバー環境で、Claude・OpenAI・Geminiの3プロバイダー切り替えと、LINEのWebhook連携を一通り確認しています。目立った不具合はなく、設計通りに動作しました。

とはいえ、運用を続ける上で気に留めておきたい点は残っています。

  • 各社のモデル名は世代交代が頻繁で、ハードコードした初期値がいずれ陳腐化する前提で設計している
  • 実際にご利用いただく中で、LINEアプリ内蔵ブラウザでのダウンロード不可という実運用で初めて判明した問題が1件あった(配布フロー側の話で、AI連携部分とは別)

本格的な運用を考えるなら、他にも色々と検討しないといけませんが、まずはAIによる自動化の入り口として、活用頂けたら嬉しいです。