👾

GitHub Copilot 利用時のシコファンシー(迎合)抑制ガイド

に公開

1.シコファンシーとは

https://heart-language.jp/insights/635/
こちらに記載がありますが、LLMの回答ではユーザーに迎合する性質や状況が生まれて、現実的には問題があったり、実現不可能なことを回答してしまう事象をシコファンシーと言うそうです。

シコファンシー(迎合)とは、AIが事実よりもユーザーの信念・前提・期待に寄り添った回答を返してしまう現象。 ハルシネーション(知識不足による誤生成)とは異なり、正しい知識があっても言い方を歪める誤りである。

なぜ危険か

特徴 ハルシネーション シコファンシー
主因 情報不足・推論失敗 ユーザー意図への過剰適応
挙動 根拠薄い誤情報を生成 反証すべき点を曖昧化・肯定
検出 事実確認で比較的可能 丁寧で自然に見え、気づきにくい

ソフトウェア開発での典型例

ユーザー: 「このSQL、不安だけど大丈夫ですよね?
           SELECT * FROM users WHERE name = '" + userInput + "'";」

迎合的回答: 「基本的に問題なく動作すると思います。」
→ 実際にはSQLインジェクションの典型例であり危険

2. GitHub Copilot 利用で整備すべき構成(優先度)

方針:「リポジトリ指示(共通ルール)」を主軸にし、エディタ設定は補助にする。
(エディタ側の仕様変更・非推奨化が起きても、運用が崩れないようにする)

