# Prompt Appendix: 大規模住民反応シミュレーション v1.1

この付録は、AIsimの住民反応シミュレーションで使うプロンプト設計を公開用に整理したものである。APIキー、非公開ホスト名、内部ネットワーク情報は含めない。

## 研究上の問い

> どのような評価報告書が、どのような住民に、どのように理解され、納得され、信頼され、あるいは反発されるのか。

この問いに合わせて、出力は長文エッセイではなく、比較可能な構造化データを基本とする。

## プロンプト構造

大規模生成では、各入力行を次の構造にする。

```json
{
  "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."
}
```

実際のAPI callでは、system messageに `common_instructions` を置き、user messageに上記payloadをJSONとして入れる。

## Cache-friendlyな順序

プロンプトは以下の順序を守る。

1. 共通指示
2. 出力スキーマ
3. 評価報告書ケースパック
4. 可変ペルソナ入力

理由:

- 評価報告書ごとに共通する長い文脈を先に置くと、プロバイダ側prompt cacheが効きやすい。
- 可変部分を最後に置くことで、同一報告書を多数ペルソナに読ませる設計と相性がよい。
- `prompt_hash` と `cache_key` によって、停止後の再開や重複検出がしやすい。

## 共通指示の公開テンプレート

以下は公開用に整えたテンプレートである。研究上の実行では、日本語の評価報告書ケースパックとペルソナを同じ構造で渡す。

```text
あなたは、与えられた仮想住民ペルソナとして、自治体の評価報告書を読む。

制約:
- 与えられたペルソナ情報と評価報告書情報だけを使う。
- 報告書にない事実を作らない。
- 反応は、報告書内容に基づく判断と、ペルソナの生活文脈に基づく解釈を区別する。
- 出力はJSON objectのみとする。
- すべてのscoreは1から5の整数にする。
- main_reasonとpersona_linkは短い日本語1文にする。
- free_commentや長文感想は出力しない。

あなたの仕事:
1. ペルソナの生活、価値観、行政への信頼、情報環境を踏まえる。
2. 評価報告書の内容がどの程度理解・納得・信頼されるかを判断する。
3. 指定されたschemaに完全一致するJSONだけを返す。
```

## 可変入力の公開テンプレート

```json
{
  "persona_id": "P0000001",
  "persona_summary": {
    "age_band": "60代",
    "residence": "長野県内の市町村",
    "household": "高齢家族と同居",
    "mobility": "自家用車中心だが公共交通にも関心がある",
    "administrative_trust": "中程度",
    "policy_literacy": "中",
    "information_sources": ["自治体広報", "地域紙", "家族・近隣"]
  },
  "assignment_group": "original"
}
```

## 評価報告書ケースパックの公開テンプレート

```json
{
  "report_id": "example_report_001",
  "title": "自治体評価報告書の例",
  "municipality": "長野県内自治体",
  "evaluation_system": "施策評価",
  "year": "2020年代",
  "case_pack_text": "評価対象、目的、事業内容、成果指標、課題、今後の方向性を整理した本文。",
  "source_note": "公開資料から抽出し、Markdown化したもの。"
}
```

## 大規模標準出力 schema

大規模runでは、全persona-report-condition pairに対して以下のJSON objectを返す。

```json
{
  "understanding_score": 1,
  "satisfaction_score": 1,
  "personal_relevance_score": 1,
  "trust_score": 1,
  "anger_score": 1,
  "policy_support_score": 1,
  "perceived_accountability_score": 1,
  "perceived_fairness_score": 1,
  "perceived_local_fit_score": 1,
  "cost_effectiveness_acceptance_score": 1,
  "preferred_action": "continue",
  "response_mode": "general_citizen",
  "main_reason": "資料内容に基づく短い理由。",
  "persona_link": "ペルソナの生活文脈と反応を結ぶ短い説明。"
}
```

### score項目

すべて1から5の整数。

- `understanding_score`: 資料内容を理解できた程度
- `satisfaction_score`: 説明・成果への満足
- `personal_relevance_score`: 自分の生活との関係
- `trust_score`: 行政・評価情報への信頼
- `anger_score`: 不満・怒り
- `policy_support_score`: 施策継続や方向性への支持
- `perceived_accountability_score`: 説明責任が果たされたと感じる程度
- `perceived_fairness_score`: 公平性への納得
- `perceived_local_fit_score`: 地域事情への適合感
- `cost_effectiveness_acceptance_score`: 費用対効果への納得

### enum項目

`preferred_action`:

```text
continue, revise, expand, reduce, stop, unsure
```

`response_mode`:

```text
user, taxpayer, family_caregiver, worker, local_resident, professional, general_citizen, other
```

## main_reason と persona_link

`main_reason` は、報告書内容に対してなぜその反応になったかを短く書く。

例:

```json
"main_reason": "成果指標の改善が限定的で、支出に見合う効果が十分に説明されていないと感じたため。"
```

`persona_link` は、そのペルソナだからそう反応しやすい理由を書く。

例:

```json
"persona_link": "高齢家族の通院を支えているため、移動支援の必要性は理解するが、利用実績の弱さには不安を持つ。"
```

## cache_key

推奨形式:

```text
persona_id + prompt_hash + model_id + dataset_version
```

cacheは各workerごとに持つ。停止後に同じinput/output/report/cacheを指定して再起動すれば、完了済み行を再利用し、未完了行だけを続ける。

## optional: 仮想インタビュー

大規模標準出力では長文自由記述を出さない。必要な場合のみ、集計後に以下のようなケースを抽出して追加インタビューを行う。

- 高理解・低満足
- 高怒り
- 高信頼
- 同じ属性セル内の外れ値
- 特定報告書で特徴的な反応

これにより、定量比較可能性と定性分析の深さを分離して管理する。

