Day 22|設計可切換的 LLM 連線層
如果今天想從 Gemini 換成 Claude,要改幾個地方?最好的答案是:只改一個設定。
為什麼要把連線集中起來
每一家 LLM 的 API 格式都不一樣:請求網址、驗證標頭、訊息欄位、回應位置都有差異。如果程式直接寫死某一家,換模型就要大改。我把連線集中在 llm.py,對外只有一個函式:給它系統提示詞和對話,它回傳模型的文字。
四種供應商,一個設定切換
用環境變數 LLM_PROVIDER 切換:mock(離線示範)、anthropic(Claude)、openai(OpenAI 相容)、gemini(Google 的 OpenAI 相容端點,和 openai 走同一套程式,只有預設網址不同)。也接受 claude、gpt 這類常見寫法。API 金鑰只存在後端的 .env,前端完全看不到。
一個容易忽略的細節
有些 API 要求對話必須從使用者訊息開始,但我們的對話是從 AI 的開場白開始。所以連線層會在最前面補一則提示訊息,並合併連續相同角色的訊息。這個「自動補資料」的做法,後來引出了一個 bug(見 Day 21 的踩雷三)。
小結
把會變動的部分(供應商)和不變的部分(對話流程)分開,換模型就只是改設定。介面設計得越單純,後面越不怕改。