見出し画像

大規模言語モデル(LLM)の性能を底上げするIn-Context Learningの可能性と限界

はじめに

前回にあたる法律事務所のためのChatGPT利活用ガイドブックを読んだ、という記事で少し触れた128kトークンを上回るコンテキストウィンドウの対応により、回答(生成)の体験がどう変わるのか、去年から色々ChatGPTで遊んで試していました。昨年時点の期待感から一転して、やはり立ちはだかる障壁などの解像度も上がってきたので、このタイミング書き起こしてみたいと思います。


おさらい

前回紹介の書籍ではリーガル活用のプロンプトについて焦点があたっていましたが、一方で法令文章は現段階でのLLMにおいては、専門家以外が扱うにはまだまだ限界があります。ちなみに、私が想定しているのは以下のような活用方法です。また現時点では定額制のGUI利用を想定しています。

個人的な興味は小難しい法令文章の理解をサポートする用途でした。事前に文章を読み込ませた上で専門家への相談前の整理および留意点洗い出しなどの可能性に関心がありました。

法律事務所のためのChatGPT利活用ガイドブックを読んだ

長いコンテキストウィンドウ対応の恩恵は法令文章にとどまりません。2024年3月にリリースのClaude3 では200kまで対応となっていて、他のLLMも(少なくとも)これらに近い水準の対応を余儀なくされる時代に突入しています。

そこで、本記事では128k超のコンテキストウィンドウに対応したLLMの活用法について掘り下げていきたいと思います。

膨大なコンテキストウィンドウ時代の到来

まず128k Tokenがどれくらいなのかを体感するため、OpenAIが提供するTokenizerで日本語を入力するとTokenの目安が把握できます。

試しにWikipediaの人工知能の一部を入力すると 334Tokenでした

約 350 tokens ほどです。これらの何倍もの文章の参照が可能になっています。この参照のために、In-Context Learning(以下、ICL)という手法を用いて入力プロンプトを作成することになります。

In-Context Learning(ICL)とは

簡単に言えば、ICLはプロンプト内に例示や前提などの指示文を記載しつつ回答を生成させる手法です。ChatGPTをよく利用する方なら自然と行っているかもしれません。

ちなみに、oshima_123さんの記事(*1)で説明されているように、Few-Shot プロンプティングと同じであると言って差し支えないようです。

プロンプトエンジニアリングの手法である「Few-shot プロンプティング」のことを「Few-shot Learning」と呼ぶ場合もあります。

RAG を「In-Context Learning」と呼ぶかは微妙という話

ICLは何が良いのか?

通常はFine-Tuningなどで追加学習を行わなければLLMは未学習の質問には適切な回答ができません(*2)。しかし、Fine-Tuningはデータセットの質や量(数千~数万ほど) を用意しなければならないとされていて、さらにFine-Tuningの実行するコストも発生します(*3)。

加えて、知識獲得により別の知識を忘却するトレードオフもあるようで想像以上に取り扱いが難しいのだなと感じました。


一方で、ICLはFine-Tuningのように恒常的な改善(パラメータの更新)にならないものの、その手軽さは説明するまでもなく、うまく活用できれば精度向上も期待できる手法というわけです。また、ICL について調査した論文では、ICLの課題の1つに「入力文字数の成約」であると指摘していました。

(1) the quantity of demonstrations is constrained by the maximum input length of LMs, which is significantly fewer compared to fine-tuning (scalability);

A Survey on In-context Learning

しかし、128k / 200k コンテキスト・ウィンドウ対応に伴って解消されるわけです(*3)。

ICLはどうやって実行するのか?

以下のように擬似的なレストランの説明をするだけのケースで確認してみましょう。

ChatGPT(GPT-3.5)で検証

とりあえずはうまく回答できました。LLMにとって未学習な内容に対して適切に回答が可能となるわけです。

ICLに課題は無いのか?

残念ながらあります。本来これはLLMの課題と言いかえた方が適切かもしれません。ひとまずはICLの課題として以下2つを紹介します。

① ICLによる大量文章の例示と計算量の課題
② ICL Robustness(堅牢性)の課題

① ICLによる大量文章の例示と計算量の課題

