Pythonの基礎知識(実践編)

【Pythonの基礎知識】ChatGPT連携で賢く返信するAI執事ボットを作ろう(第2弾)

LINEに「疲れた」と話しかけたら、気の利いた言葉を返してくれる――そんな“気の利く執事ボット”を作ってみませんか?
本記事では、前回作成したLINE×Googleカレンダー連携ボットに「ChatGPTによる自然な返答」を加え、より賢く・柔軟に返してくれるAI執事へと進化させていきます。予定の取得だけでなく、言葉の意図を読み取って対応を変える“文脈理解型ボット”の作り方を、実装付きで解説します。

ChatGPT連携の前に知っておきたいこと

この章では、ChatGPT APIをLINEボットに組み込む前提として知っておくべき基本知識を整理します。Web上で利用できるChatGPTと、プログラムから呼び出すChatGPT APIは異なるサービスであり、利用形態や料金体系にも明確な違いがあります。事前にこの仕組みを理解しておくことで、API連携時の戸惑いや誤解を防ぐことができます。

ChatGPT APIはWeb版とは別物

多くの人が利用しているchat.openai.comのChatGPTは、OpenAIが提供するWebベースのチャットUIです。一方で、APIとして提供されているChatGPT APIは、FlaskなどのプログラムからHTTP経由で呼び出す専用インターフェースです。これらは同じGPTモデルを使っているものの、契約体系や使い方がまったく異なります。

たとえば、chat.openai.comでChatGPT Plus(有料プラン)に加入していても、それはWeb版の優先アクセス権を得ているだけであり、APIを使用する権利は一切含まれていません。API経由でChatGPTを利用したい場合は、別途APIキーを取得し、個別に課金設定を行う必要があります。

APIの利用には課金が必要です

ChatGPT APIは無料では利用できません。初めてAPIを使う場合でも、最低5ドル分のクレジットを事前に購入する必要があります。これは「月額制」ではなく「使った分だけ引かれる従量課金制」で、利用量に応じて自動的にクレジットが消費されていく仕組みです。

料金はモデルによって異なりますが、たとえば gpt-3.5-turbo を使った場合、1回のやりとりに発生するコストは数円〜数十円程度です。ただし、LINEボットなどで大量のやりとりが発生した場合には、あっという間に残高が尽きてしまう可能性があるため、テスト中は頻繁なアクセスを避けるなどの工夫が必要です。

また、クレジット購入時に「自動チャージ(Automatic recharge)」が有効になっていると、残高が減るたびに自動で課金されてしまうため、初回はこの設定をOFFにしておくことを強くおすすめします。

ChatGPT連携の準備をしよう

まず最初に、この記事で紹介するChatGPT連携には、OpenAIのAPIを利用する都合上「実費」が発生します。これはChatGPT本体(chat.openai.com)とは別で、アプリやLINEボットなどに組み込むための「開発者向けAPI」の利用となるため、使った分だけ課金される従量制が適用されます。

ChatGPT APIを利用するには、まず最低5ドル分のクレジットを購入してアカウントを有効化する必要があります。ただし、最初は利用制限(Usage Tier 1)がかかっており、一定以上の利用実績(例:累計50ドル支払い)を積み上げることで、月ごとの利用上限を引き上げることができます。

OpenAI APIの料金体系は、日本国内の一般的なサービスとは異なる独自形式(ドル建て・従量課金制)を採用しています。最新の料金条件や利用規約については、必ず公式サイトを直接ご確認ください。本記事は執筆時点の情報に基づいており、今後変更される可能性もあります。最新情報は公式発表を必ずご確認ください。

つまり、誰でも自由に使える無料のChatGPTとは異なり、「自分のアプリでChatGPTを動かす」には開発者として正式に課金ユーザーになる必要がある、という点を理解しておくことが重要です。

この費用はあなたのLINEボットがどれだけ返答するか、どれだけ複雑な応答をするかによって変動します。大規模に展開しない限り月数百円〜数千円程度に収まるケースが多いですが、無料では使えません。それでも、自分だけのAI執事を作るという体験には、十分に見合う価値があります。

