見出し画像

GPTで「できること」を増やすための3つのアプローチを非エンジニア向けにまとめてみた 〜プラグインとAPIとファインチューニング

最近、とにかく話題が尽きないChatGPTやLLM(大規模言語モデル)。

毎日のように“できること”の情報がどんどんと更新されているので、追いかけるだけで精一杯!という方も多いのではないでしょうか。かくいう自分も相当インプットしているつもりですが、いまだに全容を掴みきれていません。

そこで今回は、自分自身の整理も兼ねながら、ChatGPTでプロンプト開発をする際の全体像をまとめてみました。

※プロンプト:GPT等のLLMに対する入力文ないしはコマンドのこと

チャット上でのプロンプトエンジニアリングはもちろん、pluginやAPI、LangChain、プロンプトの評価、さらにはファインチューニングまでテーマを広げてまとめています。

エンジニアにとどまらず、ChatGPTやLLMで何かを作りたい全ての人に向けに、以下の2点を目標にして整理を試みているので、「情報量が多くて理解が追いついていない!」という方は、ぜひご覧いただき、感想等をコメントいただけると大変嬉しいです。

  • 仕組みやできることを「イメージ」で伝える

  • 正確さと理解しやすさのバランスをとる

※このnoteは2023年4月10日までの情報を元に、筆者の理解の範囲でまとめたものです。もし何か間違い等見つけられた方がいましたら、こちらまでご連絡頂けるとありがたいです。

GPTとは

まずは基本事項の確認です。GPT(Generative Pre-trained Transformer)は、人工知能技術を活用した言語処理プログラムです。大量のテキストデータを学習することで作られており、何らかのテキストを入力すると、それに対応するテキストを出力します。

GPTは多様な用途に対応できるため、テキスト生成、要約、質問応答、機械翻訳など、様々なことができます。

ご存知の方も多いと思いますが、GPTとChatGPTは別物です。GPTはChatGPTの元となっているプログラムです。ChatGPTはGPTをベースに、文脈を扱える仕組みを構築しています。

GPTのイメージ

GPTを擬人化(以下、GPTさん)するとすると「とても賢く、知識も豊富だけど、新しいことは何一つ憶えられない人」のイメージになります。「新しいことは何一つ憶えられない」ことがポイントです。(憶えさせる方法もありますが、そちらは後述します)

この人とコミュニケーションするには、ペラ1枚の紙を使います。ペラ1枚に指示などを書いて渡すと、それに対して返答してくれるイメージです。

このペラ1枚の紙の大きさは決まっていて、書ける量の情報しか渡せないというのもポイントです。

GPTと会話するには

そんなGPTさんと会話するには、話したい内容を紙に書いて渡せばOKです。書いた内容を解釈して、返答してくれます。

ここで思い出してもらいたいのは、GPTさんは新しいことを何一つ憶えられないという点です。

「お手伝いできることはありますか?」というGPTさんからの質問に対して、返事を別の紙に書いて渡してしまうと、GPTさんはこれまでの会話を全く憶えていない状態で返答してくることになります。

これまで話した内容(文脈・コンテキスト)を踏まえた会話をするには、どうすればいいのでしょうか?

GPTと文脈を捉えた会話するには

そうです。新しいことを憶えられないのであれば、これまでのやり取りをログとして紙に残した上で、新しい問いかけをすればよいのです。上の図にあるとおり、ユーザーとGPTさんとのやりとりの履歴を紙に書いた上で、新しい質問を書くと、これまで話した内容(文脈・コンテキスト)を踏まえた会話をしてくれるのです。

これで、新しいことを憶えられないGPTさんと会話する方法が見えてきました。

ここまでの内容を前提にして、今度はChatGPTがどのような仕組みになっているのかを見ていきましょう。

ChatGPTの仕組み(推測)

自分が知る限りにおいて、ChatGPT自体の仕組みに関する公式ドキュメントは存在しないので(もしあったとしたら教えてください!)、筆者の推測+GPT4に質問して得られた回答の範囲でお送りします。

