昨晩、ある東京のIT企業向けにオンラインでAIに関するセミナーを実施しました。
エンジニアの方を中心に20人ほどご参加いただき、相互のやり取りもありながら楽しく進めることができました。
その後、ご質問をいただいたのですが、生成AI活用時のハルシネーション(幻覚:生成AIが誤った解答をもっともらしくすること)に関するものでした。
実は、昨日の午前中には別の北九州の企業と生成AI活用に関する打ち合わせがあったのですが、そこでもハルシネーション対策に関する内容の話が出ました。
生成AIを活用する際、いくつかのリスクがありますが、その2大巨頭と言えるのが、情報漏洩への不安と、このハルシネーションだと思います。
ハルシネーションをゼロにすることはできない
まず大前提として、ハルシネーションをゼロにすることはできません。
生成AI登場前から存在する認識AIや予測AIについても精度評価を行い、認識AIであれば正解率(他にも再現率や適合率といった指標もある)、予測AIであれば平均誤差(その計算方法はいろいろある)が精度指標となりますが、正解率100%、平均誤差ゼロといったモデルを作ることは基本的にできない、という前提で精度向上を目指していきます。
認識や予測のAIで誤りのないモデルを作ることが無理である以上、ハルシネーションのない生成AIというのもやっぱり無理なわけです。
重要なのはHITL
Human In The Loopという考え方があります。これは、AIの言うことを鵜呑みにせず、AIを活用した意思決定に人間を介在させるというものです。基本的には、これがすべてです。
AIは誤りがあるということを前提に、人間を介在させることで誤りをできるだけ減らそうというものです。
絶対誤りのない人間というのもいないわけで、だからダブルチェックをしようという話になるのですが、AIであっても同じというだけです。
AIが出した結果を人間がチェックするのがHITLというわけですね。逆に、人間が出した結果をAIでチェックするという活用方法もあるでしょう。AIはバランス良く、穴のない回答をしてくるので、バイアスまみれの人間には良いツールです。
それでもハルシネーション対策をどうするか?
ハルシネーションをゼロにすることができないことを前提に、ハルシネーション対策をするということは、要は回答精度を高めましょうという議論になるわけですが、採りうる手段はだいたい下記の2つです。
- プロンプトを作り込む
- RAGを使う
プロンプトエンジニアリング
プロンプトの作り込みは、よくプロンプトエンジニアリングといって、いろいろな手法があります。
基本的な考え方は、OpenAIの下記のページを読んでみると良いのではないかと思います。
私がプロンプト作成のお仕事を請けたときにやったのは、
- 試行錯誤する(どのモデルを使うか、そのモデルに対してどのようなプロンプトを書くか)
- できるだけ明確な指示を与える
- AI側でよく分からない時に、分かったようなことを言わないと釘を刺す(ようなプロンプトを書く)
- 何について、どのように出力して欲しいか、出力形式を指示する(可能であればPydanticでオブジェクト定義を与えてJSONを出力させる)
- サンプル文例を与える
といったことです。「分からない時に適当なことを言わない」という指示は結構効き目があるように思います。(使うモデルによるでしょうが。)
RAG
RAGを使った方が良いのは言うまでもありません。RAGはプロンプトの中に回答のための情報(カンペ)を入れておく手法ですから、AIに答えを教えるのに等しいわけで、それはAIは正しい答えを作り出します。
ただ、そのカンペをどう作るかが重要です。
RAGでは基本的に多くのデータをベクトルストアに入れておいて、質問文とのマッチ率の高い情報を抽出し、それをプロンプトの中に入れます。そのため、データをどのようにベクトルストアに入れるか、マッチ率の高い情報をどうやってベクトルストアから抽出するかといったところが重要です。
後者のベクトルストアからの情報抽出の方法は、リランク(ベクトルストアからの抽出結果をLLMで関連の高い順に並べ替える)やハイブリッドサーチ(ベクトルストアと通常の全文検索エンジンを併用する)などのテクニックがあるので、技術的に(RAGツールの中で)どうやって解決するかという話です。
それに対して前者は、使っているRAGツールがどのようにPDFやオフィスファイル、CSVやJSON等のデータをベクトルストアに入れているかを知る必要があります。特に、アップロードされたデータをそのままベクトルストアに入れることはなく、何らかの方法で分割してチャンクという状態にしてからベクトル化し、ベクトルストアに格納するので、チャンクの作り方に合わせたデータを作ると、精度を高く保つことができます。
ファインチューニング
生成AIに独自の情報を回答させるための手段として、RAG以外にファインチューニングがあります。
ファインチューニングは基本的に良質で大量のトレーニングデータを準備する必要があり、結構大変です。認識AIや予測AIのモデルを作るときと同様、データを準備してモデルを作って精度を評価して・・・という作業が必要になるので、精度が上がらなくてPoC地獄というケースが予見されます。(もちろんRAGでもPoC地獄はあり得るのですが、ファインチューニングはもっと大変というイメージです。)
生成AIの精度をどう評価するか
認識AIでは認識結果が当たったか外れたかで、明確にOK/NGが分かります。予測AIでは予測値と実測値の誤差が出るので、やはりOK/NGが分かりやすいです。
それに対して生成AIが出力する結果は文章や画像なので、何がOKで何がNGかというのが分かりづらいという特徴があります。
ただ、ある質問文に対する理想の回答文を準備できれば、生成された文章と理想の回答分をそれぞれベクトル化し、そのマッチ率で評価するという方法があります。また、生成された文章を別のLLMなどで評価させるといった方法も考えられます。ただ、いずれにせよ認識AIや予測AIほど評価は簡単ではないというのが実際のところです。
まとめ
生成AIを使う以上、ハルシネーションと付き合うのは宿命です。AIを使い以上、誤りが生じるのは仕方ないのであって、どうしようもありません。ただ、人間だって間違うわけで、あとは程度問題だったり、ダブルチェックを組み込む(HITL)など、業務フロー全体で解決する必要があるのです。
完璧な人間は存在しないし、完璧なAIも存在しない。だから、助け合って生きていきましょう、というわけですね。