CH5 AI Prompt 互動提示詞生成系統

Part 2:專案架構與服務設計

深入了解 Flask 應用的分層架構與核心模組

Flask MVC 服務分層 資料流向

📁 專案目錄結構

CH5_AI_Prompt_Generator/
├── app.py # Flask 應用入口
├── config.py # 配置管理
├── src/
│ ├── services/ # 服務層
│ │ ├── ai_service.py
│ │ ├── rag_service.py
│ │ └── prompt_builder.py
│ ├── models/ # 資料模型
│ └── utils/ # 工具函數
├── templates/ # Jinja2 模板
├── static/ # CSS/JS 靜態檔
├── data/ # 資料儲存
└── gas/ # Google Apps Script

設計原則

  • 分層架構:路由、服務、資料分離
  • 模組化:功能獨立,易於維護
  • 配置驅動:透過 .env 控制行為
  • 可擴展:預留擴展空間

🔧 核心服務模組設計

🤖
AIService

統一抽象 OpenAI 和 Gemini API

  • 智能生成提示詞
  • 優化分析功能
  • 錯誤處理與重試
📚
RAGService

管理知識庫所有操作

  • 文件上傳與解析
  • 向量嵌入與儲存
  • 語義檢索
📝
PromptBuilder

模板生成引擎

  • 樹狀模板結構
  • 變數替換
  • 多語言支援

⚙️ 配置管理 (config.py)

class Config:
    # Flask 配置
    SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key')
    DEBUG = os.getenv('FLASK_DEBUG', 'True').lower() == 'true'

    # AI 服務配置
    OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
    GOOGLE_AI_API_KEY = os.getenv('GOOGLE_AI_API_KEY')
    AI_PROVIDER = os.getenv('AI_PROVIDER', 'both')

    # RAG 配置
    VECTOR_DB_TYPE = os.getenv('VECTOR_DB_TYPE', 'chromadb')
    EMBEDDING_PROVIDER = os.getenv('EMBEDDING_PROVIDER', 'sentence-transformers')

    # Google Sheets 整合
    GOOGLE_SHEETS_ENABLED = os.getenv('GOOGLE_SHEETS_ENABLED', 'false')
優勢:集中管理配置,透過環境變數調整行為,不需修改程式碼

🔄 資料流向分析

1. 前端
generator.html → 收集表單資料
2. API 路由
/api/generate → 驗證與分發
3. 服務層
PromptBuilder / AIService
4. 返回結果
JSON Response → 前端展示

💡 關鍵設計決策

為什麼同時支援模板和 AI 生成?

  • 成本考量:模板生成免費
  • 可靠性:API 不可用時的備案
  • 速度:模板幾乎即時
  • 學習價值:展示良好結構

為什麼選擇 ChromaDB?

  • 嵌入式:不需獨立伺服器
  • 易用性:幾行程式碼完成操作
  • 效能:中小規模表現良好
  • 可遷移:未來可升級

為什麼使用 SQLite?

  • 嵌入式:單一檔案儲存
  • 可攜性:整個目錄可遷移
  • 效能夠用:低頻操作
  • 可升級:SQLAlchemy ORM

為什麼不用 React/Vue?

  • 降低門檻:HTML+JS 易理解
  • 簡化部署:不需 npm 構建
  • 互動夠用:原生 JS 能勝任
  • 實用主義:解決問題優先

📌 本節重點回顧

學到的內容
  • Flask 應用的標準目錄結構
  • 三大核心服務模組的職責
  • 配置驅動設計的優勢
  • 資料在系統中的流向
  • 關鍵技術選型的理由
📖
設計哲學
  • 分層架構易於維護
  • 模組化支援擴展
  • 配置驅動提高靈活性
  • 實用主義優於技術炫技
  • 簡單是最好的設計
下一節:深入了解互動式提示詞生成器的實作細節