OpenAI公式オススメ!プロンプトエンジニアリングの8つのコツ

元記事:Best practices for prompt engineering with OpenAI API


OpenAIは、APIでプロンプトエンジニアリングを行う際に役立つベストプラクティスをまとめています。「APIを使う場合」についての解説ですが、一般のプロンプトエンジニアリングにも参考になります。

早速、OpenAIが公式におすすめする「プロンプトエンジニアリングの8つのコツ」を見てみましょう。


プロンプトエンジニアリングの8つのコツ


  1. 最新のモデルを使用する
  2. プロンプトの先頭に指示を入れ、##や"""で指示と文脈を区切る
  3. 望ましい文脈、成果、長さ、形式、スタイルなどについて、具体的かつ説明的で、できるだけ詳細に説明する
  4. 望ましい出力形式を明確にする
  5. ゼロショットから始め、次にフューショット、それでもうまくいない場合にはファインチューン
  6. "ふわっと"した曖昧な記述を減らす
  7. やってはいけないことを言うのではなく、代わりに何をすべきかを伝える
  8. (コード生成の場合)モデルを特定のパターンに誘導するための「リーディングワード」を使用する



1. 最新のモデルを使用する

当然ですが、まずは最新のモデルを使用しているか確認しましょう。

ChatGPTであればGPT-4が最新です。

APIであれば既に使用許可が出ていればGPT-4、まだであればGPT-3.5です。

APIでGPT-4を使用できるよう申請するにはこちら

https://openai.com/waitlist/gpt-4-api

出力の品質についてGPT-3系とGPT-4との間には雲泥の差がありますので、必ず最新のモデルを使用しましょう。

2. プロンプトの先頭に指示を入れ、##や"""で指示と文脈を区切る


イマイチ❌:
以下の文章を、最も重要な点を箇条書きにして要約してください。

{ここにテキストを入力}
Good✅:
以下の文章を、最も重要な点を箇条書きにして要約してください。

テキスト: """
{ここにテキストを入力}
"""

3. 望ましい文脈、成果、長さ、形式、スタイルなどについて、具体的かつ説明的で、できるだけ詳細に説明する

文脈、成果、長さ、形式、スタイルなどについて、具体的に説明してください。
イマイチ❌:
OpenAIについて詩を書いてください。
Good✅:
OpenAIについて、最近のDALL-E(DALL-Eはテキストから画像へのMLモデル)の製品発表に焦点を当て、{有名な詩人}のスタイルでインスピレーションを与える短い詩を書いてください。

4. 望ましい出力形式を明確にする

イマイチ❌:
以下のテキストに記載されている要素を抽出してください。会社名、人名、特定の話題、テーマの4種類の要素を抽出してください。

テキスト: {テキスト}
見せる、そして伝える - 特定のフォーマット要件を示すと、モデルはよりよく反応します。また、プログラムによって複数の出力を確実に解析することが容易になります。
Good✅:
以下のテキストに記載されている重要なエンティティを抽出してください。まずすべての会社名を抽出し、次にすべての人名を抽出し、次に内容に合った特定のテーマを抽出し、最後に一般的な包括的テーマを抽出してください。

希望する形式
会社名:<コンマで区切られた会社名のリスト>。
人名: -||-
具体的なトピック-||-
一般的なテーマ: -||-

テキスト: {テキスト}。

5. ゼロショットから始め、次にフューショット、それでもうまくいない場合にはファインチューン

✅ ゼロショット
以下のテキストからキーワードを抽出してください。

テキスト: {テキスト}

キーワードは
✅ フューショット(Few-shot) 参考としていくつかの例を提供します
以下の対応するテキストからキーワードを抽出してください。

テキスト1:Stripeは、Web開発者がWebサイトやモバイルアプリケーションに決済処理を組み込むために使用できるAPIを提供している。
キーワード1:Stripe、決済処理、API、Webデベロッパー、Webサイト、モバイルアプリケーション
##
テキスト2:OpenAIは、テキストの理解と生成に非常に優れた最先端の言語モデルを訓練している。私たちのAPIはこれらのモデルへのアクセスを提供し、言語処理を伴うほぼすべてのタスクを解決するために使用することができる。
キーワード2:OpenAI, 言語モデル, テキスト処理, API.
##
テキスト3:{text}。
キーワード 3:
✅ ファインチューン:ファインチューンのベストプラクティスをこちらでご覧ください。