ChatGPT APIを使うには、まずAPIキーの取得と、Pythonからの接続準備が必要です。安全な運用のためにも、APIキーの扱いには注意が必要です。

OpenAIのAPIキーを取得する

OpenAIのAPIを利用するためには、事前にAPIキーを発行する必要があります。現在のUIではメニュー上に表示されないため、専用のページに直接アクセスするのが確実です。

  1. 以下のリンクから APIキー管理ページ にアクセスします。

  2. ログインを求められた場合は、OpenAIアカウントでログインします。
    (ログイン後、APIキー管理ページ にアクセスします。)

  3. 「API keys」ページが表示されたら、画面右上の 「+ Create new secret key」 をクリックします。

  4. 任意の名前を入力し、「Create secret key」ボタンを押します(例:my-ai-butlerchatgpt-key-dev など)。

  5. 表示されたAPIキーをコピーし、必ず安全な場所に保存してください(再表示不可)。

【補足】APIキー発行前に表示される初回セットアップ画面について

OpenAIに初めてログインした直後、いきなりAPIキーが発行できるわけではありません。まずは以下のような「初回セットアップ画面」で、いくつかの入力・選択が求められます。

入力項目と正しい設定例
入力項目入力例補足説明
Organization nameBeproTools
My AI Project
英数字とスペースのみ可。
ハイフン(-)や記号は使用不可。
What best describes you?Individual属性の選択。特に深く考える必要なし。
Initial credit purchase$5最低クレジット額。まずは5ドルでOK。
Automatic rechargeチェックを外す自動課金を防ぎたい場合は必ずOFF。
When credit goes below / Bring credit back up to未入力(空欄)自動課金を使わない場合は空欄で問題なし。

以上を完了すると、APIキーを発行できる画面に進むことができます。エラーなく進めるために、特にOrganization名の形式や自動課金のチェック設定には注意してください。

クレジット残高はどこで確認できる?

現在のAPIクレジット残高は、OpenAIのBillingページからいつでも確認できます。以下の手順でアクセスしてください。

  1. OpenAI Billingページにアクセスします。
  2. 「Usage this month(今月の使用量)」や「Credit balance(クレジット残高)」という表示が確認できます。

「Credit balance」の欄に、現在の残りクレジット(例:$4.87)が表示されます。これが0になると、APIは使えなくなり insufficient_quota エラーが発生します。

なお、使用履歴の詳細を確認したい場合は、同じ画面内にある「Usage」タブから日別・API別の消費量をチェックすることも可能です。

さらに詳しい使用履歴を確認したい場合

Billingページでは「現在のクレジット残高(例:$5.00)」しか表示されません。
より細かい使用状況(いつどのくらい使ったか)を確認したい場合は、左メニューにある「Usage」画面を開いてください。

以下のリンクから直接アクセスすることも可能です。
https://platform.openai.com/account/usage

Usage画面では、日別の消費額、モデルごとの利用量、月間合計などをグラフで確認できます。Botの利用頻度が増えたときなどの分析にも便利です。

ChatGPTとLINEの設定情報を安全に管理する

APIキーやアクセストークンなどの機密情報をコード内に直接書いてしまうのは非常に危険です。セキュリティと保守性を両立させるために、.envファイルを使って外部ファイルに分離し、環境変数として読み込む構成を取りましょう。

ChatGPT APIを使うためのモジュールを事前にインストールする

今回のBotは、LINEからのメッセージをChatGPT(gpt-3.5-turbo)に渡して返答を得る構成になっています。そのため、OpenAIのAPIをプログラムから扱うための公式モジュール openai が必要です。

また、APIキーなどを安全に読み込むための python-dotenv、Webアプリを動かす flask、LINE Messaging APIを扱う line-bot-sdk も必要になります。

以下のコマンドで、これらのモジュールを仮想環境に一括インストールしておきましょう。

