AI_AVALON : FrontPage
( jump to Download Page )
>> The latest version of the AI_AVALON system is ver.0.9.7 (20241225_0324).
問合わせをご希望の場合は,AI_AVALON システムのソースアーカイブに含まれる "Contact_Us.txt" を見てください.
AI_AVALON プロジェクト
AI_AVALON は,"THE REGISTANCE:AVALON" (和名 "レジスタンス:アヴァロン") という ゲームを題材に,「説得」会話を重視して,人も交えてプレイすることができる AI を 作成することを目指すプロジェクトです. とはいえ,無制限の会話を可能とすることは現状では非現実的であるため,「説得」に 必要となりそうな会話の流れや表現を絞ってプロトコル化しています.
例えば,説得の効果を上げるために信頼度を上げる方向の発言を連続したり,他者の説 得行動を阻害するために即座の反論をしたりということがあると思いますが,これを無 条件に許容しようとすると,プレイのコントロールが難しくなります. そのため,AI_AVALON では,基本的にはプレイヤの発言権は順番に回すようにするもの の,「割込み発言」という行為で発言手番とは別に発言することを可能としています. ただし,「割込み発言」を無条件で許可してはプレイのコントロールができないため, 保有するポイントを消費して「割込み発言」の権利を獲得する必要があるとします. これにより,「割込み発言」を可能としつつも制限を加えてプレイの流れが破綻する ことを回避すると同時に,どのタイミングでどの程度のコストを支払ってどのような 割込み発言を行うのが効果的かをという課題も課すことになります.
AI_AVALON のシステムの概要は, 次の README ファイル(AI_AVALON システムのソースアーカイブに含まれています)を見てください.
[ README about AI AVALON ]
Copyright (c) 2022 Hidetoshi NAGAI
Copyright (c) 2022 Kyutech AI AVALON Team
*** AI_AVALON システム ***
このディレクトリの下には,AI_AVALON システムのプログラムやドキュメントが
置かれています.
AI_AVALON は,"THE REGISTANCE:AVALON" (和名 "レジスタンス:アヴァロン") という
ゲームを題材に,「説得」会話を重視して,人も交えてプレイすることができる AI を
作成することを目指すプロジェクトです.
とはいえ,無制限の会話を可能とすることは現状では非現実的であるため,「説得」に
必要となりそうな会話の流れや表現を絞ってプロトコル化しています.
例えば,説得の効果を上げるために信頼度を上げる方向の発言を連続したり,他者の説
得行動を阻害するために即座の反論をしたりということがあると思いますが,これを無
条件に許容しようとすると,プレイのコントロールが難しくなります.
そのため,AI_AVALON では,基本的にはプレイヤの発言権は順番に回すようにするもの
の,「割込み発言」という行為で発言手番とは別に発言することを可能としています.
ただし,「割込み発言」を無条件で許可してはプレイのコントロールができないため,
保有するポイントを消費して「割込み発言」の権利を獲得する必要があるとします.
これにより,「割込み発言」を可能としつつも制限を加えてプレイの流れが破綻する
ことを回避すると同時に,どのタイミングでどの程度のコストを支払ってどのような
割込み発言を行うのが効果的かをという課題も課すことになります.
現在の AI_AVALON システムがサポートするプロトコル (全体の流れや発言の種類) は,
Document/Protocol.txt に記載していますから,詳しくはそちらを参照してください.
*** システムの構成 ***
AI_AVALON システムの構成要素は次の通りです.
--------------------------------------------------------------------------
・サーバ
中核においてプレイの進行管理を司ります.
・プレイヤオブジェクト
ゲーム参加者ごとに一つが生成され,サーバとエージェントとのやり取りを,
サーバと同一プロセス上で司るものです.
クライアントとの間に Socket (TCP または UNIX domain) 通信路を開きます.
・クライアント
エージェントごとに一つ存在し,サーバとエージェントと間の通信を中継します.
エージェントと同マシン上で稼働し,プレイヤオブジェクトとの間で Socket 通信を,
エージェントとの間で pipe を用いた通信を行います.
・エージェント
ゲーム参加者として実際に行動計画を行う AI (または人) です.クライアントと
の間で標準入出力を pipe で繋ぎ,プレイに関する通信を行います.
--------------------------------------------------------------------------
つまり,プレイ進行中の構成は
--------------------------------------------------------------------------
[method] [Socket] [pipe]
<サーバ> ←→ <プレイヤオブジェクト1> ←→ <クライアント1> ←→ <エージェント1>
↑↑
|└──→ <プレイヤオブジェクト2> ←→ <クライアント2> ←→ <エージェント2>
|
└───→ <プレイヤオブジェクト3> ←→ <クライアント3> ←→ <エージェント3>
: : :
: : :
--------------------------------------------------------------------------
となっており,<プレイヤオブジェクト> ←→ <クライアント> ←→ <エージェント>
の組が,サーバから見た際の一人のプレイヤということになります.
AI_AVALON システムのコードは Ruby で書かれていますが,思考を司るエージェントは
標準入出力で通信を行う独立した存在ですので,好きなプログラム言語を用いて実装す
ることができるようになっています.
*** ディレクトリの内容 ***
各ディレクトリの内容は次の通りです.
--------------------------------------------------------------------------
・Document
プロトコルの説明などの文章が置かれています.
・Protocol.txt
プレイの進行やメッセージの種類など,システム全般を規定.
・KeyCode.txt
通信で利用する数値コードを規定.
・CommunicationFormat.txt
通信路におけるバイナリ形式でのデータフォーマットを規定.
プレイヤオブジェクト←→クライアント間の通信で使用.
クライアント←→エージェント間での通信にも選択可能.
・CommunicationString.txt
通信路におけるテキスト形式でのデータフォーマットを規定.
クライアント←→エージェント間での通信のデフォルトとして使用.
・Connection.txt
サーバとクライアントとの間の接続確立までの手順を規定.
・Query.txt
エージェントからサーバ (プレイヤオブジェクト) への問い合わせ規定.
(必要性が乏しそうであるため,現状では未完成)
・Terminate.txt
プレイ終了時の処理についての説明.
・Library
システムを構成する Ruby プログラムの内,エージェント作成時に役立ちそうな
プログラム (Ruby版/Python3版) が置かれています.
・msg_catalog/
データフォーマットの内容を自然言語表現するためのメッセージカタログ
で,ログなどの内容を人が確認するのを助けるためのものです.
ログのデータファイルの内容を自然言語表現で表示したい場合は,
Utility/msg_log_to_nl.rb や Utility/serverlog_to_nl.rb を
参照してください.
・System
システムの中核となるサーバやクライアントのプログラムが置かれています.
・server.rb
AI_AVALON システムにおけるサーバです.
・client.rb
AI_AVALON システムにおけるクライアントです.
・server_launcher.rb
クライアントからの通信を受け付けてプレイヤオブジェクトを生成し,
サーバを起動してプレイを開始するプログラムです.
1ゲームだけの実行を想定しています.
・agent_launcher.rb
サーバ (プレイヤオブジェクト) との通信を確立し,
クライアントの生成とエージェントの起動を行うプログラムです.
・multi_server_service.rb
一つのポートで待ち受けて,複数サーバを起動するプログラムです.
設定人数のプレイヤが参加するごとに並列にサーバを起動します.
同時動作するサーバ数は設定可能で,限度を超えた場合には
接続しようとするクライアントはサーバ終了の順番待ちとなります.
AI_AVALON システムをサービスとして動作させる場合を想定しています.
このプログラムでは fork 命令によるプロセス生成を使用しているため,
fork をサポートしていない OS (例:Windows) 上では動作しません.
・group_controller.rb
multi_server_service.rb は,接続を完了したエージェントの順に
プレイヤーグループを作成するため,接続が並列に集中すると
エージェントを起動した順にグループができるとは限りません.
このプログラムは,グループ成立後ののサーバ起動を監視しつつ,
1グループ分のエージェントを起動するプログラムを繰り返すことで,
指定するエージェント群でプレイが行われるように制御します.
・request_group_key.rb
multi_server_service.rb において,グループを指定するための識別子を
獲得するためのプログラムです.
グループキーを指定してエージェントを起動する例は,
System/test-grpkey.sh や System/test-grpkey_ux.sh を参照してください.
現在の設定では,グループキーの有効期限は生成後約 10 分間です.
あるグループキーに対してグループが作成されてプレイが開始されたなら,
その時点から 10 分間の有効期限延長がなされます.
ただし,一つのグループキーでプレイできるのは 100 ゲームまでとします.
有効なグループキーを登録しておける数は,現在の設定では 1000 個です.
それ以上は,登録済みキーの有効期限切れによる空きを待つ必要があります.
これらの制限は multi_server_service.rb の頭の方に記載されています.
・Agent
ダミーエージェントや,人がプレイする際のインターフェースが置かれています.
・basic_agent.rb (Ruby版) / basic_agent.py (Python3版)
独自のエージェントを作成する場合のベースとなるクラス定義です.
簡易な独自エージェントを作成する場合は,このクラスを継承して,
各種メッセージの受信時処理に対応しているメソッドを
オーバーライドすれば良いでしょう.
このファイルをエージェントプログラムとしてそのまま起動した場合は,
すべてのメッセージ要求に対して発言省略 (omit) のメッセージを
送信するようになっています.
それゆえ,そのままダミーエージェントとして使うこともできます.
・basic_nl_agent.rb (Ruby版) / basic_nl_agent.py (Python3版)
basic_agent.{rb,py} で定義されているエージェントと比較して,
出力を自然言語表現に変換するようにしただけのエージェントです.
basic_agent.{rb,py} の定義を継承して作成したクラスの例でもあります.
basic_agent.{rb,py} 同様に,ダミーエージェントとして使うこともできます.
・human_if/human_if.rb
人がプレイに参加するためのインターフェースです.
受信したメッセージを自然言語表現で確認できると同時に,
送信すべきメッセージの編集機能も有しています.
・Utility
プレイログを調べる場合など,プレイ外で役立ちそうなユーティリティプログラム
が置かれています.
--------------------------------------------------------------------------
*** プログラムの起動 ***
サーバやエージェントの起動は,以下に従ってください.
--------------------------------------------------------------------------
・server_launcher.rb によるサーバの起動
起動のためのコマンドラインは次の通りです.
ruby server_launcher.rb <logfile> <config> <restriction>
・<logfile>
プレイログを記録するファイル名です.
指定を省略するか,"-" か空文字列を指定した場合は,標準エラー出力に
書き出します.
・<config>
サーバの動作条件を設定するファイルです.
指定を省略した場合,server_launcher.rb と同じ場所にある server.conf が
使用されます.
サンプルとして,TCP socket を使用する 10 人プレイ用の server.conf と,
最少人数構成である 5 人プレイ用の server-minimum.conf,
および,それぞれの UNIX domain socket を使用するバージョンの
server_ux.conf と server_ux-minimum.conf とを置いています.
そのまま利用することも可能ですが,人がプレイする際のメッセージ送信のタ
イムアウトが 30 秒に設定されているので,実際に人がプレイするならばもう
少し時間を延ばした方が良いかもしれません.
・<restriction>
プレイを行う際,エージェントに対する役職割当やプレイヤ順などに関して,
何らかの条件を指定したい場合に与えます.
サンプルとして,assign_rst.conf.sample を置いていますから,具体的な指定
方法はそのファイルの内容を参照してください.
・agent_launcher.rb によるエージェントの起動
起動のためのコマンドラインは次の通りです.
ruby agent_launcher.rb <addr>:<port> <mode> <name> <add> <command> ...
or
ruby agent_launcher.rb ux:<unix_sock> <mode> <name> <add> <command> ...
・<addr>:<port>
サーバの IP アドレスとポート番号を指定します.
IP アドレスが省略された場合のデフォルト値は '127.0.0.1' とし,ポート番
号が省略された場合のデフォルト値は 7625 としています.
・ux:<unix_sock>
UNIX domain socket を用いるサーバのソケットファイル名を指定します.
・<mode>
エージェントのタイプを指定します.指摘できる値は "AI" か "HM" です.
"AI" を指定した場合は,エージェントは AI であると想定して,AI 用のタイ
ムアウト時間が設定されます.
同様に,"HM" を指定した場合は,エージェントは人であると想定して,人間用
のタイムアウト時間が設定されます.
・<name>
エージェントの名称を指定します.ただし,この名前はサーバのログ上で,ど
のプレイヤがどのエージェントかを識別するためのものに過ぎず,プレイして
いる他のプレイヤには一切開示されません.
複数のエージェントが同じ名称で参加を試みた場合に対応するため,登録され
る名称は,この <name> の後ろに ":<番号>" を付加したものになります.
登録名称は,サーバとの間で通信を確立する過程で定められて連絡されます.
エージェントが自分の登録名称を受け取るには,<add> パラメータの設定によ
り,コマンドライン引数として受け取る必要があります.
・<add>
サーバとの間で通信を確立する過程において,<logname>,<timeout>,<rolee>
の3つの情報が得られます.それぞれ
<logname> : エージェントの登録名称
<timeout> : 送信すべきメッセージがタイムアウトとなるまでの時間
<roles> : プレイに登場する各役職の人数
を表します.
なお,<roles> の形式については,サーバ設定ファイル (server.conf 等) の
記述を参照してください.
この値に "1" を指定した場合は,エージェントのプログラムを起動する際の
コマンドライン引数の末尾に,これら3つの情報がこの順番で追加されます.
・<command> ...
エージェントプログラムを起動するためのコマンドラインを構成するトークン
リストを指定します.
エージェントプログラムは,標準入力でメッセージを受信し,送信メッセージ
は標準出力に書き出す仕様になっていなければなりません.
なお,<add> パラメータに "1" が指定されている場合は,これらのトークンリ
ストの末尾に3つのパラメータが追加されることを忘れないでください.
・multi_server_service.rb による AI_AVALON サービスの起動
起動のためのコマンドラインは次の通りです.
ruby server_launcher.rb <limit> <loghead> <config> <restriction>
・<limit>
同時に起動するサーバ数の制限値を指定します.
・<loghead>
プレイログを記録するファイルのヘッダ (パスを含む) です.
プレイログは <loghead>_<サーバ起動日時>.log というファイルに,
サーバが標準エラー出力に送った内容は <loghead>_<サーバ起動日時>.err
というファイルに,書き出します.
なお,サーバ起動日時の表記は 24 時間制で,"YYYYmmdd-HHMMSS" です.
・<config>
並列起動するサーバの動作条件を設定するファイルです.
server_launcher.rb で指定するファイルと同じものです.
server_launcher.rb の場合と同様に,指定が省略された時には
multi_server_service.rb と同じ場所にある server.conf が使用されます.
・<restriction>
プレイを行う際,エージェントに対する役職割当やプレイヤ順などに関して,
何らかの条件を指定したい場合に与えます.
server_launcher.rb で指定するファイルと同じものです.
--------------------------------------------------------------------------
agent_launcher.rb を使用したエージェント起動の例を下記に示します.
(例1) ダミーエージェントをデフォルトのサーバ IP アドレス,ポート番号で起動.
ruby agent_launcher.rb : AI dummy 0 ruby ../Agent/basic_agent.rb
(例2) ダミーエージェントを UNIX domain socket のファイル名 /tmp/AI_AVALON.sock
で起動 (実際には1行).
ruby agent_launcher.rb ux:/tmp/AI_AVALON.sock
AI dummy 0 ruby ../Agent/basic_agent.rb
(例3) 人間用インターフェースをエージェントとして起動 (実際には1行).
ruby agent_launcher.rb xxx.yyy.zzz:nnnn
HM human 1 ruby ../Agent/human_if/human_if.rb xxx.log ja_JP.UTF-8
5人プレイ用の設定 (System/server-minimum.conf) で起動しておいたサーバに対し,
5人分のダミーエージェントを起動するテストスクリプトとして
System/test-rb.sh, System/test-py.sh, System/test-nl.sh
を,また,UNIX ソケット版5人プレイ用設定 (System/server_mx-minimum.conf) で起動
しておいたサーバに対し,5人分のダミーエージェントを起動するテストスクリプトとして
System/test-ux-sock.sh
を置いています.システム動作テストにご利用ください.
Keyword(s):[AVALON] [AI_AVALON] [AI AVALON] [THE REGISTANCE:AVALON]
References:[AI_AVALON : Downloads] [AI_AVALON ARENA] [AI_AVALON : English FrontPage]