ここで押さえるべきポイントとしては、ChatGPTとの会話はしていますが、GPTが会話内容を憶えて話しているわけではないという点です。

私たちがChatGPTに何かを質問すると、「これまでのやり取り+新しい質問」をGPTに投げるという仕組みが、ChatGPTの裏で走ります。

この際に、過去のやり取りはOpenAIのデータベースに保存されているものから再現します。一度ブラウザ等の画面を閉じても、ChatGPT画面の左のリストからこれまでの会話をロードできるということは、会話は全てデータベースに残っているということです。

会話内容が多く、GPTに渡せる容量の制限を超えた場合、過去のやり取りの一部を短縮または省略して制限内に収めます。(これはプロンプト上で簡単な実験をすると確認できます)

ChatGPTがチャットの中で文脈を扱う仕組み(イメージ)

ここまでの話をまとめると、こんな感じの図になります。

GPTさんは新しいことを憶えられないので、ChatGPTではこれまでの流れをログとして、今回の質問と一緒にGPTに渡します。

皆さんがChatGPTの画面でプロンプトエンジニアリングしているのは、「今回の質問」(図中の一番下のところ)の範囲のみです。ログの部分はChatGPTが自動生成してGPTに渡します。

この仕組みを図にすると、以下のようになります。

GPTでできることを広げる3つの方向性

ここまでの内容を踏まえて、ここからは、GPTの実力をフルに発揮するべく私たちができることについて、3つの方向性を見ていきたいと思います。

①ツール/スキルを渡す

まずは「ツール/スキルを渡す」ということで、いわゆる「plugin(プラグイン)」と呼ばれる機能が主軸になるアプローチです。

プラグインを導入することで、GPTに様々な機能を持たせることができます。例えば検索機能を持たせることで、当該領域における最新情報を検索して回答に取り入れることが可能になります。

また、調べるだけでなく何かしらのアクションも可能です。例えばお店を予約したり、Slackに投稿したりといったこともできるようになります。

さらに、機能を組み合わせることで、例えば以下のようなこともできると言われています。

  • スポーツのスコア、株価、最新ニュースなど、リアルタイムの情報の取得

  • 個人のカレンダー等の情報を参照した上で、レストランを予約

  • 個別のメールにアクセスし、本文等の内容を要約してSlackに投稿

ChatGPT上で上記のような機能を実現するにはpluginを使用しますが、現在はα版で限定公開中。アクセスするにはwaitlistに登録し、許可が下りるのを待つ必要があります。

プログラミングをすることになりますが、LangChainのAgents/Toolsを使えばpluginを使わずに似たようなことをすることも可能です。この辺りは、また追って別記事で解説したいと思います。

②「プロンプト全体」を活用​​

続いては、GPTが提供するAPIを使うことによって「プロンプト全体」を活用するアプローチです。GPT提供のAPIを使うと、GPTへと直接アクセスできるようになるので、プロンプト全体を自由に設計・構築することができます。

下図の左側がChatGPT上でのプロンプトエンジニアリング、右側がGPTのAPIを活用したプロンプトエンジニアリングです。

APIを使うことで、ChatGPT上よりも格段に自由なプロンプト設計ができることがお分かりかと思います。

では、例えばGPTのAPIを活用して、自作のチャットボットを作ろうと思ったら、どうすればよいでしょうか。

文脈を憶える基本的なチャットボットの作り方

考え方はChatGPTと全く一緒です。

「過去の会話の文脈情報」をデータベース等から構築し、「今回の質問内容」とセットでGPTのAPIに渡す形になります。

もう一つ例をみてみましょう。

「社内の情報(制度やルール等)に関して質問すると回答してくれるシステム」を作るとしたら、どうすればよいでしょうか。

例えば「出張で泊まれるホテルはいくらまで?」と聞くと、旅費規定から内容を確認して回答してくれるようなボットを想定しています。

GPTは個社の社内規定までは学習しておらず、知識は持っていない前提です。

基本的な社内文書の問い合わせシステム例

