プロンプトエンジニアリング、人間との対比で考えよう「具体的に」「小分けに」「専門家に」

# この記事のめあて
- プロンプトエンジニアリングについて人間との対比で整理する
- まず基礎、X-shot、Chain-of-Thoughtまで

# 結論
:::note info
人間との対比で考える
- 似ていないところ
    - 博学な割に**うろ覚え**
- 似ているところ**重要なのは3点**
    - **具体的に**
    - **小分けに**
    - **専門家に**

:::

# 背景
プロンプトエンジニアリングの話が乱立している。大きく分けると2つと思う。
- プロンプトは何ができるかトップダウン的な解説
    - [Prompt Engineering Guideの日本語訳](https://www.promptingguide.ai/jp) など
- このケースではこう書く（要約ならこう、スライド作成ならこう）とボトムアップ的な解説
    - [ANTHROPICのプロンプトライブラリ](https://docs.anthropic.com/ja/prompt-library/library) など

覚えきれない。必要になったら検索すればいいけれど要領よくするために**かんどころ**を知りたい。私なりに整理した。

:::note info
以下、ChatGPT 4o 一時チャットで試していますが、代表的な対話型AIでは概ね結果は同様でしょう（基本対話型AIはランダム性があるので全く同じ回答となるわけではありません）。
:::

# 人間と似ていないところ

:::note warn
対話型AIは**うろ覚え**
:::

- 人間
    - なんでも幅広く知っている人はきちんとした根拠を持って話す
- 対話型AI
    - なんでも幅広く知っている割には根拠がなく「嘘」をつくことも多い

ここ、人間と同じように扱うと痛い目にあう。でも「嘘」をつくと言う意志はないですよね。確率が高いものを答えているだけだし。**うろ覚え**なだけ
> そのままのAI（ChatGPT）は、うろ覚えで暗算する学生のようなもので、危なっかしいのです。
    c.f. [深津氏に学ぶChatGPTプロンプトの極意、資料そのものをAIに作ってもらう](https://xtech.nikkei.com/atcl/nxt/column/18/02906/080200003/?P=2)

簡単な足し算や掛け算を間違うなど計算に弱い（数式を理解しているわけではないから）と言われてますが、なら文字列なら強いかというと有名なものに
[GPT-4やClaudeなどの大規模言語モデルが抱える「ストロベリー問題」とは？](https://gigazine.net/news/20241019-strawberrry-problem/)

- Query
```
strawberry のrの文字数は
```

- Answer
```
"strawberry" の中の "r" の文字数は 2 です。
```



Oops!

頭では分かっていても難しいことでも素早く自然な言葉で返答してくるのですぐ忘れてしまい、回答を信じてしまう。日常でいつも試してできることできないことを体感しないと、いざという時に重要なところで誤った回答を信じてしまい大失敗するかも。毎日使おうということと、対話型AIは**うろ覚え**で回答しているということは我々はしっかり覚えておこう。

# 人間と似ているところ
何かを指示、質問するときに、**具体的に**、**小分けに**、**専門家に**と言う点は人間と一緒です。

:::note info
人間も対話型AIも指示・質問するときは**具体的に**、**小分けに**、**専門家に**
:::

## 具体的に
「この資料明日までに直しといて」的な指示で手痛い失敗は依頼がわ受け手がわ両方で経験ないですか。空気読むとか阿吽の呼吸でとかが有能な秘書、部下、なのかもしれませんが少なくとも対話側AIはそうじゃないです。何しろ**うろ覚え**ですし、人間の指示なんてみんな適当なんだから。
「p.19のグラフの単位を米ドル換算で差し替えておいて」とか**具体的に**。

## 小分けに
役員へのプレゼンに気が重く先延ばしになってないですか。考えだしてもあっちがこっちがごっちゃになり、直前になっても骨子も決まっていないとか。ストーリーの骨子を決める、必要なデータを集める、各章の要旨を書く、とか**小分けに**しますよね。

## 専門家に
最後、対話型AIさんは何でも知っているので何でも回答してくれますが、人間の場合は何でも正確に答えられる人はほとんどいなくて、契約書のことは法務部の人、取引先の入金が遅れそうな場合の手続きは経理の人、社内システムの不具合はシステム部の人とか専門家に聞きますよね。対話型AIでも**専門家に**です。
それファインチューニングとかRAGするというのもありますが対話型AIの大規模言語モデルに対してプロンプトで工夫するだけでもかなり改善します。ここは恐らくですが
- 対話型AIは確率的に次の言葉を生成している
- 「経理部の人として答えて」と指示すると言語空間の中から経理関連の文章・単語の空間に重みをつけて生成する
- 「経理部の人として答えて」と指示すると経理関連の指示・質問の精度が上がる
だと思っています。

# 本論

代表的なトップダウン型プロンプトエンジニアリングである[Prompt Engineering Guideの日本語訳](https://www.promptingguide.ai/jp)で示されている代表的なプロンプトエンジニアリング手法を
- **具体的に**
- **小分けに**
- **専門家に**

で理解していこうと思います。

手法の分類を仮置き。

```plantuml
@startmindmap
+ prompt
++ 具体的に
+++ 書式・記号
++++_ 一般的なTips[指示][特異性]
+++ 範囲指定
++++_ 一般的なTips[不正確さを避ける]
++++_ 一般的なTips[するかしないか？]
+++ 例示
++++_ X-shot
++ 小分けに
+++ 考えるステップを小分け
++++_ Chain-of-Thought
+++ 分野・範囲を小分け
++++_ （今後説明予定）
++ 専門家に
+++ 考える方を専門家に
++++_ （今後説明予定）
+++ 説明の仕方を専門家に
++++_ 一般的なTips[不正確さを避ける]
@endmindmap
```

## [Introduction - プロンプトをデザインする一般的なTips - プロンプトの設計に関する一般的なヒント](https://www.promptingguide.ai/jp/introduction/tips)

:::note info
まず何よりも基本は「**具体的に**」
:::

### 指示

```
### 指示 ###
以下のテキストをスペイン語に翻訳してください。
Text: "hello!"
```

記号を使い指示を具体的にするというプロンプト手法があります。これは「**具体的に**」ですね。
現在の対話型AIならば

```
hello! をスペイン語で
```

くらいで大丈夫ですが、複雑な指示になった時はこういう明確な指示が間違いないです。
記号は決まりがありませんがよく使われるのは

```
# 項目1
# 項目2
```

```
### 項目A　###
```

```
[項目A]
```

```
項目あ: 
```

などで指示項目を明確化することですね。

### 特異性

指示をもう一歩進めて指示内容と出力形式をユニークに指定することですね。これも「**具体的に**」です。
同様に、現在の対話型AIならばここまで具体的に指示しなくても対応してくれますが、もっと長文で場所の他にも人名や事件の名前等複数指示を出し場合にはこういった特異性を持った指示が重要です。まさに「**具体的に**」

```
以下のテキストから場所の名前を抽出してください。
望ましいフォーマット：
Place: <comma_separated_list_of_places>
入力：「これらの進展は研究者にとって励みになっていますが、まだ多くのことが謎のままです。リスボンのシャンパリマウド・センター・フォー・ジ・アンノウンの神経免疫学者であるヘンリーク・ヴェイガ・フェルナンデスは、「脳と周辺部で見られる効果の間にはしばしばブラックボックスがあります」「治療的な文脈で使用したい場合、実際には作用機序を理解する必要があります。」」
```

### 不正確さを避ける

```
プロンプトエンジニアリングの概念を説明してください。説明は短く、数文で、あまり詳しくしないで
ください。
```

は不明確なため、望んだ回答にならないことがあります。あまり複雑に説明されてもわからないので詳しくない者にもわかるように、という趣旨と思います。そこでよく使われるのが

```
高校生に対して、プロンプトエンジニアリングの概念を2〜3文で説明してください。
```

まさに「**具体的に**」です。長い付き合いの人に尋ねたら、「こいつのレベルに合わせるとこれくらいだな」と合わせてくれるでしょうが対話型AIはそうではないので（メモリ機能などもあるので近々合わせてくれるかも）、「高校生に」がよく使われます。研究者、大学生、中学生、小学生など使いわけもできます。

ここの一つ応用として、私が見つけた「予備校講師のように説明して」を使ってみてください。「具体的に」と共に「**専門家に**」聞く、ですね。

高校生に対して
- Query
```
高校生に対して、相対性理論の概念を2〜3文で説明してください。
```

- Answer
```
相対性理論は、時間と空間が絶対的なものではなく、観測者の動きによって変化するという概念です。
例えば、光の速さは誰が見ても一定で、これが時間の進み方や物体の長さに影響を与えます。この理論
により、私たちが経験する現実が観測者の速度や重力の強さで変わることが示されています。
```

予備校講師のように

- Query
```
予備校講師のように、相対性理論の概念を2〜3文で説明してください。
```

- Answer
```
相対性理論は、物体が光の速度に近づくと時間や空間の感覚が変わるという、アルバート・アインシュ
タインによって提唱された理論です。特殊相対性理論では「光の速度は誰にとっても一定」という原理
に基づき、時間が伸び縮みし、物体が移動するとその長さが短くなる現象を説明します。一般相対性理
論では、重力が空間と時間を曲げる力であると解釈し、これにより惑星の軌道や光の進行も曲げられる
ことを示しています。
```

違いがわかりますかね。「予備校講師のように」の方は
- 「アルバート・アインシュタイン」
- 「特殊相対性理論」「光の速度は誰にとっても一定」
- 「一般相対性理論」「重力が空間と時間を曲げる力」

とまさに入試に出てきそうな概念や用語を強調するが如く、非常に重要な用語や概念も漏らさず返してくれます。そう、入試に出そうな用語や概念をわかりやすく説明してくれるのが予備校講師です。仕事で新たな分野の調べ物をしているときに

この説明でなんとなくわかったんだけど別の用語Aとのこの用語Bとの関連がわからないな

と困っていたときにこのプロンプトを使ったらそこを漏らさないのでわかりやすさがグッと上がりました。

ちなみに対話型AIによるかもですがGPT 4oならもう一歩すすんで「ヨビノリさんのように説明して」「林修先生のように説明して」もあたかも声が聞こえてきそうなくらいそれっぽくわかりやすく説明してくれます（某ショボイLLMを積んだものは「今でしょ」とか入れてきましたが林先生そんなんじゃないんで）。

:::note info
「**予備校講師のように説明して**」これ使えます。
:::

### するかしないか？

```
以下は、顧客に映画を推薦するエージェントです。興味を尋ねないで、個人情報を尋ねないでください。
顧客：私の興味に基づいて映画をお勧めください。
エージェント：
```

```
もちろんです！最近の映画で、幅広いジャンルからいくつかご紹介しますね。

1. **アクション:** 『ジョン・ウィック』シリーズ - スタイリッシュなアクションと緻密なストー
リー展開が魅力です。
2. **ドラマ:** 『フォード vs フェラーリ』 - 実話に基づいた感動的なストーリーと迫力あるレ
ースシーンが楽しめます。
3. **サスペンス:** 『ナイブズ・アウト』 - 謎解き要素が強いミステリーで、予想外の展開が楽し
めます。
4. **アニメ:** 『スパイダーマン: スパイダーバース』 - 美しいアニメーションと心温まるストー
リーが魅力です。

これらの映画はいかがでしょうか？
```

となってしまいますが、

```
以下は、顧客に映画を推薦するエージェントです。エージェントは、上位のグローバルトレンド映画か
ら映画をお勧めする責任があります。ユーザーの好みを尋ねることを避け、個人情報を尋ねることを避
ける必要があります。エージェントがおすすめ映画を持っていない場合は、「申し訳ありませんが、今日
お勧めする映画が見つかりませんでした。」と返答する必要があります。
顧客：私の興味に基づいて映画をお勧めください。
エージェント：
```

```
申し訳ありませんが、今日お勧めする映画が見つかりませんでした。
```

となると。これ例としてどうなのよとよくわからない点もありますが「すること」「しないこと」を「**具体的に**」の例ですね。


## Techniques - X-shotプロンプティング
, 
指示するときに例示をするということでこれも**具体的に**ですね。

### [Zero-shot](https://www.promptingguide.ai/jp/techniques/zeroshot)
```
テキストを中立、否定的、または肯定的に分類してください。
テキスト: 休暇はまずまずでした。
所感:
```

```
中立
```

と簡単な例なら例示をしなくても正確に答えてくれるという例。

ただこれも前述の**具体的に**をすでに使っています。単純に

- Query
```
休暇はまずまずでした。 の所感は
```

とすると

- Answer
```
「休暇はまずまずでした」という所感には、特に大きな不満もないものの、期待を大きく上回るような
出来事もなかった、というニュアンスが含まれています。穏やかに過ごせたけれど、特別な感動や驚き
があったわけではない、といった印象が伝わります。
```

となります。

### [Few-shot](https://www.promptingguide.ai/jp/techniques/fewshot)

いくつか例示をして指示を**具体的に**する例ですね。

```
「whatpu」とはタンザニア固有の小さくて毛皮のある動物です。 「whatpu」という言葉を使った文
の例は次のとおりです。
私たちはアフリカを旅行して、これらのとてもかわいいwhatpusを見ました。
「farduddle」というのは、とても速く上下にジャンプすることを意味します。 「farduddle」とい
う言葉を使用した文の例は次のとおりです。
```

```
私たちは試合に勝ったとき、みんなfarduddleをして祝いました。
```

こんな機械的な例示も有効です。**具体的に**ですね。

```
これは素晴らしい! // ネガティブ
これは酷い! // ポジティブ
あの映画は最高だった! // ポジティブ
なんてひどい番組なんだ! //
```

```
ネガティブ
```

## [Techniques - Chain-of-Thoughtプロンプティング](https://www.promptingguide.ai/jp/techniques/cot)

Few-shotを用いて算数の問題を解かせると

```
このグループの奇数を合計すると偶数になります：4、8、9、15、12、2、1。
A: 答えはFalseです。
このグループの奇数を合計すると偶数になります：17、10、19、4、8、12、24。
A: 答えはTrueです。
このグループの奇数を合計すると偶数になります：16、11、14、4、8、13、24。
A: 答えはTrueです。
このグループの奇数を合計すると偶数になります：17、9、10、12、13、4、2。
A: 答えはFalseです。
このグループの奇数を合計すると偶数になります：15、32、5、13、82、7、1。 
A: 
```

```
答えはTrueです。
```

- 15+5+13+7+1=41なので奇数つまりFalseですね。というFew-shotの限界の例示があるのですが現在のGPT 4oではFalseと回答します。改善してしまっているのですがより複雑な問題だと同じように例示しても正しい回答が得られないので、ステップを踏んだ指示をつまり**小分けに**というのがChain-of-Thoughtです。

```
このグループの奇数を合計すると偶数になります。: 4、8、9、15、12、2、1。
A: 奇数を全て加えると(9, 15, 1)25になります。答えはFalseです。

このグループの奇数を合計すると偶数になります。: 17、10、19、4、8、12、24。
A: 奇数を全て加えると(17, 19)36になります。答えはTrueです。

このグループの奇数を合計すると偶数になります。: 16、11、14、4、8、13、24。
A: 奇数を全て加えると(11, 13)24になります。答えはTrueです。

このグループの奇数を合計すると偶数になります。: 17、9、10、12、13、4、2。
A: 奇数を全て加えると(17, 9, 13)39になります。答えはFalseです。

このグループの奇数を合計すると偶数になります。: 15、32、5、13、82、7、1。
A:
```

```
奇数を全て加えると(15, 5, 13, 7, 1)41になります。答えはFalseです。
```

「奇数を全て加えると」→それが偶数か奇数か
と2ステップに例示を**小分け**にして**具体的に**例示しているんですね。

その後の例示

```
私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリ
ンゴを買って1つ食べました。残りは何個ですか？
```

```
11個のリンゴ
```

```
私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリ
ンゴを買って1つ食べました。残りは何個ですか？
ステップバイステップで考えてみましょう。
```

```
最初に、10個のリンゴから始めました。
隣人と修理工に合わせて、リンゴを2つずつ渡し、残りは6個になりました。
次に、5つのリンゴを買い、11個になりました。
最後に、1つのリンゴを食べたため、残りは10個になります。
```

となっているのですが現在のGPT 4oでは一発で

```
計算してみましょう。

1. 最初に市場で **10個のリンゴ** を買いました。
2. 隣人に **2個**、修理工に **2個** 渡したので、**10 - 2 - 2 = 6個** 残っています。
3. その後、さらに **5個のリンゴ** を買ったので、**6 + 5 = 11個** になります。
4. そこから **1個食べた**ので、**11 - 1 = 10個** です。

**答え：残りは10個です。**
```

とChain-of-Thoght的な考え方を取り入れています。GPTさんもさんざん叱られて悔しい思いをしたのでしょう。努力がうかがえます。

計算だけでなく提案書作成など文書生成などでもChain-of-Thoughtは有効です。ここではstraberryに調整してみましょうか。

- Query
```
lightgray に使われている文字数は l:1, i:1, g:2, h:1, t:1, r:1, a:1, y:1の
1+1+2+1+1+1+1+1=9 の9文字で、rは1文字使われています。
transformer に使われている文字数は t:1, r:3, a:1, n:1, s:1, f:1, o:1, m:1, e:1の
1+3+1+1+1+1+1+1+1=11 の11文字で、rは3文字使われています。
strawberry は？
```

- Answer
```
**strawberry** に使われている文字数を数えてみましょう。

- s: 1
- t: 1
- r: 3
- a: 1
- w: 1
- b: 1
- e: 1
- y: 1

それぞれの数を足し合わせると、**1 + 1 + 3 + 1 + 1 + 1 + 1 + 1 = 10** 文字になります。

また、**r** は **3文字** 使われています。
```

yeah! ただ人間の労力が半端ないな。でも考え方ね。

補足：Chat-GPTなら裏でPythonが動くのでこんな面倒なプロンプトにしなくても

- Query
```
strawberry のrの文字数は
Pythonの文字列関数を使って
```

とすれば正しく答えてくれます。

- Answer
```
文字列 "strawberry" の中の rの文字数は3 です。
```

**具体的に***の応用例ですね。