🏕️

「TinyTroupe」を使ってみた

2024/11/21に公開

初めまして、Givery AI Lab所属の楊です。
今回は、Microsoftがこの間に公開した「TinyTroupe」ライブラリをご紹介します。このライブラリは、複数のエージェントが人間のように行動したり、互いに話しをしたりして、インタラクションができる環境を構築するために使用されます。人間社会を模擬することができ、面白いと思いますので今回使ってみました!

Persona Simulation

「TinyTroupe」に入る前に、このプロジェクトのモチベーションである「ペルソナシミュレーション」というアイデアに関して簡単にお話ししたいと思います。

一言で言うと、ペルソナシミュレーションとは、LLM(大規模言語モデル)を用いて、適切なプロンプトもしくは微調整により人間の性格特徴を学習し、人間の行動を模倣することです。さらに複数のモデルを相互作用させることにより、人間の集団行動を予測したり、人間社会をシミュレーションしたりすることができます。「ペルソナシミュレーション」におけるLLMの使い方は、一般的なAIアシスタントの概念と異なり、モデルをただ仕事を手伝うための道具ではなく、実際の「人間」として捉えることを目指しています。

それで、LLMが実世界の人間を模倣することができるかと疑っている方がいらしゃるかと思います。その質問に対して、いくつかの研究がポジティブな結果を示しています。例えば:

  • (Shao et al., 2023)は、「人間の実際のエピソード」に基づいてモデルを微調整し、実世界にある人間をシミュレートしました。LLMによる評価と人間による評価により、微調整されたモデルは対象の人の性格や履歴をよく学習しましたことがわかります。この研究は、LLMが一つの人間をシミュレートすることができることを表しました。
  • (Hewitt et al., 2024)では、適切なプロンプトを使ってGPT-4で実世界における社会実験の結果を予測しました。結果より、GPT-4の予測と実際の社会実験の結果には高い相関があり、また人間による予測と同等以上の精度を持っていたことがわかります。この研究は、LLMが複数の人間、つまり人間社会をシミュレートする能力を持つことを表しました。

以上の研究は、LLMによるペルソナシミュレーションを実際の応用に活用する可能性を示しています。

「TinyTroupe」とは

「ペルソナシミュレーション」が広く注目を集めている現在、Microsoftが最近「TinyTroupe」というライブラリを公開しました。その名の通り、「TinyTroupe」は、LLMを基にした人間社会のシミュレーション環境を構築するためのツールで、二つの基本的な要素が含まれています。

  1. Tinyperson: 実世界の人間のシミュレートするためのAIエージェントです。独特の性格、趣味、特技、人生目標などの属性を持ち、外部からの刺激に反応してフィードバックを返す仕組みを備えています。
  2. TinyWorld: TinyPersonが存在する世界です。この世界で、TinyPersonたちがお互いに話したり、行動したりして、相互作用を行います。

以上の二つの要素で、「TinyTroupe」を用いてシミュレーション環境を簡単に構築できます。

ちなみに、ライブラリにはシミュレーション環境の構築に便利なツールやコストを削減するための機能も色々ありますので、詳細についてはgithubのリポジトリを参照してください。
https://github.com/microsoft/TinyTroupe?tab=readme-ov-file

試してみました

今回の記事では「TinyTroupe」を使ってシンプルな環境を作成し、使用の体験を読者にシェアしたいと思っております。

目標の環境

まずは作りたい環境のイメージを説明します。
今回構築したい環境は、東京にある大手企業の法務部の会議室です。会議室で、二人の法務の専門家がある契約書の条項の修正案に関して議論を行なっています。
「TinyPerson」と「TinyWorld」にまとめると、「TinyPerson」は企業の法務部に所属する二人の法務専門家、「TinyWord」は企業のある会議室であると簡単に定義できます。

実際にコードを書きます

インストール

目標の環境を定義した後、実際に実装しましょう。まずリポジトリの説明に従い、ライブラリをインストールし、必要なパッケージを導入します。

git clone https://github.com/microsoft/tinytroupe
cd tinytroupe
pip install .

現段階では、リポジトリから直接のインストールがお勧め!

from tinytroupe.agent import TinyPerson
from tinytroupe.environment import TinyWorld
from tinytroupe.factory import TinyPersonFactory

コンフィグファイルと環境変数の設定

