こんにちは、サイオステクノロジーの佐藤 陽です。
ChatGPT-4o が世間を賑わせていますね!
今日はそんな生成 AI を使いこなすためのプロンプトエンジニアリングについて解説していこうと思います。
- 思ったような回答得られないんだよなー
- もっと生成 AI をうまく使いこなしたいな
といった方はぜひ最後までご覧ください。
なお今回は基礎編になります。
もう少し踏み込んだ内容については、続編を書こうと思っているのでこうご期待ください。
チートシート
時間がない人向けに、本記事の内容をまとめたチートシートを置いておきます。
テクニック | (個人的な)要約 |
Instructions | 具体的に質問してください |
Primary Content | プロンプトのテキスト自体を変換できます |
Examples | 例を提示してから質問してください |
Cue | 回答の出だしを指定してください |
Supporting content | 補助的な情報を与えてください |
プロンプトエンジニアリングとは?
NRI によると、以下のように定義されています。
AI(人工知能)から望ましい出力を得るために、指示や命令を設計、最適化するスキルのことです。ChatGPT などの生成 AI を使いこなすために注目されるようになりました。生成 AI は、命令(プロンプト)の出し方によって、出力されるコンテンツの質が大きく異なるため、より適切なものを入力するスキルが求められています。
出典:https://www.nri.com/jp/knowledge/glossary/lst/ha/prompt_engineering
生成 AI は様々な回答を行ってくれますが、こちらの命令によってその回答内容は様々です。
こちらが質の高い命令を行うことで、AI からも質の高い回答が返ってきます。
例えば、「ダイエットをしたいなぁ」と思った時に
1.
「痩せる方法を教えてください」
と聞くよりも
2.
「 あなたは優れたスポーツドクターで、痩せるための食事や運動方法について精通しています。 私は現在 30 歳の男で身長 170cm、体重 80kg あります。 1 年間で 5kg の減量をしたいと考えています。 痩せるために食事および運動についてのアドバイスをください 」
のほうがなんだか具体的なアドバイス貰えそうじゃないですか?
実際、AI の聞いてみたところ以下のような回答が得られました。
1.
痩せるためには、以下のポイントに注意してください: 適切な食事: バランスの取れた食事を摂ることが重要です。食事の量を減らし、野菜や果物、たんぱく質を豊富に含む食品を選びましょう。また、加工食品や糖分の多い飲み物は避けるようにしましょう。 適度な運動: 適度な運動を取り入れることで、カロリーを消費し脂肪を燃焼させることができます。有酸素運動(ウォーキング、ジョギング、サイクリングなど)や筋力トレーニングを行いましょう。 水分摂取: 水分は新陳代謝を促進し、体内の老廃物を排出する役割を果たします。適切な水分摂取を心掛けましょう。 心の健康: ストレスや不安は食欲や代謝に影響を与えることがあります。リラックスする時間を作り、良い睡眠をとることも大切です。 継続と忍耐: 痩せるためには時間がかかることもありますので、継続と忍耐が必要です。一時的なダイエットではなく、健康的な生活習慣を身につけることが大切です。 ただし、個々の体質や健康状態によって最適な方法は異なる場合がありますので、専門家に相談することをおすすめします。
2.
了解しました。以下に、食事と運動の面でのアドバイスをお伝えします。ただし、具体的なプランを作成するためには、より詳細な情報が必要ですので、専門家と相談することをおすすめします。 食事面のアドバイス: カロリー制限: 1 日の摂取カロリーを減らすことが重要です。適切なカロリー制限の範囲内で、栄養バランスの取れた食事を摂るようにしましょう。 高タンパク質食品: タンパク質は満腹感を与え、筋肉の維持・修復にも重要です。鶏肉、魚、豆類などの高タンパク質食品を積極的に摂取しましょう。 野菜と果物の摂取: 食事には野菜と果物をバランス良く取り入れましょう。食物繊維やビタミン・ミネラルの補給に役立ちます。 糖分と加工食品の制限: 砂糖や加工食品はカロリーが高く、満腹感を得にくくなる傾向があります。できるだけ避けるようにしましょう。 運動面のアドバイス: 有酸素運動: 有酸素運動は脂肪燃焼に効果的です。ウォーキング、ジョギング、サイクリングなどの有酸素運動を週に 3〜5 回行いましょう。30 分以上の運動を心掛けてください。 筋力トレーニング: 筋肉を増やすことで基礎代謝が上がり、脂肪燃焼効果が高まります。ウェイトトレーニングや体重を使ったエクササイズを週に 2〜3 回行いましょう。 毎日の活動量を増やす: 毎日の生活の中で積極的に動くように心掛けましょう。階段を使う、歩いて買い物に行くなど、日常生活に運動を取り入れることが大切です。 以上が一般的なアドバイスですが、個別の状況によって適した方法は異なります。身体の健康状態や運動経験に応じて、専門家の指導を受けることをおすすめします。
思った以上に 1.のケースでも色々なアドバイスをされて驚きですが
2.のケースの方がやはり具体的なアドバイスをもらえている感じがあります。
プロンプトエンジニアリングの重要性
「なーんだ、ただ詳しく聞けばいいだけじゃん」と思われる方もいる方もいらっしゃいますが
聞き方に関しても色々なテクニックがあり、それを使いこなすことによって得られる回答の精度も大きく変わってくるのです。
以下のOpenAI社のセッション内でもこのプロンプトエンジニアリングの重要性が述べられています。
A Survey of Techniques for Maximizing LLM Performance
要約すると
- LLM の性能を最大化するには RAG や、Fine-tuning などの方法があるが、スタート地点としてはプロンプトエンジニアリングである。
- 常にプロンプトエンジニアリングから始めて、全員がこの原則を理解していることが重要である
ということであり、このプロンプトエンジニアリングを疎かにしてはいけないことが分かります。
環境
今回は Azure OpenAI のサービスを利用していきたいと思います。
モデルは gpt-35-turbo-16k を利用します。
ChatGPT を利用したり、別のモデルを利用した場合でも、問題なくプロンプトエンジニアリングの効果は得られます。
ただし、得られる回答が異なる場合がありますので、その点ご了承ください。
概要
基礎知識
このような Chat サービスを利用する場合として、
人間:「〇〇ですか?」
生成 AI:「×× です」
と対話するような利用方法をよく見ます。
ただし、これに限らず生成 AI モデルは、プロンプトのテキストに続く可能性が最も高い一連の回答を行おうとします。
例えば以下のような例を見てみたいと思います。
プロンプト
織田信長は戦国時代の
回答
武将であり、日本の戦国時代に活躍した有名な武将です。織田信長は、1534 年に生まれ、1582 年に暗殺されるまでの短い期間で日本史上に名を刻みました。 信長は、尾張国(現在の愛知県)の戦国大名であり、その勢力を拡大して近畿地方を支配しました。彼は数々の戦術や戦略を用いて、他の大名や武将との戦いで勝利を収め、領土を拡大していきました。
必ずしも「〇〇ですか?」と聞かなくても、プロントの内容をくみ取り、回答をしてくれます。
これから出てくるテクニックもこの基礎知識を活かす部分があるので、是非理解しておいてください。
テクニック
Instructions
一般的によく使われる「Instructions(命令)」のテクニックです。
簡単な例と複雑な例の 2 つを挙げます
・簡単な例
プロンプト
会社を紹介するメッセージを考えてください。
回答
ご挨拶いたします。私たちの会社は、革新的なソリューションを提供するテクノロジー企業です。 私たちは、お客様のビジネスの成長を支援するために、最新の技術と専門知識を駆使しています。 私たちの強みは、独自のアプローチと柔軟性にあります。 お客様のニーズに合わせてカスタマイズされたソリューションを提供し、より効率的で効果的なビジネス運営をサポートします。 また、常に最新のトレンドやテクノロジーの動向に目を向け、お客様に最先端のソリューションを提供することをお約束します。
・複雑な例
プロンプト
会社を紹介するメッセージを考えてください。会社の Vision と成り立ちに関する説明を加えてください。
回答
ご挨拶いたします。私たちの会社は、お客様のビジネスを革新し、未来に向けた成長を支援することを使命としています。 私たちのビジョンは、世界中の企業と個人が持つ潜在能力を最大限に引き出し、持続可能な社会の実現に貢献することです。 私たちの会社は、創業以来、革新的なソリューションを提供するために努力してきました。 過去の成功から得た経験と知識を活かし、常に最新のテクノロジーとトレンドに目を向けながら、お客様のニーズに合わせたカスタマイズされたソリューションを提供しています。
こうすることで、より求めている回答に近づくことができます。
要するに、「具体的に質問してね!」ということだと思います。
Primary Content
Primary Content は、プロンプトとして与えた内容自体に処理をしてもらうテクニックです。
プロンプトとして与えるテキスト自体が回答のコンテンツになっているため、Primary Content という名称がついていますね。
エンジニアだとコードの変換とかで使うかもしれませんね。
プロンプト
以下の C#のコードを TypeScript に変更してください。 public string Hello() { return "Hello world"; }
回答
以下が、C#のコードを TypeScript に変換したものです。 public hello(): string { return "Hello world"; } 以上が、C#のコードを TypeScript に変換したものです。 TypeScript では、関数に戻り値の型を指定するために string を追加しています。 また、public キーワードは TypeScript でも使用可能です。
コードの変換を正しく行ってくれました。 他にも
- プロンプトとして与えた文章の要約
- 翻訳(日本語 → 英語等)
などにもよく使われるテクニックかと思います。
Examples
Examples は、Few-shot Learning と呼ばれるテクニックの基本にあたるものです。
Few-shot Learning等の具体的な手法はまた続編で取り上げたいと思うので、今回は基本的な部分だけご紹介します。
(早く知りたい!という方は弊社 武井さんの記事をご覧ください。)
プロンプトの内容として事前に複数の例を伝えておき、その例に沿って回答してもらうテクニックになります。
プロンプト
りんご:赤 みかん:オレンジ ぶどう:紫 バナナ:
回答
黄色
こんな感じですね。
プロンプトから「果物:色」という法則を理解し、バナナの色の回答をしてくれています。
Cue
次の Cue は、プロンプトの回答の出力を誘導する方法です。
今回は例としてwikipedia から織田信長の情報を引っ張ってきて、その内容を要約してもらうことにします。
wikipediの[概要]の部分をプロンプトの冒頭として与え、それを要約してもらうことにします。
なお、この時に回答の出だしを指定しました。
プロンプト
[概要...] 上記の内容を要約してください。 また以下の文章から始めてください。 織田信長は桶狭間の戦いにおいて
回答
織田信長は、桶狭間の戦いにおいて駿河の今川義元を撃破し、尾張の統一を進めました。彼は尾張守護代の...(略)
指定した通りの出だしで回答を得ることができました。
このような指定をすることで、自分が得たい回答により近づくことができそうです。
なお、参考にしたドキュメントには、「また以下の文章から始めてください。」というワードがなくても実現できそうでした。
が、手元で
[概要...] 上記の内容を要約してください。 織田信長は桶狭間の戦いにおいて
とプロンプトを実行した場合は、出だしを無視して回答が行われてしまいました。
基礎知識のところで述べた部分とも相反する気もするのですが、日本語として何か影響があるのかもしれません。
Supporting content
こちらは、プロンプトの回答に影響を与えるような情報を与えてあげるテクニックです。
上で説明したPrimary Contentは、プロンプト自体がコンテンツでしたが
今回のSupporting contentはあくまで補助的な情報としてコンテンツを提供する形になります。
例えば以下のような形です。
・Supportなし
プロンプト
友人に赤ちゃんが生まれたのですが、出産祝いは何がいいですか?
回答
赤ちゃんの出産祝いとして選べるさまざまなアイテムがあります。以下は一部のアイデアですが、贈り手の好みや予算に合わせて選んでください。 ベビーギフトセット:ベビーケア用品やおむつなどがセットになったギフトセットは、便利で喜ばれるアイテムです。 おくるみやベビーブランケット:赤ちゃんが暖かく包まれるような柔らかいおくるみやブランケットは、実用的で可愛らしい贈り物です。 おもちゃ:赤ちゃんが遊べるおもちゃやぬいぐるみは、成長に合わせて楽しめるプレゼントです。 ベビーウェア:可愛らしいベビーウェアやボディスーツなども喜ばれるアイテムです。 赤ちゃんの成長の記録用品:記念日や写真を残せるフォトフレームやアルバムなど、赤ちゃんの成長の記録に役立つアイテムもおすすめです。 マタニティグッズ:ママのケアを考えて、マタニティ用品やリラックスグッズなどを贈るのも良いアイデアです。 また、赤ちゃんの性別や親の好みに合わせて、色やデザインを選ぶこともできます。最も大切なのは、心からのお祝いの気持ちを込めて贈ることです。
・Supportあり
プロンプト
友人に赤ちゃんが生まれたのですが、出産祝いは何がいいですか? 10月生まれで、予算は1万円以内です。
回答
友人の赤ちゃんの出産祝いとして、以下のアイデアがあります。予算が1万円以内であることを考慮し、可愛らしさや実用性を兼ね備えたアイテムを選んでみてください。 ベビーギフトセット:赤ちゃんのお風呂やスキンケア用品がセットになったギフトセットがあります。柔らかな肌触りのタオルやベビーソープ、ローションなどがセットになっているものを選ぶと良いでしょう。 ベビー服セット:可愛らしいベビー服のセットを贈るのもおすすめです。季節に合わせた素材やデザインを選ぶと良いでしょう。例えば、10月生まれあれば、秋らしい柄や色合いの服を選ぶと喜ばれるかもしれません。 おしゃぶりやスタイセット:おしゃぶりやスタイ、ベビーバンドなどがセットになったアイテムも人気があります。可愛らしいデザインや柄が多く、実用的な贈り物となります。 ベビーブック:赤ちゃんの成長やマイルストーンを記録できるベビーブックは、喜ばれるギフトの一つです。写真やメモリーを残すことができ、将来の思い出となります。 おもちゃ:柔らかいぬいぐるみや手触りの良いおもちゃは、赤ちゃんの興味を引きます。音が鳴るおもちゃや触ったり握ったりできるものを選ぶと良いでしょう。 これらのアイデアは、予算内で可愛らしさや実用性を考慮したものです。友人の好みや赤ちゃんの特性に合わせて選んでみてください。
このように補助的な情報を与えてあげることで、生成AIの回答としてもその情報に沿った回答をしてくれます。
Best Practice
これまで基本的なテクニックをつらつら書いてきました。
ただ困ったとことにプロンプトについて厳格なルール化ができるものではないですし、白黒はっきり良し悪しを決めれるものでもないです。
そこがプロンプトエンジニアリングの難しいところですね。
ただ、先ほどのOpenAIの動画やMicrosoftのページなどを見ると
基礎的な部分で気を付ける点としては
- 具体的に伝えること
- 分かりやすく伝えること
- 簡潔に伝えること
- 繰り返し伝えること
- 分割して伝えること
- 伝える順序
といった事かなと思います。
個人的な総括として、根底にある考えとしては「丁寧に伝えること」であると感じました。
小さな子供に物事を伝える気持ちでプロンプトを書くと、良い回答が得られるのではないかなと思いました。
まとめ
今回は生成AIを使いこなすための基本中の基本であるプロンプトエンジニアリングを取り上げました。
テクニックに関して曖昧な部分もあり、使いこなすのが難しい部分がありますが、基礎的な部分なので頭に入れておきたいところです。
もう少し踏み込んだ内容は続編に書きたいと思うので、こうご期待!
ではまた!