pip install openai python-dotenv flask line-bot-sdk

これらのインストールが完了していない状態で python3 app.py を実行すると、以下のようなエラーが確実に出ます。

ModuleNotFoundError: No module named 'openai'

こうしたエラーを防ぐためにも、プログラム実行前に必要なモジュールを明確に導入するのが大前提です。

.envファイルにキー情報をまとめる

.envファイルは最初から存在するものではありません。環境変数を安全に管理するためには、自分で新規に .env ファイルを作成し、必要なキー情報を記述する必要があります。

ターミナル上で作成する場合は、以下のコマンドを実行してください。

vi .env

内容の記述後は、ESCキー → :wq → Enter の順に入力して保存します。

ChatGPTやLINEのAPIを利用するには、それぞれに対して固有の認証情報が必要です。これらをコード内にベタ書きしてしまうと、GitHub等にうっかり公開してしまった場合に不正アクセスを招く恐れがあります。 .env ファイルを用意し、すべてのキー情報を集約しておきましょう。

.envに設定する項目一覧

ChatGPTとLINE Botを連携させるために、.envファイルに記述しておくべき代表的な設定項目を以下の表にまとめました。全て必須の情報です。

取得する情報用途取得場所
LINEチャネルアクセストークンLINE Bot の応答に使用LINE Developers「Messaging API」設定画面
LINEチャネルシークレットWebhookの検証に使用LINE Developers「チャネル基本設定」
OpenAI APIキーChatGPTと接続するために必要https://platform.openai.com/account/api-keys
GoogleカレンダーID予定を取得する対象カレンダーの指定Googleカレンダーの「設定と共有」→ 「カレンダーの統合」
GoogleサービスアカウントJSONパスGoogle Calendar API 認証に必要な秘密鍵ファイルのパスGoogle Cloud Console「IAMと管理」→「サービスアカウント」からJSONを作成・保存

これらの値は、OpenAIのAPI設定画面およびLINE Developersのチャネル基本設定画面から取得できます。文字列はすべて半角英数字で、コピーミスを防ぐためにダブルクリックでコピーするなど丁寧な作業を心がけましょう。

ファイル名はそのまま「.env」でOKです。ファイルの中身は以下のように記述します。

OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LINE_CHANNEL_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXX
LINE_CHANNEL_SECRET=YYYYYYYYYYYYYYYYYYYYYYYYYYYYY
GOOGLE_CALENDAR_ID=ZZZZZZZZZZZZZZZZZZZZZZZZZZ
GOOGLE_SERVICE_ACCOUNT_JSON=GOOGLE_SERVICE_ACCOUNT_JSON_FilePath

このように記述しておけば、Python側からは os.getenv() を通じて環境変数として読み込むことが可能になります。たとえば以下のような形で読み取ります。

import os
from dotenv import load_dotenv

load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
line_bot_api = LineBotApi(os.getenv("LINE_CHANNEL_ACCESS_TOKEN"))
handler = WebhookHandler(os.getenv("LINE_CHANNEL_SECRET"))

この構成にしておくことで、環境ごとに設定値を切り替えたり、キーが漏洩するリスクを大幅に軽減することができます。

※重要:この記事ではLINE SDK v3構文で実装しています

2024年にリリースされた line-bot-sdk-python v3 により、従来の LineBotApiTextSendMessage などのクラスは非推奨(Deprecated)となりました。今後のバージョンで削除される可能性が高いため、この記事では初めから v3構文に完全準拠した実装を紹介しています。


すでにネット上にはv2構文の解説も多くありますが、これから新しくBotを作る場合は、v3構文で開発することが現実的かつ安全な選択です。
コード構造やimport文が従来と大きく異なりますが、本記事では一つひとつ解説しながら進めていきます。

.envファイルは、プログラム内で使う「キーと値」のペア(例:APIキーやパスワードなど)を外部にまとめて管理するためのファイルです。これにより、プログラム本体に直接書き込まずに、設定情報を一元化できます。この考え方は、プログラミング言語によって呼び方は違っても、幅広い開発現場で当たり前に使われています。ファイル設計を効率化し、セキュリティ向上にも役立つ基本的な仕組みです。

