GPT-4と協力してGPT3.5turbo搭載のSlackBot開発を作った:実例から学ぶ、AIパワードのエンジニアリング🚀🤖💡
こんにちは。四畳半です。
昨日、自宅で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