🔠

プロンプトエンジニアリング テクニックまとめ

2023/07/17に公開
1

プロンプトエンジニアリング

Large Language Model(以降LLM)のプロンプトエンジニアリング、色々テクニックがあるのですが、全然名前と内容が一致しないので一度自分なりにまとめてみることにしました。

そもそも、LLMOps:基盤モデルに基づくアプリケーション開発のワークフローによると、LLMの開発には以下の3つのアプローチがあるとのことです。


LLMOps:基盤モデルに基づくアプリケーション開発のワークフローより引用

本記事ではその中の、In-Context Learningについて(要は、プロンプトを工夫してなんとかしましょうというアプローチ)のみ記載します。そして、更にIn-Context Learningを、この記事の内容で分類した図を以下に示します。

ここで出てくるIn-Context Learningのテクニック、結構名前がカッコいいというか、仰々しいんですよね。「Zero-Shotのゼロってどういうこと?(何もしないの??)」とか「Learningとかついているけど、実際は学習してないじゃん!」など、よくわからなくなってしまうこと多いなと思っていたら、fukabori.fmという音声配信番組の97回目のエピソードでも同じようなことが語られてました。自分だけじゃなくて安心しました。この記事では、音声配信に出てくる内容の中でも、基本的な一部に関して紹介しています。

また、取り上げるプロンプトのテクニックは、誰かがちょっと試してみた的なオレオレプロンプトではなく、ある程度論文などで再現性が確認されているもの・OpenAIの公式情報で紹介されている情報を中心に、具体例や論文、公式情報と一緒にとりあげていきたいと思います。

In-Context Learning

概要

直訳すると「文脈を学習」でしょうか。よくわかりませんね。In-Context Learningは広い概念で、後のK-ShotとかChain of Thought(CoT)を内包するようなものと理解しています。

Learningと書いてありますが、実際にモデルを学習(ファインチューニングなど)をするわけではなくて、プロンプト内にいくつか具体例(タスク例)を挙げることで、モデルの出力をコントロールしていくプロンプトのテクニックです。

具体例

この後出てくるものは、ほぼ全てIn-Context Learningの範疇となります。

論文

https://arxiv.org/abs/2005.14165

Zero/Few/K-Shot

概要

In-Context Learningのために、プロンプトと一緒に提供されるタスク例の数Kに応じてK-Shotと呼ばれるらしいです。

Zero-Shotってどういうこと?と思ったら、タスク例がなく、単純に指示だけだとZero-Shotになるみたいです。Zero-Shotって何かカッコいいけど、実際は単に指示しているだけというね。

Kがちょっとだけ(多分1〜3くらい)だとFew-Shotらしいです。

Open AIの公式ガイドには、Instructionをプロンプトの最初に書いて、文脈(In-Context)は、"""###で区切るのが推奨のようです。

具体例

Zero-Shotのプロンプトは以下です。

fried chickenを日本語に訳してください

Few-Shot(K=3)は、以下のように3つ例を挙げたプロンプトになります。

fried chickenを日本語に訳してください。

日本語訳例:"""
apple > りんご
bear > くま
beer > ビール
"""

論文

https://arxiv.org/abs/2005.14165

Chain of Thought(CoT)

概要

思考の連鎖って、なんかかっこいいですね。

プロンプトのタスク例として、論理的思考の過程を記載すると性能が上がるという話みたいです。説明より具体例をみた方が分かりやすいと思います。

具体例

Chain-of-Thought Prompting Elicits Reasoning
in Large Language Models
より引用

論文

https://arxiv.org/abs/2201.11903

Self-Consistency

概要

CoTの発展形です。Few-shotのCoTを使うことで、性能がアップするようです。

説明が少しむずかしいのですが、具体例を見たほうがピンとくるかもしれません。詳細は論文を参照ください。

具体例

Q:林には15本の木があります。林業従事者は今日、林に木を植える予定です。その後、21本の木があります。林業従事者は今日、何本の木を植えましたか?
A:15本の木から始めます。後で21本の木があります。差は、彼らが植えた木の数でなければなりません。したがって、彼らは21-15 = 6本の木を植えなければなりません。回答は6です。
Q:駐車場に車が3台あり、さらに2台の車が到着した場合、駐車場には何台の車がありますか?
A:駐車場には既に3台の車があります。2台の車が到着しました。これで、車が3+2 = 5台あります。回答は5です。
Q:リアは32個のチョコレートを持っており、彼女の姉妹は42個のチョコレートを持っています。彼らが35個食べた場合、彼らが残したピースの数は何ですか?
A:リアは32個のチョコレートを持っており、リアの姉妹は42個のチョコレートを持っていたことを意味します。つまり、もともとは32 + 42 = 74個のチョコレートがありました。35個食べられました。したがって、合計で残るのは74-35 = 39個のチョコレートです。回答は39です。

...

(略)

...

Q:私が6歳のとき、妹は私の半分の年齢でした。今、私は70歳です。私の妹は何歳ですか?
A:

Prompt Engineering Guide より引用

論文

https://arxiv.org/abs/2203.11171

Zero-Shot CoT

概要

プロンプトの最後に「Let’s think step by step.(ステップごとに考えよう)」とつけるだけで、性能が上がるというものです。

それだけ??と思ってしまうのですが、ここでのポイントは、CoTという高度なIn-Context Learningを、タスク例を挙げること無くZero-Shotで実現してしまうという点ですね。

そう捉えると、この「Let’s think step by step.」の発見の凄さが少し分かるのではないでしょうか??

具体例

ほんとに、最後に「Let’s think step by step.」つけてるだけです。

Large Language Models are Zero-Shot Reasonersより引用

論文

https://arxiv.org/abs/2205.11916

外部(実世界)から取得した情報を活用する方法

システムが現実にアクセスする手段を提供することをLLMの分野だと「Grounding」といいます。そのGroundingを活用した手法を紹介します。

ここからは、まだまとめきれてないので、簡単に紹介します。

Retrieval-Augmented Generation(RAG)

情報をベクトル化(Embedding)して、プロンプトで検索して、距離が近い文章をプロンプトと一緒に投げる手法です。In-Context LearningのIn-Contextを外部からひっぱってくることですね。

実際にやってみた例が以下となります。

https://zenn.dev/karaage0703/articles/9bd40f2d3d1a76

参考情報

https://dev.classmethod.jp/articles/revise-retrieval-augmented-generation/

https://arxiv.org/abs/2005.11401

https://qiita.com/t_serizawa/items/a2ced4441da714b3076f

ReAct

外部のサービスから必要な情報をLLMが取得する方法です。

参考情報

https://zenn.dev/ryo1443/articles/d727b2b9a6d08c

https://arxiv.org/abs/2210.03629

Recursively Criticizes and Improves(RCI)

LLMの出力をLLM自身で確認して修正する方法です。いわゆるエージェントと環境の相互作用で生まれる情報を活用しているわけで、これもGroundingの一種ではないかと自分は思っています(あんまりそういう文脈で語られていない気がするので、ちょっと自信ないです。

Code Interpreterがエラーを自分で修正してくのも、このRCIを使っているのかと思います。

参考情報

https://logmi.jp/tech/articles/329009

https://book.st-hakky.com/docs/chatgpt-prompt-engineering-basic/

https://speakerdeck.com/hirosatogamo/chatgpt-azure-openai-da-quan

https://speakerdeck.com/keio_smilab/keio-univ-intro-to-ml-02-coding

プロンプトインジェクション

プロンプトを使った攻撃(ハック)に関してです。以下にまとめました。

https://zenn.dev/karaage0703/articles/b55d3e4282325e

まとめ

プロンプトのテクニック、色々あるので、網羅的にまとめようと思ったのですが、In-Context Learning周りの代表的なものだけで限界でした。またここに追記するか、別記事で別観点でまとめてみたいと思います。

もっと知りたい方は、参考リンクあたりをみていただけたら幸いです。あと、間違いに気づかれた方はそっと優しく教えていただけると嬉しいです。

参考リンク

ガイド

https://platform.openai.com/docs/guides/prompt-engineering/prompt-engineering

https://github.com/dair-ai/Prompt-Engineering-Guide

https://github.com/openai/openai-cookbook

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/prompt-engineering

https://www.promptingguide.ai/jp

https://fukabori.fm/episode/97

https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/

https://dev.classmethod.jp/articles/how-to-design-prompt-engineering/

https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api

https://qiita.com/sonesuke/items/24ac25322ae43b5651bc

https://learnprompting.org/docs/category/️-intermediate

https://logmi.jp/tech/articles/329009

https://book.st-hakky.com/docs/chatgpt-prompt-engineering-basic/

https://speakerdeck.com/hirosatogamo/chatgpt-azure-openai-da-quan

https://book.st-hakky.com/docs/llm-prompt-engineering-self-consistency/

https://note.com/piqcy/n/nd25bc0ad80e5

https://speakerdeck.com/dahatake/chatgpt-nochong-ji-code-interpreter-gachu-tahou-baziyon-61deaacb-ea80-441e-a115-d9eeb4eea14e

https://speakerdeck.com/dahatake/chatgpt-dezi-fen-noshi-shi-gadoule-sikunarunokawokao-erunetaji-2023nian-10yue-baziyon

https://aiboom.net/archives/56671

https://qiita.com/fuyu_quant/items/157086987bd1b4e52e80

https://www.jailbreakchat.com/

https://qiita.com/YutaroOgawa2/items/aca32f8fd7d551596cf8

https://speakerdeck.com/ftnext/chatgpt-prompt-engineering-for-developers-shou-jiang-ti-yan-ji

https://speakerdeck.com/dahatake/chatgpt-for-developer-chao-ru-men

https://ai.google.dev/docs/prompt_best_practices?hl=ja

https://blog.brainpad.co.jp/entry/2023/12/19/153000

https://www.digitalservice.metro.tokyo.lg.jp/documents/d/digitalservice/ai_prompt

https://note.com/art_reflection/n/n82a3fbf1af6d

https://zenn.dev/knowledgesense/articles/7504b1c6bbba84

https://speakerdeck.com/hirosatogamo/aoai-dev-day-llmsisutemukai-fa-tipsji

https://tech.algomatic.jp/entry/column/llm-product/03

https://github.com/anthropics/courses/tree/master/prompt_engineering_interactive_tutorial

https://zenn.dev/yonekubo/books/c47eb828fd972d

https://zenn.dev/furunag/articles/4f67ad4dad4dbd

プロンプト集

https://platform.openai.com/examples

https://docs.anthropic.com/claude/page/prompts

https://prompt.quel.jp/

https://github.com/dahatake/ChatGPT-Prompt-Sample-Japanese

https://oshiete.ai/

https://dosparaplus.com/
プロンプトで検索

https://exp-p.com/

デジタル庁のプロンプト集
https://www.digital.go.jp/news/19c125e9-35c5-48ba-a63f-f817bce95715

Google Gemini用のプロンプト集
https://ai.google.dev/gemini-api/prompts?hl=ja

システムプロンプト集(個人まとめ)
https://github.com/schroneko/systemprompts

論文

https://speakerdeck.com/smiyawaki0820/2023-dot-03-dot-21-gpt-4-prompt-bao-gao-hui

https://www.promptingguide.ai/jp/papers

https://book.st-hakky.com/docs/llm-prompt-engineering-paper/

https://yhayato1320.hatenablog.com/entry/2023/02/06/111122

https://github.com/Timothyxxx/Chain-of-ThoughtsPapers

https://speakerdeck.com/1never/ibis2023tiyutoriaru-da-gui-mo-yan-yu-moderuhuo-yong-ji-shu-nozui-qian-xian

https://twitter.com/ai_database/status/1719554041074819307

https://arxiv.org/abs/2310.14735

https://arxiv.org/abs/2312.16171

https://trigaten.github.io/Prompt_Survey_Site/

ツール

https://acro-engineer.hatenablog.com/entry/2024/05/21/120000

https://acro-engineer.hatenablog.com/entry/2024/11/18/120000

関連記事

https://zenn.dev/karaage0703/articles/5df61d446684f9

変更履歴

  • 2024/07/01 プロンプト集追記
  • 2023/07/27 Self-Consistency、Groundingに関して追記
  • 2023/07/18 全体感を追記

Discussion