.envファイルをGit管理から除外する

もしGitを使ってコードを管理している場合、 .env ファイルをそのままコミットしてしまうのは非常に危険です。APIキーやシークレット情報が含まれているため、リモートリポジトリに流出すると重大なセキュリティ事故に繋がります。

そのため、 .gitignore.env を記載し、Gitの管理対象から除外しておくのが基本ルールです。

echo ".env" >> .gitignore

上記コマンドを実行すると、 .gitignore ファイルに .env の除外ルールが追加されます。これにより、以後Gitは .envファイルを追跡しません。

※すでに .env を一度でもGitでコミットしてしまっている場合は、履歴から削除する必要があります。その場合は git rm --cached .env を実行し、再コミットしてください。

.envファイルは、いわば「クレジットカード番号をメモしておくようなもの」です。もしこのファイルを誤ってGitなどにアップロードしてしまうと、APIキーやパスワードといった重要な情報が外部に漏れてしまう危険性があります。こうしたリスクを防ぐため、.envファイルは必ずGitの管理対象から除外しておく必要があります。

ChatGPT応答をLINEで返すボットの実装

このセクションでは、LINEで受け取ったメッセージをChatGPTに渡し、その応答を再びLINEで返信する仕組みを構築します。LINE SDKはv3構文、OpenAIはv1.0以降の新構文を使用しており、Flaskアプリはポート8000で起動します。

ChatGPTに投げる関数を定義する

ChatGPTと通信するには、OpenAI SDKのChat Completionsエンドポイントを使います。OpenAI v1.0構文では OpenAI() を通じてAPIクライアントを初期化し、そのインスタンスからメソッドを呼び出す形に変わっています。

from openai import OpenAI
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def askChatgpt(user_message):
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": user_message}]
    )
    return response.choices[0].message.content

出力例:

askChatgpt("こんにちは")
→ "こんにちは!何かお手伝いできることはありますか?"

ユーザー入力をChatGPTに渡す

LINEで受信したユーザーのテキストメッセージは、LINE SDK v3構文で event.message.text として取得できます。この内容をそのまま ask_chatgpt() に渡すことで、ChatGPTから応答を得ることができます。

@handler.add(MessageEvent, message=TextMessageContent)
def handleMessage(event):
    user_message = event.message.text
    reply_text = askChatgpt(user_message)

ChatGPTの返答をLINEに返信する

OpenAIの返答をLINEに返信するには、LINE SDK v3で提供される MessagingApi を使い、 ReplyMessageRequest によってメッセージを送信します。以前の line_bot_api.reply_message() 構文はv3では廃止されているため、注意が必要です。

with ApiClient(configuration) as api_client:
    messaging_api = MessagingApi(api_client)
    messaging_api.reply_message(
        ReplyMessageRequest(
            reply_token=event.reply_token,
            messages=[TextMessage(text=reply_text)]
        )
    )

完成版 app.py(コメント付き)

ここまでのコードをすべて統合した完成版が以下です。Flaskアプリはポート8000で起動するようになっており、LINE Developers のWebhook URLもそれに合わせて設定する必要があります。

 

次のステップに進む前に:LINEとChatGPTが正しく連携しているか確認

ここから先の内容(意図分類やAI執事への拡張)は、LINEボットがすでにChatGPTと連携済みで、正しく応答できていることを前提としています。

ステップ①:Webhook URLの疎通確認

まず、LINE Developersの設定画面でWebhook URLを入力した後、「検証」ボタンをクリックしてください。

「成功」または「200 OK」 が返ってくれば、LINEがFlaskアプリにリクエストを正常に送れていることを意味します。

ステップ②:メッセージ送信とChatGPT応答の動作確認

  • Flaskアプリが ポート8000 で起動している
  • .env のAPIキーやトークンが正しく読み込まれている
  • LINEで「こんにちは」「今日の予定」などのメッセージを送信する
  • ChatGPTから自然な返答がLINEで届く
  • ターミナルに "POST /callback" のログが出ていて エラーがない