文章量が多ければ、その分コストが増加します。APIの実行を前提にしたアプリケーションを想定した場合は致命的です。ただし、ChatGPTやClaude3を定額で利用する用途であれば問題にはなりにくいです。そのこともあり、冒頭で説明したように「自分自身の理解や留意点洗い出しをサポートする法令関連の用途」に特に関心を持ちました。

② ICL Robustness(堅牢性)の課題

Robustnessとは、変化(外乱の影響)に強い性質のことです。つまり、例示の順序を変えるだけでも回答が変わったり、フォーマットの違いでも差異が発生してしまうようです。情報の品質にももちろん左右されます(*4)。一見、試行錯誤しやすい課題のように見えますが(そしてそれは事実としても)、後述の「LLM自体の課題と限界」に根源がある厄介な問題なためLLMを取り扱う上で留意が必要です。

なお、論文の検証ではGPT-3 / T5 / BERT / RoBERTaなど2024年現在と比較すれば小規模なモデルでの検証でしたが、現在でもChatGPT(GPT-3.5)に触れる機会がよくある方は、その傾向をよく目にするのではないでしょうか。

・・・・これ以外にもLLMそのものに大きな課題が残されています。このことについても、後述で少しだけ取り上げます。

実際に色々と試してみる

それでは、もう少しICLによる検証をすすめてみましょう。検証のために以下のような擬似的サービスの特徴を用意しました。金額など適当です。おかしなところはご容赦ください。

ICL検証用の擬似的なサービス

- サービス概要:
  - 大規模言語モデルを使用した対話サービス: 
    - 3つのドメイン固有モデルを準備している。
        - 問題解決コンサルティング
        - 認知の再構築に特化
        - アイデア出し
- プラン:
    - エントリープラン:
        - 価格: 740円
        - 問い合わせ限度: 55件まで
        - 追加料金: 追加の問い合わせ1件につき10円
        - 大規模言語モデルの種類:
            - 独自モデルのみ利用可能
        - 高機能アクセス: 利用不可
    - プロプラン:
        - 価格: 3730円
        - 問い合わせ限度: 485件まで
        - 追加料金: 追加の問い合わせ1件につき10円
        - 二要素認証: 含まれる
        - 追加機能: すべてのプレミアム機能とプロセッサ選択(GroqCeleb)が追加費用なしで利用可能
- 追加有料機能:
    - エントリープランでは1500円の追加費用がかかりますが、プロプランでは追加費用なしでこの機能が含まれます。
        - 情報記憶機能: 情報を30日間だけ記憶可能(学習には使用されない)。この機能はエントリープランでは追加費用がかかりますが、プロプランには含まれています。
        - 大規模言語モデルの種類:
            - GPT-4 turbo
            - Genimi Pro 1.5
            - Claude3 Opus
        - プロセッサ選択
            - Groq
            - Celeb
        - ファインチューニング機能:
            - データインポート: すべてのプランでCSV形式でのインポートが可能。
            - 利用限度: すべてのプランで月に3回まで
            - データ量: すべてのプランでインポートあたり最大3000レコードまで


上記を読み込ませた上で、ChatGPT(GPT-3.5)とClaude3 Haiku で比較します(*5)。試したプロンプトは以下の ① ~ ⑥ です。LLMの回答が「パターン1では2580円」、「パターン2では3880円」と出力されれば正解です。

## パターン1 (答え2580円:740+340+1500)
- ① Prompt: 上記はとある企業が先月にリリースしたサービスだ。私は今月からエントリープランを契約しており、追加有償機能に契約している。利用回数は89回を使用している。私の今月の料金はいくらだろうか?
- ② Prompt(Zero-Shot CoT): 上記はとある企業が先月にリリースしたサービスだ。私は今月からエントリープランを契約しており、追加有償機能に契約している。利用回数は89回を使用している。私の今月の料金はいくらだろうか?Step by Stepで考えて私の今月の料金を回答して。
- ③ Prompt(カスタム): 上記はとある企業が先月にリリースしたサービスだ。私は今月からエントリープランを契約しており、追加有償機能に契約している。利用回数は89回を使用している。私の今月の料金はいくらだろうか?最初にサービスの通常の料金と超過料金、追加オプション機能の補足事項を書き出してください。その後にオプション費用を確認してください。その他に考慮すべき事項がないかを確認して、最終的な料金をStep by Stepで考えて回答して。