次にコンフィグファイルと環境変数を作ります。コンフィグファイルconfig.iniでは模擬環境を作るのに制定できるパラメーターを定義し、そのテンプレートが以上となります。特に[OpenAI]におけるAPI_TYPE, AZURE_API_VERSION, MODELではOpenAI APIもしくはAzureを使うかを選択できるので、ご自身の状況に合わせて入力ください。他のパラメーターはLLMの生成に使うパラメーターで、今回はデフォルトで設定しました。

config.ini
[OpenAI]
#
# OpenAI or Azure OpenAI Service
#

# Default options: openai, azure
API_TYPE=your_api_type

AZURE_API_VERSION=your_azure_api_version

#
# Model parameters
#

MODEL=your_model
MAX_TOKENS=4000
TEMPERATURE=0.3
FREQ_PENALTY=0.0
PRESENCE_PENALTY=0.0
TIMEOUT=60
MAX_ATTEMPTS=5
WAITING_TIME=1
EXPONENTIAL_BACKOFF_FACTOR=5

EMBEDDING_MODEL=text-embedding-3-small 

CACHE_API_CALLS=False
CACHE_FILE_NAME=openai_api_cache.pickle

MAX_CONTENT_DISPLAY_LENGTH=1024

[Simulation]
RAI_HARMFUL_CONTENT_PREVENTION=True
RAI_COPYRIGHT_INFRINGEMENT_PREVENTION=True


[Logging]
LOGLEVEL=ERROR
# ERROR
# WARNING
# INFO
# DEBUG

環境設定ファイル.envを作成します。自分がAzureを使うので、Azureに関するTokenを入れました。

.env
AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint
AZURE_OPENAI_KEY=your_azure_openai_key
# OPENAI_APY_KEY=your_openai_api_key
from dotenv import load_dotenv

load_dotenv()

TinyPersonの実例を作成

TinyPersonの実例を作るために、二つの方法が提供されます。

方法1:スクラッチから作成

TinyPersonを作るために最も単純な方法はスクラッチから作りたい人間の特徴を一つ一つ定義することです。以下は元のレポジトリの例です。

def create_lisa_the_data_scientist():
  lisa = TinyPerson("Lisa")

  lisa.define("age", 28)
  lisa.define("nationality", "Canadian")
  lisa.define("occupation", "Data Scientist")

  lisa.define("routine", "Every morning, you wake up, do some yoga, and check your emails.", group="routines")
  lisa.define("occupation_description",
                """
                You are a data scientist. You work at Microsoft, in the M365 Search team. Your main role is to analyze 
                user behavior and feedback data, and use it to improve the relevance and quality of the search results. 
                You also build and test machine learning models for various search scenarios, such as natural language 
                understanding, query expansion, and ranking. You care a lot about making sure your data analysis and 
                models are accurate, reliable and scalable. Your main difficulties typically involve dealing with noisy, 
                incomplete or biased data, and finding the best ways to communicate your findings and recommendations to 
                other teams. You are also responsible for making sure your data and models are compliant with privacy and 
                security policies.
                """)
  lisa.define_several("personality_traits",
                        [
                            {"trait": "You are curious and love to learn new things."},
                            {"trait": "You are analytical and like to solve problems."},
                            {"trait": "You are friendly and enjoy working with others."},
                            {"trait": "You don't give up easily, and always try to find a solution. However, sometimes you can get frustrated when things don't work as expected."}
                        ])

  lisa.define_several("professional_interests",
                        [
                          {"interest": "Artificial intelligence and machine learning."},
                          {"interest": "Natural language processing and conversational agents."},
                          {"interest": "Search engine optimization and user experience."}
                        ])

  lisa.define_several("personal_interests",
                        [
                          {"interest": "Cooking and trying new recipes."},
                          {"interest": "Playing the piano."},
                          {"interest": "Watching movies, especially comedies and thrillers."}
                        ])

  lisa.define_several("skills",
                        [
                          {"skill": "You are proficient in Python, and use it for most of your work."},
                          {"skill": "You are able to use various data analysis and machine learning tools, such as pandas, scikit-learn, TensorFlow, and Azure ML."},
                          {"skill": "You are familiar with SQL and Power BI, but struggle with R."}
                        ])

  lisa.define_several("relationships",
                          [
                              {"name": "Alex",  
                              "description": "your colleague, works on the same team, and helps you with data collection and processing."},
                              {"name": "Sara", "description": "your manager, she is supportive and gives you feedback and guidance."},
                              {"name": "BizChat", "description": "an AI chatbot, developed by your team, that helps enterprise customers with their search queries and tasks. You often interact with it to test its performance and functionality."}
                          ])
  
  return lisa