これらがすべて確認できていれば、次のセクション「🧠 意図を読み取るAI執事に進化させる」に進んで問題ありません。

意図を読み取るAI執事に進化させる

ここからは、ChatGPTの応答をただの「オウム返し」にせず、「ユーザーの目的や意図を理解して応答を切り替える」本物の執事型アプリに進化させていきます。分類ロジックとプロンプト操作を組み合わせて、よりスマートな対応を目指します。

入力文の意図を判定する分類処理を設計

まずは、ユーザーから送られてきた文章が「何を意図しているか」を判断する処理を設計します。今回の例では、「予定を知りたい」「天気を聞いている」「悩みを相談している」といった大まかな分類を想定します。

def classifyIntent(text):
    text = text.lower()
    if "予定" in text or "スケジュール" in text:
        return "schedule"
    elif "天気" in text:
        return "weather"
    elif "やる気" in text or "疲れた" in text:
        return "mental"
    else:
        return "general"

出力例:

classifyIntent("明日の予定を教えて") → 'schedule'
classifyIntent("今日の天気は?") → 'weather'

なお、カスタマイズを深めれば、さらに高性能なボットに進化させることも可能です。ただしそのためには、「ユーザーがどんな場面でどんな言葉を使うか」を体系的に分析し、必要なキーワードや表現パターンを設計するスキルが求められます。この領域は「プロンプトエンジニアリング」と呼ばれ、実際にプロとして活動するエンジニアには月額100万円以上の案件も存在するほどです。この記事ではテンプレート型の基本形に留め、実装まで進めていきます。

意図に応じてChatGPTプロンプトを切り替える

分類された意図に応じて、ChatGPTに渡すプロンプトの内容を変更します。こうすることで、「予定について答えて」「天気について説明して」など、より適切な文脈を持たせた応答が可能になります。

def generatePrompt(intent, user_message):
    if intent == "schedule":
        system_prompt = "あなたは予定管理を手伝うアシスタントです。"
    elif intent == "weather":
        system_prompt = "あなたは天気情報に詳しいアシスタントです。"
    elif intent == "mental":
        system_prompt = "あなたは気持ちに寄り添う共感的なカウンセラーです。"
    else:
        system_prompt = "あなたは親切で柔軟なAIアシスタントです。"

    return [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_message}
    ]

出力例:

generatePrompt("weather", "今日の天気は?")
→ [{"role": "system", "content": "あなたは天気情報に詳しいアシスタントです。"},
    {"role": "user", "content": "今日の天気は?"}]

条件分岐に応じてAPI呼び出しを拡張する(予定、ToDo、天気など)

意図分類に応じて、ChatGPTに直接聞くだけでなく「外部APIを叩いて回答内容を補完する」といった構造に拡張していきます。以下は例として「予定」リクエスト時には Google カレンダーAPIから予定情報を取得し、ChatGPTに渡す構成の一部です。

if intent == "schedule":
    events = get_today_events_from_google_calendar()
    user_message = f"今日の予定はこれです:{events}。内容をわかりやすく説明してください。"

こうして、ChatGPTは「会話の文脈」と「実データ(予定、天気、タスクなど)」を組み合わせて、より高度なAI執事として機能するようになります。

実行してみよう!使用例と動作確認

ここでは、実際にLINEにメッセージを送ってみたときのAI執事の返答例を紹介します。分類処理とプロンプト切り替えが適切に機能していれば、ChatGPTがただ反応するだけでなく、「意図を汲み取って」より適切な返答を返してくれるはずです。

「明日の予定は?」と聞いた時の応答

ユーザーが予定に関するメッセージを送った場合、意図分類で schedule と判定され、Googleカレンダーなどから取得した予定情報をChatGPTに渡す構成になります。