GPTは社内文書に関する情報は知識として持っていないので、別途「文脈情報」として与えます。問い合わせに関連する社内文書の情報を、文脈情報としてプロンプトに挿入するのです。

その上で、与えた文脈情報のみを用いて、質問に回答するように指示します(図にあるように「事前の知識は使わず、コンテキスト情報から以下の質問に答えてください」みたいな形で質問の前に前提を置きます)。こうすることで、GPTが一般的な回答をすることを防ぎます。

次に、関連しそうな社内文書を引いてくるシステムの例を見ていきます。

関連する社内文書を持ってくるやり方は複数存在しますが、ここではGPT連携でよく用いられる方法として、LangChainのIndex機能の活用ケースをご紹介します。少し専門的な内容になりますが、ざっくりとした内容を記載しておきます。

  1. 社内文書を短く切ってチャンク化(複数の塊に)します。この際に、単純に文字数などでぶつ切りにすると精度が悪くなるので、Text Splitters機能などを使うことで、意味のある小さなチャンクに分けることができます。

  2. チャンクをベクトル化(embedding)します。その際、意味が近いチャンクはベクトルの距離が近くなるようにします。

  3. 新しい質問があった際は、質問文を同様にベクトル化します。

  4. 質問文のベクトルと距離の近い、社内文書のチャンクのベクトルを探します。これはつまり、質問文と意味が近いということになります。

  5. こうして見つけた社内文書のチャンクを、関連しそうな文脈情報としてプロンプトに記載します。

プロンプトデザインの構成要素

ここまでで、プロンプト全体を設計・構築する例をいくつか見てきました。

改めて、プロンプトデザインの構成要素を図にまとめると、以下のようになります。

画像上部にある水色のフロー図が、全体の流れです。何を達成したいのかを特定したら、それに対してどのように実現するのかを設計し、プロンプトを構築してLLMに投げ、出てきたアウトプットをチェックしつつその精度を確認して、また何を達成したいのかの確認に戻るという流れです。

その中でも「どのように実現するか」に繋がっている3つの赤い四角は、プロンプト構築の構成要素になります。実現の仕方を考えるにあたって、この3つの要素を元に考えると進めやすいです。

まず「プロンプトの全体構成」とは、プロンプト全体のテンプレートのようなイメージです。何を達成したいかに紐つきます。

例えば社内文書の問い合わせシステムであれば、文脈情報として社内情報を渡し、この内容から質問に答えてくださいといった指示を出す流れになります。つまり、何を達成したいかにより、この「プロンプトの全体構成」をデザインすることになります。

次に「記憶・文脈の表現」は、プロンプトに渡す文脈情報の構成システムです。GPTは新規記憶を持たないため、これまでのやり取りや、社内の情報などをまとめ、文脈情報として提供します。

最後の外部連携は「GPTでできることを広げる3つの方向性」の「①ツール/スキルを渡す」のことを指します。どんなplugin等の機能を追加すれば、達成したいことを実現できるのかを検討します。

プロンプトの精度確認方法

ここまで、APIを活用することでプロンプト全体を設計・構築する方法を見ていきました。

それでは、作ったプロンプトがどの程度機能しているのか、先ほどの図の「アウトプットの精度確認」の部分について、具体的にどのように確認すればよいでしょうか。

基本的には、以下の通り定性的と定量的、それぞれの手法があります。

図にも記載していますが、「定性的」な手法は、人間が色々なパターンを試し、感覚的に判断するやり方です。実際に活用しながらうまくいかないパターンを集め、手動でプロンプトを改善していきます。

一方で「定量的」な手法は、「このような入力の時はこのような出力が欲しい」といったデータセットを作り、達成率を計算するやり方です。データセットが存在するため、プロンプトを変更することによる精度変化をトラッキングしながらプロンプトの改善が可能です。

GPTなどのLLM開発のすごいところは、要約や会話など、うまくできているかどうかの定量化がしにくいテーマでも、判定用のLLMを別途構築することで点数化できてしまうという点です。例えば、「この返答は何点ですか?」といった問いに答えられる「判定用GPT」を用いることで、返答プロンプトの自己採点が可能になるというわけです。