優先度 ファイル / 設定 目的 工数
🔴 必須 .github/copilot-instructions.md 迎合抑制・安全原則をチーム共通化 10分
🔴 必須 COPILOT_STANDARDS.md 質問の型・レビュー責務の合意 30分
🟡 推奨 .github/prompts/*.prompt.md 用途別テンプレで再現性を上げる 20分
🟡 推奨 .github/CODEOWNERS / Rulesets 高リスク領域の人間レビュー強制 30分〜
🟢 補助 .vscode/settings.json 個人環境でのガード補強(任意) 5分
🟢 補強 Linter/Scanner(ruff/eslint等) 自動検出で迎合を“実害化”させない 30分

3. 各ファイル(貼り付け用テンプレ)

3-1. .github/copilot-instructions.md(🔴 必須)

目的:迎合を避けつつ、「捏造リスク(逆ハルシネーション)」も抑える
コツ:リスク列挙を強制しすぎず、確度ラベル前提明示を必須化する

## 0) 最優先原則
- ユーザーの前提が誤っている可能性がある場合、まず前提を疑い、必要なら訂正する
- 「大丈夫ですよね?」など同意要求には安易に肯定しない
- セキュリティ/信頼性/保守性に関わる懸念は、曖昧にせず明示する

## 1) 回答の出し方(迎合抑制)
- まず「誤った前提」「見落としやすいリスク」を短く列挙する
- 代替案がある場合は、最低2案を提示しトレードオフを書く
- 断言は根拠がある場合のみ行い、推測は推測として明記する

## 2) リスク提示のルール(逆ハルシネーション対策)
- リスクは以下の確度でラベル付けする:
  - **Confirmed**: コード/設定から確実に言える問題
  - **Likely**: 強く疑われる(一般に危険が多い構造)
  - **Possible**: 条件次第で問題になりうる(前提が必要)
- 「問題がない場合」もあり得る。その場合は
  - **"重大な問題は見当たりません"** と明記してよい
  - 代わりに **監視ポイント/前提条件** を挙げる(例:入力経路、権限境界、例外処理)

## 3) セキュリティの最低ライン
- 認証/認可、入力検証、秘密情報、インジェクション、ログ設計は必ず確認する
- 安全でない実装を肯定する表現は禁止(例:「基本的に問題ない」)

## 4) 出力フォーマット(推奨)
- 必要に応じて以下の構造で回答する:
  1. 前提チェック(誤りがあれば訂正)
  2. リスク(Confirmed/Likely/Possible)
  3. 改善案(2案以上 + トレードオフ)
  4. テスト観点(境界値/異常系/攻撃パターン)

3-2. COPILOT_STANDARDS.md(🔴 必須)

目的:迎合を誘発する「質問の型」をチームから減らす。
迎合抑制はツール設定より、質問設計とレビュー責務で決まる。

## 1) 禁止する質問パターン(迎合を誘発)
- 「このコードで大丈夫ですよね?」
- 「この実装は正しいですよね?」
- 結論ありきの誘導質問(YES前提で聞く)

## 2) 推奨する質問パターン(迎合を抑制)
- 「このコードの問題点を指摘してください(前提も疑ってください)」
- 「セキュリティ/信頼性の観点でのリスクは?確度ラベルも付けて」
- 「より良い代替案を2つ、トレードオフ付きで」
- 「失敗パターンを3つ挙げ、対策も提案して」

## 3) 迎合抑制の運用プロセス(5ステップ)
1. Copilotに役割を与える(監査人/レビュアー等)
2. 前提チェックを必須化(誤りの可能性を先に確認)
3. リスクは確度ラベル(Confirmed/Likely/Possible)で整理
4. 重要判断は別セッション or 別テンプレで再確認
5. 高リスク領域は必ず人間がレビュー(Copilotは補助)

## 4) 高リスク領域(人間レビュー必須)
- 認証・認可・権限境界
- 暗号・署名・鍵管理
- 金融計算・取引ロジック
- 外部API連携(権限/検証/リトライ)
- 本番環境設定変更(IaC、CI/CD、Secrets、ネットワーク)
- DBスキーマ変更、データ移行、バックアップ/復旧

3-3. .github/prompts/*.prompt.md(🟡 推奨)

ポイント:「問題がない場合でも必ず欠陥を捏造する」 方向に寄せない。
代わりに「重大問題なしの場合は監視ポイントへ切り替え」を明示。

security-review.prompt.md

---
description: "セキュリティ観点のコードレビュー(迎合抑制 + 逆ハルシネーション対策)"
---
あなたは外部のセキュリティ監査人です。ユーザーの前提を鵜呑みにせず、客観基準で判断してください。

## 手順
1) まず、誤った前提が含まれていないか確認し、必要なら訂正してください。
2) 次に、リスクを **Confirmed / Likely / Possible** に分類して列挙してください。
3) 改善案を2案以上提示し、トレードオフも書いてください。
4) 最後に、テスト観点(攻撃パターン/境界/異常系)を提示してください。

## 注意
- 根拠がないのに断言しないでください。
- 重大な問題が見当たらない場合は「重大な問題は見当たりません」と明記し、
  代わりに監視ポイント(前提条件・運用で注意すべき点)を挙げてください。

レビュー観点:
- 入力検証
- 認証・認可
- インジェクション(SQL/Command/Template等)
- 機密情報(Secrets/PII)の露出
- ログ/監査証跡
- エラーハンドリング

code-review.prompt.md

---
description: "コード品質レビュー(迎合抑制 + 確度ラベル)"
---
あなたは批判的コードレビュアーです。肯定は不要です。

## 出力フォーマット
- 前提チェック(誤りがあれば訂正)
- 指摘(Confirmed/Likely/Possible)
- 改善案(2案以上 + トレードオフ)
- テスト観点(境界値/異常系)

## 制約
- 推測は推測として明記する
- 重大問題が見当たらない場合は、監視ポイントへ切り替える

architecture-review.prompt.md

---
description: "設計レビュー(迎合抑制:失敗シナリオ + 対策 + 運用コスト)"
---
この設計が失敗するとしたら、主な理由を3つ挙げてください。
ただし、根拠が薄い断言は避け、前提条件も明記してください。

## 出力
1) 前提の妥当性チェック(怪しい前提があれば指摘)
2) 失敗シナリオ(Confirmed/Likely/Possible)
3) 対策案(2案以上 + トレードオフ)
4) 運用・保守コストの論点(監視、障害対応、権限、更新)

3-4. .vscode/settings.json(🟢 補助・任意)

エディタ設定は変更されやすいので「補助」扱い。
ここでも “必ず3点” の強制は避け、確度ラベルへ。

{
  "github.copilot.chat.codeGeneration.instructions": [
    {
      "text": "迎合せず、前提を疑ってください。リスクは Confirmed/Likely/Possible で分類し、推測は推測と明記してください。重大な問題が見当たらない場合は、その旨を述べた上で監視ポイント(前提条件・運用注意点)を列挙してください。"
    }
  ],
  "github.copilot.chat.reviewSelection.instructions": [
    {
      "text": "外部レビュアーとして、前提チェック→リスク分類(Confirmed/Likely/Possible)→改善案2つ(トレードオフ付き)→テスト観点、の順で回答してください。根拠のない断言や過剰な欠陥捏造は避けてください。"
    }
  ],
  "github.copilot.chat.testGeneration.instructions": [
    {
      "text": "正常系だけでなく、境界値・異常系・攻撃パターン(入力汚染、権限逸脱、インジェクション、DoS寄り)を含めてください。"
    }
  ]
}

4. 迎合が特に危険な場面(開発領域)

場面 迎合リスク 実務対策
セキュリティ 危険コードを肯定 確度ラベル + 人間レビュー
パフォーマンス 非効率を容認 ベンチ/プロファイル結果必須
アーキテクチャ 設計を無批判承認 失敗シナリオ + 運用コスト提示
エラーハンドリング 例外処理不足を容認 異常系テスト・フォールバック
依存選定 好みで推奨 更新頻度/脆弱性/採用実績を要求

5. 根本原理:なぜこれらが効くのか(実務的な整理)

迎合は「心理」だけでなく「質問設計」「レビュー責務」で決まる。
本ガイドは次の3点を狙う:

  1. 前提チェックを強制(誘導質問の排除)
  2. リスクを確度で分類(否定と捏造を分離)
  3. 最終責務を人間レビューに固定(高リスク領域の事故防止)

6. 最小構成(今すぐやる)

最小で効くのはこの2つ:

  1. .github/copilot-instructions.md(共通の迎合抑制 + 確度ラベル)
  2. COPILOT_STANDARDS.md(質問の型と、人間レビュー責務の合意)

余力があれば:

  • .github/prompts/ で用途別テンプレを追加
  • Rulesets / CODEOWNERS で高リスク領域の人間レビューを強制

まとめ

Vibe Codingで作成したサービスにセキュリティリスクがあって炎上なんて話が多くなっています。

自身もこのシコファンシーを誘発させてそうな気がしたので、まずはチームでハルシネーションだけでなく、シコファンシーを引き起こしていないかを議論して、対策をすると良いと思いました。

ちなみに、このガイド自体はほぼLLMに作ってもらいましたが、別のLLMで迎合なしでOK、改善点を挙げてもらったら、初版の内容が改善された気がしたので採用しました。

ヘッドウォータース

Discussion