分散生成による住民反応シミュレーションの生成管理
本研究では、自治体の評価報告書を多数の仮想住民ペルソナに読ませ、理解、納得、信頼、反発、政策支持などの反応を構造化データとして生成している。 生成は単一端末ではなく、複数OSの端末に分散し、非重複シャード、個別キャッシュ、検証report、基盤データベースによって管理している。
Architecture: どこで壊れても再開できるようにする
評価報告書とペルソナの組み合わせは、まずprompt input JSONLとして構造化される。 各行は、固定プロンプト、評価報告書ケースパック、ペルソナ情報、prompt hash、cache keyを持つ。 大規模生成では、このJSONLを複数の非重複シャードに分割し、各ワーカー端末が独立に処理する。
Worker A
- OS
- macOS
- Role
- 主ストレージ兼ワーカー。基盤データベースを保持する。
Worker B
- OS
- Linux
- Role
- 研究室ワークステーション。割り当てられたshardを独立処理する。
Worker C
- OS
- Linux
- Role
- モバイルワークステーション。追加workerとして処理量を吸収する。
Control Laptop
- OS
- macOS
- Role
- 指示、監視、軽量作業用。大規模生成の主力からは外す。
Persona Layers: 住民像は4層で管理する
ペルソナは単一の長文プロフィールではなく、persona_id を結合キーとして4つのレイヤーに分けて管理している。
生活史の豊かさと、分析・可視化で使える比較可能性を分離するためである。
基本設計セル
年齢層、性別、居住類型、行政・制度への信頼水準、情報環境など、ペルソナ集合を系統的に作るための最小変数。
生活史と語り口
生活史、日常生活、世界観、情報環境、accountability triggers、報告書を読むときの内的独白を持つ文章レイヤー。
分析用の拡張属性
政策リテラシー、行政接触、説明選好、文書耐性、専門用語への反応など、層別分析と可視化に使う構造化属性。
地理正規化
居住自治体を実在自治体へ正規化し、自治体コード、代表緯度経度、照合状態を付けるGIS連携レイヤー。
シミュレーションpromptには全フィールドをそのまま長く入れるのではなく、目的に必要な項目を要約して渡す。 一方で、完全な属性セットは別データとして保持し、生成後に政策リテラシー別、行政接触別、地域別などの層別分析に使う。
Persona files: persona_data_structure.md, persona_data_layers.json.
Pipeline: JSONLを細かく割って、戻せる単位で走らせる
-
評価報告書とペルソナを構造化する
報告書ケースパック、仮想住民ペルソナ、assignment groupをJSONLの各行にまとめる。
-
完了済みpairを除外してpending shardを作る
persona-report-condition pairを重複させず、workerごとに入力shardを固定する。
-
workerごとにoutput、report、cacheを分ける
停止後も同じshard/output/report/cacheを指定すれば、完了済み行を再利用して未完了分だけ続行できる。
-
監督スクリプトでstale workerを再起動する
PID、log、output、reportを見て、止まったworkerや進捗のないworkerを検出する。
-
merge時にschema validationと重複検査を行う
全workerの出力を統合し、構造化出力として分析可能な状態にする。
Prompt Design: 固定部分を先、可変ペルソナを後
プロンプトはcache hitを得やすいよう、共通指示、出力スキーマ、評価報告書ケースパックを先に置き、可変のペルソナ情報を最後に配置している。 同一報告書を多数ペルソナに読ませるため、長い共通文脈を前方に寄せ、差分を後方に閉じ込める設計である。
{
"fixed_prompt_prefix": {
"common_instructions": "...",
"output_schema": {...},
"case_pack": {...}
},
"VARIABLE INPUT": {
"persona": {...},
"assignment_group": "..."
},
"task": "Read the fixed case pack as the given persona and return JSON matching the output schema."
}
Tips
「巨大なfor文をLLM APIに投げる」のではなく、input shard、output JSONL、report JSON、cache directoryを1セットにしたworker単位へ分割する。
そのため、rate limit、ネットワーク停止、端末停止が起きても、同じ4点セットを指定して再実行すれば復帰できる。
Prompt appendix: prompt_appendix.md
Fault Tolerance: 再起動しても同じ行を作り直さない
各workerは、出力JSONL、検証report、cache directoryを個別に持つ。 この分離によって、途中停止後も完了済みrecordを再利用し、未完了recordだけを処理できる。
python3 run_simulation_batch_v1.py \
--simulation-run-id example_run \
--input data/simulations/shards/example_run/worker-a-01.jsonl \
--output data/simulations/runs/example_run/worker-a-01.outputs.jsonl \
--report data/simulations/runs/example_run/worker-a-01.report.json \
--cache-dir data/cache/simulation_runs/example_run/worker-a-01
復旧原則は単純である。同じinput shard、output JSONL、report JSON、cache directoryで再起動する。 この4点を変えないことが、完了済み行の再生成を避けるための生成管理上の約束になる。
Data Governance: 秘密情報と基盤データベースを分ける
Secrets
API keys、ローカル環境ファイル、SSHホスト名、VPN IP、実端末名は公開パッケージに含めない。
Method
sharding、cache、supervision、merge、schema validationの実行構造を公開する。
基盤データベース
大容量の実データ本体は主ストレージ上に置き、Webでは方法論、図、公開コード、必要な集計補助データに限定する。
Public Code Bundle
以下のファイルはシミュレーション実行構造を示すための公開コードであり、APIキーや実データは含まない。
-
run_simulation_batch_v1.py1 shardをOpenAI-compatible chat completion APIに投げ、出力を検証してJSONLへ書き出す。 -
start_simulation_worker_v1.sh固定されたinput shard、output、report、cache directoryでworkerを起動する薄いラッパー。 -
supervise_generic_simulation_workers_v1.pyworkerのPID、log、output、reportを監視し、停止またはstale状態を再起動する。 -
merge_simulation_shards_v1.py分散出力をmergeし、重複とschemaを検査する。 -
build_pending_shards_example.py完了済みpersona-report pairを除外して、未処理分の非重複shardを作る例。 -
simulation_output_schema_v1_1.json大規模標準出力のJSON Schema。 -
public_code/README.md公開コードbundleの概要。
Package Files
README.md公開パッケージ全体の説明。web_handoff_instructions.mdWeb掲載の構成、図の扱い、注意事項。package_manifest.md公開するファイルと非公開にする情報の一覧。data/distributed_generation_architecture.json図のノード、エッジ、注釈データ。persona_data_structure.mdペルソナ4層構造の説明。data/persona_data_layers.jsonペルソナレイヤーの作図・Web実装用JSON。
Update History / 更新履歴
2026-07-12
Updated the page as simulation generation management and added persona layer documentation.