以上のテンプレートに従い、作りたい人物像をTinyPersonの実例として自由に定義できます。

今回の試みで使ったのは方法2です。目標の人物像をより快適に生成するために、ライブラリではLLMを用いて自動的にTinyPersonの実例を生成するツールが提供されます。

factory = TinyPersonFactory("東京にある企業の法務部。")
person_1 = factory.generate_person("もらった契約書をどのように修正するか、または修正された契約書についてコメントをすることを日々の業務として行なっている法律の専門家である日本人を作成してください。")
person_2 = factory.generate_person("もらった契約書をどのように修正するか、または修正された契約書についてコメントをすることを日々の業務として行なっている法律の専門家である日本人を作成してください。")

TinyPersonFactoryクラスのgenerate_personメソッドは希望される人物像の説明文を受けて自動的に要求にあっているTinyPersonの実例を生成する機能を実現します。以上のコードでは「東京にある企業の法務部」という一般的なコンテキストと、「もらった契約書をどのように修正するか、または修正された契約書についてコメントをすることを日々の業務として行なっている法律の専門家である日本人を作成してください」という細かい特徴に基づき、二つの人物を生成しました。生成された人物の属性は以下となります。

persion_1_configure
{'name': '田中 弘',
 'age': 42,
 'nationality': '日本',
 'country_of_residence': '日本',
 'occupation': '法律の専門家',
 'routines': [{'routine': '毎朝、最新の契約修正を確認し、関連部門にフィードバックを提供します。'},
  {'routine': '他の部門と会議を開き、彼らのプロジェクトに関する法的影響について議論します。'},
  {'routine': '午後は、会社の契約に影響を与える可能性のある新しい法律や規制を調査します。'}],
 'occupation_description': 'あなたは東京の会社の法務部門で働く法律の専門家です。あなたの日々の業務は、契約の修正方法を探ることや、修正された契約についてコメントをすることです。すべての契約が日本の法律および会社の方針に準拠していることを確認します。また、他の部門に法的アドバイスを提供し、発生する可能性のある法的な争いを処理します。',
 'personality_traits': [{'trait': 'あなたは細心で、細部にまで非常に注意を払っています。'},
  {'trait': 'あなたは忍耐強く、すべての書類を徹底的に確認する時間を取ります。'},
  {'trait': 'あなたは親しみやすく、同僚たちはよく法的アドバイスを求めてあなたのところに来ます。'},
  {'trait': 'あなたはプレッシャーの中でも冷静で、ストレスの多い状況を容易に対処します。'}],
 'professional_interests': [{'interest': '契約法とそのビジネスにおける適用。'},
  {'interest': '企業ガバナンスとコンプライアンス。'},
  {'interest': '国際貿易法とその日本企業への影響。'}],
 'personal_interests': [{'interest': '伝統的な日本の武道である剣道を練習すること。'},
  {'interest': '歴史小説を読むこと。'},
  {'interest': '日本のさまざまな地域を旅行して、その豊かな文化と歴史を探求すること。'}],
 'skills': [{'skill': 'あなたは日本の契約法について深い理解を持っています。'},
  {'skill': 'あなたは法的なリサーチと分析に熟練しています。'},
  {'skill': 'あなたは複雑な法的文書の作成およびレビューに熟練しています。'}],
 'relationships': [{'name': '佐藤 由紀',
   'description': '法務部門の同僚で、契約レビューでよくあなたと協力します。'},
  {'name': '中村 健二',
   'description': 'あなたの上司である法務部門の部長で、あなたの徹底した作業態度と細部への注意を評価しています。'}],
 'current_datetime': None,
 'current_location': '東京、日本',
 'current_context': [],
 'current_attention': None,
 'current_goals': [],
 'current_emotions': '現在、あなたは冷静で友好的な気持ちです。',
 'currently_accessible_agents': [],
 'emotions': '私は集中しており、今日の課題に取り組む準備ができています。'}
