用多個模型)
一個AI項目接入第二個模型供應(yīng)商之后真正的問題才暴露出來。代碼沒有變得更難寫而是變得更難改。供應(yīng)商A的流式返回格式和供應(yīng)商B不同工具調(diào)用的參數(shù)結(jié)構(gòu)對不上錯誤碼體系各自為政。每新增一個模型業(yè)務(wù)代碼里就多一層條件分支。這不是模型數(shù)量的問題是接口差異正在穿透到不該到達的層面。一套OpenAI SDK調(diào)用多個模型本質(zhì)上是把供應(yīng)商差異從業(yè)務(wù)代碼中剝離出去收進一個統(tǒng)一的適配層。實現(xiàn)路徑有兩條自建統(tǒng)一層或使用AI API Gateway。前者把控制權(quán)留在團隊手中代價是持續(xù)的適配和維護成本后者把差異封裝在外部代價是鏈路多一個節(jié)點、數(shù)據(jù)邊界需要評估。選擇取決于團隊規(guī)模、合規(guī)要求和路由策略是否是核心競爭點——不存在一種方案適合所有場景。為什么接入第一個模型時一切都很順利接入第一個模型時開發(fā)者面對的是一個確定性系統(tǒng)。一個SDK一套認證方式一種請求格式一種響應(yīng)結(jié)構(gòu)。代碼路徑清晰錯誤處理簡單調(diào)試直接。問題出現(xiàn)在接入第二個模型的時候。表面上看只是多了一個API地址和一組密鑰但實際需要處理的是一組“隱形差異”。以當(dāng)前主流模型為例DeepSeek V4 Pro 和 Qwen3.8 Max 都宣稱兼容OpenAI協(xié)議但開啟推理模式的方式不同——前者使用extra_body.thinking后者使用enable_thinking。Claude Opus 5.5 的流式返回中推理內(nèi)容放在delta.reasoning_content字段而 OpenAI 的 GPT-6 Sol 使用reasoning_effort參數(shù)控制推理深度5。Gemini 3 Pro 通過其 OpenAI 兼容端點接入時多模態(tài)輸入對音頻格式的要求又與其他供應(yīng)商不同5。這些差異單獨看都不復(fù)雜但當(dāng)它們開始散落在業(yè)務(wù)代碼的不同位置時維護成本會非線性增長。一個典型的信號是代碼中開始出現(xiàn)if provider claude: ... elif provider gemini: ...這樣的分支而且分支數(shù)量隨著供應(yīng)商數(shù)量同步增加。真正困難的地方不是模型數(shù)量而是協(xié)議差異對業(yè)務(wù)邏輯的侵入多模型接入的工程復(fù)雜度根源不在“調(diào)不通”。每個供應(yīng)商的API文檔都很清楚單獨對接任何一個都不困難。困難在于差異侵入的路徑是漸進的而且在早期不容易被察覺。參數(shù)命名和約束的不統(tǒng)一是最先暴露的問題。temperature、max_tokens、top_p這些通用參數(shù)各家的取值范圍、默認值和生效條件并不完全一致。更隱蔽的是推理參數(shù)同一個“開啟深度思考”的語義在 DeepSeek V4 上是extra_body.thinking在 Qwen3.8 上是enable_thinking在 OpenAI 的 GPT-6 Luna 上是reasoning_effort。如果不做歸一化業(yè)務(wù)層就需要知道當(dāng)前調(diào)用的是哪個模型才能構(gòu)造正確的請求體。流式返回格式的差異是第二個侵入點。OpenAI 的流式響應(yīng)使用delta增量輸出字段結(jié)構(gòu)相對統(tǒng)一。但 Claude 的流式事件使用獨立的事件類型系統(tǒng)工具調(diào)用信息可能在多個事件片段中分次到達且停止原因字段的語義與 OpenAI 不同。如果適配層只是簡單地把所有流式響應(yīng)“翻譯”成 OpenAI 格式工具調(diào)用的參數(shù)可能被截斷或丟失導(dǎo)致下游 Agent 框架無法正確執(zhí)行函數(shù)調(diào)用。工具調(diào)用協(xié)議的差異則更深一層。OpenAI 的tools參數(shù)使用 JSON Schema 描述函數(shù)簽名tool_choice控制調(diào)用策略。Claude 的tool_use和tool_result是消息內(nèi)容塊的一種類型與文本內(nèi)容共享同一個消息數(shù)組。Gemini 的函數(shù)調(diào)用使用functionDeclarations和functionCall兩個獨立結(jié)構(gòu)。這些差異意味著一個跨模型可用的工具調(diào)用抽象層需要在內(nèi)部定義一套統(tǒng)一的事件模型再為每個供應(yīng)商編寫雙向轉(zhuǎn)換器——請求方向的轉(zhuǎn)換相對容易響應(yīng)方向特別是流式響應(yīng)中的工具調(diào)用轉(zhuǎn)換才是真正的難點。錯誤碼體系的不可通約性是第四個問題。OpenAI 使用 HTTP 狀態(tài)碼加error.type字段Anthropic 使用error.type加自定義錯誤類型Google 使用 gRPC 狀態(tài)碼體系。如果不做歸一化業(yè)務(wù)層的重試和降級邏輯就無法復(fù)用每個供應(yīng)商都需要一套獨立的異常處理分支。這四個層面的差異如果同時暴露在業(yè)務(wù)代碼中代碼的認知負擔(dān)會迅速超過可維護的閾值。實際項目中多模型接入通常如何失控一個典型的失控路徑是這樣的項目最初只使用 GPT-6 Sol 處理對話任務(wù)代碼中直接實例化 OpenAI 客戶端調(diào)用client.chat.completions.create()。一切正常。然后團隊決定加入 DeepSeek V4 Flash 處理成本敏感的批量任務(wù)。開發(fā)者新建了一個客戶端實例指向 DeepSeek 的兼容端點調(diào)用同樣的方法。代碼里出現(xiàn)了第一個分支根據(jù)任務(wù)類型選擇不同的客戶端。這個分支本身不是問題問題在于請求構(gòu)造邏輯也開始分叉——DeepSeek 的max_tokens上限和 GPT-6 不同需要調(diào)整。接著引入 Claude Opus 5.5 處理需要長上下文和工具調(diào)用的 Agent 場景。Claude 的 SDK 是獨立的認證方式不同流式返回的事件結(jié)構(gòu)與 OpenAI 不兼容。開發(fā)者寫了一個轉(zhuǎn)換函數(shù)把 Claude 的流式響應(yīng)映射到 OpenAI 的delta結(jié)構(gòu)但工具調(diào)用的input_json_delta需要特殊處理——Claude 在流式模式下會把工具參數(shù)分多個事件發(fā)送而業(yè)務(wù)層的 Agent 框架期望一次性拿到完整的 JSON 參數(shù)。問題開始變得明顯業(yè)務(wù)代碼中出現(xiàn)了供應(yīng)商特定的解析邏輯。if model.startswith(claude): parse_claude_tool_call(...)這樣的代碼開始出現(xiàn)在本應(yīng)只關(guān)心業(yè)務(wù)邏輯的位置。然后是計費和用量統(tǒng)計。每個供應(yīng)商的usage字段結(jié)構(gòu)不同OpenAI 返回prompt_tokens、completion_tokens、total_tokensClaude 返回input_tokens和output_tokensGemini 的usageMetadata結(jié)構(gòu)又不同。流式模式下部分供應(yīng)商在最后一個 chunk 才返回 usage部分不返回。如果不做統(tǒng)一財務(wù)對賬時需要為每個供應(yīng)商寫單獨的解析腳本。到這個階段代碼的修改已經(jīng)不再是一個簡單的任務(wù)。新增一個模型意味著在多個位置添加分支、調(diào)整參數(shù)映射、編寫響應(yīng)轉(zhuǎn)換、更新錯誤處理——平均需要投入數(shù)人日的工作量。更隱蔽的成本是每次修改都在增加回歸風(fēng)險而測試覆蓋很難跟上這種分散式的變更。如何避免接入更多模型后代碼失控一個可維護的多模型架構(gòu)核心原則是讓差異在盡可能靠近供應(yīng)商的位置被吸收讓業(yè)務(wù)層只面對一個穩(wěn)定的抽象。推薦的架構(gòu)分層如下text業(yè)務(wù)層 ↓ 統(tǒng)一模型接口門面 ↓ 路由層 ↓ 適配層每供應(yīng)商一個適配器 ↓ 模型供應(yīng)商業(yè)務(wù)層只依賴統(tǒng)一模型接口不感知供應(yīng)商、協(xié)議或網(wǎng)絡(luò)細節(jié)。它調(diào)用的是client.chat(modelreasoning-model, messagesmessages)這樣的方法其中model是一個邏輯名稱而非供應(yīng)商特定的模型ID。統(tǒng)一模型接口定義一套內(nèi)部契約請求結(jié)構(gòu)、響應(yīng)結(jié)構(gòu)、流式事件類型、錯誤分類。這套契約以 OpenAI 的chat.completions接口為參考因為它的認知成本最低且大多數(shù)供應(yīng)商已經(jīng)在兼容它。路由層負責(zé)將邏輯模型名映射到具體的供應(yīng)商和模型ID并執(zhí)行路由策略——按任務(wù)類型、成本優(yōu)先級、延遲要求或可用性進行選擇。路由層還可以處理重試和降級當(dāng)首選供應(yīng)商不可用時路由到備用供應(yīng)商同時保持對業(yè)務(wù)層透明。適配層是差異收編的最終位置。每個供應(yīng)商對應(yīng)一個適配器負責(zé)四件事請求參數(shù)轉(zhuǎn)換標(biāo)準(zhǔn)參數(shù)→供應(yīng)商私有參數(shù)、響應(yīng)格式歸一化供應(yīng)商響應(yīng)→標(biāo)準(zhǔn)結(jié)構(gòu)、流式事件轉(zhuǎn)換供應(yīng)商流式協(xié)議→統(tǒng)一事件流、錯誤碼映射供應(yīng)商錯誤→統(tǒng)一錯誤分類4。一個適配器的偽代碼示意pythonclass DeepSeekAdapter: def build_request(self, messages, **params): # 將標(biāo)準(zhǔn)參數(shù)轉(zhuǎn)換為 DeepSeek 私有參數(shù) request {model: self.model_id, messages: messages} if params.get(thinking): request[extra_body] {thinking: True} return request def parse_stream_chunk(self, chunk): # 將 DeepSeek 流式 chunk 轉(zhuǎn)換為統(tǒng)一事件 delta chunk.choices[0].delta if delta.reasoning_content: return ReasoningEvent(contentdelta.reasoning_content) if delta.content: return TextEvent(contentdelta.content) return None業(yè)務(wù)層不關(guān)心這段代碼的存在。它只消費ReasoningEvent和TextEvent而這兩個事件類型對所有供應(yīng)商都是同一套定義。對于不希望自行維護這層適配的團隊也可以考慮使用AI API Gateway方案。這類平臺在業(yè)務(wù)應(yīng)用與模型供應(yīng)商之間提供統(tǒng)一接口將協(xié)議轉(zhuǎn)換、路由和用量統(tǒng)計封裝在網(wǎng)關(guān)層。例如4SAPI提供兼容OpenAI協(xié)議的統(tǒng)一調(diào)用方式開發(fā)者通過更換base_url和model參數(shù)即可切換后端模型應(yīng)用層代碼保持不變。這種方式的工程收益在于適配層的更新和維護由平臺側(cè)承擔(dān)團隊可以將精力集中在業(yè)務(wù)邏輯上。自己開發(fā)統(tǒng)一層還是使用AI API Gateway這是一個需要根據(jù)具體約束條件來判斷的問題兩種方案各有其合理的適用場景。方案A自建統(tǒng)一層自建的核心吸引力在于控制權(quán)。數(shù)據(jù)不經(jīng)過第三方節(jié)點密鑰管理、日志、路由策略完全自主合規(guī)邊界清晰。如果路由策略本身是產(chǎn)品的差異化部分——比如基于任務(wù)復(fù)雜度動態(tài)選擇模型的控制邏輯——自建可以讓這套邏輯不被外部平臺限制。代價同樣明確。首先是持續(xù)的適配維護每個供應(yīng)商的API更新、新模型上線、參數(shù)變更都需要自建層跟進。其次是運維負擔(dān)高可用、限流、重試、熔斷、可觀測性這些在第三方平臺上通常是內(nèi)建能力自建需要逐一實現(xiàn)。一個常被低估的成本是Token用量統(tǒng)計和計費對賬——當(dāng)供應(yīng)商超過三個時多套賬單的匯總和異常排查會消耗顯著的工程時間20。自建方案適合的場景是團隊具備專職后端或基礎(chǔ)設(shè)施人力業(yè)務(wù)對數(shù)據(jù)鏈路隔離有明確要求或者路由策略是核心能力的一部分。方案B使用AI API Gateway第三方網(wǎng)關(guān)的核心價值是省去適配層的開發(fā)與維護。開發(fā)者獲得一組憑證和一個OpenAI兼容端點通過更改模型名稱參數(shù)即可切換后端供應(yīng)商應(yīng)用層代碼零改動。平臺側(cè)承擔(dān)協(xié)議適配、密鑰管理、用量統(tǒng)計和供應(yīng)商更新的跟進工作。需要評估的方面包括數(shù)據(jù)經(jīng)過第三方節(jié)點是否滿足業(yè)務(wù)的合規(guī)要求平臺的SLA和故障響應(yīng)能力自定義路由和擴展能力是否受平臺限制以及計費模式的透明度20。第三方網(wǎng)關(guān)適合的場景是中小團隊、快速原型驗證、希望將工程資源集中在業(yè)務(wù)層的項目、以及沒有專職基礎(chǔ)設(shè)施人力的團隊。按場景的判斷參考個人開發(fā)者和早期原型第三方網(wǎng)關(guān)的初始成本最低可以在數(shù)小時內(nèi)完成多模型接入的驗證。代價是需要評估平臺的數(shù)據(jù)處理方式是否符合項目要求。企業(yè)團隊有基礎(chǔ)設(shè)施能力如果已有網(wǎng)關(guān)基礎(chǔ)設(shè)施如Kong、APISIX可以在其上擴展AI路由能力復(fù)用現(xiàn)有的限流、鑒權(quán)和可觀測性體系。如果從零開始需要評估自建適配層的工作量是否在團隊的維護能力范圍內(nèi)。Agent應(yīng)用工具調(diào)用和流式推理對適配層的質(zhì)量要求較高。第三方網(wǎng)關(guān)如果對工具調(diào)用轉(zhuǎn)換的處理不夠精細可能導(dǎo)致Agent執(zhí)行失敗。自建方案可以針對Agent的使用模式做針對性優(yōu)化但需要投入相應(yīng)的開發(fā)和測試資源。高并發(fā)業(yè)務(wù)需要關(guān)注網(wǎng)關(guān)的性能特征。自建方案在延遲控制上有優(yōu)勢但高并發(fā)下的限流、熔斷和重試策略需要自行實現(xiàn)。第三方網(wǎng)關(guān)通常已有高并發(fā)建設(shè)但需要驗證其SLA是否匹配業(yè)務(wù)要求。無論選擇哪種方案業(yè)務(wù)層都應(yīng)保留基本的容錯能力——超時控制、降級策略和備選調(diào)用路徑。將穩(wěn)定性完全依賴網(wǎng)關(guān)層無論網(wǎng)關(guān)是自建還是第三方都會引入單點風(fēng)險。常見問題接入三個AI模型一定需要API Gateway嗎不一定。如果三個模型的使用場景相互獨立且每個模型的調(diào)用量不大直接封裝三個客戶端類即可。當(dāng)出現(xiàn)跨模型的統(tǒng)一路由需求、需要集中管理密鑰和用量、或者供應(yīng)商數(shù)量繼續(xù)增長時引入網(wǎng)關(guān)層才具有工程收益。判斷標(biāo)準(zhǔn)是差異是否已經(jīng)開始侵入業(yè)務(wù)層的條件分支。OpenAI兼容協(xié)議能完全解決多模型接入問題嗎不能。OpenAI兼容協(xié)議解決的是“請求和響應(yīng)的表面格式”問題但工具調(diào)用的流式轉(zhuǎn)換、推理內(nèi)容的字段差異、錯誤碼的語義映射這些深層差異不會被協(xié)議兼容自動抹平。兼容協(xié)議降低了接入的初始成本但不等于適配層可以省略。自建網(wǎng)關(guān)的長期維護成本主要在哪里主要成本不在初始開發(fā)而在持續(xù)跟進。供應(yīng)商API的版本更新、參數(shù)默認值的調(diào)整、新模型的適配、流式協(xié)議的變化都需要網(wǎng)關(guān)層同步更新。此外用量統(tǒng)計的準(zhǔn)確性、異常情況的排查、以及隨著供應(yīng)商數(shù)量增長帶來的測試矩陣膨脹都是容易被低估的長期成本。第三方API網(wǎng)關(guān)的延遲影響有多大取決于網(wǎng)關(guān)的部署位置和網(wǎng)絡(luò)路徑。同區(qū)域部署的網(wǎng)關(guān)通常增加幾十毫秒的往返延遲跨區(qū)域或跨云的網(wǎng)關(guān)可能增加更多。對于流式響應(yīng)首Token延遲的影響通常大于總延遲的影響。如果業(yè)務(wù)對延遲敏感需要評估網(wǎng)關(guān)的接入節(jié)點分布和鏈路優(yōu)化能力。如何評估一個AI API Gateway是否適合生產(chǎn)環(huán)境可以從幾個維度檢驗是否支持你需要的所有模型供應(yīng)商且模型版本更新是否及時工具調(diào)用和流式推理的轉(zhuǎn)換質(zhì)量是否滿足你的Agent框架的要求用量統(tǒng)計的粒度是否支持你的計費和對賬需求在供應(yīng)商故障時的自動降級行為是否符合預(yù)期以及平臺的SLA承諾是否與你的可用性目標(biāo)匹配。建議在選型階段用實際業(yè)務(wù)場景做端到端驗證而不是僅依賴文檔描述。