Closed1

Prompt Engineering

柊

プロンプトエンジニアリングの概念

  • Prompt Processing
    • より具体的に状況を書く
    • 指示を明確に
  • Few-shot Learning
    いくつかの質問と回答例を例示
  • Chain of Thought
    中間的な推論ステップを設ける、もしくは「段階的に考えよう」と指示することで、複雑な問題でもGPTが推論できるようになる性質
  • Self Consistency
    CoTの応用。
    自身で考えるための思考過程のパターンを複数生成。
  • Reacursively Criticizes and Improves
    GPT自身に出力の再帰的な修正をさせる。
    特にプログラミングなどコンピュータ言語の生成において有効。
    複数の異なる観点で何度か修正することも。
  • ReAct
    GPTに目的達成のための必要なタスクを検討(Reasoning)させ、外部APIへのアクセス(Act)した結果をプロンプトに付与することを繰り返し、目的までの複数タスク選択の精度を強化する。

OpenAI ChatGPTのプロンプトエンジニアリングのベストプラクティス

  1. 最新のモデルを使用する
  2. プロンプトの最初に指示を書き、###や”””を使って指示とコンテキストを区切る
  3. 望ましいコンテキスト、成果、長さ、形式、スタイルなどについて、具体的かつ説明的で、できるだけ詳細に説明する
  4. 欲しい出力形式を明確にする
  5. あいまいで不正確な説明を減らす
  6. ChatGPTにやってほしくないことを伝えるだけでなく、代わりに何をすべきかを伝える
  7. コード生成に特化-モデルを特定のパターンに誘導するために「リーディングワード(先行する単語)」を使用する

GitHub Copilot tips

  • 変数名:自分の意思が伝わるように分かりやすい変数名を利用
    total_attendees = 5
  • メソッドシグネチャー:明確なパラメータ名や型をメソッドシグネチャーで定義
    calculateAverage(intnum)
  • 命名規則:変数名や関数名を規則的につける
    変数名では必ずcamelCaseを利用
  • 入力・出力の型
    「入力値として文字列型の配列を使い、回文である場合はtrueのブーリアン型を返す関数を作成して」
  • エラー処理:必要な場面を明確に説明
    「整数型の入力値が空の場合はexit処理を行い、入力値が整数でない場合はエラーを発生させて」
  • 制御構造
    「整数の配列を入力値としてある場合、最初の素数を返すwhile文を作成して。素数が配列にない場合はそのままループからexitするように処理して」
  • ファイルの文頭に要件のハイレベルな説明文を含め、そのあとに明確な手順を記載する
  • プロンプトにいくつかの例を含める
  • 操作中のファイルの要件に関連するプロジェクト内の別ファイルを開いたままにする
  • 最初に成功しなかったらもう一度試す!
  • モデルに(人間の)名前を付けて呼ぶだけで、 F1 スコアが 0.6pts 上昇しました。
  • 参照したい 他の拡張子のファイル (例: .md, .csv) がある場合は、コピーしてコメントアウトする
  • 詳細な対話のために、役割を定義することができます:
# Roles: copilot
#   Python のエキスパートで 15 年以上の経験があります
# Role: me
#   中堅エンジニア
#
# me: このループを最適化する最良の方法は何ですか?
# copilot: ベクトル化されたアプローチを使用するか、中間結果をキャッシュすることを検討してください。
  • コードのコメントを読ませる→CopilotChatでテストケース作成→CopilotChatのテストケースを参考にテストコードでコメントを作成する→コメントを元にGitHub Copilotが提案してくる

tips

  • 回答にたどり着くまでのステップを具体的に記載する
  • 具体例を入力する
  • 英語で質問する
  • 期待する役割を明示する
  • 出力時の制約を記載する
  • プロンプトに含める指示内容と文脈(情報)を記号などで明示的に分ける
  • 出力形式やお手本を予めプロンプトに含める
  • 追加質問
    「情報が足りていない場合は聞いてください」
  • テキスト補完
  • 主語や目的語が欠落しない文章
  • プロンプトテンプレートの活用
  • GPTによる校正
    GPTに回答させる前に、まずGPTが解釈しやすい文にGPTに直させるステップを組み込む
  • GPTにコードを推薦してもらう→GPTに質問をするのループ
    • 分かるまで聞き直す
    • 説明に矛盾があれば指摘する
  • コメントで実装内容を記述
  • 参考にしたいコードをコメントとして貼っておく
  • 参考にしたいコードの下にそれっぽい変数名を定義する
    文脈が非常に大切なので必要な情報を明確に渡す
  • 生成されたコードをベースに実装を拡張
  • ロール設定
    「あなたは優秀なソフトウェアエンジニアであり、あらゆるプログラミングとソフトウェア開発の問題について専門的な助言を提供できます。」
    「あなたは経験豊富なエンジニアとして、複雑な技術的な問題について解答し、助言を提供する役割を果たします。」
    「私は初級者ソフトウェアエンジニアです。あなたは優秀なソフトウェアエンジニアであり、あらゆるプログラミングとソフトウェア開発の問題について専門的な助言を提供できます。初級者エンジニアに教えるのが好きで得意でもあります。回答の際は、ただ質問に対して回答するだけではなく、もし相手の考慮が足りないものがあれば、積極的にやるべきことや考えるべきことを提案したり、あなたから相手に質問をすることで相手の成長や目標達成を助けます。」
  • 「正しい答えを得るために、ステップバイステップで考えてみましょう。」
  • LLMは日時の概念がないため、「今日は○年○月○日です」と渡すと会話の質があがることも。
  • 1回1回の指示を、細切れに分けてかつ詳細に説明する。
  • 指示の前に、依存関係のあるファイルをファイル名付で覚えてもらう。
  • 追加質問「情報が足りていない場合は聞いてください」
  • コーディング規約を与えた後に具体的に指示する
