【從一台 Server 到分散式架構】第 24 篇:AI 系統架構——串流回應、推理服務與擴展策略
AI 學習助理上線一週後,用戶的反饋出奇地好。
但 DevOps 阿強拉著小明看了一張圖:
「現在每次用戶問問題,後端要等 LLM 生成完整回答——平均要 8 秒——才回傳給前端。8 秒的空白,用戶以為沒反應,很多人點了兩三次。而且 API 費用這週爆了,因為很多重複請求。」
另一個工程師說:「而且如果我們之後想要自架 LLM 模型,GPU 要怎麼管理、要怎麼擴展,我完全不知道從哪裡想起。」
小明面對著兩個問題:
- 用戶體驗:怎麼讓 AI 的回答感覺「即時」而不是「等一個結果」?
- 系統架構:推理服務要怎麼設計才能擴展?
問題一:串流回應——讓 AI 像在「打字」
LLM 生成文字的方式是逐 Token 生成:先生成第一個字(Token),再生成第二個字,一直到整段回應完成。
如果你等所有 Token 都生成完才回傳,用戶看到的是「空等 8 秒,突然出現一大段文字」。
如果你讓每個 Token 生成出來就立刻傳給前端,用戶看到的是「文字一個接一個冒出來,像有人在打字」。
這就是 Streaming(串流回應)。
技術實作:Server-Sent Events 或 WebSocket
兩種常見做法:
Server-Sent Events(SSE):
- HTTP 的單向串流:伺服器持續把 Token 推給前端
- 實作簡單,HTTP/1.1 就支援
- 適合「伺服器主動推送、不需要雙向」的場景——AI 串流完全符合
WebSocket:
- 雙向連線(第 17 篇介紹過)
- 如果你的 AI 助理需要「用戶可以隨時打斷或追問」,WebSocket 更適合
小明他們先用 SSE——簡單,夠用:
用戶送出問題
→ 後端呼叫 LLM API(帶 stream=true)
→ LLM 每生成幾個 Token 就回傳一小段
→ 後端把這些小段透過 SSE 推給前端
→ 前端即時顯示,像打字效果
問題二:推理很耗資源,怎麼擴展?
用外部 API 的情況
如果用 OpenAI、Anthropic 等 API,推理資源是對方的——你只需要考慮:
- Rate Limit(速率限制):每分鐘能打幾次、多少 Token
- 並行請求數:同時有多少個請求在等 LLM 回應
- 成本控制:每個 Token 都要錢,要避免重複請求
這種情況下,你的架構要處理的主要是前面的佇列和請求管理。
自架 LLM 的情況
如果要自己跑模型(開源模型如 Llama、Mistral),需要 GPU 機器,而 GPU 資源貴且難擴展:
| 比較 | CPU(一般後端) | GPU(LLM 推理) |
|---|---|---|
| 擴展方式 | 加機器成本低 | 加 GPU 機器貴很多 |
| 啟動速度 | 秒級 | 模型載入可能需要幾分鐘 |
| 利用率 | 容易充分利用 | 閒置時浪費成本很高 |
自架 LLM 的擴展策略:
- 模型服務與應用服務分開部署:LLM 推理服務跑在 GPU 機器,普通 API 跑在 CPU 機器,分別擴展
- 請求佇列:GPU 機器數量有限,把 LLM 請求放進佇列,按順序處理,避免 GPU 被瞬間打爆
- 批次推理(Batching):多個請求同時進模型,比一個一個跑更有效率地利用 GPU
請求佇列:讓 AI 服務「削峰填谷」
這個概念和第 08 篇的 Message Queue 一樣,只是應用在 AI 服務上:
用戶瞬間湧入提問,請求進佇列排隊;GPU 機器按自己的速度消化佇列,不會被打爆。
快取也能幫 AI 省錢
很多問題其實是重複的(「什麼是遞迴?」「如何宣告變數?」),每次都呼叫 LLM 太浪費。
語意快取(Semantic Cache):
把「問題的向量」和「LLM 的回答」存起來。下次有相似的問題,先去快取找——如果找到語意很相似的舊問題(向量距離夠近),就直接回傳快取的答案,不用再打 LLM。
這比傳統 key-value 快取更聰明:「Python loop 怎麼寫」和「Python 如何做迴圈」是不同的字串,但語意相近,語意快取能把它們視為同一個問題。
完整的 AI 助理架構
小結與預告
這篇小明學到的重點是:
- 串流回應(Streaming):逐 Token 推送給前端,讓用戶感受「AI 在打字」,而不是等一個慢速結果——用 SSE 實作最簡單。
- 推理資源貴且難擴展:GPU 機器不能隨意加,要做好請求佇列削峰;模型服務要和普通 API 服務分開,各自獨立擴展。
- 語意快取省成本:相似問題不用重複打 LLM,用向量距離判斷「夠像就用舊答案」。
到這裡,小明他們的系統功能齊全了:課程平台、微服務、即時通知、AI 助理……
是時候退一步,把這整個系統拍一張全景圖。
下一篇,我們來做一件重要的事:把從第 01 篇走到現在的每個元件,畫成一張完整的架構圖,看看這個系統到底長成了什麼樣子。