プロンプトエンジニアリングへの招待

前回、ChatGPTから見るジェネレーティブAIの未来という記事を書きました。
https://qiita.com/k1morikawa@github/items/06e6622e5e7cfcf374ae

ジェネレーティブAIにより検索エンジンがオワコンと言われている事に対しての違和感があり、その理由は、検索エンジンの代替自体は、従来型のAIで既に可能という事であって、後はUIの作り方や精度次第という事。

ジェネレーティブAIによって可能となったのは、ジェネレーティブAIが論理を理解して創造できるという事で、従来型の検索エンジンのアプローチとは全く違うという事を書きました。

今回は、そのジェネレーティブAIに対して論理を指示するプロンプトエンジニアについて書いていきたいと思います。

# プロンプトエンジニアリングとは
プロンプトエンジニアリングとは、人工知能に対して人間がプロンプト（指示）を与え、それに基づいて適切な応答を返すように指導する技術や手法のことを指します。

具体的には、人工知能に対して質問を投げかける際に、正しい回答を得るための適切な情報を提示したり、回答に至る思考過程を説明することで、人工知能がより正確な回答を返すように指導することが含まれます。

ジェネレーティブAIが５才児に例えられるのは、その学習能力が人間の子どもに相当するためです。しかし、人工知能は膨大な情報を処理することができるため、５才児以上の知識量を持っていることもあります。しかし、情報を適切に処理し、正しい判断を下すための論理的思考力や経験値を持っていないことが弱点とされています。

そのため、プロンプトエンジニアリングによって、人工知能に対して適切なプロンプトを与えることで、論理的思考力や経験値を補完することができます。これにより、より正確な回答を返すことができるようになります。

# 裏にある大規模言語モデル（LLM：Large Language Model）とは
このプロンプトエンジニアリングが普及していく裏にあるのが、実は、大規模言語モデル（LLM：Large Language Model）です。

この大規模言語モデル（LLM：Large Language Model）とは、膨大なテキストデータを用いて学習された、人工知能による自然言語処理のモデルのことです。従来の言語モデルに比べ、数百万から数十億単語の規模のボキャブラリーを扱うことができ、事前学習によって様々なタスクに適用できます。

最近のLLMの代表的なモデルには、BERT、GPT-2、GPT-3、T5などがあります。これらのモデルは、大量のテキストデータを事前学習することによって、自然言語処理におけるさまざまなタスクに対応できるようになりました。例えば、文章の生成、翻訳、質問応答、文章分類、テキストマイニングなどのタスクに用いられています。

LLMは、自然言語処理の精度や速度を向上させ、多くの分野で応用されています。しかし、巨大なデータセットと大量の計算リソースが必要であるため、LLMの開発や運用には高度な技術と大量のコストが必要となることがあります。

# プロンプトエンジニアリングと大規模言語モデル（LLM：Large Language Model）の関係
このLLMが言葉を正しく理解できる様になったため、AIに対して人間から指示(プロンプト)を与えられる様になったという事です。しかも論理的に理解する事が出来る様になりました。

大規模言語モデル（LLM）は、自然言語処理における重要な技術であり、そのような技術の発展により、プロンプトエンジニアリングがより高度になりました。LLMが大量のデータセットから学習されたことで、AIはより高度な言語理解能力を獲得し、より自然で論理的な応答を生成することができるようになりました。

プロンプトエンジニアリングは、LLMが生成した応答をより洗練された形で制御するために使用されることがあります。プロンプトエンジニアリングは、AIに何を言わせるかを正確に制御し、AIが生成する応答の品質を向上させることができます。LLMとプロンプトエンジニアリングは、共通の目標であるより自然な自然言語処理の実現に向けて、相互補完的に使用されることがあります。

# プロンプトエンジニアリングの具体例
例えば、下記の様にChatGptに指示を与えます

![スクリーンショット 2023-03-14 7.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/3e83becf-1783-5622-2cde-ab04d61b9732.png)

```
Q: Tweet: "I love pockets on jeans"

A:"I couldn't agree more! Pockets on jeans are an absolute must-have for me. #pocketlove #jeanslife"
```
これだけだと正確な回答をもらえません

![スクリーンショット 2023-03-14 7.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/06b75915-1a29-72aa-251f-87a8a07f7d1a.png)

```
Twitter is a social media platform where users can post short messages called "tweets".
Tweets can be positive or negative, and we would like to be able to classify tweets as
positive or negative. Here are some examples of positive and negative tweets. Make sure 
to classify the last tweet correctly.

Q: Tweet: "What a beautiful day!"
Is this tweet positive or negative?

A: positive

Q: Tweet: "I hate this class"
Is this tweet positive or negative?

A: negative

Q: Tweet: "I love pockets on jeans"

A:positive
```
こちらは正確な回答を得ることが出来ました。これがプロンプトエンジニアリングです。
事例＝論理を教える事により、考え方を理解してくれて動いてくれます。正に５才児の様に考え方を指示する事で正しく動いてくれます。

# プロンプトエンジニアリングのための色々な手法

- In-context Learning (ICL)
- Chain-of Thought (CoT)
- Zero-shot CoT
- ReAct
- Self-Consistency
- Program-aided Language Model (PAL)

これらの手法は、マネージメントに通用する部分がある様に思えます。指示の出し方に関して、答えだけを教えるのではなく考え方を教える事により、自分で回答を導いた感覚を覚えさせる。これにより作業の再現性が高まります。
他についてもマネージメントの感覚でプロンプトを考えてみるのも良いと思います。

# 参考になるプロンプトエンジニアリングのサイト

https://github.com/dair-ai/Prompt-Engineering-Guide
https://learnprompting.org/docs/intro

# 最後に
今後、プロンプトエンジニアリングの具体例な事例についてもう少し深ぼっていきたいと思います。

これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。