iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
生成式 AI

從系統設計切入,探索 GenAI 在企業中的實踐系列 第 17

[Day17] 掌握設計模式開發核心組件-裝飾器、策略模式

  • 分享至 

  • xImage
  •  

這三天總共會介紹以下六種設計模式在 GenAI 的應用,今天進入到第三天:

設計模式 重點 GenAI 應用
單例模式 (Singleton) 確保全局唯一實例 LLM 模型初始化
工廠模式 (Factory Method) 靈活創建對象 跨型態檔案讀取
觀察者模式 (Observer) 實現事件驅動 資料庫更新觸發處理
模板模式 (Template Method) 定義算法骨架 資料前處理流程框架
裝飾器模式 (Decorator) 動態添加功能 靈活組合資料處理步驟
策略模式 (Strategy) 動態切換算法 檢索策略調整

裝飾器模式 (Decorator)

  1. 介紹:是一種結構型設計模式,允許動態地給現有對象添加新的功能,而不需要改變其結構。這種模式通過創建一個包裝原有對象的裝飾器對象來實現。
  2. Gen AI 應用情境:
    • 數據預處理管道:動態組合不同的數據清理、轉換或增強步驟。
    • 模型功能擴展:為現有的模型添加額外的功能,如日誌記錄、性能監控或輸入驗證。
    • 動態特徵工程:根據需要動態添加或移除特徵工程步驟。
    • 模型輸出後處理:對模型輸出進行動態的後處理,如格式化、過濾或增強。
    • 模型測試實驗:通過裝飾器動態修改模型或訓練過程的行為,便於進行 A/B 測試或超參數調整。
    • API 功能擴展:在不修改核心邏輯的情況下,為 AI 服務的 API 添加認證、速率限制或響應轉換等功能。
  3. 案例與說明:使用裝飾器模式實現文本處理管道的範例。
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()
  1. 我們定義了三個裝飾器函數:lowercaseremove_punctuationtokenize。每個裝飾器都封裝一個文本處理步驟。
  2. @wraps(func) 裝飾器用於保留原函數的元數據。
  3. process_text 函數使用了以上三個裝飾器,形成了一個處理流程:先轉小寫,然後移除標點符號,最後進行分詞。
  4. 裝飾器的應用順序是從下到上的,這意味著文本首先會被轉換為小寫,然後移除標點符號,最後進行分詞。
  5. 主程序演示了如何使用這個處理管道來處理文本。

策略模式 (Strategy)

  1. 介紹:是一種行為設計模式,它定義了一系列算法,將每個算法封裝起來,並使它們可以相互替換,用於動態選擇不同的處理策略。
  2. Gen AI 應用情境:
    • 模型選擇:根據輸入數據的特性或任務需求,動態選擇不同的機器學習模型。
    • 特徵工程策略:根據數據類型或分析目標,選擇不同的特徵提取和選擇方法。
    • 數據預處理策略:根據數據質量和任務要求,選擇不同的數據清理和轉換策略。
    • 超參數優化:實現不同的超參數搜索策略,如網格搜索、隨機搜索或貝葉斯優化。
    • 文本嵌入策略:根據任務需求選擇不同的文本嵌入方法,如 Word2Vec、BERT 或自定義嵌入。
    • 模型集成策略:實現不同的模型集成方法,如投票、平均或堆疊。
  3. 案例與說明:使用策略模式實現不同檢索策略的範例。
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()
  1. DatabaseRetrievalStrategy 是一個抽象基類,定義了檢索策略的接口。
  2. SQLDatabaseStrategyNoSQLDatabaseStrategy 是具體的策略類,實現了特定類型數據庫的檢索邏輯。
  3. InformationRetriever 類使用策略模式,可以動態設置和切換不同的檢索策略。
  4. 主程序呈現了如何使用 InformationRetriever 來執行不同類型數據庫的檢索。

設計模式的部份就告一個段落了。


ref.
Refactoring.Guru | design-patterns


上一篇
[Day16] 掌握設計模式開發核心組件-觀察者、模板模式
下一篇
[Day18] CDC 變更資料捕獲-保持數據一致性
系列文
從系統設計切入,探索 GenAI 在企業中的實踐25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言