CLOSE

GPTの利用について(全1記事)

ChatGPTを使った時の「うまくいかない」をどう解決するか 機械学習エンジニアが明かす、プロンプトエンジニアリング手法

OpenAI社によって開発された自然言語処理を使ったサービス「ChatGPT」。その背景にあたり、最近特に注目を集めている技術が大規模言語モデルです。今回は、不動産テックのイタンジ株式会社が主催したオンラインセミナー「【ChatGPTの基礎と応用】自然言語処理の最新動向からプロダクトでの活用を考える」の中で、株式会社GA technologiesの機械学習エンジニアである丸山拓己氏が、大規模言語モデルの活用方法について紹介しました。

GA technologiesでM&A仲介の業務支援ツールの開発を行う丸山拓己氏

丸山拓己氏:大規模言語モデルの応用についてお話しします。AISC(AI Strategy Center)の丸山です。よろしくお願いします。

本日の目次です。まず、Prompt Engineeringについてお話しします。その後、大規模言語モデルの使用上の注意、主にプロダクトを使う時にどういう点に注意したほうがいいかについてお話しします。最後に、関連リソースやツールにフォーカスしてお話ししたいと思います。

簡単に自己紹介をさせてください。丸山拓己です。よろしくお願いします。青山学院の大学院を卒業後、2021年にGA technologiesに新卒で入社しています。現在は主に、新しく始めたM&A仲介の業務支援ツールの開発を行っています。

これ以降の発表について何点か、僕の感覚で一般ユース向けとプロダクト向けに分けてラベル付けしているところがあります。ただ、このラベルはどちらか一方にしか使えないというものではなく、「どちらにも使えるけど、強いて言えばこっち」という感覚で付けているので、絶対こっちにしか使えないというわけではないことをご承知おきください。

Prompt Engineeringとは何か?

それでは、Prompt Engineeringについて本題に入らせていただきます。そもそもPrompt Engineeringとは何かというと、大規模言語モデルです。これから「LLM」という単語がいっぱい出てくると思うのですが、大規模言語モデルは、質問文(Prompt)の書き方によって質問文に対する精度が大きく変わります。与える質問文によって大規模言語モデルの出力を制御しようという試みをPrompt Engineeringと呼んでいます。

では、どんな時に役に立つのか。例えばChatGPTを使っていて、「タスクを与えたのにぜんぜんうまくいかない」または「出力自体はいいんだけど、出力のフォーマットをもうちょっと統一したい」、「自分好みの出力にチューニングしたい」という時に、Prompt Engineeringを使用するとこういう課題を解決できるかもしれないのがPrompt Engineeringの良いところです。

質問文に埋め込み出力をコントロールする手法「Few-shot Prompting」

では、どんな手法があるのかをお話しします。まず一番有名な「Few-shot Prompting」と呼ばれる手法ですね。これは、いくつかの例を質問文に埋め込むことで出力をコントロールする手法です。

(スライドを示して)スライドのグラフの青色が例を入れなかった時、オレンジ色が例を入れた時のQ&Aの性能になるのですが、ある程度例を入れた出力のほうが精度が上であることを示しています。

具体的にどういうことなのか。この例であれば、英語からフランス語に変換してください、翻訳してくださいというタスクなのですが、英語の例の後にフランス語を入れる。例をいくつか入れて、その後に実際に聞きたい内容について質問する。これによって精度を上げているのがFew-shot Promptingです。

では、このFew-shot Promptingがなんにでも使えるかというと、ある程度苦手なタスクが存在しています。その1つが、数値計算を含むタスクです。例えば「契約書中の契約開始日と契約期間だけ書いてあるところから、契約終了日を算出してください」みたいなことはあまり得意ではありません。

もう1つは論理的な思考を含むタスク。「文書中の内容で、矛盾したことを言ってませんか?」という、ある程度論理的思考が必要なタスクはあまり得意ではないことが研究でわかっています。

推論過程を含めた例を追加して、より良い出力を得る手法「Chain-of-Thought Prompting(CoT)」

では、こういう課題をどうやって解決するか。ここで出てくるのが「Chain-of-Thought Prompting(CoT)」と呼ばれる手法です。これは、推論過程を含めた例をPromptに追加することで、モデルにも推論過程を出力させ、より性能の良い出力を得ようという試みです。

具体的に、どういうことなのか。(スライドを示して)これがCoTを使っていないPrompting、つまり普通の聞き方です。Few-shotと同じように、まずは例を提示します。

ここではロジャーが持っているテニスボールの数を数えていて、「答えは11個」としか書いていません。そうすると、次のタスクの「カフェにいくつのりんごがありますか?」という質問に対しては、めちゃくちゃな答えを返してきます。