今後の回答は下記の文脈に従って行なってください。
 
Context: """
TypeScriptでプログラミングしてください。
 
下記のコーディング規則に従ってください。
- 型アノテーションはすべてanyにしてください。他の型は使用禁止です。
- 関数名は全てsnake caseを使ってください。
- 変数名は全てsnake caseを使ってください。
 
可能な限りコーディング規則に従ってください。
"""
下記の関数を実装してください。

1. 1つの文字列を受け取って、文字列内にある数値を正規表現を使って抜き出します。

2. 抜き出した数値をnumber型に変換します。

3. もっとも大きい数値を関数の返り値とします。

入力例

  • 高速化・リファクタリング・バグを見つけてもらう・コード内容を説明・エラーを教えて・コメントを付記・コードレビュー・テストケース作成・ダミーデータ作成・テストを書いてもらう
    「下記の○○言語のコードを高速化してください。」
    「下記の○○言語のコードをリファクタリングしてください。」
    「下記は○○言語のコードです。バグをみつけてください」
    「下記は○○言語のコードです。何をしているのか説明してください」
    「下記のエラーが出ました。どうすればいいですか?」
    「下記の○○言語のコードにコメントを付加してください」
    「下記の○○言語のコードについて、問題や改善すべき点がありますか?」
    「テストケースの設計をお願いします。表形式で出力してください。また、正常系、異常系、境界値など、テストケースのカテゴライズもお願いします」
    「{HTMLのコード<form><label>年齢</label><label>名前</label></form>}以下のバリデーションがあります。年齢は20以上、名前が1文字以上10文字以下 ダミーデータを表/json形式で10個作成してください」
    「以下項目で全組み合わせを作成してください 項目1:a,b 項目2:あ、い 項目3:A,B」
    「下記の○○言語の関数に対するJestを使用したテストコードを作成してください」
  • 変数名や関数名を考えてもらう
  • ライブラリの使い方や落とし穴について教えてもらう
    「ReactのuseEffect()の使い方と落とし穴を教えて」
  • SQLを書いてもらう
下記のデータベーススキーマがあります。この時、名前が"山田"で始まる人のうち、年齢が30歳以上のアカウントの好きなエディターを抜き出すSQLを書いてください。
 
Schema: """
 
CREATE TABLE account(
 
    id INTEGER,
 
    attr1 INTEGER NOT NULL,
 
    /* 好きなエディター */
 
    attr2 VARCHAR(255) NOT NULL,
 
);
 
CREATE TABLE profile(
 
    account_id INTEGER,
 
    name varchar(255),
 
    age integer,
 
    constraint fk_person_id foreign key(person_id) references account(id)
 
);
 
"""
  • 以下の【TypeScriptコード】を覚えてください。ファイル名は○○.tsです。
  • 以下の【テストケース】を覚えてください。
    【テストケース】にあるテストケースについて、○○.tsのテストコードを作成してください。
    制約条件
    • テストコードはJest(テスティングフレームワーク)を使って実行します。
    • 外部のAPI呼び出しは、モックを使用します。
    • Reactコンポーネントのテストでは、コンポーネントを操作したテストができるよう、React Testing Libraryを使用します。
  • テストコードに以下のエラーがあります。エラーの原因とコードの改善案を出してください。

パラメータ

Temperature - 簡潔に言うと、この値が低ければ低いほど、最も確率が高い回答が常に選ばれるため、結果はより決定論的になります。この値を上げると、ランダム性が増し、より多様で創造的なアウトプットが可能になります。つまり、他の回答の可能性のある重みを増やすことになります。応用例としては、事実に基づくQAなどでは、この値を低くして、より事実に基づいた簡潔な回答を促すとよいでしょう。逆に、詩の生成やその他の創造的なタスクでは、temperatureを上げると効果的かもしれません。

memo

  • GPTの出力に対して「○○をした理由はなんですか」と聞くと、「すみません。○○したのは誤りでした。正しくは◆◆です」と言われる。「理由は何ですか」は出力結果に対する否定的な反応だと思われている?
  • 理由が聞きたいときは、「○○をするか迷っています。○○をした方がよい理由としない理由をそれぞれあげてください」というと、それぞれの理由をあげてくれ、結論もくれる。
  • GPTにたくさんプロンプトを入力すると前に入力した情報を忘れてしまうのは
    →ChatGPTの特性のようです。現在使用しているモデルのGPT-4-32kの最大トークン数は32768なので、この数を超えると会話の内容を忘れてしまうようです。

参考になりそうな情報

【プロンプトエンジニアリング】
ChatGPTは馬鹿じゃない! 真の実力を解放するプロンプトエンジニアリングの最前線
ChatGPT - Azure OpenAI 大全
【GPT-4】プロンプト内プログラム×再帰処理×焼きなまし法をやってみた / 一定の確率でチルノ参上! - Qiita
日本語で解説!Best practices for prompt engineering with OpenAI API
【最強ロール】ChatGPT(BetterChatGPT)のロール設定(例:優秀で説明上手なエンジニア)CustomInstructions

ChatGPT for Developer - Promptのチカラ

Prompt Engineering Guide – Nextra

【導入事例(GitHub Copilot)】
サイバーエージェントのGitHub Copilot導入と 開発生産性
サイバーエージェントのGitHub CopilotのAnalyticsデータを公開!利用開始から約3ヶ月でエンジニアの生産性は向上したのか? | CyberAgent Developers Blog

このスクラップは2024/03/25にクローズされました