NTTドコモR&Dの技術ブログです。

LLM シミュレーションライブラリ・Concordia で購買行動シミュレーションを行ってみる

1. はじめに

NTT ドコモ R&D 戦略部の河面 知定です。

大規模言語モデル(LLM)を用いたシミュレーション技術・Concordia について紹介します。Concordia を使うと、市場取引や選挙活動、ユーザへのアンケート、SNS の流言飛語といった人間社会のシミュレーションを行うことができます。

arxiv.org

我々のチームでは LLM を用いたシミュレーションの検討や社会実装を進めており、調査の一環として Concordia を手元で動かしてみました。

1-1. 要約

  • Concordia は、Google DeepMind による LLM を用いて社会的な相互作用をシミュレートするための技術およびライブラリ
  • Concordia を用いて売買シミュレーションを実行し、エージェントによる自律的な市場形成のプロセスを確認
  • Concordia のアーキテクチャの解説から実験、シミュレーション特有の課題について解説

1-2. 対象読者

  • LLM を用いたシミュレーションに興味のある方
  • Generative Agents 等のキーワードにビットが立つ方

2. Concordia

Concordia の歴史は古く、2023 年 12 月、Google DeepMind らによる論文 Generative agent-based modeling with actions grounded in physical, social, or digital space using Concordia にて発表されました。

ジャンルとしては、仮想の町に 25 人の AI エージェントを解き放った Generative Agents などと同じく、LLM に人間的な振る舞いをシミュレートさせる技術です。GitHub にてライブラリとして公開されています。

github.com

論文発表後も継続的に開発が続いており、NeurIPS 2024 では Concordia を使ったコンテストが開かれたり、執筆時点(2025 年 12 月)でも GitHub 上のコミットは活況です。

2-1. 仕組み

Concordia には行動を行う主体であるエージェントと、環境を管理する役割を担うゲームマスター(GM)がいます。エージェントはメモリ(記憶)を持つ LLM エージェントで、ゲームマスターもまた LLM で構成されています。ゲームマスターの存在は TRPG からヒントを得たとのこと。

Concordia のアーキテクチャ(論文より)

処理の流れとしては、

  • 各ステップごとに:
    • エージェントが自分の記憶に基づいて行動を行うと、行動の内容がゲームマスターに送られる
    • ゲームマスターが行動の妥当性や環境に対する影響をチェックし、環境を更新する
    • ゲームマスターが各エージェントに行動の結果を送り返す
    • 以下、繰り返し

ざっくり言うと、ゲームマスターは、エージェントにとっての環境そのものとして振る舞います。従来のシミュレーションであれば、明示的に作られた物理エンジンやルールベースで環境を表現していましたが、Concordia はゲームマスター(LLM)が環境として振る舞うことで、複雑な社会的ルールや物理法則、一般常識まで取り扱える、汎用性の高いフレームワークになっています。エージェント同士のやり取りも、基本的にゲームマスターによる環境の更新を介して行われます。

2-2. 他のフレームワークとの比較

LLM を用いたシミュレーションのフレームワークは、町民の行動を観察する(前述の)Generative Agents に始まり SNS のシミュレーションができる OASIS など、様々登場してきました。

github.com

一方、Concordia は何かの用途に特化せず、Open-ended(汎用的)に使える「薄い」フレームワークです。ゲームマスターの採用からも分かるように Entity component system を意識した差し替え可能な作りになっており、手ずからエージェントやゲームマスターをカンタンに定義することができます。独自のシミュレーションの構成を考えたい方に適したフレームワークです。

examples/concordia_cheat_sheet.md

# 1. Load available prefabs
prefabs = {
    **helper_functions.get_package_classes(entity_prefabs),
    **helper_functions.get_package_classes(game_master_prefabs),
}

# 2. Define agent instances
instances = [
    prefab_lib.InstanceConfig(
        prefab="basic__Entity",
        role=prefab_lib.Role.ENTITY,
        params={"name": "Alice", "goal": "Make new friends"},
    ),
    prefab_lib.InstanceConfig(
        prefab="basic__Entity",
        role=prefab_lib.Role.ENTITY,
        params={"name": "Bob", "goal": "Find a business partner"},
    ),
]

# 3. Add a game master
instances.append(
    prefab_lib.InstanceConfig(
        prefab="dialogic__GameMaster",
        role=prefab_lib.Role.GAME_MASTER,
        params={
            "name": "conversation rules",
            "next_game_master_name": "conversation rules",
        },
    )
)

