投稿日

Colaboratory で ChatGPT の API を使うには?― IoT-Tech Meetup #1

こんにちは、ソリューションアーキテクトの内田(ニックネーム: jet)です。

5/30に開催した、IoTや周辺技術の知見をエンジニア向けに共有するイベント「IoT-Tech Meetup 第1回【ChatGPT × IoT】」では、時系列データを生成系AI「ChatGPT」で分析・未来予測する利点や気を付けたいポイント、そして具体的な方法を紹介しました。

当日の様子や発表資料などは以下のブログをご覧ください。

ここでは【セッション2】 時系列データをChatGPTで読み解いてみる で紹介したデモについてお伝えします。当日の様子の補足として確認いただけると嬉しいです。

デモ環境

今回デモに利用した各環境は以下のとおりです。

実行環境は Colaboratory (以下、Colab) を利用しています。これは、自分自身で構築する必要がなく、Web ブラウザ上で誰でも利用可能であるため、API 使って試行錯誤していく様な場合にはとても便利に使えます。

また、連携するサービスも今回は簡単に実現するために、Make と Slack を利用しています。Make は iPaaS(Integration Platform as a Service)と呼ばれるサービスのひとつで、システム間をつなげたり、データフローを制御できるサービスです。Make に対して Webhook で情報を POST すると、その内容を Slack に通知する様に設定しています。

IoT デバイスのデータは、センサー情報が簡単にクラウド環境へアップロードできるため GPS マルチユニット SORACOM Edition を利用しています。データのアップロードの詳細については、SORACOM IoT レシピ:IoTで温湿度の可視化 をご覧ください。

OpenAI API

今回のデモでは Create chat completion API を利用しています。API 呼び出しには Python ライブラリの openai / openai-python を利用しています。openai / openai-pythonMIT ライセンス で提供されていて、pip でインストールすれば使えるので便利かと思います。

ライブラリのインストール

Colab のコードセルで pip コマンドを実行してインストールします。ローカル環境と変わらずインストールが行えます。

!pip install --upgrade openai

API の利用準備

API を利用するには API Key が必要になります。事前に OpenAI のサイトで API Key を発行してください。また、今回作成したデモ用のUI は Organization ID を利用しています。これは複数の Organization に所属している場合、明示的にどの Organization の API Usage を使用するかを指定するためです。

例えば、検証環境と本番環境を別々の Organization としている場合、それぞれの Organization で料金の Usage limit が異なる場合や、個人のアカウントと会社のアカウントで使い分けが必要な場合などを想像してもらえればと思います。

API Key や Organization の扱いについては、それぞれ Best Practices for API Key SafetyProduction best practices と言った記事がありますのでそちらをご覧ください。

API の利用準備については、以下の様にデモ用のUI フォームの入力値をそのまま設定しているだけです。設定が終わった後に List models API を呼び出して、API が呼び出せるかどうかの確認をしています。

import openai

openai.organization = "YOUR_INPUT_ORG_ID"
openai.api_key = "YOUR_INPUT_OPENAI_API_KEY"
openai.Model.list()

チャット API を使う

ここでは実際に API を利用してチャットを行っています。messages パラメータには、ユーザーからの入力(role : user) と、AIからの返答 (role : assistant) を含めて送信します。これによりAIとの過去のやり取りを考慮した返答が得られます。

システム(role:system) は、当日のセッション中にも説明しましたが、system で設定を行うことで AI からの返答をある程度コントロールできます。例えば、キャラクター名とそのキャラクターの口調(文調)の例となる文章を一緒に設定すると、キャラクターを擬似的に再現できます。

今回はこの仕組みを使って返答を JSON形式 で返す様に指示しています。ただし、この制約が必ず守られるわけではないので、ユーザーからのプロンプト入力を工夫していく必要性があると感じました。

以下のコードが実際にデモで利用したものになります。会話の履歴をリストに入れて、それをそのままAPI に渡している部分がポイントです。また、実行状態がわかる様に print() 文が多く記載されています。

import openai

# OpenAI を使って Chat をする
# https://platform.openai.com/docs/api-reference/chat/create
def create_chat_completion(user_msg: str, model: str, temperature: float = 1.0, msg_history: list = None, system_msg: str = None) -> list:
    params = dict()
    params['temperature'] = temperature

    messages = list()
    if system_msg != None and system_msg != '':
        messages.append({"role": "system", "content": system_msg})

    messages.append({"role": "user", "content": user_msg})

    params['messages'] = messages
    if msg_history != None and len(msg_history) > 0:
        params['messages'] = msg_history + messages

    params['model'] = model
    
    print()
    print('# api_type = ', openai.api_type)
    print('# api_model = ', model)
    print('# 🌡️ temperature = ', temperature)
    print('# 👻 system = ', system_msg)
    print()
    print('# 💻 user = ', user_msg)
    
    # 入力された情報で OpenAI を呼び出してみる
    completion = openai.ChatCompletion.create(**params)

    msg_history.extend(messages)

    # 返答を確認する
    result_msg = list()
    for item in completion.choices:
        print('# 🤖 reply = ', item.message.content.strip())
        msg_history.append(item.message.to_dict())
        result_msg.append(item.message.to_dict())

    print()
    print('# 📦 messages = ', msg_history)
    print('# 💰 usage = ', completion.usage)

    return result_msgphp

トークンと料金

当日にも少しお話しましたが、IoT の時系列データを添付してチャットを行うと、思ったよりもトークン数が多くなります。API の利用料金は従量課金となり、今回利用したモデルの gpt-3.5-turbo だと 1,000 トークンあたり $0.002 です。ご自身の利用状況は、OpenAI のページで確認できます。実際に API に送信する前にトークン数を確認したい場合は、Tokenizer で確認できます。

登録後3ヶ月間は $5.00 の 初期クレジット が付与されているので、そちらが優先して利用されます。その後は、従量課金制となり金額で使用制限がかけられます。

以下の図だと、青いラインが初期クレジットの利用状況を表しており、緑のラインが従量課金分の利用状態を表しています。

まとめ

デモで使った Colab の環境を簡単にですが紹介しました。Jupyter Notebook を簡単に実行できるため、色々と試行錯誤できるのはとてもありがたいです。検証や確認といった部分では、こういった手軽な環境を利用して、実際にサービス化する際には、他の環境に移行していくのもひとつの手となるのではないでしょうか。

今回は Colab 自体の詳細な紹介はしていませんが、Python や Pandas をはじめとしたデータ分析のライブラリも使えるため、データを整形したり確認しながらチャットの実装を行うのにも便利に使えました。

次のチャンスがあるなら、LangChain をはじめとしたフレームワークも触ってみたいですね!
またどこかで、みなさんとお話しできる機会を楽しみにしています。

次回のIoT-Tech Meetupは6/13(火)「GIS・位置情報活用の基礎」

次回の IoT-Tech Meetup の開催が決定しています。
6/13(火) 19:00スタートで、GPSをはじめとした位置測位技術の基礎知識と事例や、位置測位を用いた開発の基礎知識と具体例を共有していきます!

お申し込みページはオープンしています。お気軽にご参加ください。

7月開催!IoTの大型カンファレンス「SORACOM Discovery 2023」

7/5(水)と7/6(木)の2日間にわたってお届けするIoTカンファレンス「SORACOM Discovery 2023」でも、多くの技術セッションをご用意しています。こちらにもぜひご参加ください!

― ソラコム内田 (jet) @uchimanajet7