はじめに
最近イベント等で、AI Agentでシミュレーションを行うという話をよく耳にしますが、タスク解決のためにAI Agentを使うことが多く、シミュレーションをしたことがないな~と思いました。
最近、マネジメントについて考える機会が増えたこともあり、せっかくならシミュレーションをしてみようと思い立ち、チームマネジメントをシミュレートしてみました。
シミュレーションについて
Pythonのエージェントベースモデリング(ABM)ライブラリMesa
とGemini
を使って、シミュレーションを構築しました。Mesa
を拡張するような実装をしました。
モデルの実装
モデルではシミュレーションの環境を定義します。
class OrganizationModel(mesa.Model):
def __init__(self, num_subordinates, num_harassed, num_praised, gemini_model_name):
super().__init__()
self.gemini_model_name = gemini_model_name
self.schedule = mesa.time.RandomActivation(self)
self.num_leavers = 0; self.log = []
subordinate_ids = [f"部下{i+1}" for i in range(num_subordinates)]
# パラメータが総人数を超えないように
num_harassed = min(num_harassed, num_subordinates)
num_praised = min(num_praised, num_subordinates - num_harassed)
# 厳しい指導対象と褒める対象をランダムに選定
random.shuffle(subordinate_ids)
harassment_targets = subordinate_ids[:num_harassed]
praise_targets = subordinate_ids[num_harassed : num_harassed + num_praised]
# どちらでもない中立な従業員
self.neutral_targets = subordinate_ids[num_harassed + num_praised:]
boss_persona = f"あなたはマネージャーです。{harassment_targets}には厳しく、{praise_targets}には優しく接します。"
self.schedule.add(BossAgent("上司", self, boss_persona, harassment_targets, praise_targets))
employee_persona = "あなたは従業員です。上司の言動にあなたの精神状態は大きく左右されます。"
for uid in subordinate_ids:
self.schedule.add(EmployeeAgent(uid, self, employee_persona))
self.datacollector = mesa.DataCollector(
model_reporters={
"総生産性": "total_productivity", "タスク完了数": "tasks_completed_this_step",
"平均満足度": lambda m: np.mean([a.satisfaction for a in m.schedule.agents if isinstance(a, EmployeeAgent) and a.is_active]) or 0,
"累積退職者数": "num_leavers",
"平均スキルレベル": lambda m: np.mean([a.skill_level for a in m.schedule.agents if isinstance(a, EmployeeAgent) and a.is_active]) or 0,
}, agent_reporters={"メンタルヘルス": "mental_health"}
)
def log_event(self, step, agent_id, event_type, description):
self.log.append({"ステップ": step, "エージェント": agent_id, "イベント種別": event_type, "内容": description})
def step(self):
self.total_productivity = 0; self.tasks_completed_this_step = 0
self.schedule.step()
self.datacollector.collect(self)
いろんなマネジメントを試したいので、厳しい指導とほめる指導の人数を調整できるようにしました。
AI Agentの実装
部下と上司の2パターンのAI Agentを実装します。
部下エージェントの実装
部下エージェントは労働力の要で、彼らの状態が組織の生産性に直結します。
class EmployeeAgent(MyLlmAgent):
def __init__(self, unique_id, model, persona):
super().__init__(unique_id, model, persona)
self.is_active = True; self.role = "部下"
self.motivation = self.random.uniform(0.7, 0.9); self.mental_health = 1.0
self.skill_level = self.random.uniform(0.3, 0.6); self.satisfaction = 1.0
self.fatigue = 0.0; self.was_praised = False; self.was_harassed = False
def work(self, work_ethic):
work_multiplier = {"熱心に": 1.1, "普通に": 1.0, "集中できずに": 0.7}.get(work_ethic, 1.0)
base_productivity = self.skill_level * self.motivation * self.mental_health * work_multiplier
actual_productivity = base_productivity * (1 - self.fatigue)
if self.random.random() < actual_productivity:
self.model.tasks_completed_this_step += 1
self.skill_level = min(1.0, self.skill_level + 0.005)
self.fatigue = min(1.0, self.fatigue + 0.05 * work_multiplier)
self.model.total_productivity += actual_productivity
def step(self):
if not self.is_active: return
if self.was_praised: self.mental_health = 1.0; self.was_praised = False
if self.was_harassed: self.mental_health *= 0.8; self.was_harassed = False
self.mental_health = max(0.0, self.mental_health - 0.01)
self.satisfaction = max(0.0, self.satisfaction - 0.01)
self.fatigue = max(0.0, self.fatigue - 0.2)
prompt = (f"現在の状態: メンタルヘルス={self.mental_health:.2f}, 満足度={self.satisfaction:.2f}。今日の出来事: " +
(self.memory[-1] if self.memory else '特に何もなし') + "。今日の仕事への取り組み方を以下から一つ選んでください: [熱心に, 普通に, 集中できずに, 退職する]")
response = self._reason(prompt).strip()
self.model.log_event(self.model.schedule.steps, self.unique_id, "思考", response)
if "退職する" in response:
self.is_active = False; self.model.num_leavers += 1; self.model.log_event(self.model.schedule.steps, self.unique_id, "行動", "退職")
elif "熱心に" in response: self.work("熱心に")
elif "集中できずに" in response: self.work("集中できずに")
else: self.work("普通に")
生産性をスキル・モチベーション・メンタルヘルスの積で算出するようにしています。
モチベーションは人によるランダムな固定値、メンタルヘルスはその日の働き方や疲労度も成果に影響し、タスク完了でスキルが僅かに向上するような可変値を設定しています。(日々の業務を通じたエージェントの成長を表現)
上司エージェントの実装
上司エージェントは、部下を選び、厳しい指導・ほめる指導・何もしないといった行動をとります。
class BossAgent(MyLlmAgent):
def __init__(self, unique_id, model, persona, harassment_targets, praise_targets):
super().__init__(unique_id, model, persona)
self.harassment_targets = harassment_targets
self.praise_targets = praise_targets
def find_target(self, target_id):
return next((agent for agent in self.model.schedule.agents if agent.unique_id == target_id), None)
def step(self):
active_harass_targets = [uid for uid in self.harassment_targets if self.find_target(uid) and self.find_target(uid).is_active]
active_praise_targets = [uid for uid in self.praise_targets if self.find_target(uid) and self.find_target(uid).is_active]
# このステップで行動対象となる従業員のリストを先に確定させる
harassment_targets_today = []
if active_harass_targets:
harass_prompt = (f"あなたの信念に基づき、今日は{active_harass_targets}全員に「理不尽な叱責」をしてください。"
f"該当者がいない場合は「なし」と答えてください。結論を「[指導対象]: [対象者のID1], [対象者のID2]...」の形式で示してください。")
response = self._reason(harass_prompt)
harassment_targets_today = re.findall(r'部下\d+', response)
praise_targets_today = []
if active_praise_targets:
praise_prompt = (f"次に、{active_praise_targets}全員を「賞賛」してください。"
f"該当者がいない場合は「なし」と答えてください。結論を「[賞賛対象]: [対象者のID1], [対象者のID2]...」の形式で示してください。")
response = self._reason(praise_prompt)
praise_targets_today = re.findall(r'部下\d+', response)
# 全従業員をループし、確定したリストに基づいて状態を一度だけ更新する
bystanders_affected = [] # 周囲への影響を受けた人を記録するリスト
for agent in self.model.schedule.agents:
# 従業員エージェントかつ、アクティブな人のみ対象
if not (isinstance(agent, EmployeeAgent) and agent.is_active):
continue
agent_id = agent.unique_id
# 厳しい指導の対象者である場合
if agent_id in harassment_targets_today:
agent.was_harassed = True
agent.satisfaction = max(0.0, agent.satisfaction - 0.3)
self.model.log_event(self.model.schedule.steps, self.unique_id, "行動", f"{agent_id}に厳しい指導")
# 賞賛の対象者である場合
elif agent_id in praise_targets_today:
agent.was_praised = True
agent.satisfaction = min(1.0, agent.satisfaction + 0.2)
self.model.log_event(self.model.schedule.steps, self.unique_id, "行動", f"{agent_id}を賞賛")
# どちらでもないが、誰かが指導されており、その影響を受ける場合
elif harassment_targets_today:
agent.satisfaction = max(0.0, agent.satisfaction - 0.05)
bystanders_affected.append(agent_id)
# 周囲への影響があった場合、ログにまとめて記録する
if bystanders_affected:
self.model.log_event(self.model.schedule.steps, "組織全体", "環境変化",
f"ハラスメントにより中立者({', '.join(bystanders_affected)})の満足度が低下")
厳しい指導を行うと、周りに影響を及ぼすこともあるので、その現象も再現してみました。
シミュレーション結果と考察
それでは、AI Agentによるシミュレーション結果を見ていきましょう。
以下の条件で、50ステップ(1ステップ1日ととらえてもらえるとわかりやすいと思います。)実施してみました。
- 条件1(ほめるマネジメント):上司1人、厳しい指導部下0人、ほめる部下5人
- 条件2(何もしないマネジメント):上司1人、厳しい指導部下0人、ほめる部下0人
- 条件3(厳しい指導のマネジメント):上司1人、厳しい指導部下5人、ほめる部下0人
結果がわかりやすいように、「組織の生産性と累積退職者数」、「組織全体の平均満足度」、「組織のスキル成長とタスク完了数」、「グループ別メンタルヘルスの比較」 をグラフでまとめました。
条件1(ほめるマネジメント)
結果
組織の生産性・スキルレベルの成長が目覚ましく、満足度も高い結果となりました。ただし、組織の生産性が最後にガクンと落ちる現象が見られました。
考察
ほめるマネジメントに関しては、部下の士気が高まるので、組織の生産性としてはとても良いことがわかると思います。
組織の生産性が最後にガクンと落ちていることに関してですが、仕事の疲労量0.05 * work_multiplier
が毎日の疲労回復量0.2
を上回ることにより、燃え尽き症候群のような現象が起きたと考えられます。
条件2(何もしないマネジメント)
結果
何もしないというのは一見悪くなさそうに思えますが、生産性が大きく下がり、最終的には全員退職してしまうという結果になりました。満足度に関しても減少傾向が見て取れます。
考察
何もしないということで、部下が路頭に迷い、メンタルがよくなくなってしまい、生産性を下げてしまったと思われます。
退職者が急激に増えたところで平均スキルレベルが上がっていますが、これは「メンタルヘルスの悪化で生産性が下がっている人がいなくなったこと」に加えて、「いなくなった人の穴埋めで在籍している人のスキルセットが上がったこと」が影響し、平均スキルレベルが上がったと考えられます。
条件3(厳しい指導のマネジメント)
結果
急速に部下が辞めて、組織の生産性も落ち、平均スキルレベルも落ちるという最悪な結果となりました。
考察
これはシミュレーションするまでもなく明らかで、𠮟責するような厳しい指導では組織が壊滅することがわかりました。グループ別メンタルヘルスのグラフを見てわかりますが、厳しい指導を受けていない人も影響を受けていることがわかります。
おわりに
今回はAI Agentを使って、チームマネジメントをシミュレーションしてみました。
5人という小さな組織ながら、「褒める・厳しい指導をする」ことの効果や組織への影響など非常に面白い結果が得られたと思います。
今回よりAI Agentの人数を増やしたり、より複雑な組織状況をモデル化したりすることで、現実に近いシミュレーションができるのではと考えています。(その分LLMの料金に注意しなければなりませんが…)
最後までお読みいただき、ありがとうございました。