💬

【ChatGPT】Function Callingを使ってゲーム作ってみた!

2023/06/21に公開

はじめに

ChatGPTを使って恋愛シミュレーションゲームを作っているものです。
この度発表された新API「Function Calling」に対応してましたので、記事を書いてみました!

ちょっと広告

「AIと恋するカフェ」について

  • ChatGPTを使ったリアルな恋愛シミュレーションを楽しめるゲームです。
  • LINEで簡単に遊ぶことができちゃいます。

以下からプレイが可能です。

https://line.me/R/ti/p/%40468nyaks

  • キャラクターとの対話形式ではないので、ちゃっかり恋愛シミュレーションゲームとして楽しめちゃいます!

    • 選択肢が無く、プレイヤーが発言することで物語が進むシステムなので、展開は無限大です。
  • 好感度は、あなたがヒロインに対して、共感したり自分のことを話したりすることで上がるシステムにしています!

    • 「summary」と入力すると今の評価が聞けます。現実の恋愛でも必要なスキルをゲームで身につけることができます。
  • 展開は始めるたびに少しづつランダムに変化するので、何度も楽しめます。

    • 会話がおかしくなった時も「reset」と入力して最初からやり直せます。

まだ、フォロワーがいません…フォーローお願いします!😭
最初のフォロワーは君だ!!

目次

方法

Function Callingを使ってゲームを進行させる方法について解説します。以下はLangchainJSを対象としています。

1.関数を定義する

まずは、以下のようにChatGPTに知らせる関数をJsonフォーマットで定義します。
関数は複数個あっても対応可能です。その場合はdescriptionでどの関数を使うべきかを判断してくれます。

ここではユーザーにゲームの結果について送信するという関数を定義しています。

functions = {
  functions: [
      {
        name: "send_game_progress_results",
        description: "The game's progress results should be answered in Japanese.",
        parameters: {
          status: { 
	    type: "string",
	    description: "Describe the status of the game"
	  },
        },
	required: ["status"],
      },
    ],
    // 以下を設定すると強制的にFunctionを使わせることができる
    function_call: {
      name: "send_game_progress_results",
    },
}

2.関数とメッセージを渡してリクエストする

modelを定義してリクエストします。
optionsに先程のfunctionsを指定することでFunctionをChatGPTが使用することができます。

const model = new ChatOpenAI({
  temperature: 0.9, openAIApiKey: process.env.OPENAI_API_KEY
});

const aiResponse = await model.generate(messages, functions);
console.log(aiResponse)

messages.push(aiResponse)

実行結果

AIChatMessage {
  text: '',
  name: undefined,
  additional_kwargs: {
    function_call: {
      name: 'send_game_progress_results',
      arguments: '{\n  "status": "ゲームの進行結果"\n}'
    }
  }
}

3.FunctionChatMessageを追加する

次にメッセージをリクエストする際に、関数を実行した結果であるFunctionChatMessageを追加します。
リクエストは以下のような順番になります

  1. HumanChatMessage
  2. AIChatMessage
  3. FunctionChatMessage
  4. HumanChatMessage
    ...(以下繰り返し)
const functionMessage = new FunctionChatMessage(`'{"status": "success"}'`, "send_game_progress_results")
messages.push(functionMessage)

const response = await model.generate(messages, functions);
...

このように1〜3を繰り返すことで、TRPGのようなゲームであってもFunctionCallingを使ったゲームの進行が可能です。

良かった点

以前同じような形でプロンプト上で工夫してレスポンスをJson形式にしていましたが、たまに普通の文字列やエラーのJsonが返ってくることがありました。それに比べFunctionCallingはよりエラーが減って安定して使えるようになったのかなと思います。

つまづきポイント

langchainjsではモデルの呼び出し(generate)をするときに、AIChatMessageのfunction_callが含まれないという仕様になっていました。(誰か直してください…)
追伸:PR出しました。

終わりに

先日のアップデートではFunction calling以外にも様々な発表がありましたね。
コンテキスト長の増加や価格の低下など嬉しいものばかりでした。今後もますます発展していきそうなこの分野を見逃すな!
それでは!

Discussion