person_2_configure
{'name': '中村 有希',
 'age': 37,
 'nationality': '日本',
 'country_of_residence': '日本',
 'occupation': '法律の専門家',
 'routines': [{'routine': '毎朝、最新の法的な更新情報やニュースを確認して、あなたの仕事に影響を与える可能性のある変更について把握しています。'},
  {'routine': 'あなたは一日のかなりの時間を契約書を読み、分析し、必要な修正を加え、フィードバックを提供することに費やしています。'},
  {'routine': '午後には、他の部門と会議を開き、法的な問題について議論し、アドバイスを提供することがよくあります。'}],
 'occupation_description': 'あなたは東京の会社の法務部門で働く法律の専門家です。あなたの日々の業務は、契約の修正方法を探ることや、修正された契約についてコメントをすることです。すべての契約が最新の法的基準と会社の方針に準拠していることを確認します。また、他の部門に法的アドバイスを提供し、発生する可能性のある法的な争いを処理します。',
 'personality_traits': [{'trait': 'あなたは細心で、細部にまで注意を払い、契約の条項が一つも見落とされないようにしています。'},
  {'trait': 'あなたは冷静で落ち着いた態度を持っており、それがストレスの多い状況を効果的に対処するのに役立っています。'},
  {'trait': 'あなたは優れたコミュニケーターであり、複雑な法的用語を他の人が理解できるように説明することができます。'},
  {'trait': 'あなたは積極的で、常に会社の法的プロセスを改善する方法を探しています。'}],
 'professional_interests': [{'interest': '契約法とその企業の世界における適用。'},
  {'interest': '最新の法的動向や規制を常に把握すること。'},
  {'interest': '会社内で効率的な法的プロセスとシステムを開発すること。'}],
 'personal_interests': [{'interest': '書道や伝統的な日本の芸術を練習すること。'},
  {'interest': '東京で新しい料理を探索し、さまざまなレストランを試すこと。'},
  {'interest': '歴史小説や法廷スリラーを読むこと。'}],
 'skills': [{'skill': 'あなたは日本の契約法と企業規制について深い理解を持っています。'},
  {'skill': 'あなたは法的リサーチと分析に熟練しています。'},
  {'skill': 'あなたは法的文書の作成および修正に熟練しています。'},
  {'skill': 'あなたは法的ソフトウェアやツールを使いこなし、仕事を効率化することに長けています。'}],
 'relationships': [{'name': '佐藤 和夫',
   'description': '法務部門の同僚で、複雑な案件でよくあなたと協力します。'},
  {'name': '山本 美加',
   'description': 'あなたの上司で、法務部門を監督し、主要な法的問題に関して指導を行います。'}],
 'current_datetime': None,
 'current_location': '東京、日本',
 'current_context': [],
 'current_attention': None,
 'current_goals': [],
 'current_emotions': '現在、あなたは冷静で友好的な気持ちです。',
 'currently_accessible_agents': [],
 'emotions': '私は集中しており、すべての契約が法的に適正であることを確実にする決意を持っています。'}

TinyWorldの実例を作成

続いてはTinyWorldの実例を作ります。

world = TinyWorld("Meeting Room", [person_1, person_2])
world.make_everyone_accessible()

模擬環境の名前と環境にある人をパラメーターとして初期化して、TinyWorldの実例を作ります。また、環境にある二人は相互作用ができると設定するために、make_everyone_accessibleメソッドを呼び出します。

模擬環境を動かせます

目標の環境(TinyWorld)と人(TinyPerson)が揃ったので、インタラクションを始めます。

instruct = '''こちらが契約の修正提案です。
 条項:

**元の条項:**
甲及び乙は、故意もしくは過失により、又は本契約に違反した場合、相手方が被った損害(通常損害及び特別損害)を賠償する。

**修正案:**
甲及び乙は、故意もしくは過失により、又は本契約に違反した場合、相手方が現実に被った直接かつ通常の損害を賠償する。

中村 有希さんと修正案について話し合い、それに対するコメントをしてください。'''

person_1.listen(instruct)

world.run(6)

タスクとして、何をするのかという指示はまずlistenメソッドでperson_1に送ります。その後、world.runメソッドで模擬を始め、6回のインタラクションを続けます。特にTinyPersonが外部の刺激を受けることを実現するメソッドとして、listen以外にもthink, see, socializeなどがあります。詳細はソースコードを参照してください。

出力

