モデルの精度を上げるために、prompt文を調整するのは一番簡単なことです。良いprompt文を作るためには色々手法があります。今日はよくある手法と今一番人気なものを紹介したいと思います。
①few-shot(one-shot)
few-shotとはモデルに例をいくつ提示することで、類似の質問に対する回答の精度を向上させる手法です。例が一つだけ提示する場合はone-shotです。promptのサンプルとしては以下のようです。
prompt例:
"Question:Aはリンゴを1個持っている、Bは3個持っている、二人合わせて何個持っている?
Answer: 4
Question: Cはリンゴを2個持っている、Bは4個持っている、二人合わせて何個持っている?
A:"
langchainには最適なサンプルを自動的に探してくれる"選択器"(SemanticSimilarityExampleSelector)がありますので、実際使う時にはほとんどone-shotだけでやってます。
選択器の中身はRAGと同じように、質問に対して一番関係性が高い(ベクトル)サンプルを探すことです。
one-shotの反対はzero-shotです。zero-shotは、モデルが例なしで質問を回答することです。
②cot(chain of thoughts)
cotはGoogleが提出したfew-shotを改善する手法です。
思考の過程をprompt文に追加することで回答の精度を向上させる方法です。でも小さなモデルは理解できないので、30B以上のモデルではないと効果はほぼないです。
先のprompt例だと:
"Question:Aはリンゴを1個持っている、Bは3個持っている、二人合わせて何個持っている?
Answer: こちらの問題を数学問題で考えると、1+3の結果を計算することになりますので、正解は4です。
Question: Cはリンゴを2個持っている、Bは4個持っている、二人合わせて何個持っている?
A:"
モデルは提示した思考過程を真似して質問を回答します。
その後、Googleは東京大学とzero-shotのcotも提出しました。
こちらは例なしなので、非常にシンプルでpromptに「Let’s think step by step(段階的に考えてください)」を追加するだけです。chatgptが間違った時に試したら効果を実感できると思います。
③tot(tree of thoughts)
totはcotの改善バージョンです。
改善点としては思考過程をより複雑にし、決定木のように変えました。
イメージとしては以下のようです。複雑なタスクには効果あるはずですが、prompt作るのは面倒なので、私は使ったことはないです。
④Step Back Prompting
こちらはlangchainがおすすめの手法です。今一番人気なpromptチューニング手法かもしれません。
まず与えられた質問に基づいて、より具体的、一般的なstepback質問を生成します。その後、与えられた質問とstepback質問両方からRAGで情報を探して、質問と合わせてモデルに渡して回答を生成します。
私が試した経験としては精度が結構高くなります。特に質問が複雑で、自分でもうまく質問を説明できない場合は非常に効きます。
興味ある方試してみてください。
cot:
tot:
Step Back Prompting: