這三天總共會介紹以下六種設計模式在 GenAI 的應用,今天進入到第三天:
| 設計模式 | 重點 | GenAI 應用 | 
|---|---|---|
| 單例模式 (Singleton) | 確保全局唯一實例 | LLM 模型初始化 | 
| 工廠模式 (Factory Method) | 靈活創建對象 | 跨型態檔案讀取 | 
| 觀察者模式 (Observer) | 實現事件驅動 | 資料庫更新觸發處理 | 
| 模板模式 (Template Method) | 定義算法骨架 | 資料前處理流程框架 | 
| 裝飾器模式 (Decorator) | 動態添加功能 | 靈活組合資料處理步驟 | 
| 策略模式 (Strategy) | 動態切換算法 | 檢索策略調整 | 
import string
from functools import wraps
def lowercase(func):
    @wraps(func)
    def wrapper(text):
        return func(text).lower()
    return wrapper
def remove_punctuation(func):
    @wraps(func)
    def wrapper(text):
        return func(text).translate(str.maketrans("", "", string.punctuation))
    return wrapper
def tokenize(func):
    @wraps(func)
    def wrapper(text):
        return " ".join(func(text).split())
    return wrapper
@tokenize
@remove_punctuation
@lowercase
def process_text(text: str) -> str:
    return text
def main():
    text = "Hello, World! This is an Example."
    processed_text = process_text(text)
    print(f"Original text: {text}")
    print(f"Processed text: {processed_text}")
if __name__ == "__main__":
    main()
lowercase、remove_punctuation 和 tokenize。每個裝飾器都封裝一個文本處理步驟。@wraps(func) 裝飾器用於保留原函數的元數據。process_text 函數使用了以上三個裝飾器,形成了一個處理流程:先轉小寫,然後移除標點符號,最後進行分詞。from abc import ABC, abstractmethod
class DatabaseRetrievalStrategy(ABC):
    @abstractmethod
    def retrieve(self, query: str) -> str:
        pass
class SQLDatabaseStrategy(DatabaseRetrievalStrategy):
    def retrieve(self, query: str) -> str:
        return f"從 SQL 資料庫檢索:執行 SQL 查詢 '{query}'"
class NoSQLDatabaseStrategy(DatabaseRetrievalStrategy):
    def retrieve(self, query: str) -> str:
        return f"從 NoSQL 資料庫檢索:使用 key-value 查詢 '{query}'"
class InformationRetriever:
    def __init__(self, strategy: DatabaseRetrievalStrategy):
        self.strategy = strategy
    def set_strategy(self, strategy: DatabaseRetrievalStrategy):
        self.strategy = strategy
    def search(self, query: str) -> str:
        return self.strategy.retrieve(query)
# 使用範例
def main():
    retriever = InformationRetriever(SQLDatabaseStrategy())
    print(retriever.search("SELECT * FROM users"))  # 使用 SQL 資料庫
    
    retriever.set_strategy(NoSQLDatabaseStrategy())
    print(retriever.search("user:123"))  # 使用 NoSQL 資料庫
if __name__ == "__main__":
    main()
DatabaseRetrievalStrategy 是一個抽象基類,定義了檢索策略的接口。SQLDatabaseStrategy 和 NoSQLDatabaseStrategy 是具體的策略類,實現了特定類型數據庫的檢索邏輯。InformationRetriever 類使用策略模式,可以動態設置和切換不同的檢索策略。InformationRetriever 來執行不同類型數據庫的檢索。設計模式的部份就告一個段落了。
ref.
Refactoring.Guru | design-patterns