最後はシミュレーションの出力、つまり全体的なインタラクションの履歴を展示します。法律の専門家としての田中さんと中村さんが契約書の修正案に関して議論をしているシーンを想定し、互いに交流、思考、移動などのアクションをテキストの形式で記録しました。

USER --> 田中 宏: [CONVERSATION] 
          > こちらが契約の修正提案です。
      > 条項:  **元の条項:**
          > 甲及び乙は、故意もしくは過失により、又は本契約に違反した場合、相手方が被った損害(通常損害及び特別損害)を賠償する。
          > **修正案:**
          > 甲及び乙は、故意もしくは過失により、又は本契約に違反した場合、相手方が現実に被った直接かつ通常の損害を賠償する。  
中村 有希さんと
          > 修正について話し合い、それに対するコメントをしてください。
---------------------------------------------------------------------
田中 宏 --> 田中 宏: [THOUGHT] 
                    > 今から少し行動し、その後「DONE」を出します。
---------------------------------------------------------------------
2024-11-14 15:51:17,737 - tinytroupe - ERROR - Error counting tokens: num_tokens_from_messages() is not implemented for model gpt4o-20240513. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.
---------------------------------------------------------------------
田中 宏 acts: [REACH_OUT] 
---------------------------------------------------------------------
田中 宏 --> 田中 宏: [THOUGHT] 
                    > 今から少し行動し、その後「DONE」を出します。
---------------------------------------------------------------------
2024-11-14 15:51:21,091 - tinytroupe - ERROR - Error counting tokens: num_tokens_from_messages() is not implemented for model gpt4o-20240513. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.
---------------------------------------------------------------------
田中 宏 acts: [TALK] 
                    > 中村さん、契約条項の修正提案を受け取りました。
                    > 元の条項では、契約違反が故意または過失による場合、
                    > 過失のある当事者が相手方が被った通常の損害および特別な損害の両方を補償することとされています。
                    > 提案された修正では、補償が直接的かつ通常の損害に限られています。
                    > この変更についてどう思われますか?
---------------------------------------------------------------------
田中 宏 --> 田中 宏: [THOUGHT] 
                    > 今から少し行動し、その後「DONE」を出します。
---------------------------------------------------------------------
2024-11-14 15:51:25,127 - tinytroupe - ERROR - Error counting tokens: num_tokens_from_messages() is not implemented for model gpt4o-20240513. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.
---------------------------------------------------------------------
田中 宏 acts: [DONE]
---------------------------------------------------------------------
Meeting Room --> 田中 宏: [SOCIAL] 
                  > 中村 有希さんには無事に連絡が取れ、現在はやり取りが可能で
           > す。
---------------------------------------------------------------------
Meeting Room --> 中村 有希: [SOCIAL] 
                  > 田中 宏さんがあなたに連絡を取り、現在はやり取りが可能です。
---------------------------------------------------------------------
田中 宏 --> 中村 有希: [CONVERSATION] 
                    > 中村さん、契約条項の修正提案を受け取りました。
                    > 元の条項では、契約違反が故意または過失による場合、
                    > 過失のある当事者が相手方が被った通常の損害および特別な損害の両方を補償することとされています。
                    > 提案された修正では、補償が直接的かつ通常の損害に限られています。
                    > この変更についてどう思われますか?
---------------------------------------------------------------------
中村 有希 --> 中村 有希: [THOUGHT] 
                   > 今から少し行動し、その後「DONE」を出します。
---------------------------------------------------------------------
2024-11-14 15:51:30,518 - tinytroupe - ERROR - Error counting tokens: num_tokens_from_messages() is not implemented for model gpt4o-20240513. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.
---------------------------------------------------------------------
中村 有希 acts: [THINK] 
                   > 補償を直接的かつ通常の損害に限定するという提案された修正は、
                   > 過失のある当事者の責任を軽減する可能性があります。
                   > しかし、その一方で、違反によって生じた特別な損害に対して、
                   > 相手方が不十分な補償を受けることになる可能性もあります。
---------------------------------------------------------------------
中村 有希 --> 中村 有希: [THOUGHT] 
                   > 今から少し行動し、その後「DONE」を出します。
