Skip to main content

簡短回答

同一段內容,流式和非流式遇到內容過濾時的結果可能完全不同:
  1. 非流式:某條官方線路觸發內容安全過濾時,API易 會自動換一條官方線路重新生成。客戶端拿到的是完整結果,只計費一次。
  2. 流式:內容一開始輸出就已經發給客戶端了,中途沒法再換線路。這次請求會以 finish_reason: "content_filter" 結束,已經生成的部分照常計費。
  3. 怎麼選:需要逐字展示給使用者的(對話、Agent 回覆)用流式;程式生成完才使用的(劇本、分鏡、翻譯、結構化資料)用非流式。

過濾發生的兩個時機

原廠的內容安全過濾會在兩個時機介入,流式下兩種形態都會出現: 兩種情況的 HTTP 狀態碼都是 200,響應以 data: [DONE] 正常收尾,HTTP 錯誤日誌裡看不到,只能從流的最後一個事件判斷。

流式與非流式對照

非流式的自動切換能大幅提高成功率,但不是 100%:如果內容明顯違反原廠使用政策,換一條線路後也可能被模型自己拒答,形態見 OpenAI 模型拒答長什麼樣?。

實測對照

2026-09-25 (UTC+8),用 gpt-5.6-terra、相同的引數(max_tokens=35000、temperature=0、reasoning_effort=high),對同一批影視分鏡劇本分別發流式和非流式請求: 同一段內容原樣重試,流式下的結果基本一樣。決定是否觸發的主要是內容本身,不是運氣。

流式被截斷時的輸出形態

最後一個帶 choices 的事件沒有正文,只有結束原因:
生成階段被截斷時,拼好的正文末尾會直接接上一句英文拒答,中間沒有換行,例如:……林遠把長刀橫於胸前,腳尖緩慢挪動,始終讓I'm sorry, but I cannot assist with that request.如果把這段正文原樣帶進續寫請求,模型會在上下文裡看到一句拒答,下一輪更容易繼續被攔。續寫前請先去掉這句。

怎麼選

用流式

  • 聊天、客服、Agent 對話回覆,使用者需要立刻看到輸出
  • 需要中途打斷(使用者點「停止」)的場景
  • 日常對話觸發內容過濾的機率很低,流式的體驗優勢更重要

用非流式

  • 劇本、分鏡、小說章節等創作類長文本
  • 批次翻譯、資訊抽取、結構化 JSON
  • 結果要先解析、落庫,再展示給使用者
  • 容易碰到敏感情節的內容(打鬥、傷亡、犯罪)
同一個產品完全可以兩種都用:對話部分走流式,劇本或分鏡生成走非流式。只需要把後者請求裡的 stream 改成 false,其他引數不變。 非流式要等整段生成完才返回,長輸出的推理模型可能要 30~100 秒甚至更久,請把這類請求的客戶端超時設到 300 秒以上,見 如何避免介面超時?。前端如果需要進度感,可以先顯示「生成中」,完成後一次性展示。

必須用流式時怎麼處理

1

讀流時記下 finish_reason

最後一個帶 choices 的事件裡,finish_reason 為 content_filter 就說明被過濾了。不要只看 HTTP 狀態碼。
2

去掉末尾的拒答句

生成階段被截斷時,正文末尾帶著一句英文拒答,先把它去掉,再決定怎麼用已生成的部分。
3

改走非流式重試

對被截斷的那一段,改用非流式重新請求,讓平臺自動切換線路。這比流式續寫的成功率高得多。
4

連續被攔就調整表述

同一任務非流式也拿不到結果時,把敏感細節寫得概括一些再試,不要原樣重試。
下面是一個最小示例:流式讀取,被過濾時去掉拒答句,再改走非流式重試。
示例裡直接用非流式把整段重新生成一遍,最省事。如果你的業務必須保留已生成的部分,可以把 partial 作為上下文讓模型續寫,但續寫請求同樣建議用非流式。

常見問題

扣。原廠已經實際生成了這些內容,按實際輸入、輸出 tokens 計費。所以容易觸發過濾的內容,用非流式更划算:非流式只計成功的那一次。
不能。過濾由原廠執行,API易 無法關閉,也無法調整尺度。平臺能做的是在非流式請求被過濾時換一條官方線路重試。
不同官方線路的過濾尺度不完全一致,模型每次生成的措辭也不同,所以邊界附近的內容可能時而通過、時而被截斷。明顯敏感的內容會被穩定攔截。
生成階段的截斷髮生在正文已經發出之後,客戶端已經收到並展示了前半段,這時再換線路從頭生成,內容會對不上。所以流式請求只能由客戶端識別 content_filter 後自行處理。

相關文件

OpenAI 模型拒答長什麼樣?

被模型自己拒答時的輸出體與識別方法

流式和非流式呼叫有什麼區別?

兩種呼叫方式的接入、計費與常見誤區

如何避免介面超時?

非流式長輸出的超時設定

內容安全如何合規性?

平臺內容安全與合規政策