一言で、これは何?
Pythonで壁打ちしてJSON作るスクリプトです。
スクリーンショット
デモ動画(YouTube)
背景思想
産業革命期(18-19世紀)
機械技術 → 労働力需要 → 疫病蔓延 → 公衆衛生制度スマートフォン時代(2010年代)
デジタル技術 → レアメタル需要 → 供給不足 → リサイクル・代替技術AI時代(2020年代)
AI技術 → 電力需要 → 供給制約 → 再エネ・電力市場変革
この30日程度、50前後の多言語RSSから7000件以上報道を集めてみて、メガトレンドとは別に、AIの電力の問題も進行していると感じました。
技術は社会を変えますが、新たな課題を伴います。
かといって、電力や計算資源や環境の問題を理由に使うことを禁じるのは、息苦しいですよね。
それより、AIでもPythonでもいけること(ルーチンワークを見つける)をスクリプトに落とし込むことで、劇的に資源を使わずに済みます。さらに、AIと壁打ちや対話学習をする前にJSON化しておけば、最良のプロンプトにもなります。
結果、人間にしか出来ないこと、AIに頼むこと、Pythonなどで出来ることを組み合わせると、コスパ良くなりますし、環境にもプラスです。
最後までお読み下さり感謝します。
リポジトリ
ソースコード
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
5 Whys × SWOT 思考支援チャットボット
フレームワークで思考を促進する
"""
import datetime
import json
from pathlib import Path
from typing import List, Dict, Tuple
class ThinkingFrameworkBot:
"""5 Whys × SWOT フレームワーク思考支援ボット"""
def __init__(self, data_dir: str = "thinking_sessions"):
self.data_dir = Path(data_dir)
self.data_dir.mkdir(exist_ok=True)
# セッション情報
self.session = {
"original_input": "",
"selected_framework": "",
"current_phase": "",
"swot_data": {"S": [], "W": [], "O": [], "T": []},
"five_whys_data": {},
"conversation_log": []
}
# フレームワーク定義
self.frameworks = {
"SWOT→5Whys": {
"description": "SWOT分析で現状把握してから、重要な要素を5 Whysで深掘り",
"phases": ["swot_analysis", "select_element", "five_whys", "action_plan"]
},
"5Whys→SWOT": {
"description": "5 Whysで根本原因を特定してから、その原因をSWOTで分析",
"phases": ["five_whys", "swot_on_cause", "action_plan"]
},
"SWOT各象限5Whys": {
"description": "SWOTの各要素に対してそれぞれ5 Whysを適用",
"phases": ["swot_analysis", "whys_for_each", "synthesis"]
}
}
def detect_problem_type(self, text: str) -> str:
"""テキストから適切なフレームワークを推奨"""
text_lower = text.lower()
# 現状分析・全体把握系のキーワード
if any(word in text_lower for word in ["現状", "状況", "全体", "把握", "分析", "整理"]):
return "SWOT→5Whys"
# 問題・原因追及系のキーワード
elif any(word in text_lower for word in ["問題", "なぜ", "原因", "理由", "うまくいかない"]):
return "5Whys→SWOT"
# 包括的分析系
elif any(word in text_lower for word in ["詳しく", "徹底的", "全面的", "多角的"]):
return "SWOT各象限5Whys"
# デフォルト
return "SWOT→5Whys"
def start_framework_selection(self, user_input: str):
"""フレームワーク選択の開始"""
self.session["original_input"] = user_input
recommended = self.detect_problem_type(user_input)
print("\n=== 思考整理フレームワークの選択 ===")
print("あなたの入力に基づいて、以下のフレームワークをお勧めします:")
print(f"\n🎯 推奨: {recommended}")
print(f" {self.frameworks[recommended]['description']}")
print("\n他のフレームワークも選択できます:")
for i, (name, info) in enumerate(self.frameworks.items(), 1):
marker = "👉 " if name == recommended else " "
print(f"{marker}{i}. {name}")
print(f" {info['description']}")
print("\n選択してください(1-3):")
def select_framework(self, choice: int) -> bool:
"""フレームワークの選択"""
framework_names = list(self.frameworks.keys())
if 1 <= choice <= len(framework_names):
selected = framework_names[choice - 1]
self.session["selected_framework"] = selected
self.session["current_phase"] = self.frameworks[selected]["phases"][0]
print(f"\n✅ 「{selected}」を選択しました。")
print(f" {self.frameworks[selected]['description']}")
print("\n思考整理を開始します...\n")
return True
return False
def run_swot_analysis(self):
"""SWOT分析の実行"""
print("=== SWOT分析 ===")
print("あなたのテーマについて、以下の4つの観点で整理してみましょう。")
print("各項目で思いつくことを自由に入力してください。(空欄でスキップ可能)")
swot_prompts = {
"S": "【Strengths - 強み】現在持っている強みや優位性は?",
"W": "【Weaknesses - 弱み】現在の弱みや不足している点は?",
"O": "【Opportunities - 機会】活用できそうな機会や可能性は?",
"T": "【Threats - 脅威】懸念される脅威やリスクは?"
}
for key, prompt in swot_prompts.items():
print(f"\n{prompt}")
while True:
item = input("💭 ").strip()
if not item:
break
self.session["swot_data"][key].append(item)
print(f" ✓ 追加しました: {item}")
print(" 他にもありますか?(なければ空欄でEnter)")
self.show_swot_summary()
def show_swot_summary(self):
"""SWOT分析結果の表示"""
print("\n=== SWOT分析結果 ===")
swot_labels = {
"S": "Strengths(強み)",
"W": "Weaknesses(弱み)",
"O": "Opportunities(機会)",
"T": "Threats(脅威)"
}
for key, label in swot_labels.items():
print(f"\n【{label}】")
if self.session["swot_data"][key]:
for i, item in enumerate(self.session["swot_data"][key], 1):
print(f" {i}. {item}")
else:
print(" (なし)")
def select_element_for_whys(self):
"""5 Whysで深掘りする要素の選択"""
print("\n=== 深掘り対象の選択 ===")
print("SWOT分析の結果から、5 Whysで深掘りしたい要素を選んでください。")
print("特に「弱み」や「脅威」を選ぶと根本原因の特定に効果的です。")
# 選択肢の生成
options = []
option_map = {}
counter = 1
for key, items in self.session["swot_data"].items():
for item in items:
print(f"{counter}. 【{key}】 {item}")
options.append((key, item))
option_map[counter] = (key, item)
counter += 1
if not options:
print("SWOT要素が空です。SWOT分析からやり直しましょう。")
return False
while True:
try:
choice = int(input("\n選択してください(番号): "))
if choice in option_map:
selected_key, selected_item = option_map[choice]
print(f"\n✅ 選択: 【{selected_key}】{selected_item}")
# 5 Whysを実行
self.run_five_whys(selected_key, selected_item)
return True
else:
print("無効な番号です。")
except ValueError:
print("数字を入力してください。")
def run_five_whys(self, category: str, target_item: str):
"""5 Whys分析の実行"""
print(f"\n=== 5 Whys分析:【{category}】{target_item} ===")
print("「なぜ?」を5回繰り返して、根本原因を探ってみましょう。")
print("各段階で、前の答えに対して「なぜそうなのか?」を考えてください。")
whys_data = {
"target": target_item,
"category": category,
"whys": []
}
current_question = target_item
for i in range(1, 6):
print(f"\n【Why {i}】")
print(f"❓ なぜ「{current_question}」なのですか?")
answer = input("💭 ").strip()
if not answer:
if i <= 2: # 最低2つのWhyは必要
print("⚠️ 分析を続けるために回答をお願いします。")
print(" 簡単な推測でも思考を深めるのに役立ちます:")
answer = input("💭 ").strip()
if not answer:
answer = "これについてもっと考える必要がある"
else:
print("残りのステップで分析を続けます...")
break
whys_data["whys"].append({
"level": i,
"question": current_question,
"answer": answer
})
print(f" ✓ {answer}")
current_question = answer # 次の質問の対象にする
self.session["five_whys_data"][f"{category}_{target_item}"] = whys_data
self.show_five_whys_result(whys_data)
def show_five_whys_result(self, whys_data: Dict):
"""5 Whys結果の表示"""
print(f"\n=== 5 Whys分析結果 ===")
print(f"対象: 【{whys_data['category']}】{whys_data['target']}")
print("\n原因の連鎖:")
for why in whys_data["whys"]:
print(f" Why {why['level']}: {why['question']}")
print(f" → {why['answer']}")
if whys_data["whys"]:
root_cause = whys_data["whys"][-1]["answer"]
print(f"\n🎯 根本原因: {root_cause}")
# 対策案の検討を促す
self.suggest_action_planning(root_cause)
def suggest_action_planning(self, root_cause: str):
"""対策案検討の促進"""
print(f"\n=== 対策案の検討 ===")
print(f"根本原因「{root_cause}」に対して、どのような対策が考えられますか?")
print("以下の観点で考えてみてください:")
print(" • 短期的にできること")
print(" • 中長期的な改善策")
print(" • 必要なリソースや協力")
print(" • 実行の優先順位")
print("\n対策案を入力してください(複数可、空欄で終了):")
actions = []
while True:
action = input("💡 ").strip()
if not action:
break
actions.append(action)
print(f" ✓ 追加: {action}")
if actions:
self.session["action_plans"] = actions
print(f"\n✅ {len(actions)}個の対策案を記録しました。")
def run_problem_focused_whys(self):
"""問題焦点型の5 Whys(5Whys→SWOTパターン)"""
print("=== 問題の根本原因分析 ===")
print("まず、あなたが直面している問題や課題を具体的に教えてください。")
problem = input("🔍 ").strip()
if not problem:
print("問題が入力されませんでした。")
return
print(f"\n対象問題: {problem}")
self.run_five_whys("Problem", problem)
def show_final_summary(self):
"""最終結果のサマリー表示"""
print("\n" + "="*50)
print("=== 思考整理完了 ===")
print("="*50)
# 元の入力
print(f"\n【最初の入力】")
print(self.session["original_input"])
# 使用したフレームワーク
print(f"\n【使用フレームワーク】")
print(self.session["selected_framework"])
# SWOT結果(ある場合)
if any(self.session["swot_data"].values()):
print(f"\n【SWOT分析結果】")
swot_labels = {"S": "強み", "W": "弱み", "O": "機会", "T": "脅威"}
for key, items in self.session["swot_data"].items():
if items:
print(f" {swot_labels[key]}: {', '.join(items)}")
# 5 Whys結果
if self.session["five_whys_data"]:
print(f"\n【根本原因分析結果】")
for key, data in self.session["five_whys_data"].items():
if data["whys"]:
root_cause = data["whys"][-1]["answer"]
print(f" {data['target']} → 根本原因: {root_cause}")
# 対策案
if "action_plans" in self.session and self.session["action_plans"]:
print(f"\n【対策案】")
for i, action in enumerate(self.session["action_plans"], 1):
print(f" {i}. {action}")
print(f"\n思考プロセスを見ますか? (y/n)")
def show_thinking_process(self):
"""思考プロセスの表示"""
print("\n=== 思考プロセス ===")
framework = self.session["selected_framework"]
phases = self.frameworks[framework]["phases"]
print(f"フレームワーク: {framework}")
print("実行したステップ:")
step_names = {
"swot_analysis": "SWOT分析による現状整理",
"select_element": "深掘り対象の選択",
"five_whys": "5 Whysによる根本原因分析",
"whys_for_each": "各SWOT要素の深掘り",
"swot_on_cause": "根本原因のSWOT分析",
"action_plan": "対策案の検討",
"synthesis": "結果の統合"
}
for i, phase in enumerate(phases, 1):
name = step_names.get(phase, phase)
print(f" {i}. {name}")
print(f"\nこの思考プロセスにより、表面的な分析ではなく")
print(f"根本的な理解と具体的な行動計画を得ることができました。")
def save_session(self):
"""セッションの保存"""
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
filename = self.data_dir / f"thinking_session_{timestamp}.json"
with open(filename, 'w', encoding='utf-8') as f:
json.dump(self.session, f, ensure_ascii=False, indent=2)
print(f"\n💾 セッションを保存しました: {filename}")
def run(self):
"""メインの実行ループ"""
print("🧠 5 Whys × SWOT 思考支援チャットボット")
print("問題や課題について、フレームワークを使って深く考えてみましょう。")
print("-" * 60)
# 初期入力
print("\n何について考えたいですか?自由に入力してください:")
user_input = input("💭 ").strip()
if not user_input:
print("入力がありません。終了します。")
return
try:
# フレームワーク選択
self.start_framework_selection(user_input)
while True:
try:
choice = int(input())
if self.select_framework(choice):
break
else:
print("1-3の数字を入力してください:")
except ValueError:
print("数字を入力してください:")
# 選択されたフレームワークに応じた処理
framework = self.session["selected_framework"]
if framework == "SWOT→5Whys":
self.run_swot_analysis()
self.select_element_for_whys()
elif framework == "5Whys→SWOT":
self.run_problem_focused_whys()
# TODO: 根本原因に対するSWOT分析
elif framework == "SWOT各象限5Whys":
self.run_swot_analysis()
# TODO: 各要素に対する5 Whys
# 最終サマリー
self.show_final_summary()
# プロセス表示の選択
response = input().strip().lower()
if response in ['y', 'yes', 'はい']:
self.show_thinking_process()
# セッション保存
self.save_session()
except KeyboardInterrupt:
print("\n\n中断されました。")
except Exception as e:
print(f"\nエラーが発生しました: {e}")
finally:
print("\nお疲れさまでした!")
def main():
bot = ThinkingFrameworkBot()
bot.run()
if __name__ == "__main__":
main()