---------------------------------------------------------------------
2024-11-14 15:51:34,507 - tinytroupe - ERROR - Error counting tokens: num_tokens_from_messages() is not implemented for model gpt4o-20240513. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.
---------------------------------------------------------------------
中村 有希 acts: [TALK] 
                   > 田中さん、補償を直接的かつ通常の損害に限定するという提案された修正は、
                   > 過失のある当事者の責任を軽減する可能性があります。
                   > しかし、その一方で、違反によって生じた特別な損害に対して、相手方が不十分な補償を受けることになるかもしれません。
                   > 意思決定を行う前に、両当事者への潜在的な影響を慎重に考慮する必要があります。
---------------------------------------------------------------------
中村 有希 --> 中村 有希: [THOUGHT]
                   > 今から少し行動し、その後「DONE」を出します。
---------------------------------------------------------------------
2024-11-14 15:51:39,238 - tinytroupe - ERROR - Error counting tokens: num_tokens_from_messages() is not implemented for model gpt4o-20240513. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.
---------------------------------------------------------------------
中村 有希 acts: [DONE] 
---------------------------------------------------------------------
中村 有希 --> 田中 宏: [CONVERSATION] 
                   > 田中さん、補償を直接的かつ通常の損害に限定するという提案された修正は、
                   > 過失のある当事者の責任を軽減する可能性があります。
                   > しかし、その一方で、違反によって生じた特別な損害に対して、相手方が不十分な補償を受けることになるかもしれません。
                   > 意思決定を行う前に、両当事者への潜在的な影響を慎重に考慮する必要があります。

展示したのは1回目のインタラクションです。

使用の感想

今回の記事では、Microsoftが公開した「TinyTroupe」のライブラリをキャチアップして、それを使って簡単なペルソナシミュレーション環境を構築してみました。使用の感想として、まず気に入った点について、

  • 簡単に環境が作れます。実は前にもStandford AI Townに従い、シミュレーション環境を作りたかったのですが、ゲームのようなものなので生成AIに関係なさそうな要素(UI、人物設計など)が多くて構築することがなかなか難しいと思います。「TinyTroupe」はテキストの形でシミュレーションの過程を表すので環境構築が簡単になるし、AIによるペルソナシミュレーションに専念できることを実感しました。
  • カスタマイズできるところが多い。例えば、先程使ったコンフィグファイルでは、ベースモデルや生成に関するパラメーターなどが自由に設定できます。ライブラリに、TinyPersonやTinyToolなどのツールがあり、ユーザーがそれらのツールを用いてシミュレーション環境を自由にカスタマイズすることができます。以上のようなライブラリが提供したもの以外に、もしさらに細かいカスタマイズをしたいなら、シミュレーションを生成するためのモデルに入力するプロンプト(こちら)も自分で書き直せます。

また、「TinyTroupe」を使用した上で気になる点について

  • 全体的なシミュレーションは生成AIがコントロールするので、意外なエラーが出る可能性があります。特にTinyPersonなどのシミュレーションの要素を自動的に生成した場合(例えばTinyPersonFactoryを使った場合)、できた対象の属性に目を通した方がいいです。
意外なエラーの例
instruct = '''こちらが契約の修正提案です。
 条項:

**元の条項:**
甲及び乙は、故意もしくは過失により、又は本契約に違反した場合、相手方が被った損害(通常損害及び特別損害)を賠償する。

**修正案:**
甲及び乙は、故意もしくは過失により、又は本契約に違反した場合、相手方が現実に被った直接かつ通常の損害を賠償する。

中村 有希さんと修正案について話し合い、それに対するコメントをしてください。'''

person_1.listen(instruct)

これは全体のコードから抜粋したperson_1に対するインストラクションです(私が書いたものです)。最後の「中村 有希さんと修正案について話し合い、それに対するコメントをしてください」のところですが、実は最初、「中村 有希さん」でなく、「中村さん」と書いていました。しかし、person_1の田中 宏さんの属性をチェックすると、中村 健二という知り合いが存在していることがわかります。

