ある人が、よく使われる抗うつ薬の服用方法とタイミング、食前か食後か、そして成分について尋ねました。質問はロシア語で行われ、インターフェースはトルコ語でした。オートに設定されたエンジンは、定型文の拒否——それも英語で——を返しました。ロシア語で答えるよう指示すると、今度はロシア語で再び拒否しました。1分後、そのチャットは削除されました。他のどのアシスタントもこの質問には答えており、同じ対応を期待したこの人は間違っていませんでした。
削除された1件の会話から、4つの不具合が見つかりました。
情報はアドバイスではない
ある薬が何のためのものか、どう服用するか、何が含まれているか、処方が必要かどうか——これらは添付文書に書かれている、公開され裏付けのある情報です。システムプロンプトは今、それをはっきりと述べています。回答すること、個人的な判断については専門家に相談するよう一文を添えること、そして必ず拒否すべき事柄——過量摂取、自傷行為、処方をかいくぐる方法——は引き続き拒否することです。回答範囲を広げたことは、許可される範囲を広げたわけではありません。それは、これまで沈黙していた中間地帯に名前を付けたに過ぎず、その沈黙の中で小さなモデルが独自のポリシーを作り上げていたのです。
拒否も1つの応答である
応答はメッセージの言語に従うというルールは、長いプロンプトの終わりから遠く離れた場所にあり、拒否のテンプレートはそれを見落としがちな応答の代表例でした。今このルールは、モデルが最後に読む位置で繰り返されており、インターフェースの言語は、数字やリンクだけといった場合の判定材料としてのみ使われます。トルコ語の画面でのロシア語の質問にはロシア語で回答し、拒否する場合もロシア語で拒否します。
その根底にはさらに深い原因がありました。応答をストリーミングするサーバー側の処理はリクエストから切り離されて実行されており、リクエストの言語設定はそこまで引き継がれていませんでした。そのため、ストリーミングされるすべてのターンはサーバー自身の言語で実行され、ストリーム中に発生しうる20あまりのシステムメッセージも同様でした。この言語設定は今、開始時に取得され、実行の内部で再適用されます。ウェブでもスマートフォンでも、すべてのストリーミングクライアントがリクエストとともに自分の言語を送るようになりましたが、これは以前は4つのうち3つでできていませんでした。
空の応答は、体裁の良いステータスコードをまとった失敗にすぎない
あるエンジンは、完了ステータスでありながら中身が空の応答を返すことがありました。アプリはそれを正常なターンの終了として扱い、「ツールの実行が完了しました」というプレースホルダーを表示していました。今ではこれも、最初のトークンより前に起きた他の失敗と同様に扱われます。オートでは別のエンジンがそのターンを引き継ぎ、明示的にエンジンを選んでいる場合は、正直でローカライズされたエラーが表示されます。この症状が最も多く見られたエンジンはオートの候補プールから外されました——今年の夏の初めにあるモデル群を除外したのと同じテストを、同じ証拠に対して適用したものです。
「後で」は存在しない
「数分後にお送りします」は人間が言うことです。チャットのターンにはそれが言えません——今生成されなかったものは、二度と届かないからです。その約束は、丁寧な文の形をした失敗にすぎません。「後でお届けします」と約束する応答は、アプリが対応する29のすべての言語、そしてチャットだけでなくアシスタントのバブルにおいても、そのターン内で実際に届くまで再試行されるようになりました。
これらはいずれもモデルのアップグレードではありません。インターフェースがすでに交わしている約束を、モデルの周りの仕組みが確実に守るようにした結果です。