では、CoTはこれをどうやって解決したのか。(スライドを示して)この青色で書いてあるところ、先ほどとの差分がこの答えのところです。この答えを、段階的にどう計算していけばいいかをまず例示します。そうすると、モデルも同じように段階的に考えてくれます。これによって精度を上げるのがChain-of-Thoughtの仕組みです。

“Let’s think step by step”を追加して、モデルに推論過程を出力させる手法「Zero-shot CoT」

このChain-of-Thoughtの発展形が、Zero-shot CoTと呼ばれる手法です。今までChain-of-Thoughtでは例を入れる必要があったのですが、例を入れないで、文の最後に「Let’s think step by step」、日本語で「段階的に考えていきましょう」という文章を追加することで、モデルに推論過程を出力させて、より精度の良い回答を得ようという試みです。これによってCoTでは必要だった例が不要になります。

答えを多数決で決めるという手法「Self-Consistency」

もう1つ、例を追加すること自体はいいから、もっと性能の良い答えを得たいよという場合。その場合は「Self-Consistency」という手法が有効です。

この手法は、CoTをやるところまでは同じなのですが、その出力を複数個受け取ります。そして、その得た答え……(スライドを示して)ここでは18ドルとか26ドルとか、いろいろな答えがあるのですが、簡単に言うと、これを多数決で決めるという手法です。本当はもう少しこのへんにいろいろな工夫があるのですが、今回は簡単にするために多数決を取っていると理解してもらえればと思います。

最新情報と外部データソースは使用できない

ここまで、Chain-of-Thoughtとその発展形のお話をしてきましたが、それでもまだ解決できない課題が存在しています。それは何かというと、そもそも構造上、最新の情報や外部のデータソースを使用できないようになっています。

大規模言語モデルは、基本的に学習時までの知識しか持っていないので、ChatGPTであれば2021年9月までの情報しか知らないことになります。なので、日本がWBCで優勝したことは知らないわけです。

また、外部のデータソースも使用できません。例えばWikipediaやGoogleで検索、もしくは自社のデータベースを参照できないというデメリットがあります。

外部のデータにアクセスできる手法「ReAct」

プロダクトに組み込む時には、こういうものも使いたいと思うと思います。それを解決するのが次のReActという手法です。

これは、大規模言語モデルがどうやって答えを導き出すかを考える過程で、外部のデータソースを参照できる手法です。思考と行動の2つのプロセスに分けて大規模言語モデルに考えさせて、行動の際に外部のデータソースを触りにいける仕組みになっています。

具体的に、論文中に出されている例を紹介します。「シルク・ドゥ・ソレイユのショー『ミステール』が行われているホテルは、部屋は何室ありますか?」という質問ですね。これは、(スライドを示して)正解ラベルが付いているのですが、実はもうこの正解ラベルも古くなっているみたいです。

これに対して、大規模言語モデルがReActを使用してどう答えを導き出すかというプロセスを追っていきます。

まず、この入力が与えられた時に大規模言語モデルはどうやって解けばいいかを考えた時に、「ミステールという単語を検索して、開催されているホテルの部屋数を調べればいい」という出力をします。その上で「『Cirque du Soleil show Mystere』で検索する」ということをします。

ただ、外部のデータソースを探しにいった結果、この「『Cirque du Soleil show Mystere』は見つかりませんでした」という結果が得られました。

この結果を加味して別の検索をしましょう。大規模言語モデルは「ホテルは『Mystere(Cirque du Soleil)』で調べれば出てくるんじゃないか」と判断して、実際に「Mystere(Cirque du Soleil)」で検索をします。

そうすると、開催されているホテルが外部のデータソースから得られました。開催されているホテルの名前は「Treasure Island Hotel and Casino」だとわかりました。

大規模言語モデルはその結果を踏まえて、「次は『Treasure Island Hotel and Casino』というホテルについて調べて部屋数を確認すればいい」と思いつき、それを行動に移します。

検索した結果、2,884室の部屋と220室のスイートルームがあることがわかったので、これを足して3,104室という答えが得られます。これがReActと呼ばれる手法です。以上でPrompt Engineeringの話は終わりです。

間違った出力「Hallucination」を緩和する方法

続いて、プロダクト使用時の注意点についてお話しします。いろいろな注意点がありますが、今回の発表ではスライドの3点について説明します。

ご存じかもしれませんが、ChatGPTや大規模言語モデルは間違った出力をすることがあります。

