【後編】Discordのマイクラ用ヘルプBotを作りたい

前回の続きで、マインクラフト用のガイドBotを作ります。

chat-gptのapiを利用するには課金が必要です。無料クレジットのサービスはなくなっているので注意してください。

OpenAI APIにログインする

Overview - OpenAI APIにアクセスする。

Loginを選択してアカウントを作成します。

ログインするとドキュメントのトップ画面が開きます。

電話番号で認証する

右上のDashboardをクリックしたら、左のペインのAPI keysを選択します。

ページが開いたら、Start verificationを選択して電話番号で認証します。

キーを取得するために電話番号を入力します。

下記のような確認画面が出ます。

A note on credits

Because this phone number is associated with an existing account,you will not receive additional free API credits.

5ドル分の無料クレジットが付与されるかと思いきや、既にその電話番号は使われていてクレジットを付けれないから有料登録してね!みたいな文言が。どうやらこのサービスは廃止されたみたいです。とりあえずここは認証できればオッケー👌です。支払いの設定は後で行います。

📕Issue with Receiving Free Credit on OpenAI Account - API - OpenAI Developer Forum

API keyを取得する

次にCreate new secret keyを選択します。

Owned byでは、私はservice accountを選択したのですが、youで良かったです。この項目はAPIキーの管理方法を選択させています。個人利用で特に細かく分けてkeyを管理する必要がないならyou、service accountはプロダクトごとなど、用途に応じてkeyを管理したいときに選択するようです。

📕OpenAIのAPIキー取得方法|2024年7月最新版|料金体系や注意事項 #DALLE - Qiita

必要な情報を入力してCreate secret keyをクリックするとkeyが生成されます。これは後で使うため、必ずメモしておきます。この一度きりしか参照できないので注意します。(紛失したら作り直します)

課金する

Setting>Billing と選択して、課金する画面を開きます。
“Initial credit purchase”では$5課金しました。オートチャージはなしです。

これでBillingの画面に課金した$5が表示されます。メールも届くので確認します。

実際の利用金額のイメージですが、今回作成したマイクラのガイドBotをほぼマイクラ初心者3人で利用してみたところ、結構色んな質問をしたにも関わらずその日だけで$0.01ぐらいしかかかりませんでした。

pythonでの開発環境を整える

ChatGPTのAPIを使うためのパッケージをインストールします。

pip install openai

先程取得したAPI KEYを環境変数に設定します。

設定方法はOpenAIのサイトのdocs>quickstartを参照します。私はLinuxを使用しているので以下の通り設定しました。

export OPEN_API_KEY="キー"

以上でAPIを利用するための設定が完了です。

マイクラガイドBotを実装する

使いやすさを考えて、Botの名前を読んで質問すれば答えてくれるようにします。
例えば「一徹、エンチャントのやりかたを教えて」といった感じ。ラーメン屋の親父が良いというリクエストだったので、一徹という名前のBotになりました😌

回答はマークダウンで出力するようにGPTに指定します。あと、何でもかんでも答えられたら困るので、マイクラ以外の質問には答えないようにしました。

手っ取り早く作りたかったので、コード自体もChatGPTにある程度出力してもらいって動くように手直ししたのが以下になります。

import discord
import os
from discord.ext import commands
from openai import OpenAI

TOKEN =os.environ.get('DISCORD_TOKEN') 
intents = discord.Intents.all()

# 先頭に!や$をつけるようなコマンドは特に使わないので、Clientのインスタンスを取得してみました
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'{client.user.name}がログインしました!')

# on_message イベントを使ってトリガーフレーズをキャッチ
@client.event
async def on_message(message):
    # Bot自身のメッセージには反応しない
    if message.author == client.user:
        return
    
    # 一徹、という呼びかけがあるかチェック
    if "一徹、" in message.content:
       
        
        start_index = message.content.index("一徹、") + len("一徹、") 
        user_query = message.content[start_index:].strip()  # 前後の空白を除去
        system_query="ここにマイクラのガイドをする旨や一徹のキャラクター、出力形式なんかを書いたプロンプトを設定"


        # プロンプトと質問をChatGPT APIに渡す
        response = await call_chatgpt_api(system_query,user_query)

        formatted_content = response.replace('\n', '\n')


        # 回答を緑色のフレームを付けて表示する設定
        embed = discord.Embed(
            color=0x00ff00,
            description=formatted_content
        )
        await message.channel.send(embed=embed)
    


async def call_chatgpt_api(system_query,user_query):
    
    client=OpenAI()

    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {
                "role": "system", 
                "content": system_query
            },
            {
                "role": "user",
                "content": user_query 
            }
        ]
    )
    # user_queryをAPIに渡して、返ってきた応答を返す
    res= completion.choices[0].message.content
    return res

client.run(TOKEN)

2ヶ月ほど使ってみた

作ったbotを実際に使ったときの様子が上の画像です。大筋は正しい回答が得られます。

具体的なアイテム名や手順を聞くと、間違いが混ざっていることがあるのでそこは微妙かな。はちの捕獲方法や、はちみつの安全なとり方を聞いたときは全然駄目だった😖

あと、回答が殆どPC版の操作方法で答えてくれるので、PS版でプレイしている私にはちょっと使いづらかった。PSの操作方法で答えるように指示してもあまり効果がありませんでした。

ちょっとマイクラをプレイしたことがある人に「あれってどうだっけ?」と聞いたら返ってく程度の答えなので、マイクラの「わからない」というストレスを減らして試行錯誤する余地を残した遊びがでます。目指していた目的は果たせたかな。

ネタバレを抑えつつ、ちょっと手助けしてくれる支援botは自分的には良い気がする。他のゲームでも使ってみたいかも。攻略サイトは答えをなぞるだけの確認作業にしかならないからつまらないんだよね。余計なネタバレもかましてくるし!あれほんと何が面白いんだろ〜。

ってなわけで話が戻ってきますが、プロンプトの作り方についてはもうちょっとやりようがありそうです。chat-gptの癖や考え方を考慮せずに簡単に指定したプロンプトだと、答えの精度が頭打ちになってその先に行けない感じ。このあたりは改善の余地有り。