有人問一種常見抗憂鬱藥該怎麼吃、什麼時候吃、飯前還是飯後吃,以及它含有什麼成分。提問用的是俄語,介面語言是土耳其語。處於「自動」模式的引擎給出了一段套話式的拒答——用的是英語。當被要求用俄語回答時,它又用俄語再次拒答了一次。一分鐘後,這段對話被刪除了。其他所有助手都會回答這類問題,這位使用者期待同樣的回答,這個期待沒有錯。
一段被刪除的對話,暴露出了四個問題。
資訊不等於建議
一種藥物是做什麼用的、怎麼服用、含有什麼成分、是否需要處方——這些都是說明書上公開、有據可查的資訊。系統提示詞現在明確說明了這一點:予以解答,並附上一句話建議就具體的個人決定諮詢專業人士,同時繼續拒答那些必須拒答的內容——過量服用、自我傷害、規避處方的方法。擴大了可以回答的範圍,並沒有擴大允許的邊界;它填補的是中間那段先前一直沉默的地帶,而正是在那段沉默裡,一個較小的模型自行發明了一套屬於自己的規則。
拒答也是一種回覆
回覆應遵循提問語言的這條規則,先前位於一段很長的提示詞中偏靠前的位置,而拒答範本恰恰是最容易忽略它的那類回覆。現在這條規則會在模型最後讀取的位置再次出現,介面語言只在遇到孤立的數字或連結這類情況時才作為決勝依據。土耳其語介面上的俄語提問,會得到俄語的回答;如果確實需要拒答,也會用俄語拒答。
背後還有一個更深層的原因。伺服器中負責串流輸出回覆的部分執行時與請求本身是分離的,請求所帶有的語言區域資訊並沒有跟著傳遞過去——於是每一個串流回合都以伺服器自身的語言運作,串流輸出過程中可能出現的二十多則系統訊息也是如此。現在這個語言區域資訊會在開始時就被擷取,並在執行流程內部重新套用。每一個串流用戶端,無論是網頁版還是手機端,現在也都會隨請求一起傳送自己的語言,先前四個用戶端中有三個都沒有做到這一點。
空白回覆只是披著更體面狀態碼的失敗
有一個引擎有時會回傳一則內容為空、但狀態標記為已完成的回覆。應用程式會把它當作正常結束的回合,顯示一段說「工具已執行完成」的佔位文字。現在,這種情況會被當作和「第一個詞元之前發生的任何其他失敗」一樣來處理:在「自動」模式下,會由另一個引擎接替這一回合;如果是明確指定的引擎,你會看到一則誠實的在地化錯誤提示。最常出現這種情況的引擎已經被移出「自動」模式的候選池——這正是今年夏天稍早淘汰過一類模型時用的同一套判斷標準,這次用在了同樣的證據上。
沒有「以後」這回事
「我幾分鐘後傳給你」,這是人才會說的話。一次對話回合說不出這句話:現在沒有產生的內容,就永遠不會到來,而這樣的承諾不過是一句包裝得很有禮貌的失敗。凡是承諾「稍後奉上」的回覆,現在都會被重試,直到在這一回合內真正交付——應用程式支援的全部二十九種語言,以及對話和助手泡泡中,都是如此。
這些都不是模型層面的升級,而是圍繞模型搭建的基礎設施,讓它兌現介面早已做出的那些承諾。