Open3
プロンプトエンジニアリングをしっかりと理解する
細かい記法の話とかもあとでカバーしつつ、プロンプト作成全般に通ずる普遍的な原則論みたいな話からまとめていきたいよね。
fukabori.fm #97 の内容から勉強するのが良さげだからこの内容をベースにまとめてみた。
最初だから、めっちゃ基本的なところから文字起こししてみる。
LLMとは
- Large Laungage Model の略称。大規模言語モデル。
- 単語から次にくる単語を予測して、確率的に次々と繋げてテキストを生成する仕組みを持っている。
- 言語モデル自体が知識とか知能を持っているのではなくて、あくまでも確率的に単語を繋げているだけ。
- Web上にある膨大(数兆単語くらいの規模)なテキストを学習させて、自然な人間レベルのアウトプットが出せるようになった。
- ChatGPTは言語モデルではなくて、LLMをWebサービスとしてラップしているサービスと言う位置付けになる。
- ChatGPTの場合、モデルとしてGPT-3.5-turboとかGPT-4とかが裏側に存在する。
プロンプトエンジニアリングとは
- 言語モデルに思い通りのアウトプットをさせるための技術の総称
- 言語モデルは確率的なランダム性を持つので、雑な依頼(プロンプト)を投げると、依頼に対する出力の選択肢も多くなってしまい、結果的に大まかなものになりがち。なので、回答になりうる選択肢の幅を狭めて、自分が欲しい確度高くアウトプットをさせるための工夫(技術)が存在する。
- 確度を高めるためには依頼する内容を正確に言語化する必要があるので、依頼する側の言語能力が大事になる。
- どんなプロンプトでも「具体的に」「明確に」「一度に1つのことを依頼する」のが共通して大切。
- この原則がプログラミングで処理を逐次的に技術したり、1つの関数の処理を肥大化させすぎないようにしたりする感覚に似ている。
- プログラミング以外だと、人に何かの仕事を依頼する時にその内容をわかりやすく伝える感覚に通じている。(なので、自分が依頼される側になった時に動きやすいような伝え方で言語モデルに依頼すると良い。)
具体的な技術について
必殺技の名前みたいなもの。名前がカッコ良すぎるけど、1つ1つやってることは割とシンプル。
In-Context Learning
- プロンプトエンジニアリングにおける基本的な技術
- やって欲しい仕事に対して、具体例をいくつか渡して、モデルが次に出力するものをうまくコントロールすること
- 学習済みのモデル自体を微調整して精度を向上させるFine-tuningとは別物。
X-Shot Learning (Zero-shot, One-shot, Few-shot)
- In-Context Learning の一種。
- "shot"と呼ばれる例を与えて、モデルに回答を出力させる。与えるshotの数によって呼び方が変わる。
- e.g. 例文とその文がネガティブかポジティブかの情報をいくつか渡して、入力した文がポジティブ・ネガティブなのかを判別させる。
- e.g. 文書校正のタスクで校正対象になるようなダメな例の文と修正例を事前に与える。
- 理論上、与えるshotの数が多ければ多いほど出力精度も上がる。GPT-4のテクニカルレポートでもshotの数によってモデルのパフォーマンスが変化するベンチマークが報告されている。(らしい)
- ただし、言語モデルへの入力にはトークン長の制限があるので、無限にshotを与えることはできない。shotの数と出力の精度のバランスを見つつ適切な量のショットを与える必要がある。
- 実際のプロンプト作成ではshotの数を徐々に増やしていく感じで探っていくのが良いとのこと。
Chain of Thought (CoT)
- タスクを依頼する時に論理的な考え方のステップを示して、狙ったアウトプットを出力させる技術
- 依頼するときに思考のステップをstep-by-stepで提示した後に問題を解いてもらう
Self Consistency
- 問題の解き方を何通りか考えて、それぞれ問題を解いてみた後にそれぞれの回答を比較して最適そうな解をピックアップさせる方法。
- LLMが確率モデルなので、ランダム性をコントロールできるパラメーターみたいなものが存在する。ランダム性を担保して試行回数を増やして最頻値を取るみたいなアプローチになる。
- GPTにはtempature というパラメーターがある。これを0にすると出力のランダム性が完全に無くなる。(らしい)
- ランダム性(tempature)を上げて、ランダム性が高い状態で複数回問題を解いたあとに、その解を総合して最適解をピックアップするような段取りになる。
- 出てきた答えを振り返るような方法なので、出力された答えを検証する仕組みをどこかで用意する必要がある。これはプロンプトの中にあるとは限らない。
ReAct
- Reasoning and Acting の略称
- 言語モデルに何かのリクエストをした時に、モデルがそのリクエストを達成するために必要な行動を類推させる(Reasoning)
- 言語モデルが選択できる行動の種類をあらかじめに実装しておく必要がある
- モデルはその選択肢を選ぶだけなので、処理の全貌がプロンプトだけで閉じない。
- 全体のフローを制御するオーケストレーション的な役割を果たす処理が必要になる。
- プロンプトの入力から最適なChatGPTのPluginを選択して結果を出力するのも、このReActの一種。
- 言語モデルがユーザーのリクエストと各プラグインのDescriptionを照らし合わせて最適なプラグインを選ぶの部分がまさにReasoning。
Retrieval Augmented Generation (RAG)
- 簡単に言うと知識の外部化。
- 具体的な知識を外部のナレッジベースから回答させるもの。モデルに生成させるものではない。
- 外部に処理を委託するという意味ではReActと本質的には一緒。
細かいChatGPTの記法の話はこの記事が参考になりそう