見出し画像

PythonとChatGPT APIで共感型カウンセリング・デスクトップアプリを作成する

近年、AI 技術の発展に伴い、自然言語処理を利用したチャットボットやカウンセリングアプリが注目を集めています。特に、OpenAI 社が提供する ChatGPT API は、高度な言語理解と生成能力を持ち、より自然で共感的なコミュニケーションを可能にしています。

本記事では、Python の GUI ライブラリである tkinter を使って、ChatGPT API を活用した共感的カウンセリングアプリをデスクトップアプリとして開発する方法を紹介します。このアプリは、ユーザーの悩みや相談に対して、AI が共感的な応答を提供することを目的としています。

デスクトップアプリを作成することには、以下のような利点があります。

  1. ブラウザを介さずに直接 API と通信するため、レスポンスが速い

  2. ユーザーのプライバシーを保護しやすい

  3. ユーザーインターフェースをカスタマイズしやすい

  4. 家庭や職場のコンピューターにインストールすることで、多くの人が手軽に ChatGPT 応用アプリを利用できる

特に、最後の点は重要です。Web アプリケーションとは異なり、デスクトップアプリは実行環境を選ばないため、より多くのユーザーに届けることができます。これにより、AI を活用した共感的カウンセリングの恩恵を、より多くの人々が享受できるようになります。

本記事を通して、Python と tkinter を使ったデスクトップアプリ開発の基礎を学ぶことができます。また、ChatGPT API との連携方法や、共感的な応答を生成するためのテクニックについても解説します。最終的には、Windows と Mac の両方で動作する配布用プログラムを作成し、パッケージ化する方法も紹介します。

記事をご覧いただき、ありがとうございます。noteで4つ目の有料記事を公開できました。公開記念として10部限定で、100円で販売します。興味のある方はお早めにご購入ください。


記事概要

本記事では、Python の GUI ライブラリである tkinter を使って、ChatGPT API を活用した共感的カウンセリングアプリをデスクトップアプリとして開発する方法を詳細に解説します。記事は大きく5つの部分に分かれています。

第1部では、デスクトップアプリ開発の基礎として、tkinter について説明し、ユーザーインターフェースの実装方法を紹介します。

第2部では、ChatGPT API との連携方法について深く掘り下げます。API の概念から始まり、OpenAI アカウントの作成、API キーの取得、使用状況の確認など、API を利用するために必要な手順を説明します。さらに、API 実装の設計、エンドポイントへの問い合わせ、認証方法、リクエストの形式、レスポンスの処理など、技術的な詳細についても解説します。

第3部では、ユーザーとの会話履歴をデータベースに保存し、後で復元できるようにする方法を紹介します。これにより、ユーザーは過去の会話を振り返ることができ、より効果的なカウンセリングが可能になります。

第4部では、カウンセリングアプリをより使いやすくするために、ChatGPT からの応答を音声で読み上げる機能の実装方法を説明します。

第5部では、開発したアプリケーションを配布可能なスタンドアローンの実行ファイルにパッケージ化する方法を、PyInstaller を使って Windows と Mac それぞれの環境で解説します。

これらの内容を通して、読者は Python と tkinter を使ったデスクトップアプリ開発の基礎から、ChatGPT API との連携、高度な機能の実装、アプリケーションの配布まで、一連の流れを学ぶことができます。本記事が、AI を活用した共感的カウンセリングアプリの開発に挑戦する開発者にとって、有益な情報源となることを願っています。

第1部 デスクトップアプリ開発を開始する

近年、Web アプリケーションの人気が高まっていますが、デスクトップアプリケーションの開発には、今なお多くのメリットがあります。デスクトップアプリは、ユーザーのローカル環境で直接実行されるため、ブラウザを介さずに動作し、レスポンスが速いという利点があります。また、ハードウェアリソースへの直接アクセスが可能なため、高いパフォーマンスを発揮できます。

デスクトップアプリは、ユーザーインターフェースのカスタマイズ性が高いことも大きな利点です。開発者は、オペレーティングシステムのガイドラインに沿ったネイティブな見た目を実現できるだけでなく、独自のデザインを適用することで、ブランドイメージを強化することもできます。さらに、キーボードショートカットやドラッグアンドドロップといった直感的な操作を取り入れることで、ユーザーの利便性を高められます。

本アプリケーションは、ChatGPT API を使用しているため、インターネット接続が必須ですが、API との通信は暗号化された接続を通じて行われるため、データの傍受や改ざんのリスクは軽減されます。また、ユーザーの入力内容は、ローカル環境で処理されるため、Web アプリケーションと比較して、プライバシーを保護しやすいというメリットがあります。

デスクトップアプリの大きな利点の一つは、実行ファイルの形で配布できることです。これにより、ユーザーは、インストールプロセスを経ずに、アプリを手軽に利用できます。また、家族や友人、同僚などの身近な人に実行ファイルを渡すことで、アプリを共有し、よりパーソナルなコミュニケーションを促進できます。この点は、共感的カウンセリングアプリにとって特に重要です。

Python と tkinter を使ってデスクトップアプリを開発することで、これらのメリットを活かしたアプリケーションを作成できます。tkinter は、Python の標準ライブラリに含まれているため、追加のインストールが不要で、手軽に開発を始められます。また、tkinter は、クロスプラットフォームに対応しているため、同じコードを使って、Windows、Macなど、さまざまな環境で動作するアプリを開発できます。