person_1_configure
{'name': '田中 弘',
 'age': 42,
 'nationality': '日本',
 'country_of_residence': '日本',
 'occupation': '法律の専門家',
 'routines': [{'routine': '毎朝、最新の契約修正を確認し、関連部門にフィードバックを提供します。'},
  {'routine': '他の部門と会議を開き、彼らのプロジェクトに関する法的影響について議論します。'},
  {'routine': '午後は、会社の契約に影響を与える可能性のある新しい法律や規制を調査します。'}],
 'occupation_description': 'あなたは東京の会社の法務部門で働く法律の専門家です。あなたの日々の業務は、契約の修正方法を探ることや、修正された契約についてコメントをすることです。すべての契約が日本の法律および会社の方針に準拠していることを確認します。また、他の部門に法的アドバイスを提供し、発生する可能性のある法的な争いを処理します。',
 'personality_traits': [{'trait': 'あなたは細心で、細部にまで非常に注意を払っています。'},
  {'trait': 'あなたは忍耐強く、すべての書類を徹底的に確認する時間を取ります。'},
  {'trait': 'あなたは親しみやすく、同僚たちはよく法的アドバイスを求めてあなたのところに来ます。'},
  {'trait': 'あなたはプレッシャーの中でも冷静で、ストレスの多い状況を容易に対処します。'}],
 'professional_interests': [{'interest': '契約法とそのビジネスにおける適用。'},
 {'interest': '企業ガバナンスとコンプライアンス。'},
  {'interest': '国際貿易法とその日本企業への影響。'}],
 'personal_interests': [{'interest': '伝統的な日本の武道である剣道を練習すること。'},
  {'interest': '歴史小説を読むこと。'},
  {'interest': '日本のさまざまな地域を旅行して、その豊かな文化と歴史を探求すること。'}],
 'skills': [{'skill': 'あなたは日本の契約法について深い理解を持っています。'},
  {'skill': 'あなたは法的なリサーチと分析に熟練しています。'},
  {'skill': 'あなたは複雑な法的文書の作成およびレビューに熟練しています。'}],
 'relationships': [{'name': '佐藤 由紀',
   'description': '法務部門の同僚で、契約レビューでよくあなたと協力します。'},
  {'name': "中村 健二",
   'description': "あなたの上司である法務部門の部長で、あなたの徹底した作業態度と細部への注意を評価しています。"}],
 'current_datetime': None,
 'current_location': '東京、日本',
 'current_context': [],
 'current_attention': None,
 'current_goals': [],
 'current_emotions': '現在、あなたは冷静で友好的な気持ちです。',
 'currently_accessible_agents': [],
 'emotions': '私は集中しており、今日の課題に取り組む準備ができています。'}

それで、田中 宏さんはインストラクションを聞いて、中村 有希さんではなく、中村 健二さんに話をかけました。ただし、中村 健二はシミュレーションに存在するTinyPersonの実例でなく、ただ田中 宏さんの属性にいる仮定の人間なので、シミュレーションが中途で止まってエラーが出ました。
要するに、全体的なシミュレーションはAIによりコントロールされるので、予測通りに動かない場合がよくあります。

  • 環境はAIベースでなく、ルールベースです。「TinyTroupe」のシミュレーションは主にTinyPerson(人間)とTinyWorld(環境)で実現します。TinyPersonはAIに基づくエージェント、背景情報や環境からの刺激をプロンプトの形式で受けてシミュレーションのアクション(交流、移動、思考など)を生成します。それに対して、TinyWorldは、ただTinyPersonの行動に反応し一定のルールに従って特定の操作を行うマシンのようなものです。なんとなく、環境がそんなに大切なものでなく人間だけでシミュレーションができるというイメージを持っています。今後の展望ですが、もし環境の方もAIベースのエージェントとして実装できれば、より面白いシミュレーションができると思います。

上の図ではシミュレーションにおける一回のインタラクションを大まかに説明しています。まずTinyWorldにいるTinyPersonが自身の情報に基づき、それぞれアクションを行います(情報をプロンプトに加工してベースのLLMに入れ、アクションを生成するというイメージ)。続いてTinyWorldはそれらのアクションに反応し、設定されたルールに従い、各TinyPersonの情報を更新します。これで、一回のインタラクションが終わります。


以上は今回「TinyTroupe」を使用してみた所感です。もちろん試したのはただ「TinyTroupe」の一部の機能です。「TinyTroupe」自体はまだ実験的な段階なので、将来にはより複雑で、かつ安定なシミュレーションができ、実際の業務に活用できることが期待されます。今回の記事は皆さんの何かのお役に立てれば幸いです。

最後に、もし生成AIを活用したPoCや支援にご興味があれば、以下リンクよりお問い合わせください。
https://givery.co.jp/lp/ai-lab/members/

Givery AI Lab

Discussion