## パターン2 (答え3880円:3730+150)
- ④ Prompt: 上記はとある企業が先月にリリースしたサービスだ。私は今月からプロプランを契約しており、追加オプションのGroqプロセッサーを利用している。利用回数は500回を使用している。私の今月の料金はいくらだろうか?
- ⑤ Prompt(Zero-Shot CoT): 上記はとある企業が先月にリリースしたサービスだ。私は今月からプロプランを契約しており、追加オプションのGroqプロセッサーを利用している。利用回数は500回を使用している。私の今月の料金はいくらだろうか?Step by Stepで考えて私の今月の料金を回答して。
- ⑥ Prompt(カスタム): 上記はとある企業が先月にリリースしたサービスだ。私は今月からプロプランを契約しており、追加オプションのGroqプロセッサーを利用している。利用回数は500回を使用している。私の今月の料金はいくらだろうか?最初にサービスの通常の料金と超過料金、追加オプション機能の補足事項を書き出してください。その後にオプション費用を確認してください。その他に考慮すべき事項がないかを確認して、最終的な料金をStep by Stepで考えて回答して。

今回はサービスの内容と上記の各プロンプトと一緒に入力しています。ICLを用いることで、外部知識(仮)に対してどのような回答(出力)が可能なのかをいくつか紹介します。

ChatGPT(GPT-3.5):  ③Prompt(カスタム) / 正解

まず、サービスの通常の料金と超過料金を計算しましょう。
エントリープランの通常料金は、基本料金740円に加えて、55件の問い合わせまでが含まれます。
追加の問い合わせ1件につき10円の追加料金がかかります。
プロプランの通常料金は、基本料金3730円に加えて、485件の問い合わせまでが含まれます。
同様に、追加の問い合わせ1件につき10円の追加料金がかかります。
今月の利用回数が89回であるため、エントリープランでは55件までが含まれ、それを超える34回分の超過料金が発生します。
プロプランは485件まで含まれるので、超過料金はありません。

次に、追加有料機能に関連する料金を確認します。
エントリープランでは、情報記憶機能を利用するために1500円の追加費用がかかりますが、プロプランでは追加費用は発生しません。
以上の情報を踏まえて、追加有料機能に契約している場合、エントリープランの料金は次のように計算されます。
- 通常料金: 740円
- 超過料金: 34回 × 10円 = 340円
- 追加有料機能: 1500円
エントリープランの料金合計は、740円 + 340円 + 1500円 = 2580円となります。
したがって、今月の料金は2580円になります。

Claude3 Haiku:  ④Prompt / 正解

上記のサービス情報から、あなたが現在プロプランを契約しており、追加オプションのGroqプロセッサーを利用しているとのことですね。
プロプランの料金は3,730円で、問い合わせ限度は485件までです。また、追加の問い合わせ1件につき10円の料金がかかります。

あなたは500回利用しているということですから、追加料金は以下のように計算できます:
- 問い合わせ限度485件を超過した分: 500 - 485 = 15件
- 追加料金: 15件 x 10円 = 150円

したがって、あなたの今月の料金は、プロプランの基本料金3,730円 + 追加料金150円 = 3,880円となります。

Claude3 Haiku:  ⑤Prompt2(Zero-Shot CoT) / 正解

はい、サービスの料金プランを詳細に分析して、あなたの今月の料金を計算していきましょう。
まず、プロプランの料金は3,730円です。
次に、追加の問い合わせ料金ですが、プロプランでは485件までが無料で、それ以降は1件につき10円の追加料金がかかります。
あなたは500回利用しているので、追加利用分は15件(500-485)となります。
追加料金は15件 × 10円 = 150円です。
最後に、プロセッサ選択のオプション「Groq」は、プロプランでは追加料金なしで利用できます。
以上より、あなたの今月の料金は以下のように計算されます:
- プロプラン料金: 3,730円
- 追加利用料金: 150円
- 合計: 3,730円 + 150円 = 3,880円