(スライドを示して)これは「ITANDI」について聞いた結果です。それらしいことを言っているように見えますが、「自動車メーカーや製薬会社などの大手企業からの受託開発を手がけています」。こんな事実はないので、これは事実ではなく嘘の出力です。

こういう間違った出力をすることが、大規模言語モデルにはよくあります。英語で「Hallucination」と言います。

この問題を完全に解決するのは難しいのですが、緩和する方法はいくつか提案されています。1つは、わからないことや自信のないことは、Promptの時点で「わからない」と出力させてしまう方法です。

これをさらに強化するために、Few-shot Promptingを使う際には、わからない時の例を追加します。例えば「原子とは何ですか?」には答えられるけれど、「アルバン・ムンツとは誰ですか?」と言ったら「?」、わかりませんと返すというPromptingを追加する。

また少し違う解決の方法として、与えるPromptの中に「この情報をもとに以下の質問に答えてください」という、もとになる情報を特定できる時はそれを与えるのも、1つの解決策です。

価値観が偏った出力・暴力的、性的な出力を解決する方法

続いて、バイアスや攻撃的な出力をすることがあるという話です。前半で説明したように、InstructGPTによってAlignmentチューニングが施されました。これによって攻撃的な出力はある程度抑制されたのですが、まだまだ好ましくない出力をすることがあります。例えば価値観の偏った出力や、暴力的や性的な出力をするケースが存在します。

これをどう解決するか。出力をそのままユーザーへ提供するのではなく、チェックを入れます。例えば大規模言語自体を言語モデルに判定させるという方法もありますし、Hugging FaceやOpenAIが出しているAPI、EvaluateモジュールやModeration APIと呼ばれるようなものを使用してチェックを入れるのも、解決策の1つとしてあると思います。

悪意のあるユーザー操作への対策

最後に悪意のあるユーザーの操作についてです。これは、2つ例を挙げます。

1つは「Prompt Injection」と呼ばれる手法です。これは、ユーザーが事前に与えられているPromptを無視させる指示を与える手法です。そうすると、大規模言語モデルは時々そのプロンプトを無視してしまいます。これによって、本来プロンプトで制御していたはずの出力を超えたなにかを出してしまうことがあります。

次は、「Prompt Leaking」と呼ばれるものです。これは、事前に与えられているプロンプトを出力させるというものです。これの何がまずいか。ユーザーが、サーバーサイドで持っているプロンプトなどを、「プロンプトやサーバーサイドで持っているから大丈夫」と思って安易に機密情報、個人情報など大事な情報を与えてしまうと、これによって抜かれてしまうことがあります。

この対策もいろいろ提案されています。例えば、ユーザーの指示を無視するプロンプトを与えたり、引用符などで囲むことも効果があると言われています。また、モデルにユーザーのプロンプトを実行していいかを一度評価させて、その結果を出力させる。その結果で、良い・悪いを判断する方法も提案されています。

関連リソース・ツールの紹介

最後に関連リソースやツールについて紹介します。時間がなくなったので、駆け足で紹介します。

1つは、「LangChain」と呼ばれるものです。これは大規模言語モデルを使用したアプリ開発の支援ツールです。Python版とTypeScript版があるのですが、いろいろな便利機能が入っています。また、更新自体がかなり頻繁に行われているので、今は機能がないと思っても後で機能が追加されるという点で注目のツールだと思っています。

もう1つは、「Prompt Engineering Guide」と呼ばれるものです。Prompt Engineeringについて、Web上で論文や実例と一緒にさまざまなテクニックがまとめられています。今回の資料も参照しているところが多いのですが、最近日本語版が公開されたので、ぜひ見てみてください。

今回話したのは、Prompt Engineeringとその注意点、関連ツールなどです。いろいろ話しましたが、この分野は今、本当に流れがめちゃくちゃ速いので、常にいろいろな情報ソースをウォッチしていくことが大事だと思います。ぜひおすすめの資料があれば教えてください。

私からは以上です。ありがとうございました。

続きを読むには会員登録
(無料)が必要です。

会員登録していただくと、すべての記事が制限なく閲覧でき、
著者フォローや記事の保存機能など、便利な機能がご利用いただけます。

無料会員登録

会員の方はこちら

この記事のスピーカー

同じログの記事

コミュニティ情報

Brand Topics

Brand Topics

  • 今までとこれからで、エンジニアに求められる「スキル」の違い AI時代のエンジニアの未来と生存戦略のカギとは

人気の記事

新着イベント

ログミーBusinessに
記事掲載しませんか?

イベント・インタビュー・対談 etc.

“編集しない編集”で、
スピーカーの「意図をそのまま」お届け!