6. "ふわっと "した不正確な記述を減らす

イマイチ❌:
この製品の説明文は、かなり短く、数文のみで、それ以上にはならないようにします。
Good✅:
この製品について、3~5文の段落で説明してください。

7. やってはいけないことを言うのではなく、代わりに何をすべきかを伝える

イマイチ❌:
以下は、エージェントとお客様との会話です。ユーザー名やパスワードを尋ねないでください。繰り返さないでください。

お客様: 自分のアカウントにログインできないのですが。

エージェント:
Good✅:
以下は、エージェントとお客様との会話です。エージェントは、問題の診断と解決策の提示を試みますが、個人情報に関連する質問は控えてください。ユーザー名やパスワードなどの個人情報を尋ねる代わりに、ヘルプ記事(www.samplewebsite.com/help/faq)を紹介してください。

お客様: 自分のアカウントにログインできないのですが。

エージェント:

8. (コード生成の場合)モデルを特定のパターンに誘導するための「リーディングワード」を使用する

イマイチ❌:
# 以下のようなシンプルなpython関数を書きます。
# 1.マイルで数字を聞いてみる
# 2.マイルをキロメートルに変換してくれる
以下のコード例では、"import"を追加することで、モデルがPythonで記述し始めることを示唆しています。(同様に "SELECT "はSQL文の開始を示す良いヒントとなります)。
Good✅:
# 以下のようなシンプルなpython関数を書きます。
# 1.マイルで数字を聞いてみる
# 2.マイルをキロメートルに変換してくれる

import



ChatGPTの対話に最新のWebを反映させようというChrome拡張「WebChatGPT」

WebChatGPT
https://chrome.google.com/webstore/detail/webchatgpt-chatgpt-with-i/lpfemeioodjbpieminkklglpmhlngfcn/related?hl=ja

ChatGPTの対話に最新のWebを反映させようというChrome拡張

おすすめ度:△

概要と特長

仕組みとしては、ユーザーが投入した検索文字列を一旦WebChatGPTで受けて検索し、その検索結果を含むプロンプトを生成してChatGPTに渡すというものです。

検索エンジンはDuckDuckGo(!)を使用します。

スタンドアロンで動きプライバシーを侵害しないのがウリであると謳っています。

また、本家ChatGPTのサイト上で動作するChrome拡張なので、ProアカウントならGPT-4が使えます。

また使用するかどうかをその都度切り替えたり、プロンプトに含める検索結果の数、地域、時期を変更することができます。

ChatGPTに投入するプロンプト自体をカスタマイズすることもできます。

履歴がChatGPT本体で管理されるのも嬉しいですね。

Webアクセスをオフにすることもできるので、不要な場合にはオフにしたり、必要なときだけオンにしたりといった使い方ができます。

使用を特におすすめしない理由

  • 検索結果の品質が高くない
  • これは使用する検索エンジンに由来するので酷ではあります
  • 検索結果の是非について検討があまりなく、その内容に引きずられがち
  • 検索結果を要約する仕組みになっているのが理由。
  • プロンプトのカスタマイズで幾分改善する可能性はあります
  • Bingで似たようなことはできる

まだまだ荒削りではありますが、アイデアは面白いChrome拡張だなと思います。

外部ディスプレイの明るさをキーボードで調節できない(Karabiner-Elements)

環境
ソフト
  • Karabiner-Elements
ハード
  • Mac Studio
  • Studio Display
  • Magic Keyboard

状況
通常、MacであればF1, F2キーで明るさ調整ができるが、できない
Karabiner-Elementsを使わない場合には調整可能

対処
Karabiner-Elementsの設定を調整する

詳細
display_brightnes_increment/decrement になっているのを
brightness_down/brightness_up にする

備考
謎にbrightness_down(2)/brightness_up(2) という選択肢もあった。場合によってはこれが正解になるのかもしれない。



bad object refs/stash, repository did not send all necessary objects

git fetchpullができません。--prune オプションを付けても以下のようなエラーメッセージが出て何もできませんでした。

fatal: bad object refs/stash
error: github.com:organization/repository.git did not send all necessary objects

以下のコードを実行すると解決しました

git rm .git/refs/stash

参考:git fetchしようとしたら fatal: bad object refs/heads/master 2 - Qiita

DDD in Scala に関するメモ

マイクロサービス化するならScalaでなくてもよい
  • 型を共有できない、共有するのが大変なのでScalaのメリットがあまりない
  • Scalaやるならモジュラーモノリス
    • sbtのサブプロジェクト機能が便利

    TDDに関する所感

    静的型付け言語との相性について
    • そこまでではない
    • 解決しようとしている問題領域が多少重なっている気がする
      • 特定の時点における整合性(コミット時点の整合性)
        • 静的型はこちらに強い
        • テストはこちらに弱い
      • 変化に対する整合性(コミット前後の整合性)
        • 静的型はこちらに弱い
        • テストはこちらに強い
    • 思考・開発フローとの折り合いがそれほど良くない
      • 差分ごとに型を変えるのが手間
  • 最小手数で書いて通すので局所最適に陥りそう
    • bad practiceルートに入りそう
  • 時間不足や割り込み作業などでblush upが足りないままマージされる恐れ
  • 手作業が多い
  • 先に要求に関するテストを書き、実装に関しては静的型で検査するのがよさそう

  • org.scalatest.concurrent.ScalaFutures について

    ScalaFuturesとは
    • お手軽にAwaitしてくれるやつ
      • Await.ready(scalaFuture, Duration.fromNanos(config.timeout.totalNanos)).eitherValue.get
    • implicit conversion用メソッド

    AsyncTestSuite とは
    • Future.map 内での評価も有効にしてくれるやつ
    • executionContextを提供してくれるやつ

    AsyncTestSuiteとScalaFuturesとの関係
    • AsyncTestSuiteを使っている限りはScalaFuturesに頼る必要はない
    • AsyncTestSuiteを使っている場合にScalaFuturesを併用するべきでないか?
      • 一般的には問題ない

    CircleCIからHerokuにデプロイできない

    CircleCIからHerokuへのデプロイが失敗してしまう。
    • "Invalid credentials provided." と言われる

    エラーメッセージは以下。

    (Compile / deployHeroku) com.heroku.api.exception.RequestFailedException: Unable to list config failed. statuscode:401 responseBody:{"id":"unauthorized","message":"Invalid credentials provided."}

    原因は Credentials、つまりHerokuから取得したAPI Keyが古かった。おそらくはHeroku側の都合でパスワードがリセットされたのか、一旦ログインできなくなっていたのでその影響か。

    アカウント設定ページ(https://dashboard.heroku.com/account)からAPI Keyを再取得し、CircleCIの環境変数に設定して完了。デプロイできるようになりました。

    ScalaTestのAsyncTestSuiteとAkkaのTestKitとの相性が悪い

    要旨
    • ScalaTestは非同期でのテスト用にExecutionContextを提供するAsyncTestSuiteが用意されている
      • AsyncFunSpecなど
      • org.scalatest.concurrent.SerialExecutionContext
    • Akka TestKitにはテスト用のExecutionContextが供給されている
      • akka.testkit.CallingThreadDispatcher
    • SerialExecutionContextからCallingThreadDispatcherを呼ぶとデッドロックする(逆も然り)

    IntelliJ IDEAのScalaプラグインのsbtシェルのヒープサイズを設定する

    sbtシェルは便利ですが、ヒープサイズが小さくてOutOfMemoryErrorが出てしまう場合があります。

    そのようなときはIntelliJの設定画面からsbtの設定を開き、最大ヒープサイズを適切な値に設定します。

    これによってsbtの起動時に-Xmxが指定した値に設定されるので、メモリ不足が解消します。