0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIでもPythonでも出来ることはPythonに投げる壁打ちサンプル『framework-sounding-board』公開しました。

Last updated at Posted at 2025-08-04

一言で、これは何?

Pythonで壁打ちしてJSON作るスクリプトです。

スクリーンショット

Screenshot 2025-08-04 16.07.36.png
起動画面

Screenshot 2025-08-04 16.08.02.png
フレームワーク選択画面

Screenshot 2025-08-04 16.09.28.png
結果

デモ動画(YouTube)

背景思想

産業革命期(18-19世紀)
機械技術 → 労働力需要 → 疫病蔓延 → 公衆衛生制度

スマートフォン時代(2010年代)
デジタル技術 → レアメタル需要 → 供給不足 → リサイクル・代替技術

AI時代(2020年代)
AI技術 → 電力需要 → 供給制約 → 再エネ・電力市場変革

出典: おそらく、『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()

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?