「確信せよ、ただし検証せよ」
「美容とファッションの専門家が明かす!『確信せよ、ただし検証せよ』」
私が最もよく使用するGen AIトリックは、ウェブページやドキュメントの要約です。セマンティック検索と組み合わせることで、必要な単語やアイデアを探すためにほとんど時間を無駄にしません。要約は非常に重要になっており、MLの要約で私のキーポイントが表示されるように書く際に使用しています。残念ながら、これは二律背反の剣です。要約が何かを見落としたり、さらに悪いことには要約が幻覚を見たりするために、ディープラーニングへの依存は、恥ずかしい、高価な、またはキャリアを終わらせるようなミスを引き起こすでしょうか。
幸いにも、多くの年月を技術職として過ごしたことから、リスク管理の価値を学びました。本記事では、要約のリスクを特定し、それらのリスクを軽減する(実際にはかなり簡単な)方法について説明します。
問題の特定
ソフトウェア開発の歴史を通じて、要件どおりにコードが機能することを検証するのは非常に簡単でした。ソフトウェアとコンピュータは決定論的で、有限状態オートマトンです。つまり、私たちが指示した通りに動作します(宇宙線や他のビザンチン障害源を除く)。これにより、正しい動作をテストするのは簡単なものでした。すべての可能なユニットテストケースは、assertEquals(actual, expected)、assertTrue、assertSame、assertNotNull、assertTimeout、assertThrowsで処理できました。最もトリッキーな動的文字列メソッドさえも、assertTrue(string.Contains(a), string.Contains(b), string.Contains(c) and string.Contains(d))で処理できました。
しかし、それは以前の話です。私たちは今、基本的にランダムなシステムである大規模な言語モデルを持っています。contains(a)、contains(b)、またはcontains(c)のフルアルファベットでも、Gen AIの応答が予測できない程度に変動する正しい動作を検証するのには適していません。JUnitやNUnit、PyUnitにassertMoreOrLessOK(actual, expected)はありません。それでも、これらのGen AI APIをテストし、本番で監視する必要があります。Gen AIの機能が本番環境に入ると、従来の監視方法では以下に説明する潜在的な障害モードに対して警告されることはありません。
したがって、問題は、Gen AIシステムによって返されるコンテンツが期待通りであることを確認する方法と、本番環境でそれらを監視する方法です。そのためには、LLMの多くの障害モードを理解する必要があります。それだけでなく、非技術的な同僚にこれらの障害モードを説明できるようにする必要があります-問題が発生する前に。
LLMの障害モードは独特で、監視に本当の課題を提供します。最近のOpenAIからの例で説明します。これはメインストリームのニュースには取り上げられなかったが、取り上げられるべきであったものです。スタンフォード大学UCバークレーの3人の研究者がChatGPTを監視し、それが時間の経過とともに変化するかどうかを確認していました。
問題:完全に間違っている
ある場合に、研究者たちはChatGPTに対して繰り返し簡単な質問をしました:17,077は素数ですか?ステップバイステップで考えてから、はいまたはいいえで答えてください。2023年3月、ChatGPTは正しく答えたのは98%の回答です。3ヶ月後、同じテストを繰り返しましたが、ChatGPTは87%の回答で誤った答えを出しました!
なお、OpenAIは2023年3月14日にAPIの新バージョンをリリースしました。2つの問いに答える必要があります:
- OpenAIは、新しいリリースに問題があることを知っていたのか、そしてなぜそれをリリースしたのか?
- 彼らが知らなかった場合、なぜ知らなかったのか?
これは、Generative AIの監視における課題の1つに過ぎません。リリースに完全な制御を持っていても、明白な問題を検出することができなければなりません。
研究者たちは彼らのコードと手順をGitHubで公開しており、これは非常に良い手引きとなります。彼らはさらにいくつかの追加資料と最新情報も追加しました。もしもあなたのユースケースが事実の正確性を必要とする場合、これは素晴らしい出発点です。
問題:一般的な被害
正確性に加えて、Generative AIはバイアスや有害性といった悪影響を持つ回答を生成する可能性も非常に高いです。HELM(ホリスティック言語モデルの総合評価)は、公開された言語モデルの42のシナリオにわたり、60以上のベンチマークを評価することができます。言語モデルのリスクと各ベンダーがリスクに関してどれだけ透明性を持っているかをよりよく理解するための優れた出発点です。元の論文とコードはオンラインで自由に利用できます。
モデル崩壊は、もう一つの潜在的なリスクです。それが発生した場合、その結果は広く知られることでしょう。軽減策は、前のモデルに戻ることができるようにすることです。一部の研究者は、ChatGPTとBardがすでにその方向に向かっていると主張しています。
問題:モデルドリフト
なぜドリフトに気をつける必要があるのでしょうか?話を聞かせてください。OpenAIはスタートアップです。スタートアップが何よりも必要とするものは、急速な成長です。ChatGPTが2022年12月に初公開されたとき、ユーザー数は急増しました。しかし、2023年6月からユーザー数は減少し始め、夏を通じて減少し続けました。多くの評論家は、これがChatGPTの学生ユーザーが夏休みを取ることと何か関係があるのではないかと推測しましたが、OpenAIからの内部データがないため、推測することしかできませんでした。理解できるように、OpenAIは減少の原因に関する情報を公開していません。
さて、これがあなたに起こったと想像してみてください。ある日、Gen AI機能の利用統計が減少し始めます。他の通常のビジネスデータは潜在的な原因を指摘していません。顧客のうちわずか4%がクレームをする傾向があり、クレーム数は増加していません。優れたAPIとUXの可観察性を実装していますが、応答時間や利用可能性に問題はありません。減少の原因は何でしょうか?データに欠陥はありませんか?
モデルドリフトとは、データ、言語モデル、トレーニングデータを提供する文化の変化によって、LLMの応答における徐々な変化のことです。個々の応答を見ると、LLMの振る舞いの変化はわかりにくいかもしれません。
- データドリフトとは、時間の経過とともに入力データモデルの変化を指します。
- モデルドリフトとは、モデルがデプロイ後に時間とともに性能が変化することで、次のような結果をもたらす可能性があります:
- 性能の低下:データドリフトにより、同じテストセット上でモデルの正確性が低下します。
- 振る舞いの変化:モデルが元々とは異なる予測を行うことがあります。
ただし、ドリフトは概念ドリフトも指す場合があります。これにより、モデルが時代遅れまたは無効な概念的前提条件を学習し、現在の言語のモデリングが不正確になる可能性があります。これは、顧客メッセージへの適切な応答の生成など、下流のタスクでの失敗を引き起こすことがあります。
リスクとは?
これまでに特定された潜在的な問題は、Generative AIシステムの振る舞いにおける障害とドリフトであり、予期しない結果につながります。残念ながら、非決定論的なシステムでは事前にどのような応答範囲があるのかを確定的に述べることはできませんので、ビジネスへのリスクを断定的に述べることはまだ不可能です。
Gen AIユースケースごとに潜在的なリスクを予測する必要があります。あなたの実装は金融アドバイスを提供したり、製品に関する事実情報に対する顧客の質問に応じたりしていますか?
LLMは確定論的ではありません。この文は、おそらく3分前よりも今はもっと理解できる人にとって、ドリフト検出についてではありません。ドリフトの検出は、モデルの作成者の責任であり、検出作業は重要なデータサイエンスです。
統計学または応用数学の学位を持ったスタッフがいる場合、この論文で説明されている方法(最大平均差異)を使用してドリフトを試みることができるかもしれません:
テキストデータでのドリフトの解明:機械学習モデルのドリフトの検出と軽減のための教師なしの手法
何をしていますか?
あなたは、注意深く選りすぐられたテキストサンプルの比較的小さなデータセットを使用して、モデルの振る舞いのドリフトを検出しようとしています。上記の手法と同様に、不一致度を使用しますが、全体のセットではありません。代わりに、プロンプトとレスポンスの基準コレクションを作成し、各プロンプト-レスポンスペアをAPIに100回送信し、各プロンプトの平均と分散を計算します。そして、毎日またはそれに準じて、同じプロンプトをGen AI APIに送信し、平均からの過剰な分散を探します。これもかなり簡単に行えます。
さあ、コーディングしましょう!
埋め込みを作成する際に使用する言語モデルを選択してください。このモデルは、Gen AI APIで使用されているモデルにできるだけ近いものである必要があります。このモデルのファイルとすべての設定、および埋め込み作成時および類似性計算時に使用するすべてのサポートライブラリを完全に制御できる必要があります。このモデルは、質量のグローバル標準である純粋なシリコンの1 kg球の相当物です。
Javaの実装
Javaの20年のベテランである私にとって、コーディングからの例を整理するまで、Javaでのこの作業は苦痛でした。残念ながら、DJLはPythonと比較して非常に限られたネイティブ言語モデルのリストを持っています。例えば、JavaコードはPythonとほぼ同等の簡潔さです。
- 文の埋め込みベクトルを作成するために使用されるLLMのセットアップ。
- テキストの埋め込みベクトルを作成し、2つのテキスト間の意味的な類似性を比較するコード。
- 意味的な類似性を計算する関数。
全てを組み合わせましょう
前述したように、目標は個々のレスポンスのドリフトを検出できるようにすることです。使用するGen AI APIや使用ケースによって、ベンチマークのプロンプトの数、基準となるレスポンスの数、APIをサンプリングする頻度は異なります。手順は以下のようになります。
- 使用ケースを強く代表するベースラインのプロンプトとGen AI APIのレスポンスを作成します:10、100、または1,000。これらをテーブルAに保存します。
- レスポンスのベースラインセットを作成します:各プロンプトに対して数日から数週間にわたってAPIに10回、50回、または100回送信し、テキストレスポンスを保存します。これらはテーブルBに保存します。
- ベースラインレスポンス間の類似性を計算します:各ベースラインレスポンスについて、テーブルAのレスポンスとの類似性を計算します。これらの類似性の値をテーブルBの各レスポンスと一緒に保存します。
- テーブルBの類似性の値の平均、分散、標準偏差を計算し、テーブルAに保存します。
- ドリフト検出ランを開始します:ステップ1と同じ手順を毎日行います。結果をテーブルCに保存します。
- 各検出ランの終了時に、テーブルAのレスポンス間の類似性を計算します。
- すべての類似性が計算された後、元の分散から外れたものを探します。
- 分散が過剰なレスポンスについて、元のプロンプト、テーブルAの元のレスポンス、およびテーブルCの最新のレスポンスを確認します。最新のレスポンスの意味に十分な違いがあるかどうかを確認します。そうであれば、Gen AI APIモデルが製品オーナーの期待から逸脱している可能性がありますので、それについて彼らと話し合いましょう。
結果
データが収集され、グラフ化された場合、以下のようになります:
このチャートは、1週間にわたって100回ずつAPIに送信された125のベンチマークプロンプトの結果を示しています。各プロンプトの平均類似性が計算され、ベースラインのラインと平均プロットで表されています。同じ125のベンチマークサンプルの最新の実行は、昨日APIに送信されました。これらの類似性はベースラインの平均値と比較して計算され、最新サンプルとして表示されます。平均からかなり異なる個々のサンプルのレスポンスは、ベースラインレスポンスとの意味的な不一致があるかどうかを確認するためにレビューされます。もし発生した場合は、調査結果を製品オーナーと共有してください。
結論
非決定的なソフトウェアは、大きなAIの脳が私たちの仕事を全て奪うその日まで、エンジニアが開発、テスト、監視するための挑戦となり続けるでしょう。それまでは、明確な説明と簡単な方法であなたが次のGen AIの問題に対応する際に笑顔でいられるように、あなたに予告と警告を行い、武装していることを願っています。そして、それ以外でも、この記事があなたがデータサイエンティストを雇う理由を主張するのに役立つはずです。もしカードにない場合は、それでは…数学でしょうか?
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles