Brex's Prompt Engineering Guide

What is a prompt?

  • プロンプト(コンテキストと呼ばれることもある)は、モデルが出力を生成し始める前に提供されるテキスト
  • Hidden Prompts
    • モデルとのチャットなど、ユーザがモデルと動的に対話するアプリケーションでは、通常、プロンプトには、ユーザが見ることを意図していない部分がある。これらの隠された部分はどこにでも発生する可能性がありますが、ほとんどの場合、会話の開始時に隠されたプロンプトがあります。
    • ⚠️ Always assume that any content in a hidden prompt can be seen by the user.
  • Tokens
    • 言語モデルの消費単位は「単語」ではなく、「トークン」
  • Token Limits
    • 主要な言語モデルアーキテクチャであるトランスフォーマーの入力と出力のサイズが固定されている
    • プロンプトの総サイズは、「コンテキスト・ウィンドウ」と呼ばれることもあるが、モデルに依存し、GPT-3では4096トークン。GPT-4では8,192トークンか32,768トークンです。
    • トークン数を数える方法
      • OpenAI has a library called tiktoken that you can use with their models. If you’d like an approximation without having access to a tokenizer,  will give a rough, but better than you’d expect, approximation for English inputs.

Why do we need prompt engineering?

  • 言語モデルに私たちが望むことをさせるためにプロンプトを書く技術であり、ソフトウェアエンジニアリングがコンピュータに私たちが望むことをさせるためにソースコードを書く技術であるのと同じ
  • 良いプロンプトを書くには、扱うモデルの特異性を考慮しなければならない
  • Give a Bot a Fish
    • 隠されたコンテキストの中で、ボットに要求されたタスクを実行するために必要なすべての情報を、ボットに明示的に与えることができるシナリオ
    • 例えば、ユーザーがダッシュボードを開き、どんなタスクが残っているのか、ちょっとしたフレンドリーなメッセージを表示したい場合、inboxの内容を全部ボットに渡すことで次のように要約させることができます。
    • Semantic Search
      • 世界についてもう少し詳しく知る必要がある場合、一般的なアプローチはセマンティック検索を実行すること
      • セマンティック検索は、ドキュメント埋め込みを中心に展開される手法です。ドキュメント埋め込みは、固定長の数値の配列と考えることができます。各数値はドキュメントのある側面を表しています。ユーザーのクエリに対しても同じ関数を使用して埋め込みを計算することができます。ユーザーのクエリと類似した埋め込みを持つドキュメントを探し、そのドキュメントや要約をボットが参照できる隠されたコンテキストに配置します。しかし、ユーザーのクエリが短い場合には、埋め込みがあまり有用ではありません。そこで、"Hypothetical Document Embedding"またはHyDEと呼ばれる賢明な技術が利用されます。この技術では、ユーザーのクエリに対して仮想のドキュメントを生成し、そのドキュメントの埋め込みを計算します。これにより、モデルは架空のドキュメントを作り出し、それを元に関連するドキュメントを見つけることができます。
      • HyDE技術は、モデルへの呼び出し回数が増えますが、多くのケースで結果が著しく向上します。この手法を使用することで、より精度の高い検索結果を得ることができます。セマンティック検索の応用範囲は広く、科学のドキュメントからアートのドキュメントまで、さまざまな分野で活用されています。また、ユーザーのクエリに応じてドキュメントを生成することも可能であり、ボットが自身のリサーチアシスタントとして機能することもあります。
       
  • Teach a Bot to Fish
    • レシートにメモを追加したり、グラフをプロットしたりするように、ボットにユーザーの代わりにアクションを実行させたい時はボットに魚の釣り方を教える必要がある
    • Command Grammars
      • 例えば、"plot-the-last-days-of-expenses "というコマンドをボットに与えても、ボットがそのコマンドでできることは柔軟でもなんでもない。
      • 同様に、draw-pixel-at-x-y [y] [rgb]というコマンドはあまりにも低レベルです。
      • しかし、botにplot-expensesコマンドとlist-expensesコマンドを与えることで、botがある程度柔軟に使える良いプリミティブを提供することができます。
      • CommandArgumentsDescription
        list-expensesbudgetReturns a list of expenses for a given budget
        conversemessageA message to show to the user
        plot-expensesexpenses[]Plots a list of expenses
        get-budget-by-namebudget_nameRetrieves a budget by name
        list-budgetsReturns a list of budgets the user has access to
        add-memoinbox_item_id, memo messageAdds a memo to the provided inbox item
      • この表をMarkdown形式でモデルに提供すると、言語モデルは驚くほどうまく処理する。おそらくOpenAIがGitHubのデータを多用して学習しているからだろう。
      • 🧠 There are some interesting subtle things going on in that example, beyond just command generation. When we ask it to add a memo to the “shake shack” expense, the model knows that the command  takes an expense ID. But we never tell it the expense ID, so it looks up “Shake Shack” in the table of expenses we provided it, then grabs the ID from the corresponding ID column, and then uses that as an argument to .
      • 複雑な状況下でコマンド文法を確実に機能させるのは難しいことだ。そこで私たちができる最善の手段は、多くの説明と、できる限り多くの使用例を提供すること
      • 一般的に、例文を多く提供すればするほど、学習効果は上がりますが、トークンの予算も減ってしまうので、バランスを取る必要があります
      • もっと複雑な例(typescriptでoutputのjsonを定義している)
      • full prompt
    • ReAct
      • In March of 2023, Princeton and Google released a paper “ReAct: Synergizing Reasoning and Acting in Language Models”, where they introduce a variant of command grammars that allows for fully autonomous interactive execution of actions and retrieval of data.
      • モデルは思考と実行したいアクションを返すように指示される。次に別のエージェント(例えばクライアント)がアクションを実行し、それをオブザベーションとしてモデルに返す。モデルは、答えを返すまで、さらに思考と行動を返すようにループします。
      • これは信じられないほど強力なテクニックであり、事実上、ボットが自分自身のリサーチアシスタントとなり、ユーザーの代わりに行動を起こすこともできる。
      • 例えば、従業員データの取得とウィキペディアの検索に関連する小さなコマンドセットをモデルに与える
        • CommandArgumentsDescription
          find_employeenameRetrieves an employee by name
          get_employeeidRetrieves an employee by ID
          get_locationidRetrieves a location by ID
          get_reportsemployee_idRetrieves a list of employee ids that report to the employee associated with employee_id.
          wikipediaarticleRetrieves a wikipedia article on a topic.
        • “Is my manager famous?”という質問に対してbotは次のような挙動を取る
            1. まず、従業員のプロフィールを調べます。
            1. プロフィールからマネージャーのIDを取得し、彼らのプロフィールを調べる。
            1. マネージャーの名前を取り出し、ウィキペディアで検索する。このシナリオでは、マネージャーには架空の人物を選びました。
            1. ボットはウィキペディアの記事を読み、架空の人物なので私のマネージャーではないと結論づける。
            1. そして、ボットは(実在の人物)を含むように検索を修正し、検索結果が何もないのを見て、ボットは私のマネージャーは有名ではないと結論づけた。
           
        full prompt
    • GPT-4 vs GPT-3.5
      • 割愛

Strategies

  • Embedding Data
    • 隠された文脈では、あらゆる種類のデータを埋め込みたいと思うことがよくある。具体的な戦略は、埋め込むデータの種類や量によって異なります。
    • Simple Lists
    • Markdown Tables
      • githubのデータで学習しているおかげかOpenAIはmarkdownが得意
    • JSON
      • カラムがおおかったり、空データが混じっている時はjsonの方がよかったりする
    • Freeform Text
    • Nested Data
      • ネストされたJSONを使うと、トークンの予算に対して冗長になりすぎる場合は、Markdownで定義されたリレーショナル・テーブルにフォールバックする: