この記事は虎の穴ラボ Advent Calendar 2024の1日目の記事です。
こんにちは、虎の穴ラボの山田です。 虎の穴ラボでは、業務にOpenAI社のChatGPTを全社的に利用しています。 今回は「プロンプトエンジニアリングの基本」というタイトルで、ChatGPTの「プロンプトエンジニアリング」のポイントと、社内ブログチームがメンバーに提供しているプロンプトの実例を紹介したいと思います。
目次
プロンプトエンジニアリングとは
ChatGPTにおけるプロンプト(Prompt)とは、LLMに対する「回答を得るための指示」「入力情報」のことです。
このプロンプトを使って、より適切な回答、より望む回答を得るためのアプローチを「プロンプトエンジニアリング」と呼びます。
ポイント
まずはプロンプトエンジニアリングにおける、より適切な回答を得るためのポイントをいくつか紹介します。
1. 最新のモデルを使用する
- 基本的に最新モデルの使用が推奨されています
- コストや返答速度、質問内容により選択しましょう
- 現在は、以下のようなモデルが提供されています(2024年12月時点)
モデル名 | 説明 |
---|---|
GPT-4o | 複雑で多段階のタスクに対応するOpenAIのフラッグシップモデル |
GPT-4o mini | 高速で軽量なタスクに最適な小型モデル。この4つの中では最も安価です。 |
o1-preview | 複雑な推論を実行するために強化学習でトレーニングされた言語モデル |
o1-mini | コーディング・数学・科学で特に優れた言語モデル |
- 他にも多くのモデルが提供されています。詳しくは公式サイトを確認してください
2. プロンプトの最初に指示を書き、区切り文字を使って「指示」と「コンテキスト」を分ける
- 指示を最初に書きます
- 区切り文字を使って、「指示」と「コンテキスト(文脈や状況、脈絡、背景)」を分けると効果的です
- 区切り文字には#(ハッシュ)や"(ダブルクォーテーション)などが使用できます
例:
# 指示 以下のテキストを、最も重要なポイントの箇条書きリストとして要約してください。 テキスト: """ {ここにテキストを入力} """
3. 結果、長さ、形式、スタイルなどについて、具体的で詳細な指示を出す
- なるべく明確な指示を出します
- 出力が単純すぎる場合は、専門家レベルの文章を求めてみてください
- あなたはxxxの専門家です
- あなたはベテランのxxxです
- 出力が長い場合は、簡潔な返信を求めてみてください
- xxつあげてください
- xx文字以内に要約してください
- 回答するスタイルを指定することもできます
- フォーマルな文章で回答してください
- カジュアルな文章で回答してください
例:
# 指示 - あなたはWebサイト開発の専門家です - 以下のテキストを200文字以内に要約してください - マニュアルに記述する文章で回答してください テキスト: """ {ここにテキストを入力} """
4. 例をあげて望ましい出力形式を指示する
- 例を示して指示を出すことで、望む形式で回答を得られます。
- カテゴリー
- 実例
- デモンストレーション
例:カテゴリー
# 指示 知床半島に関する情報を以下のカテゴリーに分けて出力してください 位置: [位置] 所在: [所在] 面積: [面積] 生物: [生物] 自然の脅威: [自然の脅威] 保全活動: [保全活動]
例:実例
## 見出しだけで答えがわかる たとえば、「○○とは何か」「○○の特徴」だけだと、 具体的にそれが何なのかや、どのような特徴を持っているかは伝わらない。 次のように配下の見出しで説明することで、「○○とは何か」「○○の特徴」の答えまで伝えることができる。 """ 良い例)前述している用語について見出しで理解できる # Webページの速度とは何か ## ページロードの速度 ── ページが表示されるまでの速度 ## ランタイムの速度 ── ページ上での操作に対するUIの応答速度 """
例:デモンストレーション(首都の推測)
アメリカ//ワシントンD.C インド//ニューデリー エジプト//カイロ 日本//
5. 簡単な指示から始めて、徐々に指示を増やし、微調整を繰り返す
- 「Zero-shot prompting」というのは出力例の指示の無いプロンプトのことです
- 「Few-shot prompting」というのは出力例やデモンストレーションのあるプロンプトのことです
- まずは簡単な指示(Zero-shot prompting)で回答を求めます
- 適切な回答が得られない場合は、コンテキストを追加した指示(Few-shot prompting)を試します
- それでも適切な回答が得られない場合は、指示やコンテキストの微調整を繰り返します
6. 「リーディングワード」を使用して、回答して欲しいパターンに誘導する
- 入力データに特定のキーワードやフレーズを追加して指示することで、求める回答を得ることができます
- Pythonのソースコードが欲しければ「import」を追加
- SQLが欲しければ「SELECT」を追加
例:
# 簡単なPython関数を書いてください。 # 1. マイルの数値を尋ねます。 # 2. マイルをキロメートルに変換します import
7. 複雑な指示は、より単純な指示に分割する
- 複雑な指示により回答が複数返されるような指示は、単純な指示に分割して指示を出してみてください
- 長大な指示は段階的に指示を出して、応答を繰り返して回答を得るようにしてみてください
8. モデルに「考える」時間を与える
- あまり適切な回答が得られない場合、以下のような指示を付け加えることで回答が変化することがあります
- 「よく考えて回答してください」
- 「熟考して回答してください」
参考資料
「プロンプトエンジニアリング」については、ネット上に多数のドキュメントが存在します。今回紹介した内容は、主に以下のドキュメントを参考にさせていただきました。
社内の実例
虎の穴ラボには、この技術ブログを管理するブログチームというのが存在します。
ここに所属するメンバーがブログ投稿の手助けとなるようなプロンプトを作成していますので、今回はこちらを実例として紹介します。
1. 箇条書きから記事構成の提案
記事にしたい内容をプロンプトに箇条書きで示すと、ブログの構成を提案してくれるプロンプトです。 プロンプトの説明には「制約条件」に項目を追加すると、より欲しい出力に近づくことが書かれています。
# 命令書 あなたはプロの技術ブログ編集者です。 以下の制約条件と入力をもとに、最高のブログ記事を出力してください # 制約条件 - 10分ほどで読める技術記事 - 重要なキーワードを取り残さない - 章タイトルは章の内容を具体的で簡潔に分かるものにする - 文章は分かりやすく簡潔に *** 好みで条件を追加すると欲しい出力に近づく *** - 読みたくなるキャッチーなタイトル - 実装例を交えて具体的に解説 *************************************** # 入力 {ここにブログで伝えたいことや注意点などを箇条書きで書きます} ********************************* # 出力
例えば、以下のようにプロンプトに入力して使用します。出力例は長くなるため省きますが、試せる環境がある場合はぜひ試してみてください。
# 命令書 あなたはプロの技術ブログ編集者です。 以下の制約条件と入力をもとに、最高のブログ記事を出力してください # 制約条件 - 10分ほどで読める技術記事 - 重要なキーワードを取り残さない - 章タイトルは章の内容を具体的で簡潔に分かるものにする - 文章は分かりやすく簡潔に *** 好みで条件を追加すると欲しい出力に近づく *** - 読みたくなるキャッチーなタイトル - 実装例を交えて具体的に解説 *************************************** # 入力 ## 伝えたいこと - HTMLネイティブのdialog要素を用いたモーダルダイアログの実装方法 - dialog要素を用いると実装がシンプルになるメリット - dialog要素で実装する際の注意する点 ## dialog要素で実装する際の注意する点 - dialog要素は開く/閉じるを切り替えてもDOMに存在しているので、マウント/アンマウントは発火しない - dialog要素は閉じる際にcloseイベントを発火するが、開く際に発火するイベントはない - dialog要素のopen属性は読み取りのみで扱うことを推奨 - escキーで閉じる仕様がデフォルトで含まれている ********************************* # 出力
2. タイトルの提案
ブログの本文をプロンプトに含めて実行することで、タイトルを提案してもらえるプロンプトです。 評価観点や制約条件を指定することで、より適切な出力を得られるようになっています。
# 命令書 - あなたはベテランのWebエンジニアです。 - プロのWebライターとしても活躍しています。 - 【本文】の内容から【タイトルの評価観点】を満たすタイトルを5つ提案してください。 - 全ての出力内容において、【制約条件】を必ず守ってください。 # タイトルの評価観点 - SEOの観点で評価してください。 - タイトルは45文字以内にしてください。 - 読者の興味を引くタイトルにしてください。 - 読者はWebエンジニアを想定しています。 # 制約条件 - 修正後の文章は出力しないでください。 - 【理由】と【おすすめポイント】は必ず簡潔に出力してください。 - 必ず日本語で回答してください。 # 入力文 ## 本文 {ここにブログの本文を書きます} # 出力文 ## タイトルについて ### タイトル案 | No. | タイトル案 | おすすめポイント | |----------------|---------------|----------------| | 1 | | | | 2 | | | | 3 | | | | 4 | | | | 5 | | |
例えば、こちらのブログ記事の本文を使用した場合、以下のような回答が得られました。
タイトル案
No. | タイトル案 | おすすめポイント |
---|---|---|
1 | 科学的根拠で証明された効果的な勉強法とは? | 読者の興味を引きつつ、科学的根拠に基づいた内容が伝わる |
2 | エンジニア必見!効率的な勉強法を徹底解説 | ターゲット層に具体的なメリットを提示 |
3 | 効果の高い学習法と低い学習法を科学的に解説 | 比較的なアプローチで読者の好奇心を刺激 |
4 | 記憶に残る!エンジニア向けおすすめ勉強法3選 | 実践的な情報が得られることを示唆 |
5 | モチベーションアップ!エンジニアのための学習法特集 | モチベーションと学習法の組み合わせで興味を引く |
理由とおすすめポイント
・科学的根拠で証明された効果的な勉強法とは?
・理由: 科学的根拠という信頼性のある情報を提供することで、読者の信頼を得る。
・おすすめポイント: 読者の興味を引きつつ、内容が具体的で信頼できることをアピールできる。
・エンジニア必見!効率的な勉強法を徹底解説
・理由: エンジニアにとっての実践的な価値を明示することで、クリック率が向上する。
・おすすめポイント: 読者に具体的なメリットを伝え、内容に対する期待感を高める。
・効果の高い学習法と低い学習法を科学的に解説
・理由: 学習法の効果を比較することで、読者の好奇心を刺激する。
・おすすめポイント: 比較的なアプローチが、読者の関心を引きやすい。
・記憶に残る!エンジニア向けおすすめ勉強法3選
・理由: 数字を用いることで具体性が増し、読者に実践的な情報を提供することを示唆する。
・おすすめポイント: 短くて覚えやすく、実践的な内容が得られることをアピール。
・モチベーションアップ!エンジニアのための学習法特集
・理由: モチベーションと学習法を組み合わせることで、読者の興味を引く。
・おすすめポイント: エンジニアにとって重要なモチベーションに焦点を当てることで、内容の関連性を強調。
終わりに
普段は簡単なプロンプトを使うことがほとんどで、それほど複数の指示や細かい条件を付けることは無かったように思います。 最近、改めて「プロンプトエンジニアリング」について見直してみて、使い方を考えるきっかけになりました。 今後は色々試してみたいと思います。
採用情報
虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp