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