プロンプトエンジニアリングに騙されない技術  " In-context Learningをそえて"

プロンプトエンジニアリングという技術？が流行っています。
実際にChatGPTを上手に使いこなすための知識であり、体系化されれば有用なのは間違いないと思います。が、それが今後の本筋でみんなやれ－という説明が多く、ちょっとあれって疑ってみる記事。

追記

https://qiita.com/saitofjp/items/86ad1ec7d924d5ccdcd3

雑に実演しました

# ちょっとまて、少し待て

※ この記事はIn context learning って言葉でをググったり、GPT-3の論文の解説を読むと、読む必要がありません。
※ 私の理解があってるみるか世に出してるみるかぐらいののりです。間違いがあればご指摘ください。たぶんどっか間違ってる。

# これが全てです。画像をみよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29715/a02b4bfa-04e1-6cc1-e64d-00193dee85b0.png)
GPT-3の論文の画像です
※元ネタの論文を紹介する記事より引用 https://zenn.dev/dhirooka/articles/dc3d31f15cccb6

GPT-3の能力なのですが、指標として4つの線があります。
線はパラメータですね。1番上がGPT-3となります。GPT-4はやばいよーのそれです。パラメータ増えるとﾔﾊﾞｲ。
でも、実は、このグラフで重要なのは、この線毎の比較ではなくNN-shot

# NN-shot

(Number of Examples in Context (K)) という説明で、NN-shotという区切りがあるのが見えますでしょうか。
これがIn context learningの区分けになります。

* Zero-shot
* One-shot
* Few-shot

という3つがあるよーと補足しています。

In context learningとは言葉で説明するより、画像を張るのが一番です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29715/04bbb136-d837-00de-6208-af72ba818da1.png)
※元ネタの論文を紹介する記事より引用 https://zenn.dev/dhirooka/articles/dc3d31f15cccb6

どうでしょうか、プロンプトな時代で言えば

* プロンプトにいきなり質問する -> Zero-shot
* プロンプトに１つだけ解答例いれる -> One-shot
* プロンプトにいくつか解答例いれる -> Few-shot

として、比べてみたよーというものなのです。

# あらためてグラフ見よう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29715/a02b4bfa-04e1-6cc1-e64d-00193dee85b0.png)

One-shotもしくは10個程度のFew-shotで、精度がめちゃくちゃ良いねーというグラフなわけです。


# 雑に知っておく In context learningって何

※ ここ読むより[論文解説とかのリンク](https://zenn.dev/dhirooka/articles/dc3d31f15cccb6)先呼んだ方が分かりやすいです

ラーニングという言葉から、"強化学習"という類を早期し易いのですが違います。

GPT-2辺りからのコンセプトとはずばり
「特定タスクのためにファインチューニングなんていちいちやってられねー。Inputから学習させたら、色んなタスクこなせないかなー -> こなせたー！！」

事前学習モデルの精度向上のためにファインチューニングというものが流行ったそうです。ファインチューニングというのはまさに教師ありの強化学習で、モデルをさらに学習させて精度を上げていくものでした。たしかに精度は上がったのですが、いちいち学習し直さなきゃタスクに適応できないという課題があり、冒頭セリフに繋がりました。(教師ありだとスケールしねえよね。と生まれたのがDeepLeraningのアイディアになってる辺り、自然な流れと思います。)

記事読んだほうが良いと思います。
> Transformerベースのアーキテクチャをファインチューニングすることで、文章読解や質問回答などといった多くのタスクで優れた性能を得ることができている。一方で、こうしたアプローチはタスクを既知として学習しており、目標タスクの学習データが必要になるという制約がある。

こうして生まれたのがGPT-2で、さらにパラメータを拡張して死ぬほど大規模にしてみたのがGPT-3なわけですね。文章生成マシンから、与えらえたInputからタスクをこなせる汎用的な推論モデルの可能性の道が開かれたわけですね。

このInputこそがプロンプトです。グラフに実践と点線がありますが自然言語によるプロンプトによって大きく改善してるというのもポイントなんですかね？これがプロンプトエンジニアリングへの期待に繋がっているのでしょうね。

In context learningというのは、ある意味GPTの個性そのもので、今の時点での実用面での可能性に私は感じます。
(GPT-3の大規模化がフィーチャーされやすいですが、面白いのはGPT-2なんでしょうね。。)
(ChatGPTに続く流れで、ファインチューニングに返ってきてるのも面白いですね。)

# んで、ここが変だよ。"プロンプトエンジニアリング"

今のプロンプトエンジニアリングって、Zero-shotでタスクを解決する。というのが主眼になっているように見えます。

グラフ見ると一目瞭然ですが、ぶっちゃけのFew-Shotの方が明らかに性能が良いわけです。パラメータが大規模になればなるほどそれは顕著です。ようするにGPT-4とかも、そっちのほうが良いわけです。たぶん。

モデルの性能の指標的には、Zero-shotの性能が向上するというのは興味深いのは間違いなのですがが。

がが、数個から10個程度サンプルだけで大きく性能が改善する手法がすでにあるわけです。最強のZero-Shotを見つける。より、雑なFew-Shotの方がいいだろうなーというのは、なんとなく想像通りかと。Zero-Shotに命をかけるより、複数のExample少し入れたやったほうがよっぽど精度が高いのです。

ぶっちゃけ[OpenAIのガイド](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api)では、ちゃんとFew-Shotに触れてます。

# 「プロンプトエンジニアリングに騙されない技術」

流行ってる言葉にのる前に、それが"何か"学習するのって大切だなと改めて思いますねーという記事でした。

先頭走ってる人達は、楽しいパワーでどんどん進むので、少しの道の違いは軌道修正して走っていきます。そういのに追いつけない私達のような凡人は、正しく過去を学び未来への線を引いて見据えたほうが良いかもね。という話でした。

GPT-3をちょと学習するだけで特徴である「In context lerning」を知ることが出来ます。すると、プロンプトという捉え方も変わり色んな発見が出来たりもします。
* 頑張って指示工夫しなくても[超高精度でJSON出力](https://qiita.com/naosugi1987/items/1e5349424e4ed878c84d
)とか出来たり。
* ChtaGPTが出る前から、 In context lerningで"最新情報"を扱えるようにする[LlamaIndex 🦙 (GPT Index)](https://gpt-index.readthedocs.io/en/latest/index.html)というOSSがあることを見つけたり。
* [ChatGPTのプラグイン](https://japan.zdnet.com/article/35201736/)の正体とかこれかなーとか分かったりして楽しかったりもします。

追記：技術的な戦略
https://www.promptingguide.ai/techniques