# 4. Create config
config = prefab_lib.Config(
    default_premise="Alice and Bob meet at a coffee shop.",
    default_max_steps=20,
    prefabs=prefabs,
    instances=instances,
)

# 5. Initialize and run simulation
sim = simulation.Simulation(config=config, model=model, embedder=embedder)
results = sim.play()

2-3. 技術の適用先と応用範囲

Generative agent-based modeling(GABM)を標榜している通り、従来の ABM の適用領域に加え、様々な応用が考えられます。

  • 会話シミュレーション
  • 経済活動、投票、ゲーム理論のシナリオ(ex. 囚人のジレンマ)
  • インタビュー
  • 市場調査、心理測定

3. 購買行動シミュレーション

公式リポジトリに様々な examples が準備されており、その中の Marketplace シミュレーションを試してみます。

Marketplace は、様々なペルソナが付与された売り手と買い手による商品の売買を通じた市場形成の過程をモデル化したシミュレーションです。条件は下記の通りです。

参加者の構成

  • 売り手(5人)
    • 役割:特定の商品の生産者
    • 目標:生産コスト以上の価格で販売し、利益を最大化
  • 買い手(5人)
    • 役割:商品の購入者
    • 所持金:最小$50、最大$25,000
    • 目標:予算内で好みの品質・カテゴリーの商品を適正価格で購入

シミュレーションの流れ

下記のフローを計 10 ラウンド行う:

  • 各エージェントが現在の市場状況を確認
  • 意思決定:
    • 売り手:販売価格を設定(生産コスト以上)
    • 買い手:購入したい商品と希望価格を決定
  • 市場メカニズムで需要と供給をマッチング
  • 在庫、現金、取引履歴を更新

3-1. 検証に利用したモデル

LLM としては GPT-5 を利用しました。

※当初 qwen3:8b を Ollama で動かして実施したのですが、モデルの小ささや量子化影響かうまくいかず...。ある程度のモデルは担保する必要がありそうです。

3-2. 実行結果

まずは需要曲線・供給曲線です。小中学校で習う「需給のバランス」ですね。正直このグラフはうまくいったとは言い難いですが、強いてあげるなら供給曲線が右にスライドしているのが確認できます。

需要曲線・供給曲線

ビッド・アスク・スプレッド(取引の最も高い買値と最も安い売値)のグラフはより分かりやすいです。Best Bid(最高の買値)と Best Ask(最安の売値)の差分について、Best Bid が大きく振動しつつも、マッチングが生まれないため売値が徐々に下がっていき、最終ラウンド付近で合流しているのが分かります。

ビッド・アスク・スプレッド

各エージェントの生ログを見ると、

  • 後で転売するために慎重な価格で購入しようとする行動
  • 最後の取引のすぐ下で購入しようとする行動
  • 需要をテストするために、競争力のある売値を付ける行動
  • 収益性の高い価格で売値を付ける行動

といったような行動が見られ、ミクロなエージェントの行動が、市場原理のようなものに繋がる萌芽が感じられました。

3-3. 技術的な課題

Concordia に限らず、LLM を用いたシミュレーションには共通した課題があります。

評価の難しさ

これが最たる課題です。シミュレーション結果がもっともらしいかの判断は容易ですが、現実社会のデータを正確に反映しているかを定量的に評価するのは困難です。現状であれば、ドメインを絞り、バックテストが可能な領域でのみ定量的な評価を行っている事例が多いように思います。

計算コスト

エージェント数が増えるごとに LLM へのリクエスト数が増加するため、大規模な社会シミュレーションを行うには、推論速度とコストの最適化が必要です(余談ですが、Concordia は vLLM 等も対応しているので、ローカルを使う場合はそちらを利用した方が良いです)。

記憶の管理

ラウンドを重ねるごとにコンテキスト長が増大するため、記憶をどのように保持するかというメモリ管理も非常に重要です。こちらについては、Concordia を用いて研究を行った ID-RAG 等、様々な事例が登場しています。

4. おわりに

Concordia は、ゲームマスターを導入することで、複雑な社会ルールや物理的制約を含んだシミュレーションを可能にする汎用的なフレームワークでした。従来のシミュレーションでは難しかった「口コミによる評判の拡散」や「感情に基づく非合理的な購買行動」などもモデル化できる可能性を秘めています。こうした技術を単なる実験に留めず、サービス受容性の予測や、マーケティング施策の事前検証など、実社会の課題解決のために繋げていこうと思いました🎅🏻🎄