【GPT】プロンプトエンジニアリング手法まとめ

 
はじめまして、sonesuke( [https://twitter.com/sonesuke](https://twitter.com/sonesuke) ) です。 LLMのニュースを追っかけ続けたので、これからキャッチアップする人用にまとめておきます。

単発のプロンプトテクニックについてはこちらご覧ください。

https://qiita.com/sonesuke/items/981925cfcc610a602e94


# これだけは知っとけ用語

各手法の説明を読む前に、これらの用語を読んでおくと各手法がわかります。知っている人は飛ばしてください。

## プロンプトエンジニアリング
入力(プロンプト)を工夫して性能をあげようというアプローチ。
機械学習系で精度アップといえば、追加学習させたりモデルを拡張するのですが、LLMではモデルが大き過ぎてコストが洒落になりません。
そのような事情からプロンプト側を工夫することで、回答に直接影響を与えるという手法が発達しています。

https://arxiv.org/abs/2107.13586

## ファインチューニング

モデルを新たな学習データで追加学習させ、モデルのパラメータを更新し、精度を高めようというもの。いわゆる普通の機械学習。

## Zero-Shot / Few-Shot

ここでいうShotは、例示の意味。Zero-shotだと、例示なし。Few-shotだと、2, 3個の例示をという意味。

## Hallucination

いわゆるGPT嘘つき問題。
LLMは、あくまでも次のワードとして確率が高いものを出しているだけで、別に事実確認はしていないし、論理的に考えているわけでもありません。まったく学習していないものに対して、それっぽいけど間違っているものを出力してしまいます。
これは実用上の問題になることが多く、さまざまな対応策が提案されています。主アプローチは以下の2つです。

- 飛躍が起きないように段階的に考えさせる。
- 知らないものは調べさせる

# 各手法

## Chain of Thought

あらかじめ関連するQuestionとAnswerを例示し、推論の道筋を方向づけします。

ポイントは

- 同じ構造の問題を選んで例示する
- 例示の解答部分で問題の構造を分解して答えを示す

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/c36bce09-8d43-bd27-396f-fcd0beee4e07.png)

https://arxiv.org/abs/2201.11903

## Zero-shot-CoT

「段階的、論理的に考えて」をつけておけば、とりあえず性能があがると一時流行っていたやつです。英語だと、”Let’s think step by step”

https://arxiv.org/abs/2205.11916

## Automatic Chain of Thought

Zero-shot-CoT + Manual CoT + Retriever。(Retrieverとは、検索エンジンだと思ってください。)
これで、最適なQAを選択し、例示することで性能を上げます。

ステップ

1. 前準備として”Let’s think step by step”でのQA集をクラスタリングしてもっておく
2. ユーザーから入力が来た際に、クラスタからQAを持ってきて、入力にCoTとして入れる

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/073a10b2-b38a-b33c-4add-ee5b05127494.png)

https://arxiv.org/abs/2210.03493

## Self-consistency

多数決 CoT。
たくさんのCoTの結果をマージすることで解答の精度を高めます。

ステップ

1. 入力(プロンプト)に対応するCoTの答えの部分をサンプリングし、複数個持つ
2. 複数の解答をマージして、最終の答えとする

![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/9f24ba6c-1c11-df64-650f-0be72ca65b66.png)

https://arxiv.org/abs/2203.11171

## APE (Automatic Prompt Engineer)

プロンプトエンジニアリング自体を自動化してよい入力を作ります。

ステップ

1. 出力から、入力を予測 (Reverse Generation)
2. 入力に対しスコアを計算
3. スコアに基づいて、入力を決める。 (スコアが収束するまで反復してもよい)

![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/0db44cc0-d135-a54e-07c0-c8f8c193e832.png)

https://arxiv.org/abs/2211.01910

## UPRISE (Universal Prompt Retrieval for Improving Zero-Shot Evaluation)

Prompt Retrieverという最適なプロンプトを検索するLLMを使って、タスク(用のプロンプト)やモデルを選択します。
Prompt Retrieverとして、GPT-Neo-2.7Bという小さめのLLMを使っているところも特徴。

![Untitled 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/1093c62c-7975-32ac-35df-86118ec242a8.png)

https://arxiv.org/abs/2303.08518

## Toolformer

APIを使ってサーチエンジンや計算などの知識を取り込み、LLMが苦手なところを補います。
下記は、QA(質問)というAPIを使用する方法。

![Untitled 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/7f347c6f-e8e6-54c8-1f96-f06d4f4375a1.png)

https://arxiv.org/abs/2302.04761

## ReAct

推論(Thought)と行動(Act)をReActフォーマットで入力を作り、実際にツールと連携して、解を導きます。
行動(Act)として、Searchなどのツールを自然に取り込むことができ、Obsとしてコンテキストに組み込まれます。

![Untitled 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/81cc935b-cdec-8ca6-9abe-2fa5ca9bc223.png)

https://arxiv.org/abs/2210.03629

## ART(Automatic Reasoning and Tool-use)

タスクライブラリとツールライブラリから、LLMを使って入力を作って、推論させます。
LLMを使って、推論ステップを生成しているところが特徴です。

![Untitled 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/9000d92e-6f7e-6c33-5fa6-2aabaa5b5686.png)

https://arxiv.org/abs/2303.09014

# まとめ

プロンプトエンジニアリングの分野はタケノコのように新手法が出てきています。
とはいうものの、基本的には、「複数回のステップに分ける」「外部の知識を取り入れる」というものが多数で、

 - どういうステップに分解させるか
 - 外部知識の取得をどうやって計画させるか
 - これらをどうやってコンテキストに盛り込むか

というところで工夫していく方向かと思われます。

なかなかまとめ上げるのに骨が折れました。皆様の参考になれば幸いです。
~~こういうをChatGPT君がやってくれるんじゃなかったっけ？~~