ですので、あなたの今月の料金は3,880円となります。

ICLを用いることで、このようにLLMが内部に持ち得ない知識を参照して回答を支援することが可能になるのです

ICLへの期待と立ちはだかる高い壁

ICLを用いれば前述のような回答を得られて解決か?と言いたいところですが、全くそんなことはない状況です。それでは現実(実際の検証結果)を見ていきます。

以下の表はすべてのパターンで10回実行で正解した回数を記しています。

ChatGPTではほぼ正解を導けなかった結果になった

パターン1のChat GPT(GPT-3.5) では、一度だけ正解しました。そのことから、ICLによる外部知識の活用自体は機能しています。それにもかかわらず、実際にはとほとんど正解を導けていないことがわかります。さらに、プロンプトの工夫にてChatGPTではZero-Shot CoTを用いても正答率が向上しなかったのは残念でした。Prompt3(カスタム)では一矢報いるように1回だけ正解が増えています。

一方で、Claude3 Haikuではプロンプトの工夫が正答率に順当に影響する可能性を示唆する結果になりました(*6)。ICLとプロンプトを工夫することで何かしらの活用できるかもしれません。

パターン2のChat GPT(GPT-3.5) では、Prompt3で正答率が若干向上したのみ。こちらでも同様にZero-Shot CoTを用いても正答率が向上しなかったのは残念でした。

一方で、Claude3 Haikuではプロンプトの工夫を用いても正答率100%が達成できなかったことは、LLMが本質的に不安定であることを示唆する結果となり非常に残念でした(*6)。

LLMの限界と問題

先ほどの結果から、「LMが本質的に不安定であることを示唆する」と記載しましたが、LLM自体にまだまだ課題が残されています。根本的な課題の以下2つを簡単に紹介します。

① Hallucination(幻覚)
② 算数が本質的に苦手

① Hallucination(幻覚)

もっとも有名でかつ根本的な問題の1つが「幻覚」と呼ばれる事象です。これは存在しない誤った情報を生成してしまうことを指すことが多いです。実際の利用でも 最高峰のモデルと言われる GPT-4やClaude3 Opusでも見られます。そして特にGemini Advanced で頻繁に発生しています。

幻覚の原因の1つは、そもそも「標準ベンチマーク(評価用のデータセット)には60%以上の幻覚的な応答が含まれていた」と説明する幻覚の起源についての論文があります。現在は品質が是正されていると思われますが、データの品質がLLMの性能に直結しているだけとわかります。

上記のことから幻覚の改善に最重要なのは、事前学習時のデータセットと品質になります。また、事前学習済みのモデルを利用する場合は(GPT-4やClaude3など)、Fine-Tuningや、RAG(Retrieval-Augmented Generation)という手法による幻覚の軽減が提案されていますが、Fine-TuningとRAGのいずれも効果を出すためには、泥臭く試行錯誤が必要であり、様々なトレードオフが発生することがわかっています(*2)。

② 算数が本質的に苦手

足し算が苦手なのことも有名ですが、そのメカニズムを理解していませんでした。GPT-4による足し算実験から示唆されるLarge Language Modelsの課題の論文を拝見(頑張って読解)すると、なんとなくその意味がわかります。LLMは数値を離散的な値として扱うのではなく、単語埋め込みによるベクトル空間に配置します(つまり配列になる)。その場合はどうしても(少なくとも)10という数値は10 の近似値になり、それ故の誤差が生じるはずです。(それだけならまだギリギリ問題なさそうですが) 類似度の評価として「10」が「100」に近いと判断されることすらあり得ることが「離散値として扱えずベクトル空間に配置されてしまう」という性質に本質的な課題であることが説明されています(*8)。

このことは、幻覚とは別の問題で根本的な課題の1つと言えそうです。

もっともらしい嘘を返答する Hallucination という現象が知られているが、今回の足し算の誤りはHallucination の定義: the generated content that is nonsensical or unfaithful to the provided source content[3] にはそぐわないように考えられる。Large Language Modelsが単純な計算間違いをすることは以前から知られており[4]、計算間違いがHallucination の一種とは言えないと考えられる。

GPT-4による足し算実験から示唆されるLarge Language Modelsの課題


おわりに

