新規ゲームへの対応手順
はじめに
新規ゲームに対応するためには、General Agent のソースコードを適切に書き換える必要があります。
そのための準備として、Get Started > テンプレートプロジェクトへの導入 > General Agent によるテストプレイ を参考に、以下のことを行ってください。
- 環境の構築
- 作業フォルダの作成
- データの事前準備
- マップ画像の用意
- マップスキャンデータの配置
- ゲームバイナリの配置
- 設定ファイルの編集
- ゲーム情報の設定
- Behavior Tree Maker の起動
- ゲーム内情報の設定
- ゲームの基本操作の設定
- 座標変換係数の設定
- オブジェクト情報の設定
Behavor Tree Maker の操作方法については Behavor Tree Maker 操作マニュアル を参照してください。
コード変更箇所
本ドキュメントでは、具体的な書き換え対象のファイルと該当箇所について説明します。
コード変更についても、Get Started > テンプレートプロジェクトへの導入 > General Agent によるテストプレイ の、以下の項目を参考にしてください。
- コードの変更
- chat_bot/chat_llm.py の編集
- chat_bot/chat_llm_data.py の編集
ビヘイビアツリー、及び、関連データのカスタマイズについては Behavor Tree Maker 操作マニュアル を参照してください。
チャットボットの LLM 関連のカスタマイズ
チャットボットの LLM 関連のカスタマイズに関して、カスタマイズ対象となり得る箇所について以下に説明します。
settings.yaml
chat_bot 関連の設定項目は以下の通りです。
# chat_bot 関連
chat_bot:
# LLM パラメータ
# model: gpt-3.5-turbo-0613
model: gpt-3.5-turbo-1106
# model: gpt-4-0613
# model: gpt-4-1106-preview
temperature: 0.0
top_p: 0.0
timeout: 20 # 秒
# 入力テキスト解析に使用する ChatLLM の関数
get_tasks_mode: oneshot # get_tasks_oneshot
# get_tasks_mode: oneshot_fc # get_tasks_oneshot_fc
# get_tasks_mode: phase # get_tasks_phase
# 音声合成に使用する外部 API
text_to_speech_mode: openai_tts # OpenAI TTS API
# text_to_speech_mode: voicevox # VOICEVOX
model
model は gpt-3.5 を利用していますが、精度向上のために gpt-4 への変更も可能です。ただし、model を変えると全体の精度バランスも変わる可能性があるので、プロンプト、functions、データリストの調整も実施するようにしてください。パラメータ 値 model gpt-3.5-turbo-1106 temperature
,top_p
temperature と top_p は LLM の response の揺れを最小限にするものですが、必要に応じて変更することも可能です。パラメータ 値 temperature 0.0 top_p 0.0 timeout
openai ver.1 からデフォルトで 3 回リトライするようになったため、リトライオーバーになった場合のトータルの時間をなるべく短くすること、たまたま通信エラーになった場合などはリトライで復旧する可能性が高いためリトライまでの時間を最小限にすること、LLM への問い合わせ内容の難易度によってはある程度の時間を確保する必要もあることなどを考慮して、timeout はバランスを取って 20 秒としています。新規ゲームに適用する場合、入力テキストの複雑度もも変わる可能性があるため、タイムアウト時間も適宜調整してください。さらに、openai ライブラリのデフォルトリトライ回数(3)をそのまま利用していますが、ライブライではリトライの回数も指定できるため、適宜利用してください。
パラメータ 値 単位 timeout 20 秒 get_tasks_mode
入力テキスト解析で使用する関数を設定します。get_tasks_mode 関数 デフォルト oneshot get_tasks_oneshot ★ oneshot_fc get_tasks_oneshot_fc phase get_tasks_phase text_to_speech_mode
使用する音声合成 API を設定します。text_to_speech_mode 関数 デフォルト openai_tts OpenAI TTS API ★ voicevox VOICEVOX
chat_bot/bot_manager.py
chat_llm モジュールを利用して入力テキストからタスク情報を取得します。
chat_llm 側のカスタマイズに対応して変更を要する可能性があります。
chat_bot/chat_llm.py
convert_response
openai ライブラリの ver.1 から API の response のデータ形式が変更になったため、この関数で従来の ver.0 のフォーマットへの変換を行っています。具体的には ver.0 では json だったのが、ver.1 では専用の class になったため、本ツールで利用しているデータのみ選択して json への変換を行っています。
load_data
chat_bot/chat_llm_data.py で定義しているデータをそのまま読み込んでいるものと、data/work_space/ の各種定義データを読み込んで処理用に再構成しているものがあります。以下では再構成しているものについて説明します。
revert_table
convert_table
の逆変換テーブルcommand_list
,command_list2
,command_ja_list
,command_ja_list2
,command_ja_dict
,command_ja_dict2
コマンド名の各種リストです。LLM に候補データとして送信します。それぞれ具体的な内容やデータ量が異なっており、ケースによって送信するものを選択しています。target_names
,target_aliases
以上は目的語のリストです。LLM に送信するデータリストを再構成するための元データです。前者は正式名のみ、後者はエイリアスを含んでいます。map_list
,place_list
,enemy_list
,item_list
,person_list
目的語の種類ごとのデータリストです。現状はエイリアスを含めたリストを利用しています。カスタマイズにより目的語の種類が変更になった場合は適宜見直してください。prompt_get_tasks
,prompt_get_tasks_fc
,functions_get_tasks_fc
,functions_remove_num_time
プロンプト、functions 定義は、chat_bot/chat_llm_data.py で定義されたものに 各種データリストを埋め込んで再構成しています。
search_command
LLM に問い合わせる前に内部データを検索することで、コマンド特定のレスポンスを高速化する目的で利用しています。目的語・数量・時間指定のないコマンドのみ有効です。
search_yes_no
LLM に問い合わせる前に内部データを検索することで、Yes/No 判定のレスポンスを高速化する目的で利用しています。
to_task
chat_llm の内部データ形式から bot_manager が扱う task 形式への変換を行っています。
to_tasks
bot_manager に返す配列形式への変換を行っています。
run_sequence_get_tasks
get_tasks 用に LLM への送受信と response から内部データ形式への s 変換を行っています。
convert_get_tasks
get_tasks 用に LLM の response から内部データ形式への変換、データチェック、タスク分割を行っています。
get_tasks_oneshot
入力テキスト解析を 1 回の LLM 送受信で行う方式です。プロンプト単独方式です。
get_tasks_oneshot_fc
同じく、入力テキスト解析を 1 回の LLM 送受信で行う方式です。こちらはプロンプトと functions を併用しています。現状のサンプルでは functions 併用よりも、プロンプト単独のほうが精度が高いため、プロンプト単独の方をデフォルト設定としています。
get_tasks_phase
LLM への問い合わせを 2 フェーズに分けて実行します。1 フェーズ目はセンテンスの分割と核となるコマンドの特定を行い、2 フェーズ目は 1 フェーズ目で分割したセンテンス毎に、特定したコマンドに必要なデータに絞り、入力テキストを解析します。gpt-3.5-turbo-1106 が 16K モデルとなったため、現状では データを絞るメリットが少ないため、oneshot (一括方式) をデフォルト設定としています。
get_tasks
入力テキスト解析のラッパー関数です。settings.yaml の設定に従って関数の振り分けを行っています。
judge_yes_no_with_llm
入力テキストが Yes か No のどちらの意味になるか LLM を利用して判定しています。
judge_yes_no
Yes/No 判定のラッパー関数です。LLM に問い合わせる前に、command_sentences.yaml に合致するワードがないか検索を行っています。
remove_num_time
LLM を利用して、ビヘイビアツリー自動生成用に、入力テキストから数量・時間指定表現の削除を行っています。
chat_bot/chat_llm_data.py
chat_llm.py で使用する各種プロンプト、functions、データリストを定義しています。
autogen_desc_suffix
ビヘイビアツリー(コマンド)を LLM を利用して自動生成する際に、LLM に送信する説明文の末尾に付加する文字列です。ビヘイビアツリー単体で延々に繰り返しループするものが生成される可能性があるため、チャットボットからの自動生成の場合は必ず 1 回で終了するようこの文字列を付加しています。func_params
自動生成用のサンプルコマンドのリストと必要なパラメータを定義しています。ビヘイビアツリーに事前に登録すれば不要になりますが、自動生成のデモ用に用意しています。convert_table
ツール内のコマンド名と LLM に実際に送信するコマンド名の変換を行うテーブルです。現状は変換が必要なケースはありませんが、コマンド名が LLM の解析の妨げになる可能性があるため、LLM の解析精度のチューニング用に設けています。num_unit_list
数量単位表現のリストです。LLM に送信します。time_unit_list
時間単位表現のリストです。LLM に送信します。time_unit_en_list
時間単位の英語表現のリストです。内部データ形式への変換用です。position_list
目的語の位置関係を示す表現のリストです。LLM に送信します。repeat_list
繰り返し指示の表現のリストです。LLM に送信します。word_dict
位置関係表現、繰り返し表現を内部データ形式に変換するためのテーブルです。prompt_get_tasks
get_tasks_oneshot と、get_tasks_phase の 2 フェーズ目で使用するプロンプトです。prompt_get_tasks_phase1
get_tasks_phase の 1 フェーズ目で使用するプロンプトです。prompt_get_tasks_fc
get_tasks_oneshot_fc で使用するプロンプトです。functions 定義と併用します。functions_get_tasks_fc
get_tasks_oneshot_fc で使用する functions 定義です。prompt_judge_yes_no
judge_yes_no_with_llm で使用するプロンプトです。functions_judge_yes_no
judge_yes_no_with_llm で使用する functions 定義です。現状は未使用です。prompt_remove_num_time_fc
remove_num_time で使用するプロンプトです。functions 定義と併用します。prompt_remove_num_time
remove_num_time で使用するプロンプトです。単独で使用します。functions_remove_num_time
remove_num_time で使用する functions 定義です。現状は未使用です。
work_space_base/command/command_error_response.yaml
コマンドの各種エラーメッセージを定義します。
work_space_base/command/command_reference.tsv
コマンドの各種パラメータを定義します。
work_space_base/command/command_response.yaml
コマンドの各種メッセージを定義します。
work_space_base/command/command_sentences.yaml
コマンド表現のバリエーションを定義します。
work_space_base/object/object_reference.tsv
オブジェクトの各種パラメータを定義します。
work_space_base/object/object_sentences.json
オブジェクトのエイリアスを定義します。