🤖

GPT-4と協力してGPT3.5turbo搭載のSlackBot開発を作った:実例から学ぶ、AIパワードのエンジニアリング🚀🤖💡

2023/03/16に公開約4,000字

こんにちは。四畳半です。

昨日、自宅でOpenAI GPT-4と一緒に GPT3.5turboを使ったSlackチャットボットを作ってみましたので、開発過程とその様子を共有します。

はじめに

まずは、GPT-3を利用するために必要なライブラリをインストールします。Pythonのパッケージ管理ツールpipを使って、openaiとslack-boltをインストールしました。

pip install openai slack-bolt

ボットのコード

次に、チャットボットのコードを書きました。まず、必要なライブラリをインポートし、環境変数からAPIキーを取得します。

import logging
import openai
import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

openai.api_key = os.environ["OPENAI_API_KEY"]
app = App(token=os.environ["SLACK_BOT_TOKEN"])

そして、GPT-3へのリクエストに必要なメッセージを保持するリストと、メッセージのトークン数を制限するための関数を定義します。

messages = []
max_tokens = 4096

def add_message(messages, role, content, max_tokens):
    # ...

def total_tokens(messages):
    # ...

初期のシステムメッセージも設定しておきます。

initial_system_message = "You are an excellent butler in our family. YourName is 風間 You are 56 years old, intelligent, gentlemanly and calm. You are often charming."
messages = add_message(messages, "system", initial_system_message, max_tokens)

次に、ボットがメンションを受けた際に呼び出されるイベントハンドラmention_handlerを定義します。この関数では、受信したメッセージのテキストとユーザーIDを取得し、GPT-3.5-turboにリクエストを送信する前に、メンション部分を取り除きます。その後、ユーザーのメッセージをメッセージリストに追加し、GPT-3.5-turboにチャットコンプリーションのリクエストを送信します。リクエストには、モデル名、メッセージリスト、温度、最大トークン数などのパラメータを指定します。

GPT-3.5-turboからのレスポンスを受け取ったら、返信を整形してSlackに送信します。最後に、GPT-3.5-turboからの返信をメッセージリストに追加します。これにより、ボットとユーザーの会話が継続的に行われることができます。

@app.event("app_mention")
def mention_handler(body, say):
    global messages
    text = body['event']['text']
    user = body['event']['user']

    # メンションを取り除く
    prompt = text.replace(f'<@{user}>', '').strip()

    try:
        # Add the user's message to the messages list
        messages = add_message(messages, "user", prompt, max_tokens)

        # GPT-3.5-turboを使ってリクエストを生成
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages,
            temperature=0.8,
            max_tokens=300,
        )

        # 返信を取得し、Slackに送信
        reply = response.choices[0]["message"]["content"].strip()
        say(f'<@{user}> {reply}')

        # Add the assistant's reply to the messages list
        messages = add_message(messages, "assistant", reply, max_tokens)

    except Exception as e:
        # Handle any exceptions that may occur

このイベントハンドラを使って、ボットはSlack上でメンションされたときに適切な返信を生成し、送信することができます。

最後に、ソケットモードハンドラを使ってボットを起動します。

if __name__ == "__main__":
    handler = SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
    handler.start()

メッセージリストとトークン数制限の実装

ここでは、GPT-3へのリクエストに必要なメッセージを保持するリストと、メッセージのトークン数を制限するための関数を定義します。

messages = []
max_tokens = 3096 # GPT3のTOKEN_MAX - ResponseのMAX

def add_message(messages, role, content, max_tokens):
    new_message = {
        "role": role,
        "content": content
    }
    messages.append(new_message)

    while total_tokens(messages) > max_tokens:
        messages.pop(0)

    return messages

def total_tokens(messages):
    token_count = 0

    for message in messages:
        token_count += len(message["content"]) + 1  # "content"のトークン数と役割分の1トークン

    return token_count

add_message関数は、与えられた役割("user"または"assistant")とコンテンツを持つ新しいメッセージをリストに追加します。その後、トータルのトークン数がmax_tokensを超えている場合、リストから最も古いメッセージを削除します。これにより、GPT-3に送信するプロンプトのサイズが適切に保たれます。

total_tokens 関数は、現在のメッセージリスト内のトータルのトークン数を計算します。各メッセージのコンテンツのトークン数に加えて、役割を示す1トークンを追加します。ただし、ここで計算されるトークン数は、実際のGPT-3のトークン数とは異なる推測値であることに注意してください。実際のトークン数を正確に取得するためには、OpenAI APIを利用する必要があります。それでも、この推測値はGPT-3へのリクエスト時に使用されるトークン数の制限に対応しており、実用上は問題ないでしょう。

まとめ

今回は、どのようにしてChatGPTと協力しながら、素晴らしいSlackBotを開発していったかを紹介しました。途中でたくさんの詰まりや失敗もありましたが、結局のところ、GPTという凄いAIに助けられながら成功にたどり着けました!

これからもっと多くの人が、このようなAIを活用して新たなアプリケーションやプロジェクトを開発することでしょう。そんな時、私たちの今回の冒険が何かの役に立てば幸いです。

最後に、GPTの助けなしにはこのブログも書けなかったことを考えると、AIの力はもはや無視できませんね。そろそろGPT-3.5-turboに感謝の気持ちを伝える手紙を書いておくべきかもしれません(笑)

それでは、皆さんもAIと一緒に楽しく開発の旅を楽しんでください!ChatGPTもきっとあなたの強力な味方になることでしょう!🤖💡

以上、風邪で床に臥せている現場からお送りしました!🚀🌟

Discussion

ログインするとコメントできます