![]()
2024年3月,我的翻譯功能在2小時(shí)內(nèi)收到847條錯(cuò)誤通知。不是翻譯質(zhì)量崩了——是三個(gè)反引號(hào)把整件事搞砸了。
模型突然開始"貼心"地用 Markdown 代碼塊包裹 JSON 響應(yīng)。```json 開頭,``` 結(jié)尾。前端 parse 直接報(bào)錯(cuò),用戶看到大片空白。那天我學(xué)到第一課:生產(chǎn)環(huán)境跑大語言模型(LLM),最先崩的永遠(yuǎn)是格式,不是內(nèi)容。
這是 Lovai 的實(shí)戰(zhàn)記錄——一個(gè) AI 食譜分享平臺(tái)的日英互譯系統(tǒng)。用戶生成內(nèi)容結(jié)構(gòu)復(fù)雜:標(biāo)題、摘要、多段正文。三次事故,三層防御,按時(shí)間線展開。
第一層:response_format 是底線,不是保險(xiǎn)
最初我沒開 JSON Mode。系統(tǒng)提示里寫"請(qǐng)返回 JSON",response_format 留空。這招撐了六周,直到模型靜默更新行為。
OpenRouter 的模型頁會(huì)標(biāo)注 structured outputs 兼容性。json_object 和 json_schema 不是全模型支持,但支持的必須開。把 LLM 輸出直接丟進(jìn) JSON.parse() 而不加 response_format,等于生產(chǎn)環(huán)境裸奔。
純提示詞指令的問題在于靜默失效——模型更新時(shí)、服務(wù)高負(fù)載時(shí),行為漂移不會(huì)有任何預(yù)警。我加的 response_format: { type: 'json_object' } 是第一道鎖,強(qiáng)制約束輸出格式。
第二層:response-healing 自動(dòng)修復(fù),但有盲區(qū)
JSON Mode 上線后,第二次事故來了。模型沒包代碼塊,但 max_tokens 截?cái)嗔隧憫?yīng),JSON 結(jié)構(gòu)殘缺。
OpenRouter 有個(gè)插件叫 response-healing,開啟后自動(dòng)修復(fù)常見格式錯(cuò)誤。配置很簡(jiǎn)單:plugins 數(shù)組里加 { id: 'response-healing' },和 json_object 并行工作。
但它有兩個(gè)硬約束:非流式響應(yīng) only,且修不了截?cái)鄦栴}。token 上限砍掉的結(jié)構(gòu),神仙也補(bǔ)不回來。我把 max_tokens 從 2048 調(diào)到 4096,同時(shí)保留 healing 插件——它修小毛病,我防大坑。
第三層:應(yīng)用層解析器,最后的偏執(zhí)
即使前兩道鎖都開,我仍在應(yīng)用層保留了防御性解析器。保險(xiǎn)邏輯很簡(jiǎn)單:遇到部分或畸形數(shù)據(jù),拒絕而非嘗試修復(fù)。
這個(gè)設(shè)計(jì)來自第三次教訓(xùn)。某次 OpenRouter 的 API 文檔更新,response-healing 的修復(fù)規(guī)則微調(diào),導(dǎo)致一批響應(yīng)被錯(cuò)誤地二次處理。我的解析器捕獲了異常格式,直接觸發(fā)降級(jí)流程——返回原文并標(biāo)記待人工審核,而不是把臟數(shù)據(jù)喂給下游。
三層防御的本質(zhì)是不信任:不信任模型行為穩(wěn)定,不信任中間層修復(fù)完美,不信任自己的早期假設(shè)。
retry 與 fallback:崩了怎么辦
JSON 之外,還有兩個(gè)工程問題值得提。retry 策略我做成指數(shù)退避,3 次失敗后切換備用模型。OpenRouter 的多模型路由是優(yōu)勢(shì),但切換時(shí)要重新校驗(yàn)新模型的 structured outputs 兼容性。
language detection 是另一個(gè)坑。用戶偶爾用混合語言發(fā)帖,模型對(duì)"這段主要是日語還是英語"的判斷會(huì)搖擺。我的解法是在提示里加明確指令,同時(shí)保留置信度閾值——檢測(cè)置信度低于 0.85 時(shí),跳過翻譯直接展示原文。
整個(gè)系統(tǒng)的核心指標(biāo)不是翻譯準(zhǔn)確率,是端到端可用率。格式錯(cuò)誤導(dǎo)致的 feature down,比翻譯生硬嚴(yán)重十倍。
現(xiàn)在我的監(jiān)控看板上有三個(gè)告警:JSON parse 失敗率、response-healing 觸發(fā)率、人工審核隊(duì)列深度。第三個(gè)數(shù)字最近從每周 120 條降到了 15 條——不是模型變乖了,是三層防火墻把臟數(shù)據(jù)攔在了用戶看不見的地方。
你生產(chǎn)環(huán)境的 LLM 輸出,現(xiàn)在有幾層保險(xiǎn)?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.