User → 明日の予定は?
Bot → 明日の予定は以下の通りです。
・10:00〜 技術MTG(Google Meet)
・13:30〜 資料提出締切
・18:00〜 同僚との飲み会

何か変更したいものがあれば教えてくださいね。

「最近やる気が出ない」と送った時の返答

気分に関する相談は mental と分類され、ChatGPTには「共感的なカウンセラー」として応答するようプロンプトが渡されます。

User → 最近やる気が出ないんだよね…
Bot → お疲れ様です。日々頑張っている証拠ですよ。
少し休んだり、深呼吸してリフレッシュするのも大切です。
今日は自分を甘やかす日にしてみませんか?

「今日の天気は?」などへの応用力

天気に関するメッセージは weather と分類され、必要に応じて外部APIを活用して補完情報を加えながら応答させることができます。

User → 今日の天気は?
Bot → 今日の東京の天気は「晴れ時々曇り」、最高気温は27℃の予報です。
夜は少し冷え込むかもしれないので、薄手の羽織りを持って出かけると安心です。

このように、AI執事はユーザーの言葉を単純にオウム返しするのではなく、「何を求めているか」を理解したうえで最適な情報や言葉を届けてくれるようになります。

安全な運用と今後の展望

AI執事ボットがユーザーの実生活に関わるようになると、セキュリティや暴走対策、障害時の対応も考慮しなければなりません。ここでは、今後の運用に向けたセーフティ対策と拡張可能性について解説します。

必要に応じて、フィルターやルールベースの制限処理を段階的に導入してください。

エラーハンドリングとログの追加

運用を開始すると、想定外のエラーが必ず発生します。システムが落ちたり、応答が返らなくなることを避けるために、try-except構文を導入したエラーハンドリングと、簡易的なログ出力を行っておきましょう。

try:
    reply_text = askChatgpt(user_message)
except Exception as e:
    reply_text = "申し訳ありません。現在応答できない状況です。"
    print("エラー:", e)

また、ログは print() ベースでも構いませんが、将来的には logger を使ったファイル記録に移行するのが望ましいです。

今後の拡張候補(音声対応、Slack連携など)

AI執事の可能性は、LINEチャットにとどまりません。今後の拡張先として以下のような構想が考えられます。

拡張対象概要技術的な方向性
音声応答LINE通話やスピーカーとの連携で、音声でのやり取りを実現Google Speech API, Whisper, audio出力
Slack対応Slack Botとして組み込み、業務の自動応答や通知に応用Slack Events API, Flask with Bolt
予定登録・更新Googleカレンダーへの予定追加や編集もボット側で処理Google Calendar API 書き込み操作

このような拡張を通じて、AI執事は「話しかけるだけで生活が整う仕組み」として、より現実的で便利な存在へと成長させていけます。

この記事のまとめ

この記事では、ChatGPTとLINEを連携させたAI執事ボットの構築手順を、実装から応用まで段階的に解説しました。Python・Flask・LINE Messaging API・OpenAI APIを組み合わせることで、生活に役立つ自動応答ツールを自作する力を身につけることができます。

  • ChatGPT APIの取得・課金設定・APIキー管理方法を理解した
  • Flaskアプリを使ってLINEからのWebhookを受け取り、ChatGPTの応答を返す構成を構築した
  • .envファイルによる安全なキー管理と、gitignoreによる漏洩防止を学んだ
  • メッセージ内容の分類処理とプロンプト切り替えにより、AI執事らしい「意図の汲み取り」ができるようにした
  • 今後の拡張に向けたセキュリティ対策・ログ処理・API統合案も検討した

この取り組みは、単なるLINE Bot開発を超えて「自分自身のために動く、生活のOSを作る」という考え方に繋がります。記事を参考に、ぜひあなた自身のAI執事をカスタマイズ・拡張してみてください。

よく読まれている記事

1

IT入門シリーズ 🟢 STEP 1: ITの基礎を知る(ITとは何か?) 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか?無料で使えるだけでなく、高い柔軟性 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Pythonの基礎知識(実践編)