🏭 第二課:廠長的 SOP 進化史

【情境代入】你是一座全自動化處理廠的「廠長」。
你撰寫了名為 Action 的「SOP (程式碼)」,用來指揮廠內的「機器人」運作。

🌟 課前總覽:SOP 升級對照表

在開始詳細的課程前,我們先來看看「原本的程式碼」跟「升級後的程式碼」長什麼樣子。
掌握了這個進化框架,後面的細節你就能秒懂!

📝 V1.0 傳統代工 原始碼
async def action(self, body: dict):

    # 1. 拿取最新包裹
    messages = body.get("messages", [])
    last_message = messages[-1]

    # 2. ❌ 沒過濾氣泡紙,直接算字數
    msg_len = len(last_message.get("content", ""))

    # 3. ❌ 直接奇異筆塗鴉,客戶沒看到進度
    last_message["content"] += f"\n長度:{msg_len}"

    return body
🚀 V2.0 智能產線 優化碼
# ✅ 引進新機台 (過濾機與電子秤)
import re, tiktoken

async def action(self, body: dict, __event_emitter__):
    last_message = body.get("messages", [])[-1]

    # ✅ 1. 啟用廣播:UI 顯示 Loading
    await __event_emitter__({"type": "status", "data": {"done": False}})

    # ✅ 2. 拆解氣泡紙,精準算 Token
    display_txt = re.sub(r'<think>.*?</think>', '', ...)
    tokens = len(tiktoken...encode(display_txt))

    # ✅ 3. 附加結果,並廣播完成
    last_message["content"] += f"\nTokens:{tokens}"
    await __event_emitter__({"type": "status", "data": {"done": True}})

    return body
🧱 第一階段:廠長必修課 (SOP 骨架拆解)
🏷️ 函式宣告 (def)
def

起草一份 SOP

廠長在筆記本上寫下這三個字,表示接下來要寫一段標準作業程序供機器人執行。

🏷️ 非同步 (Asynchronous)
async

不卡單的聰明員工

廠長賦予機器人多工能力,如果這個任務要等很久,機器人會先去處理下一件。

📦 第二階段:V1.0 傳統工廠日常

檢查貨車與拿取包裹

工人查看貨車有沒有包裹。沒有的話,觸發 return 緊急下班鍵,直接把空車退回碼頭,絕不浪費時間!

工廠災難現場:IndentationError

新手常不小心混入全形空白。對 Python 機器人來說,縮排就像工廠的地板,如果地板不平整(縮排不一致),機器人會直接摔倒當機!

messages = body.get("messages", [])
# 防呆機制:沒包裹就按下緊急下班鍵 (return)
if not messages:
    return body

last_message = messages[-1]

傳統磅秤與奇異筆塗鴉

把包裹內容放在基礎磅秤 len() 上算字數,然後直接拿奇異筆 +=,把重量硬生生塗寫在客人的包裹外箱上。

message_len = len(message_content)
last_message["content"] += f"\n長度是 {message_len}"
🚀 第三階段:V2.0 智能工廠大升級

為了解決客訴,廠長引進了新機台與廣播系統,並且架設了除錯監視器:

啟用工廠廣播系統

__event_emitter__ 就像是對外大廳的廣播器。發送 {"done": False} 就像是廣播「請稍候」,前端畫面會開始轉圈圈,提升 UX 體驗!

await __event_emitter__({
    "type": "status",
    "data": {"description": "處理中...", "done": False}
})
🏷️ 輸出與日誌 (print vs Emitter)

監視器 vs 廣播器

新手在除錯時最常問:「我要怎麼知道發生了什麼錯誤?」

📺 廠長監視器 print() 印出的字只會顯示在後台 Console,客人看不到。這是廠長自己抓蟲用的神器!
📻 大廳廣播 __event_emitter__ 對著前台大廳發送,客人的視窗會彈出通知或轉圈圈。

# 廠長在後台偷看數值,前台不會顯示
print(f"目前算出來的 Token 是: {tokens}")