本記事では、ICLの概要から実際の検証、そしてLLM自体の課題を取り上げました。根本的な課題はまだまだあるものの、それらの対策も様々なものが提案されています。また前述の検証に利用したモデルは最高峰モデルではありません。そして、昨今のLLMの進化の速度は著しく、下手するとす明日にはこの記事の課題が過去のものになってしまうかもしれない状況です。

仮に、根本的な課題解決がしばらく先になるにしても、現時点の対策(Fine-TuningやRAG)や、LLMの計算量削減の方向性(*9)に伴う低価格化などが実現するだけでもアプリケーションの応用例が今後たくさん登場するのではないかと想像しています。

発端となった「法律事務所のためのChatGPT利活用ガイドブック」では、ICL以外にもChain-of-Thought (CoT) プロンプティングTree of Thoughts (ToT)を取り上げて、複雑な推論タスクの解決に取り組んでいます。そこで、次回には前提となるCoTを踏まえつつ、ToTの可能性と課題についても触れつつ、最終的にはLLMのメカニズム(特に注意機構など)についても取り上げるような記事を書いてみようと思います。

もしよかったら、次回もまた読んでいただけたら嬉しいです。

CoTを踏まえつつ、ToTの可能性と課題について書いてみました🚀


余談と注釈

注釈は本来の用法ではなく恐縮ですが、どうでも良い余談として以下に書いています。良かったら読んでいってください。

(*1)oshima_123さんはUdemyのLangChainの講座を提供されていた方だと後から気が付きました。講座は非常にわかりやすいので社会人全般にお勧めできる内容でした。

(*2) Fine-Tuning以外にも、RAG(Retrieval-Augmented Generation)と呼ばれるLLMが外部知識を検索可能にする手法が多く提案されているようです。伝統的なRAG(Naive RAG)では、文章の前処理や分割(チャンク化) / 埋め込み(ベクトル化) / インデックス化(Vector / KV Store化) などの処理を行いLLMが未学習の知識を検索可能しているとのこと。現在、それらを発展させたAdvanced RAGなどではグラフ構造化や言い換え、Re-rankingなど様々な追加処理が提案されているようです。クラスメソッドさんの記事 (RAGの実案件に取り組んできた今までの知見をまとめてみた) がめちゃくちゃわかりやすくまとめられていて勉強になりました。どれも難しく試行錯誤が必要なものであることがわかりました。

(*3) 実際にはアプリケーションでLLMを利用する場合でかつAPIの利用を前提にするなら、ICLでも文字数に比例してコストが増えてしまいます。そのためChatGPTのような定額料金のGUIによる利用でなければ利点にはなりません。

(*4) ICLに限らずFine-Tuningでももちろん品質が大事。

(*5)モデル選択の背景はAPIのコストの相場から性能が拮抗すると思ったためですが、後発なだけあってClaude3 Haikuは安価で、かつ性能も良い結果となりました(2024年3月現在)

OpenAIAnthroic の費用感 (Million Token換算)

(*6) Claude3や 特にGeminiでは CoT に相当する内部処理を適時行うようになっているようなので、Zero-Shot CoTは不要かもしれません。Geminiではそれが逆にマイナスになっている感じもします。

(*7) なんとChatGPT(GPT-4)でもClaude3 Haikuと同じ頻度で誤りが発生していました。Claude3 Oupsでは未検証ですが、現時点で最高峰のモデルでも5~10%の確率で誤りが発生してしまう可能性を示唆しています。

(*8) 前述の足し算についても、その論文最後でもLLMの本質的な課題解決に見解を述べていてLLMそのものが理解することは難しそうです。一方で、計算ツールを利用する方向性 (たとえば、現状のCode Interpreterやプラグインの延長線上のモジュール機構など) で暫定的に解決するアプローチは色々とありそうです。Mathematicaの開発者であるスティーブン・ウルフラムの著書「ChatGPTの頭の中 (ハヤカワ新書)」でも、計算言語(ウルフラム言語)の厳密さを用いることで、自然言語(LLMが生成する近似値的文章)の不正確さをもっと精密な生成にすることが可能であるという展望を掲げていて、それらはWolfram Alphaなどの取り組みも含まれていることが書いてあります。それっぽいところの冒頭を抜粋引用すると・・・

