AI_AVALON : FrontPage  Index  Search  Changes  PageRank  RSS  Login

AI_AVALON : FrontPage

( jump to English FrontPage )

( jump to Download Page )
>> The latest version of the AI_AVALON system is ver.0.9.2 (20240425_1156).


AI_AVALON プロジェクト

AI_AVALON は,"THE REGISTANCE:AVALON" (和名 "レジスタンス:アヴァロン") という ゲームを題材に,「説得」会話を重視して,人も交えてプレイすることができる AI を 作成することを目指すプロジェクトです. とはいえ,無制限の会話を可能とすることは現状では非現実的であるため,「説得」に 必要となりそうな会話の流れや表現を絞ってプロトコル化しています.

例えば,説得の効果を上げるために信頼度を上げる方向の発言を連続したり,他者の説 得行動を阻害するために即座の反論をしたりということがあると思いますが,これを無 条件に許容しようとすると,プレイのコントロールが難しくなります. そのため,AI_AVALON では,基本的にはプレイヤの発言権は順番に回すようにするもの の,「割込み発言」という行為で発言手番とは別に発言することを可能としています. ただし,「割込み発言」を無条件で許可してはプレイのコントロールができないため, 保有するポイントを消費して「割込み発言」の権利を獲得する必要があるとします. これにより,「割込み発言」を可能としつつも制限を加えてプレイの流れが破綻する ことを回避すると同時に,どのタイミングでどの程度のコストを支払ってどのような 割込み発言を行うのが効果的かをという課題も課すことになります.

AI_AVALON のシステムの概要は,次の README ファイルを見てください.


 [ 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) 上では動作しません.

・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
置いています.システム動作テストにご利用ください.

Last modified:2024/04/26 20:38:27
Keyword(s):[AVALON] [AI_AVALON] [THE REGISTANCE:AVALON]
References:[AI_AVALON : Downloads] [AI_AVALON : English FrontPage]