プロンプトの精度を定量的に判定する話を図にまとめると、以下になります。

プロンプトの自動構築/最適化

だいぶ深い話になってきましたが、最後にもう一掘りだけしてみようと思います。

ここまでの話では、理想の入出力例のデータセットがあれば、プロンプトの出来を定量的に判定できるという話を見てきました。

つまり、プロンプトがどれだけよく書けているか、自動で点数をつけることができるということです。

ということは、プロンプトを自動生成して点数を計算し、点数が良くなるようにプロンプトを改善するようなプログラムを書けば、プロンプトの構築を自動化できるということになります。

長い旅になりましたが、ここまでが「GPTでできることを広げる3つの方向性」の「②プロンプト全体を活用」についてです。

最後に、簡単に「③新しい知識を与える」を見て終了したいと思います。

③新しい知識を与える

「②プロンプト全体を活用」の中で、理想の入出力例のデータセットを用意することで、プロンプトを自動生成できる可能性があるとお伝えしました。

ただ、ここまでの議論はあくまで「GPTは追加で新しい知識を得られない」という前提に基づいたものでした。

新しい知識を得ることができないので、限られた文量のプロンプトに対していかに効率よく文脈情報を詰め込み、適切な指示を出していくかがポイントになっていたわけです。

では、GPTが新しい知識を得ることができたらどうでしょうか。

それが「ファインチューニング」と呼ばれる、独自データによる追加学習です。

適切に学習データを用意することで、憶えさせたい内容をGPTに記憶させ、「独自のGPT」(ファインチューンモデル)を作ることができるのです。「憶えぬなら、憶えさせよう、ほととぎす」です。

ファインチューニング自体は計算コスト(API使用料)がまとまって掛かりますが、独自の学習済みモデルを作ることで、プロンプトに与える文脈情報を減らすことが可能になり、毎回のAPI使用料を節約できるようになります。(API使用料は与えるプロンプトの長さに影響します)

プロンプト自体もシンプルにできたり、逆に知識を与えて更にプロンプトを工夫することで、より複雑な処理ができたりするようになる可能性もあります。

その際は、GPTに追加学習させる内容と、追加学習後のプロンプトを共に設計することになるので、より取り組みがいのある内容になります。

まとめ

ここまで、GPTとは何か、ChatGPTとの違いは何かを見たうえで、GPTの力を最大限に引き出すために、できることを広げる3つの方向性を見てきました。

より複雑性の高いタスクを実現するためには、この3つを組み合わせながら「トータルデザイン」として、広い意味でのプロンプトを試行錯誤していく形になります。

これまでKaname Projectでは、GPTを活用して以下のような課題に取り組んできました。今回のnote記事では、それらの取り組みの中から得られた情報の一部をまとめて、記事としてご紹介させていただきました。

  • 業務の振り返りサポートツール:専用のフォーマットに沿って記述した振り返りテキストを解析し、より深い内省をサポートするためのフィードバックを生成。

  • スカウト業務サポートツール:候補者のプロフィールWebページを解析し、指定の求人要件にマッチしているかを自動解析。さらに、候補者の強みを分析してスカウト文面の微調整も提案。

  • チーム間マッチングサポートツール:約1,000チームのプロフィールを解析し、「実現したいこと」「提供できる価値」「欲しい支援」等を自動抽出。win-winとなるチーム間のマッチング案を生成。

  • レポート採点サポートツール:提出されたレポートを解析し、事前に定めたルーブリック(採点基準)に従って採点。

  • DAOガバナンスサポートツール:DAOのフォーラム(掲示板)にアクセスし、1クリックすることで、議論を要約し、賛成派・反対派の意見と、その他注目すべきポイントを表示。

※宣伝で恐縮ですが、GPT等を活用したコンサル&実証実験サービスも展開しているので、こちらもお気軽にお問い合わせください~


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