「読み取った」内容を利用しながら、 「プロンプトに即し」 た 「内容を話す」のである。 「普遍的に意味のある」 こと (あるいは、 正しい計算に対応すること)を常に話すとはかぎらない。なぜなら、(たとえば ウルフラム・アルファ のような 「強大な計算能力」を利用できないかぎり)、訓練データの中で「そう思われた」 ことに基づいて「正しいと思われる」ことを話すだけだからである。

(~中略~)

少し前までなら、(人間の)言語こそ、私たちの「世界モデル」を一般的に記述できる唯一の手段だと考えたかもしれない。 数世紀前からすでに、特定のことがらについては形式化が始まっており、 その基盤と なるのは数学だった。 だが今では、 形式化に対してもっとずっと一般性の高いアプローチが進んでいる。 それが計算言語である。

ChatGPTの頭の中

上記の引用で面白そうだなと感じたなら「ChatGPTの頭の中」はおすすめです。ウルフラム氏自身がGPT-2などを用いてChatGPTの内部メカニズムを検証していく様子が描かれています。

(*9)低ランク行列化低ビット量子化、低ビット演算チップ、代替アーキテクチャモデル(Manba / RWKV) などの方向性が注目されています。


参考文献


ChatGPT(GPT-3.5)の不正解集

参考までに不正解の一部を載せてみます。

①Prompt

追加有償機能を契約している場合、エントリープランの料金は以下のように計算できます:
- プラン料金: 740円
- 利用回数: 89回
- 利用回数が55件を超えているため、追加料金が発生します。追加料金は1件あたり10円です。
- 追加料金: (89 - 55) * 10円 = 340円
したがって、追加料金を含めた今月の料金は以下のようになります:
740円 (プラン料金) + 340円 (追加料金) = 1,080円
したがって、あなたの今月の料金は1,080円になります。

②Prompt(Zero-Shot CoT)

まずはあなたが利用した回数を超過料金に換算しましょう。
エントリープランでは、55件までの問い合わせが含まれており、超過するごとに1件あたり10円が追加料金として課金されます。
したがって、あなたが利用した回数が55を超えている場合には、その超過分を計算する必要があります。
あなたの利用回数が89回であるため、超過した回数は89 - 55 = 34回です。
この34回に10円をかけて、追加料金を計算します。
それによって、34回 × 10円 = 340円の追加料金が生じます。
次に、追加有償機能に関する追加費用を計算しましょう。
エントリープランでは、大規模言語モデルの種類やプロセッサの選択などの追加有償機能を利用する場合、それぞれの機能ごとに1500円の追加費用が発生します。
しかし、あなたがエントリープランの契約に加えているため、この追加費用はかからないことに注意してください。
最後に、月額料金を計算しましょう。エントリープランの料金は740円ですが、先ほど計算した追加料金340円を加えます。
したがって、あなたの今月の料金は740円 + 340円 = 1080円になります。
したがって、あなたの今月の料金は1080円であるということになります。

③Prompt3(カスタム)

まず、サービスの通常の料金と超過料金を計算しましょう。
エントリープランの通常料金は、基本価格である740円です。追加料金は、追加の問い合わせ1件につき10円です。
したがって、89件の追加問い合わせがある場合、その追加料金は89 × 10 = 890円です。
これにより、エントリープランの通常料金は 740円 + 890円 = 1630円 となります。
次に、追加有償機能に関連するオプション費用を確認しましょう。
エントリープランでは、追加費用がかかる追加有償機能がありますが、このうちの1つは情報記憶機能です。
この機能には、エントリープランでは1500円の追加費用がかかりますが、プロプランでは追加費用なしで利用できます。
追加料金はすでに計算されていますので、オプション費用としては1500円です。
したがって、追加有償機能のオプション費用は1500円です。
最後に、利用料金を計算します。
- 通常料金:1630円
- 追加有償機能のオプション費用:1500円
これらを合計すると、利用料金は1630円 + 1500円 = 3130円となります。
したがって、あなたの今月の料金は3130円となります。




この記事が気に入ったらサポートをしてみませんか?