わからないことが分からない話（ChatGPTの使い方：プロンプトエンジニアリング）

::: note info
本記事は[LITALICOのアドベントカレンダー３](https://qiita.com/advent-calendar/2023/litalico)の15日目の記事です。昨日は@kamesenninさんの『[マトリクス型のIT組織(250名)かつ多様な事業がある企業でIT投資戦略を策定する10のステップ](https://qiita.com/kamesennin/items/4a081b50512bfedbfe6b)』でした。
:::

初めまして！今年の8月から内定者インターンとして参画させていただいている@zacky_50です。
来年春から入社させていただく前に学生目線からまったくの門外漢がインターンでしみじみ感じていることを、せっかくのこのタイミングでしかできないという特権を使って、アドカレの1日を使わせていただいてお話ししたいと思います。
これから未経験でエンジニアになる人や何かを学び始める時の指針としてお役に立てると幸いです。

# はじめに
簡単に私の開発に対するレベル感をお話ししておきます。わたしは大学で医療系を専攻しているため、ソフトウェアを開発するといった知識はほとんどありません。プログラミングの経験としては研究で使うpythonやRくらいでした。現在も主にpythonを使って解析を行なっています。（そのうち研究の紹介などもできたらいいなあ）もちろん研究で使うプログラミングはソフトウェア開発としてのプログラミングとは全く違っており、全くの初心者とほぼ変わらない状況でした。
また、ソフトウェアエンジニアリングについては中途半端に独学をしていたため、体系的な理解がなく、わかることとわからないことの区別がつかなくなっているという状況でした。ある単語についてある程度知識があるとしても、その周りの周辺知識やほかの事象との関連などマクロな視点での理解が追いついていないということが多々あります。

# インターンで感じたこと
実際の業務では実際にコードを書くこと自体は、今は基本的にはしていませんが、サーバーやソフトウエアの仕組み、JavaScriptはある程度理解できていた方がやはりスムーズに仕事が進むように感じました。（これはQAグループにいるからなのかもしれませんが）
その際にこんな初学者がどのようにこれらの知識を吸収していくかは他の人にも共通する悩みなのではないでしょうか。
そして同時に、わからないことがわからないということも感じました。これはどういうことかというと、ミーティングで話されていることは基本的に初めのうちは全くといっていいほど理解できていなかったのです。そしてこれはなぜ理解できていないかもわかっていませんでした。

# なぜ理解できないかを考える
人の認知は大きく4つに分類されるそうです。「知っていると知っている」「知らないと知っている」「知っていることを知らない」「知らないことを知らない」

https://data.wingarc.com/unknown-unknown-23097

これは高校の時に漢文で孔子の「論語」で『知之為知之、不知為不知。是知也。（訳　自分が知っていること知っているとして、知らないことはまだ知らないと率直になることが、知るということだ。）』を習った時にそのときは何となくたしかになあという理解しかありませんでしたが、今あらためて考えると今自分の置かれている状況をこの枠組みで整理することが非常に重要だと感じます。わからないことを分析しなければ問題の解決のしようがないですからね。

もちろんわかっているのレベル感というのも重要でしょうが、今回はわからないことにフォーカスして、どうするといいのか考えていきたいと思います。（[わかることのレベル感](https://globis.jp/article/5149)も意識しながらインプットすると学習効率が上がるかもしれないですね。）

::: note info
人の認知は「知っていると知っている」「知らないと知っている」「知っていることを知らない」「知らないことを知らない」の4つに分類される
:::
## わからない原因が明確な場合
わからないことが何か明確にわかっている時は簡単です。調べればいいです。幸い今はChatGPTという心強い味方がいます。ChatGPTをはじめとした生成AI（自然言語モデルLLMs）の発展はすごいですね。最近GoogleがGeminiという新しいLLMsを発表しその精度がすごいと話題にもなっていますね。（もちろんChatGPTを超えたからといって、これが全知全能の神でないことは十分に理解していないといけませんが）
わからない単語ぐらいならGoogle先生でも十分です。「〜とは」である程度調べることもできます。

::: note info
大抵のわからないことはググれば解決
:::
## わからないことがわからない時
ではなにでわからないかがわからず躓いている時はどうすればいいでしょうか。

まず、何かの文章でその内容がわからない時、まるっとChatGPTに投げてみる方法があります。「〜〜〜。この文章の意味がわかりません。説明をしてください。」のように聞いてみればいいわけです。その中で、文中の単語がわからない時は、「その単語について説明もお願いします。」というようにすれば、同時にわからないことが解決できます。ただしChatGPTにも間違いはあるのです。ある程度その回答が正しいのか自分で精査する必要がある場合もあると思います。ただしこの場合は自分の必要としている回答は得られない可能性もあります。つまり、「それはわかってるのになあ」という回答が返ってくることがあるのです。

文章の一部が理解できている時は、それも一緒に聞くのがいいです。

人に質問する時は、「わたしはこういうものです、これこれこういうことについて考えていて、ここまでは理解できているのですが、ここから先がわかりません。」というように具体的にするものです。でないと質問された側も何を答えればいいかがわかりません。
ChatGPTに質問する時も基本的には同じです。前提となるもの、どのような背景でそれを質問しているのか、どのような文脈なのか。これは辞書を引く時でも同じでしょう。例えば、英語でbookを調べたい時に、それが動詞が名詞かで全く意味が違うのです。ChatGPTならこのぐらいであれば全ての意味を教えてくれるでしょう。ただし、それがどちらの意味であるかは結局のところわからないので、もう一度、bookがどのような意味になるのかを考えないといけないでしょう。つまり、この場合は例となる文章があって、この時にbookの意味を教えてもらうことが重要になるわけです。
これを厳密に説明すると、ChatGPTに質問する時は、「命令」「文脈」「入力データ」「出力指示子」を意識する必要があります。でなんだそれはとりそうですが、別に難しいことは言っていません。
例えば、「I need to book a flight to Tokyo. という文章の中で（文脈）bookの（入力データ）意味を教えてください（命令）。」のようになります。今回の例では出力指示子に当たるものはありませんでしたが、強いて言えばどんな言語で返すのか、「予約する」と返して欲しいのかあるいは他の言語で返して欲しいのかの指定は出力指示子となります。日本語での質問であることを汲み取ってくれると思いますが、より長い出力の場合は出力のフォーマットを指定してあげることで自分の欲しい回答が得られやすくなります。

::: note info
わからない時は何がどのようにわからないかを分析する。
:::
::: note info
ChatGPTへの質問は「命令」「文脈」「入力データ」「出力指示子」を意識する。
:::
# プログラミング初心者でもChatGPTがあれば何でもできる
最近ChatGPTがより話題になるようになってから「初心者でもなんでもプログラミングを実装できる」という話をよく耳にする気がします。（これは大学で研究のためのプログラムを書くからでしょうか？教授から「これやっといて。最悪わからなかったらChatGPTとかに聞けばわかるから」とよく言われる気がします。）
ここでの問いは「全くの初心者（PCは普段はブラウザしか使わないレベルと想定）でもChatGPTと仲良くすれば独学でWebアプリやゲームが作れるのか」ということです。
Web上のシステムがまったくわからない（わからないことが分からない）状況で一から全て実装できるか、本当に全くの初学者がプログラムを難なく実装できるかという問いに関して私は否であると思います。これは、ChatGPTの特性をある程度理解している人、もしくは何らかのプログラムを書いたことないし、みたことがあり、実装の前に必要なことがある程度理解できていないとなかなか苦労するだろうなと思います。（ここであくまでも不可能とはいっていないことは強調しておきます。）

わからないことが分からない場合、まずChatGPTに助けを求めることはできますが、ある程度有効な使い方は知っておくと良いのではないでしょうか。


# おわりに
インターンを通じて感じたわからないことが分からないという状況とそれをどのように考えて解決しようとしているのかをまとめてみました。プログラミングもChatGPTでなんでもできると言われている時代です。正しく？（より精度良く、効率的に）ChatGPTなどを活用し早急に疑問点を解決し作業を効率化できるようにうまく付き合っていきたいですね。

明日も私が記事を担当します。明日は工期について考える会をしたいと思っています。ぜひお楽しみにしていただけると幸いです。

## 参考記事
https://blog.tinect.jp/?p=68951

https://www.promptingguide.ai/jp