はじめに、プログラミングを行う「開発環境」について説明します。

開発環境について

本記事の開発は、Windows と Mac のどちらの環境でも行うことができます。ただし、Python の開発を始めるには、まずパソコンに Python をインストールする必要があります。Python は、公式ウェブサイト(https://www.python.org/)からダウンロードできます。インストールの際は、自分のオペレーティングシステムに合ったバージョンを選ぶようにしてください。Windowsの場合は、インストール画面の「Add python.exe to PATH」にチェックを入れて、どのフォルダーからでもPythonが実行できるようにしておきましょう。

本記事では、公式ウェブサイトのインストーラーを使用してPythonを導入する方法を紹介しました。この方法が、初心者にとって最も迷わずに導入できる方法だと考えたためです。
Pythonのインストール方法には、他にもWindows Storeからインストールする方法、Anaconda (Miniconda)を使用してインストールする方法、Homebrewを利用してインストールする方法など、多種多様な手段が提供されています。これらの方法にはそれぞれ長所と短所があります。本記事で紹介した方法以外のインストール方法を検討される方は、インターネットなどで情報を収集し、比較検討してみてください。

Python のコードは、メモ帳などのシンプルなテキストエディタでも書くことができます。しかし、一般的には、Visual Studio Code(VS Code)などの統合開発環境(IDE)を使用することをおすすめします。

IDE を使う主なメリットは以下の通りです。

  1. シンタックスハイライト
    IDE は、Python の文法に応じてコードの色付けを行います。これにより、コードの可読性が向上し、エラーを見つけやすくなります。

  2. インテリセンス
    IDE は、コードを入力する際に、関数名や変数名の補完を提案します。これにより、タイプミスを防ぎ、コーディングのスピードを上げられます。

  3. デバッグ機能
    IDE には、デバッガが内蔵されています。デバッガを使うことで、コードの実行を一時停止し、変数の値を確認したり、ステップ実行したりできます。これは、エラーの原因を特定する際に非常に役立ちます。

  4. ファイル管理
    IDE には、プロジェクトのファイルを管理するためのファイルエクスプローラが用意されています。これにより、複数のファイルを簡単に操作できます。

  5. 拡張機能
    多くの IDE には、拡張機能をインストールできる仕組みがあります。拡張機能を使うことで、IDE の機能を拡張し、開発をより効率的に行えます。

本記事では、筆者が Mac Studio M2 を使用して開発を行っているため、スクリーンショットなどは Mac の環境で撮影されています。Windows 環境では、画面の見た目が多少異なる場合がありますが、基本的な操作方法は同じです。Windows ユーザーの方は、適宜読み替えてください。

なお、Python のバージョンによって、一部の文法や関数の使い方が異なることがあります。本記事では、Python 3.9 を使用していますが、Python 3.6 以降であれば、ほとんどのコードは同じように動作するはずです。

それでは、実際に Python の開発環境を整え、tkinter を使ったデスクトップアプリケーションの開発を始めていきましょう。次節では、tkinter を使ったユーザーインターフェースの実装方法について詳しく説明します。tkinter の基本的なウィジェットの使い方から、レイアウトの設定、イベント処理の方法まで、デスクトップアプリ開発に必要な知識を身につけましょう。

tkinterについて

tkinter は、Python の標準のGUIライブラリであり、Tcl/Tk を Python にバインドしたものです。Tcl(ティックル)は、ツールコマンド言語(Tool Command Language)の略で、Tk(ティーケー)は、Tcl の GUI ツールキットです。tkinter を使うことで、Python でデスクトップアプリケーションを開発できます。

tkinter の特徴は以下の通りです。

  1. Pythonの標準ライブラリ
    tkinter は Python の標準ライブラリに含まれているため、Python がインストールされていれば、追加のインストールなしで使用できます。これにより、手軽に GUI 開発を始められます。

  2. クロスプラットフォーム
    tkinter は、Windows、Mac、Linux など、主要なオペレーティングシステムに対応しています。同じコードを使って、異なるプラットフォームで動作するアプリケーションを開発できます。

  3. 豊富なウィジェット
    tkinter には、ボタン、ラベル、テキストボックス、チェックボックス、ラジオボタン、リストボックス、メニューなど、GUI 開発に必要な基本的なウィジェットが用意されています。これらのウィジェットを組み合わせることで、様々なユーザーインターフェースを作成できます。

  4. レイアウト管理
    tkinter は、グリッドジオメトリマネージャ、パックジオメトリマネージャ、プレースジオメトリマネージャの3つのレイアウト管理システムを提供しています。これらを使って、ウィジェットの配置を柔軟に制御できます。

  5. イベント駆動プログラミング
    tkinter は、イベント駆動プログラミングをサポートしています。ボタンのクリックやキーボードの入力など、ユーザーのアクションに応じて、特定の関数を実行できます。これにより、インタラクティブなアプリケーションを開発できます。

  6. カスタマイズ可能
    tkinter のウィジェットは、様々なオプションを使ってカスタマイズできます。フォントやカラー、サイズなどを変更することで、アプリケーションの見た目を自由に調整できます。

次節では、実際にコードを書きながら、tkinter を使ったユーザーインターフェースの実装方法を学んでいきます。これから作成するカウンセリングアプリは、LINE風のチャットアプリのUIを採用します。ユーザーのメッセージは、画面左に背景青で表示され、カウンセラーのメッセージは左に背景黒で表示されるようにします。

ユーザーインターフェースの実装:app.pyを作成

プログラミングを開始する前に、プロジェクトを保存するフォルダーを決定しましょう。フォルダーの場所は任意に選択できますが、アクセスしやすい場所を選ぶことが推奨されます。著者は、ユーザーディレクトリ直下に「PythonProjects」というフォルダーを作成し、そこにすべてのPythonプロジェクトを保存しています。この場所は、ターミナル(コマンドラインインターフェース)からアクセスしやすいため、初心者にも適しています。

次のステップでは、「PythonProjects」フォルダーの下に「counseling_app」という名前の新しいフォルダーを作成します。このフォルダーは、今後作成するPythonファイル(.pyファイル)を保存する場所となります。

図1 新しいファイルを作成

ユーザーインターフェースを実装するために、「app.py」という名前のファイルを「counseling_app」フォルダー内に作成します。図1に示すように、フォルダー名の横の「新規ファイル」アイコンをクリックして、ポップアップしたモーダルウインドウに名前「app.py」を入力します。app.pyはアプリを実装する起点として、一般的に使われるファイル名です。

以下に示すコードを「app.py」に記述します。

import tkinter as tk  # ここから(1)
from tkinter import ttk  # ここまで(1)


class ChatApp(tk.Tk):  # (2)
    def __init__(self):
        super().__init__()  # (3)
        self.title("カウンセリングアプリ")  # ここから(4)
        self.geometry("500x600")
        # 保存されたメッセージを格納するリスト
        self.saved_messages = []  # ここまで(4)

        # UIの初期化
        self.main_frame = None  # ここから(5)
        self.canvas = None
        self.canvas_window = None
        self.scrollbar = None
        self.scrollable_frame = None
        self.input_frame = None
        self.entry = None
        self.send_button = None
        self.clear_button = None
        self.history_button = None
        self.init_ui()
        # UIの初期化

    def init_ui(self):
        # メインフレームの作成
        self.main_frame = tk.Frame(self)
        self.main_frame.pack(side="top", fill="both", expand=True)

        # キャンバスとスクロールバーの作成
        self.canvas = tk.Canvas(self.main_frame)
        self.scrollbar = ttk.Scrollbar(self.main_frame, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scrollbar.set)

        # スクロール可能なフレームの作成
        self.scrollable_frame = ttk.Frame(self.canvas)
        self.canvas_window = self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")

        # スクロール可能なフレームのサイズ変更時にスクロール領域を更新
        self.scrollable_frame.bind("<Configure>", lambda e: self.update_scrollregion())
        self.canvas.bind('<Configure>', self.on_canvas_configure)

        # キャンバスとスクロールバーの配置
        self.canvas.pack(side="left", fill="both", expand=True)
        self.scrollbar.pack(side="right", fill="y")

        # 入力フレームの作成
        self.input_frame = tk.Frame(self)
        self.input_frame.pack(side="bottom", fill="x", padx=10, pady=10)

        # 入力フィールドの作成
        self.entry = tk.Entry(self.input_frame)
        self.entry.pack(side=tk.LEFT, fill="x", expand=True, padx=(0, 10))

        # 送信ボタンの作成
        self.send_button = tk.Button(self.input_frame, text="送信", command=self.send_message)
        self.send_button.pack(side=tk.RIGHT)

        # クリアボタンの作成
        self.clear_button = tk.Button(self.input_frame, text="クリア", command=self.clear_chat)
        self.clear_button.pack(side=tk.RIGHT, padx=(0, 10))

        # 履歴ボタンの作成
        self.history_button = tk.Button(self.input_frame, text="履歴", command=self.show_history)
        self.history_button.pack(side=tk.RIGHT, padx=(0, 10))  # ここまで(5)

    def on_canvas_configure(self, event):  # (6)
        # キャンバスのサイズ変更時にスクロール可能なフレームの幅を更新
        canvas_width = event.width
        self.canvas.itemconfig(self.canvas_window, width=canvas_width)

    def update_scrollregion(self):  # (7)
        # スクロール領域を更新
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

    def add_message(self, message, side):  # (8)
        # メッセージを追加
        message_frame = ttk.Frame(self.scrollable_frame)
        bg_color = "#b3d9ff" if side == "right" else "lightgrey"
        message_widget = tk.Message(message_frame, text=message, bg=bg_color, width=400)
        message_widget.pack(anchor="e" if side == "right" else "w", pady=2, padx=10)
        message_frame.pack(fill="x", pady=2)

    def autoscroll_to_bottom(self):  # (10)
        # 自動でスクロールを最下部に移動
        self.canvas.update_idletasks()
        self.canvas.yview_moveto(1)

    def autoscroll_to_top(self):  # (11)
        # スクロール位置を最上部にリセット
        self.canvas.update_idletasks()
        self.canvas.yview_moveto(0)

    def send_message(self):  # (12)
        # メッセージを送信
        message = self.entry.get().strip()
        if message:
            self.add_message(message, "right")
            received_message = message
            self.add_message(received_message, "left")
            self.entry.delete(0, tk.END)
            self.autoscroll_to_bottom()

            if received_message != "エラーが発生しました。":
                # ChatGPTより有効なレスポンスが返ってきた場合のみ、メッセージを保存
                self.saved_messages.append((message, "right"))
                self.saved_messages.append((received_message, "left"))

    def clear_chat(self):  # (13)
        # チャットをクリア
        self.saved_messages = []
        for widget in self.scrollable_frame.winfo_children():
            widget.destroy()
        self.current_room_id = None
        self.title("カウンセリングアプリ")

    def show_history(self):  # (14)
        pass


if __name__ == "__main__":  # ここから(15)
    app = ChatApp()
    app.mainloop()  # ここまで(15)
    

このコードはPythonのTkinterライブラリを使用して、基本的なチャットインターフェイスを持つデスクトップアプリケーションを作成するためのものです。コメント番号の部分について、初心者向けに詳しく説明します。

(1) は、Tkinterのインポートを行います。「import tkinter as tk」でTkinterライブラリをtkというエイリアスでインポートしています。TkinterはPythonの標準GUIツールキットで、クロスプラットフォームのデスクトップアプリケーションを作成するのに使われます。そして、「from tkinter import ttk」でインポートされるttkは、Tkinterのテーマ付きウィジェットのセットを提供します。これにより、アプリケーションの見た目がネイティブに近づき、より現代的なGUI要素を利用できます。

(2) は、ChatAppクラスの定義を行います。ChatAppクラスは、tk.Tkを継承しています。これにより、このクラスのインスタンスはTkinterアプリケーションのルートウィンドウとなります。

(3) のsuper().__init__()は、ChatAppクラスが親クラス(tk.Tk)のコンストラクタを呼び出し、Tkinterアプリケーションの初期設定を行います。これにより、アプリケーションの基本的なウィンドウが作成され、イベント処理の準備が整い、アプリケーションの外見や動作のカスタマイズが可能になります。この一行があることで、開発者はアプリケーションの基盤を気にせず、主に機能の追加やカスタマイズに集中できます。

(4) は、アプリケーションウィンドウの設定です。ウィンドウのタイトルを設定し、ウィンドウのサイズを500x600ピクセルに設定します。

self.saved_messagesは、送受信されたメッセージを格納するためのリストを初期化します。このリストは、第3部で履歴の復元機能を実装する際に利用します。

(5) は、UIコンポーネントの初期化を行います。アプリケーションのUI部品(フレーム、キャンバス、スクロールバー、入力フィールド、ボタン)を作成し、配置します。これにより、ユーザーがメッセージを入力し、送信できるインターフェイスが構築されます。

(6) は、キャンバスサイズの調整を行うメソッドです。キャンバスのサイズが変更されたときに呼び出され、スクロール可能なフレームの幅を適切に設定します。

(7) は、スクロール領域を更新するメソッドです。メッセージが多くなったときに、新しいメッセージが表示できるように、スクロール領域を現在のコンテンツに合わせて更新します。

(8) は、メッセージを追加するメソッドです。指定されたメッセージをUIに追加します。sideパラメータによってメッセージの配置(左か右か)が決定されます。メッセージの枠の最大横サイズは400ピクセルに設定します。

(10)、(11) は、スクロールの自動調整メソッドです。

autoscroll_to_bottomメソッドは、コンテンツを追加した際に自動的にスクロールバーを最下部に移動させます。autoscroll_to_topメソッドは、逆にスクロールバーの一番上に移動させます。

(12) は、メッセージの送信メソッドです。self.entry.get()により、入力フィールドからテキストを取得します。取得したメッセージは、右寄せの枠で囲って表示します。

次に、アシスタントからのメッセージを左寄せの枠で囲って表示します。ここでは、入力した文字列がそのまま表示されるように実装しています。この部分は第2部で、ChatGPTから取得した回答文が入るように修正します。

最後に、入力フィールドをクリアします。これで、ユーザーは次のメッセージをすぐに書き始められるようになります。

(13) は、メッセージをすべてクリアするメソッドです。まず、保存されているメッセージ(self.saved_messages)をクリアし、次に、UI上のメッセージを全て削除します。これで、ユーザーは新しいチャットを始められるようになります。

(14) は、履歴画面を表示するメソッドです。このメソッドは実装されていませんが、第3部でチャット履歴を表示する機能を追加するための場所を提供します。

(15) は、アプリケーションの起動コードです。if __name__ == "__main__":は、このコードが直接実行された場合にのみ、ChatAppインスタンスを作成し、Tkinterのイベントループを開始します。これにより、アプリケーションが起動し、ユーザー入力を待ち受ける状態になります。

以上で、チャットアプリの基本的なUIが実装できました。次は、ターミナルからアプリを実行して、UIの実装を確認してみましょう。

ユーザーインターフェースの実装:デバッグ

このセクションでは、先ほど実装したコードを実行して、UIが目的に沿って実現できているかを確認します。本記事では、VS Codeで作業を進めますが、別のエディター(PyCharmなど)でも、同様の手順でデバッグすることが可能です。

VS Codeの上部メニューから、ターミナル > 新しいターミナルを選んでください。コードエディターの下にターミナルが開いて、コマンドを入力できるようになります。

図2 ターミナルからアプリを起動する

ターミナルが開きました(図2)。以下のコマンドを入力して、エンターで確定します。すると、デスクトップアプリとして、アプリが起動します。

# Windowsの場合
python app.py

# Macの場合
python3 app.py

上記のコマンドでapp.pyを実行して、チャットアプリを起動できます。WIndowsの場合は「python」コマンドを、Macの場合は「python3」コマンドを使用します。コマンドを実行すると、次に示すウインドウが立ち上がり、チャットが始められる状態になります。

図3 アプリのUIが実装できた

アプリが起動しました(図3)。入力フィールドに文字を入力し、送信ボタンをクリックしてください。送信メッセージは右側に、受信メッセージは左側に表示されます。現時点では、同じ文字列が受信メッセージとして表示されていますが、次の第2部では、ChatGPTからの回答を表示できるようにします。

次に、クリアボタンをクリックし、メッセージが消去されることを確認してください。これで、新しいチャットを開始できます。なお、履歴ボタンをクリックしても現時点では何も起きませんが、第4部でメッセージ履歴画面を表示できるように実装します。

これで、チャットアプリのUIの実装は完了です。比較的シンプルなUIであれば、tkinterを使って、デスクトップアプリを簡単に作成できることがわかりました。次のセクションでは、カウンセリングアプリの中核であるChatGPT機能を追加します。

第2部 ChatGPTとのAPI連携

このセクションでは、私たちのAndroidアプリがChatGPTと会話できるように、APIを介して二つを連携させる方法について学びます。しかし、まずAPIとは何か、そしてそれがどのように機能するのかについて簡単に説明しましょう。

APIとは?

図4 APIリクエストとレスポンス

APIは「Application Programming Interface」の略で、アプリケーション間で情報を交換するための架け橋のようなものです。簡単に言えば、APIはあるプログラムが別のプログラムに対して、「こんなことをしてほしい」とリクエストを送るための方法、またそのリクエストに応じて「こういう情報を返すよ」と応答(レスポンス)を返す仕組みです。
例えば、天気予報アプリがあったとします。このアプリがユーザーの位置情報に基づいて最新の天気を表示するためには、外部の天気予報サービスからデータを取得する必要があります。ここでAPIが活躍します。アプリは、指定されたAPIを通じて天気予報サービスにリクエストを送り、サービスはそのリクエストに応じた天気情報をAPIを通じてアプリに返します。
APIを使用する主なメリットは以下の通りです。

  1. 開発の効率化  APIを利用することで、開発者は複雑な処理をAPIサーバー側に任せることができます。これにより、アプリケーション開発に専念でき、開発の効率化につながります。例えば、天気予報アプリを開発する際、天気データを取得するための複雑な処理をゼロから実装する必要はありません。天気予報APIを利用することで、簡単にデータを取得し、アプリに組み込むことができます。

  2. 高度な機能の実現  APIを活用することで、人工知能や機械学習などの高度な機能を簡単に実装できます。例えば、ChatGPT APIを利用すれば、自然言語処理や対話システムをアプリに組み込むことができます。顔認識APIを使えば、写真から顔を検出し、識別することができます。このように、専門的な知識や技術がなくても、APIを通して高度な機能を実現できます。

  3. コストの削減  APIを利用することで、開発コストを大幅に削減できます。APIサーバーは、多くの開発者に共通の機能を提供するため、個々の開発者がゼロから実装する必要がありません。APIを利用することで、開発時間が短縮され、人件費や資源のコストを抑えることができます。

  4. スケーラビリティの向上  APIを利用することで、アプリケーションのスケーラビリティを向上できます。APIサーバーは、多数のリクエストを処理するように設計されています。アプリケーションの利用者が増加しても、APIサーバーがリクエストを処理するため、アプリケーション自体のインフラを大規模に拡張する必要がありません。

  5. 最新の技術へのアクセス  APIを通して、最新の技術や機能にアクセスできます。API提供者は常に最新の技術を導入し、改善を行っています。開発者はAPIを利用することで、自動的に最新の技術を活用できます。これにより、アプリケーションの機能を常に最新の状態に保つことができます。

APIを活用することで、開発者は複雑な処理を簡単に実装でき、高度な機能を実現できます。また、開発コストの削減、スケーラビリティの向上、最新技術へのアクセスなど、多くのメリットがあります。APIを上手く活用することが、効率的で高品質なアプリケーション開発につながります。
APIの理解ができたところで、次は、ChatGPT APIを利用するために必須の作業である「OpenAIアカウントの作成」「APIキーの作成」について説明します。(もしChatGPT APIキーの取得がお済みの方は、「ChatGPT連携:ChatGPTService」のセクションまで進んで下さい)

OpenAIアカウントの作成

このセクションで初めに行うべき作業は、OpenAIのアカウントを作成することです。このアカウントを通じて、ChatGPTのAPIキーを取得し、Androidアプリと生成AIを連携させることができます。この連携により、Androidアプリにより複雑でリアルタイムなカウンセリング機能を付加することができるようになります。
OpenAIアカウントの作成は、2024年3月10日に行いました。以下の作業手順やスクリーンショットは変更する可能性がある点にご留意ください。次の、APIキー作成ページにアクセスします。
https://platform.openai.com/account/api-keys

図5 OpenAIアカウントを作成する

APIキーを生成するため、まずはOpenAIのアカウントを作成することから始めます。アカウント作成ページで「Sign up」を選択し、メールアドレスとパスワードを入力して登録してください。このアカウントによって、OpenAIが提供するAPIを利用するための認証キーを受け取ることができます。
登録の次のステップとして、指定したメールアドレスにOpenAIから認証用のメールが送信されます。そのメール内のリンクをクリックし、メールアドレスの確認を行ってください。これは、セキュリティの一環として、アカウントの正当性を保証するためのものです。

図6 電話番号の認証

メールでの認証が完了したら、必要な個人情報(名前、組織、生年月日)を入力します。そして、「Start verification」ボタンをクリックして、電話番号の認証も行ってください。これにより、OpenAIとの連携の信頼性が高まります。
以上の手続きを終えると、アカウントの設定が完了し、APIキーを生成する準備が整います。(無料トライアルの範囲なら、クレジットカードの登録は必要ありません。)

APIキーの作成

図7 APIキーの作成

「Create new secret key」ボタンをクリックし、APIキーの生成を始めます。ポップアップされるモーダルウィンドウにある「Name」フィールドに、APIキーの名前を入力してください。後でキーを識別しやすいように、区別がつきやすい名称を選んでください。「Create secret key」ボタンをクリックすると、新しいAPIキーが生成され、そのキーは画面上に一度だけ表示されます。このキーは重要な認証情報であるため、他人に知られないように慎重に管理してください。表示されたキーは、次のセクションで、コードに入力する必要があるので、確実にコピーしておきましょう。これでAPIキーの作成プロセスは完了です。
ChatGPT APIのサービスは有料のため、使用状況を常に把握しておく必要があります。仮に、自分のAPIキーがなんらかの理由で流出し不正に利用されると、莫大な利用料金が請求されることにもなりかねません。そういった事故を防ぐためにも、使用状況の管理が重要になります。次は、使用状況の確認の方法を説明します。

使用状況の確認

図8 使用状況の確認

左メニューの棒グラフのアイコンをクリックして、Usageページを開きます。このページで毎日の使用状況を確認できます。不正な使用が行われていないかを定期的にチェックしてください。画面右に、Credit Grantsとして、5.00ドルのクレジットがチャージされています。これは、フリートライアルとして使えるお金で、表示された期限(ここでは、2024年6月10日)まで使用することができます。5ドル以上の使用、または期限以降も使用するときは、クレジットカードを登録することになります。
次に、クレジットカードの登録と、使用制限について説明します。

図9 支払い方法の登録

右側のメニューから「Settings / Billing」を選択し、「Billing Settings」ページを開きます。ここでは、将来的にAPIの使用料が発生した場合の支払い方法を設定できます。「Payment methods」セクションを通じて、サービス利用料の支払いに使用するクレジットカード情報を登録してください。APIサービスの利用開始に先立って、支払い情報を登録することが推奨されます。クレジットカードを登録したら、必ず「Usage limits」セクションを開いて確認します。
「Usage limits」セクションでは、API利用における使用制限を設定することが可能です。デフォルト設定では、96ドルの使用に達した際に登録されたメールアドレスに通知が届きます。また、利用料が120ドルを超えるとAPIサービスの利用が一時停止されるため、予期せぬ料金超過を防ぐための安全策です。これらの金額は、予算に合わせて調整可能なため、状況に応じて制限額を変更することを検討してください。

ChatGPT APIの利用料金は、使用するモデルによって異なります。GPT3をベースにする「gpt-3.5-turbo」は、1000トークン当たり、0.0005ドル(約0.074円)です(Pricingページ)。トークンという単位は、文字の単語の中間を表し、日本語では、1文字で1~3トークン程度を消費します。安価だと思って使いすぎると、すぐに無料トライアルの5ドルは使い切ってしまいます。定期的に、Usageページで現在の使用状況を確認しましょう。

以上で、OpenAIのアカウントおよびAPIキーのセットアップが完了しました。これで生成AIを組み込んだ音声アシスタントの開発に取りかかる準備が整いました。次に、API実装の設計を行います。

API実装の設計

開発者がAPIを利用したアプリケーションを構築する際には、APIとの通信をどのように行うかが重要なポイントになります。ここでは、APIエンドポイントへの問い合わせ、認証方法、リクエストの形式、およびAPIからのレスポンスの処理方法について説明します。

APIエンドポイントへの問い合わせ

APIエンドポイントは、APIが提供する特定の機能へアクセスするためのURLです。開発者は、このエンドポイントを使ってAPIにリクエストを送信し、必要なデータを取得または送信します。たとえば、ChatGPT APIにおいて、ユーザーの質問に対する回答を取得するためのAPIエンドポイントは、"https://api.openai.com/v1/chat/completions"になります。

認証方法

APIの利用には、正当な使用者であることを証明するための認証が必要になることがあります。ChatGPT APIにおいては、APIキーをリクエストのヘッダーに含めることで認証を行います。ヘッダーに含まれたキーにより、API提供者はリクエストが正当な使用者からのものであることを確認します。

APIリクエストの形式

APIへのリクエストは、決められた形式でデータを送信する必要があります。多くの場合、JSON形式でテキストデータを作成し、HTTPのPOSTメソッドを使用してエンドポイントへ送信します。JSONはJavaScript Object Notationの略で、軽量なデータ交換フォーマットです。例えば、ユーザーの質問を送るリクエストのJSONデータは以下のようになります。

{
     "model": "gpt-3.5-turbo",
     "messages": [{"role": "user", "content": "ここにユーザーの質問が入る。"}],
   }

APIレスポンスの処理

APIからのレスポンスも通常、JSON形式で返されます。レスポンスには、リクエストに対する結果が含まれています。開発者はこのレスポンスデータから必要な情報を抽出して、アプリケーションに表示するなどの処理を行います。例えば、レスポンスのJSONデータは以下のようになります。少し複雑な形をしていますが、choices配列の最初の要素を抜き出し、messageキー > contentキーから目的の回答を取得できます。

{
    "id": "chatcmpl-abc123",
    "object": "chat.completion",
    "created": 1677858242,
    "model": "gpt-3.5-turbo-0613",
    "usage": {
        "prompt_tokens": 13,
        "completion_tokens": 7,
        "total_tokens": 20
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "ここにChatGPTの回答が入る。"
            },
            "logprobs": null,
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

APIを利用したアプリケーション開発では、エンドポイントへの正しい問い合わせ、適切な認証方法の使用、決められた形式でのリクエスト送信、そしてレスポンスの効果的な処理が重要になります。これらのステップを適切に実行することで、開発者はAPIの力を活用し、機能豊かなアプリケーションを構築することができます。

以上で、ChatGPT連携のための準備が整いました。次のステップとして、VS Codeの作業に戻り、ChatGPT APIを利用するために、Pythonのパッケージのインストールを行います。

Pythonのパッケージについて

Pythonのパッケージは、再利用可能なコードの集合体であり、特定の機能を提供するためにまとめられたモジュールやリソースのことを指します。パッケージは、開発者が複雑な機能を簡単に自分のアプリケーションに取り込むことを可能にします。

Pythonには、多数の優れたパッケージが存在し、それらを利用することで、開発者は自分で一からコードを書くことなく、高度な機能を実現できます。例えば、HTTPリクエストを送信するための`requests`パッケージ、データ解析や科学計算に用いられる`numpy`や`pandas`パッケージ、機械学習のための`scikit-learn`パッケージなどがあります。

パッケージを利用する利点は、以下のようなものがあります。

  1. 開発時間の短縮:既存のパッケージを利用することで、複雑な機能を自分で実装する必要がなくなり、開発時間を大幅に短縮できます。

  2. コードの品質向上:パッケージは、多くの開発者によってテストされ、改善されているため、一般的に高い品質を持っています。これにより、バグの少ない信頼性の高いコードを書くことができます。

  3. メンテナンス性の向上:パッケージを利用することで、自分で書くコードの量が減り、コードの可読性と保守性が向上します。

  4. コミュニティのサポート:人気のあるパッケージには、大きなユーザーコミュニティがあり、ドキュメントやサンプルコード、フォーラムなどを通じて、問題解決のためのサポートを得ることができます。

Pythonでは、`pip`(パッケージインストーラー)を使ってパッケージをインストールします。`pip`は、Python Package Indexと呼ばれる大規模なパッケージリポジトリから、必要なパッケージをダウンロードしてインストールします。

以下は、`requests`パッケージをインストールする例です。

pip install requests

このように、`pip`を使うことで、必要なパッケージを簡単にインストールし、アプリケーション開発に活用できます。

次のセクションでは、ChatGPT連携に必要なパッケージをインストールし、APIを利用してアプリケーションを拡張していきます。

ChatGPT連携:パッケージのインストール

このセクションでは、OpenAIのAPIサービスを利用するためのパッケージのインストールの仕方を説明します。VSCodeのコードエディタ下のターミナルを開いてくください。ターミナルに次のコマンドを入力し、エンターキーで確定します。

# Windowsの場合
pip install openai pygame pyinstaller

# Macの場合
pip3 install openai pygame pyinstaller

上記のコマンドで、必要なパッケージをインストールできます。openaiは、ChatGPT APIとの通信に使用するパッケージで、APIリクエストの送信や認証、レスポンスの処理などを簡単に行うことができます。pygameは、ゲーム開発に使用されるパッケージですが、サウンド再生機能も備えているため、第4部で音声読み上げ機能を実装する際に使用します。ここでまとめてインストールしておくことで、後の実装がスムーズに進められます。pyinstallerは、第5部で、チャットアプリをデスクトップアプリとしてビルドする時に使用します。

これで、必要なパッケージがすべて準備できました。次に、これらのパッケージを利用して、ChatGPT APIから回答を取得するコードの実装に入ります。

ChatGPT連携:openai_service.pyを作成

OpenAIのChatGPT APIを利用すると、さまざまな役割を持ったチャットアプリを簡単に作ることができます。例えば、占い師や教師、ファイナンシャルプランナーなど、専門的な知識が必要な役割を、高い精度で再現することができます。本記事では、その一つの例として、スクールカウンセラーの役割を演じるチャットボットの実装方法を紹介します。

まず初めに、openai_service.pyという名前の新しいファイルを作成してください。そして、次に示すコードを記載してください。

from openai import OpenAI
import io
import pygame


class OpenAIService:
    # システムメッセージの定義
    system_message = """
    あなたはスクールカウンセラーです。
    生徒からの相談を受けています。
    生徒の話を受容と共感を持って聞くことが大切です。
    生徒との会話は一方通行ではなく、生徒の話に対して適切な質問を投げかけることで、
    生徒が自分の問題に気づくように導いてください。
    会話は概ね5ターン以内で終了するように、まとめて下さい。
    また、生徒の話が「ありがとう」や「さようなら」で終わった時は、
    生徒が納得したか確認して、生徒がこの話題を終了するように促してください。
    あなたの回答は100文字以内にしてください。
    """.strip()  # (1)

    def __init__(self, api_key):
        # OpenAIクライアントの初期化
        self.client = OpenAI(api_key=api_key)  # (2)

    def fetch_response(self, message, saved_messages):  # (3)
        # OpenAI APIにリクエストを送信するためのメッセージの作成
        # はじめにシステムメッセージを追加
        messages = [  # ここから(4)
            {
                "role": "system",
                "content": self.system_message,
            }
        ]
        # 保存されたメッセージを追加
        for saved_message, side in saved_messages:
            messages.append(
                {
                    "role": "user" if side == "right" else "assistant",
                    "content": saved_message,
                }
            )
        # 最後にユーザーのメッセージを追加
        messages.append(
            {
                "role": "user",
                "content": message,
            }
        )
        print(messages)  # ここまで(4)

        try:
            # OpenAI APIにリクエストを送信し、レスポンスを取得
            chat_completion = self.client.chat.completions.create(  # (5)
                messages=messages,
                model="gpt-3.5-turbo",
            )
            # レスポンスメッセージを取得
            response_message = chat_completion.choices[0].message.content.strip()  # (6)
            print(response_message)
            # レスポンスメッセージを返す
            return response_message
        except Exception as e:
            print(f"Error: {e}")  # ここから(7)
            return "エラーが発生しました。"  # ここまで(7)
        

このコードは、OpenAIのAPIを使用して、スクールカウンセラーの役割を模倣する対話型アプリケーションのバックエンドを定義しています。各コメント番号が指し示す部分について、初心者向けに説明します。

(1) は、システムメッセージの定義です。ここでは、アプリケーションがユーザー(生徒)との対話を始める前に提示するガイダンスやルールを定義しています。これは対話がスムーズに進むための前提条件や、カウンセリングセッションの目的を説明するために使われます。

具体的には、「生徒の話を受容と共感を持って聞く」「適切な質問を投げかけて生徒自身に問題に気づかせる」「会話は5ターン以内で終了するようにまとめる」といった指示を与えています。このようにシステムプロンプトを設定することで、ChatGPTは与えられた文脈に沿った応答を生成できるようになります。

このシステムプロンプトを工夫することで、ChatGPTにさまざまな役割を演じさせることができます。例えば、教師や弁護士、編集者、占い師などのロールを設定し、それぞれの文脈に適した応答を生成させるのです。

読者の皆さんも、このシステムプロンプトの部分を自由に改造してみてください。どのような役割を設定すると面白い応答が得られるか、ぜひ試してみてください。ChatGPTの柔軟性と可能性を実感できるはずです。

(2) は、OpenAI APIを使用するためのクライアントを初期化しています。api_keyパラメーターには、OpenAIから取得したAPIキーを指定します。このクライアントを通じて、APIリクエストを送受信します。

(3) のfetch_responseメソッドは、ユーザーからのメッセージと、過去の対話を保存したメッセージリストを受け取り、それらを基にOpenAI APIにリクエストを送り、対話応答を取得する役割を持ちます。

(4) は、リクエスト用メッセージの準備します。システムメッセージ、保存された過去のメッセージ、そして最新のユーザーメッセージを含むリクエストメッセージリストを作成します。これにより、APIは過去のコンテキストを考慮して適切な応答を生成できるようになります。

(5)で、 OpenAI APIに対話のリクエストを送信し、モデルからの応答を取得しています。使用されているモデルはgpt-3.5-turboです。このモデルは、品質と価格のバランスがよく、一般的によく使われています。

(6) で、ChatGPT APIからの応答を受け取った後、その内容からユーザーに返すべきメッセージを抽出しています。これは、APIから受け取った応答の中から具体的なテキスト部分を取り出しています。

(7) は、エラーハンドリングです。リクエストの送信中に何らかのエラーが発生した場合、このコードはエラーメッセージを出力し、ユーザーに「エラーが発生しました。」というメッセージを返します。これにより、アプリケーションがエラー時にも適切に対応できるようになっています。

以上で、ChatGPTとの接続を管理するクラスの説明を終わります。次は、app.pyファイルを修正して、ユーザーからのメッセージにCahtGPTからの返答をメッセージとして返す実装を追加します。

ChatGPT連携:app.pyの修正

次の修正部分をapp.pyに適用してください。修正箇所は、3箇所です。

ここから先は

22,982字 / 4画像

¥ 100 (数量限定:残り 10 / 10)

この記事が気に入ったらサポートをしてみませんか?