はじめに
2022年11月にGPT4が登場して生成AIブームが起きて以来、プロンプトテクニックに関する書籍、ブログ記事などがあふれています。
2023年4月には、プロンプトテクニックに関するガイドが公開されました。このガイドでは、プロンプトテクニックの基本的な考え方や、さまざまなプロンプトテクニックの例が紹介され、当ブログでも以下の記事でその基本的な内容について勉強しました。
【プロンプトエンジニアリングに学ぶ】上手なAIとの対話や質問の仕方 – ライフ&ジョブブログ (life-and-job.com)
ただし、そのときも多くのテクニックについて最新の研究論文と掲載されていたのですが、具体的にどのようなものかイメージができませんでした。
一方で、研究レベルから社会で実装され、実用化されるものもあり、プロンプトテクニックはさらに進化しています。本記事では、最新のプロンプトテクニックに関する最新状況について調べ、纏めていきたいと思います。
プロンプトテクニックの基本
プロンプトテクニックの基本的な考え方は、AIモデルに「何を」「どのように」実行させたいかを明確に伝えることです。そのためには、以下の3つの要素を意識することが重要です。
- 明確性:プロンプト(指示や質問)は、AIモデルが理解できるほど明確にする必要があります。そのためには、具体的な言葉や表現を使い、曖昧さを排除することが大切です。
- 簡潔性:プロンプトは、AIモデルが処理しやすいように簡潔にする必要があります。そのためには、冗長な表現を省き、要点を絞って伝えることが大切です。
- コンテキスト:プロンプトには、AIモデルが理解するためのコンテキストを提供する必要がある場合があります。そのためには、関連する情報や背景知識を盛り込むことが大切です。
シンプルなプロンプトで回答が得られる場合や、何度か反復して結果を得ていくこともありますが、うまく例を提供する必要がある基本的なプロンプトテクニックをまず復習しましょう。
これらは、DAIR.AIでまとめられたプロンプトエンジニアリングのガイドにその概要が記載されていますし、多くの書籍などでも紹介され、すでに常識的な内容になっているものですが復習をかねて記載します。
基本的なプロンプトテクニック
Zero-Shot(ゼロショット)プロンプティング
大規模言語モデルは、膨大な量のテキストデータでトレーニングされているため、これらの質問を理解し、正しい答えを導き出すことができます。
Zero-Shotプロンプティングとは、事前に例を示すことなく、質問のみを投げかけるプロンプトのことを指します。
Zero-Shotプロンプティングは、以下のようなタスクに有効です。
- 算術問題
- 常識的な問題
- 言語翻訳
- 自然言語の生成
例えば、算術の問題であれば、以下のようなものが挙げられます。
- 100から10を引くといくつになりますか?
- 3と4を掛けるといくつになりますか?
- 2の平方根はいくつですか?
これらの問題は、事前に例を示す必要はありません。大規模言語モデルは、算術の基本的なルールを理解しているため、これらの問題を正しく解決することができます。
また、常識の問題であれば、以下のようなものが挙げられます。
- 犬は哺乳類ですか?
- アメリカの首都はどこですか?
- 地球は球形ですか?
これらの問題も、事前に例を示す必要はありません。大規模言語モデルは、常識的な知識を理解しているため、これらの問題を正しく解決することができます。ただし、十分に学習していない知識や、複雑な算術の問題などでは正しく回答できない場合があります。
Few-Shot(フューショット)プロンプティング
プロンプト内の例/デモを提供してモデルをより高い性能に導く文脈学習を可能にするテクニックとして使用できます。
ガイドを引用すると、以下のような例を提供することで、モデルが正しく回答することができます。
![few-shot-prompt1](https://life-and-job.com/wp-content/uploads/2024/01/image.png)
ただし、以下のような複雑な推論問題になると、例を示しても誤った回答になってしまいます。
(奇数の合計は15+5+13+7+1=41で偶数になり、答えはFalse)
![few-shot-prompt2](https://life-and-job.com/wp-content/uploads/2024/01/image-1.png)
Chain-of-Thought(COT)プロンプティング
Few-shotプロンプティングの問題を解決する方法として、Chain-of-Thoughtプロンプティングが提案されました。
さきほどの奇数の合計問題は、奇数を選んでからそれを合計して、偶数かどうか判断するというステップを踏んで解答を導き出しますが、プロンプトの中で、その解答のプロセスを記載して例を提供しました。
その結果、見事に正解を導き出せるようになりました。1つだけ例を提供した場合でも正解となることも示されています(ここでは省略)。
![cot-prompt](https://life-and-job.com/wp-content/uploads/2024/01/image-11.png)
Zero-shot COT プロンプティング
さらに凄いのは、以下の例にあるように「ステップバイステップで考えてみましょう」という文言を書くだけで正解を導くということです。
![zero-shot-cot-prompt1](https://life-and-job.com/wp-content/uploads/2024/01/image-2-1024x435.png)
CoT プロンプティングは、中間的な推論手順を提供することで、複雑な推論タスクを解決できることが特徴ですが、Zero-shotでも「ステップバイステップで」という言葉だけで、同じように推論タスクが実行できました。
Self-Consistency(自己整合性)
算術や常識的な推論を必要とするタスクでCoTプロンプトのパフォーマンスを向上させるために使用される自己整合性というテクニックです。
以下のような推論の問題で、few-shot CoTを通じて学習させ、複数の推論パスから自己完結的に整合性のとれた結論を導き出させるプロンプティング技術 です。
![self-consistency1](https://life-and-job.com/wp-content/uploads/2024/01/image-10.png)
![self-consistency2](https://life-and-job.com/wp-content/uploads/2024/01/image-9-1024x444.png)
これにより、算術および常識的推論を必要とするタスクにおけるCoTプロンプティングのパフォーマンスが向上します。詳しくは以下のリンクを参照してください。
![](http://life-and-job.com/wp-content/themes/cocoon-master/images/doya-man.png)
いくつかのアイデアを提供して、その中から最も良いものを生成AIに選ばせるんだね。COTの応用編みたいな感じだな。
知識生成プロンプティング
より正確な予測を行うために知識や情報を組みませるため、知識生成プロンプティングでは、予測を行う前にプロンプトとして多くの知識を事前に与え、モデルはその知識を統合して予測を得るものです。
こちらについて実例は以下のリンクを参照してください。
![](http://life-and-job.com/wp-content/themes/cocoon-master/images/ojisan.png)
これも同じようなもんかな?多くのプロンプトを考えるのも大変じゃな・・・
最新のプロンプトテクニック
ここまでのテクニックは、私たちが普段ChatGPTと会話するときに手入力するプロンプトでも使えるものです。
それ以降の最新技術については、実用的にはPythonのライブラリなどでLLM(大規模言語モデル)や外部データソースを連携することなどで実装され、高度で精度の高いものとなってきているようです。
多くのプロンプトテクニックは、2022年から2023年にかけて発表された論文に基づく技術なので、ガイドの中にも、実装された実例が記述されていないものも多いです。(下表の緑字は、ガイドなどでPythonコードが紹介されているものです)。
関連したページもリンクしますので、参考にしていただければと思います。
- Tree of Thoughts (ToT、思考の木)
- 検索により強化された生成 (Retrieval Augmented Generation、RAG)
- 自動プロンプトエンジニア(APE)
- アクティブプロンプト
- 方向性刺激プロンプティング
- Program-Aided Language Models(プログラム支援言語モデル)
- ReAct
- マルチモーダルCoT
ここでは、ToT、RAG、ReActについて説明します。
Tree of Thoughts (ToT、思考の木)
複雑な課題に対して、探索や戦略的な先読みが必要な場合、従来の単純なプロンプト技術では不十分です。
ToTは、思考が問題解決への中間ステップとなる一貫した言語の連続を表す思考の木を保持します。このアプローチにより、LMは熟考プロセスを通じて中間の思考の達成度を自己評価することが可能です。思考の生成と評価能力は、探索アルゴリズム(例:幅優先探索や深さ優先探索)と組み合わされ、先読みとバックトラッキングを伴う思考の系統的な探求を可能にします。
Yao et el. (2023) Tree of Thoughts: Deliberate Problem Solving with Large Language Models
CoT-SCは自己整合性COT
具体的には、ToTは次の3つのステップで構成されています。
- 言語モデルに、問題の要約と、問題を解決するために必要な知識を提供する。
- 言語モデルに、問題を解決するための思考の木を生成させる。
- 言語モデルに、思考の木を評価させ、最適な思考の木を選択させる。
以下のサイトでは、Lang ChainでToTを実装するコードを紹介しています。
![](https://raw.githubusercontent.com/lynn-mikami/Images/main/tree-of-thoughts-prompting.webp)
検索により強化された生成 (Retrieval Augmented Generation、RAG)
この技術は、すでに実装されていて、現在最も注目されている技術ではないかと思います。
汎用の言語モデルは学習したデータ以外の最新情報をもたないため、ChatGPTなどでも、「2021年以降のデータはありません」というような回答を得たり、嘘の回答をする「幻覚(hallucination)」問題があります。このような対処のために、RAG(Retrieval Augmented Generation)と呼ばれる手法が考案されました。
RAGは、外部ソースから取得した情報を用いて、生成 AI モデルの精度と信頼性を向上させるテクノロジで、LLM の機能不足を補います。
また、RAGを使えば、ほとんどすべてのビジネスで、技術マニュアルやポリシーマニュアル、ビデオやログをナレッジ ベースと呼ばれるリソースに変えることができ、LLM を強化できます。これらのソースは、顧客や現場のサポート、従業員のトレーニング、開発者の生産性向上といったユースケースを可能にします。そのため、AWS、IBM、Google、Microsoft、Oracleなど多くの企業が RAG を採用しています。
RAG はRetriever(レトリーバー)と呼ばれる情報検索コンポーネントとGenerator(ジェネレーター)と呼ばれるテキスト生成モデルを組み合わせたものです 。
Lewis ら (2021)、Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
実装する方法はいくつかありますが、langChainによりRAGを実装する方法が主流のようです。
langChainはChatGPTなどの大規模言語モデルの機能を拡張できるライブラリで、RAGを含むさまざまな機械学習モデルを統合し、高度な自然言語処理のサービスを提供します。LangChainを使うことで、より高度な機能を実装することが可能になります。
LangChainはPythonやJavaScript、TypeScriptなどのプログラミング言語で利用できるようですが、Python版ではLangChainに含まれている全ての機能が利用できるため、Pythonで利用されることがほとんどのようです。
RAGの実装については以下のリンクに詳しく説明されているので参照してください。
ReAct Prompting
ReAct Promptingは、リーズニング(推論)とアクション(行動)を組み合わせて、コンテキストに対応するプロンプトを生成する手法です。単に質問をするだけでなく、従来の手法とは異なり、コンテキストを理解し、最適なアクションを推論し、それに基づいてタスクを実行します。
- リーズニング:システムは質問のコンテキストと実行すべきタスクを理解します。
- アクション:それに基づいて、計算やデータの取得など、特定のタスクを実行します。
ReActを実装するには、RAGでも説明したlangChainが利用されます。
langChainのおもな機能(モジュール)
Models | OpenAIのLLM(GPT-3.5やGPT-4)をはじめとした様々な言語モデルを利用する機能 (Anthropic,Azure,Google,OpenAI,etx.) |
Retrieval | 言語モデルが学習していない事柄に関して、外部データを用いて、回答を生成するための機能 PDF、CSV、PowerPoint、Word、HTML、Markdown、Email、URLなど132種類のデータ形式に対応 |
Chains | 複数のプロンプト入力を実行する機能 順番に実行することで、より精度の高い回答が得られる。また、複雑な問題を解きたい時に、中間的な回答を一度出力することで、より正確な回答を得る(CoTプロンプティング) |
Memory | ChainsやAgentsの内部における状態保持をする機能 |
Agents | 言語モデルに渡されたツールを用いて、モデル自体が、次にどのようなアクションを取るかを決定・実行・観測・完了するまで繰り返す機能 |
ReActはAgents機能によって、リーズニングによって決定されたアクションを実行することになります。流れとしては、以下のようなステップです。
- プロンプトの受け取り:エージェント(Agents)はユーザーからプロンプトを受け取ります。
- コンテキストの分析:次に、エージェントはコンテキストを分析し、プロンプトを実行可能なタスクに分解します。
- タスクの実行:エージェントは、データの取得や計算などのタスクを実行します。
- レスポンスの生成:最後に、実行されたタスクに基づいてレスポンスを生成します。
データの取得はさまざまなソースから得ることが可能です。これによって高度な回答を生成することが可能になります。
連携できる外部サービス(一例)
- awslambda
- Bing Search
- ChatGPT Plugins
- Google Search
- Wikipedia など
実装については以下のリンクに詳しく説明されているので参照してください。
その他
そのほか、以下の技術については、リンクのページに実装コードが紹介されているので参照ください。
自動プロンプトエンジニア(APE)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9QXV0b21hdGljJTIwUHJvbXB0JTIwRW5naW5lZXImdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTU4MjEyMDM0ZjA5Y2FiN2ZmNmYwMDA2NzMzNzM1NzEy&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwZnV5dV9xdWFudCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9NjhjNGI3ZGYzNWExZWI5NzA4NjJhYTdkNzY4MWE3N2E&blend-x=142&blend-y=491&blend-mode=normal&s=686f18dc2d345b119c1f9ad32d00b109)
Program-Aided Language Models(プログラム支援言語モデル)
![](https://image.moshimo.com/af-img/0304/000000053040.jpg)
まとめ
2022年以降、プロンプトテクニックは急速に進化しており、従来の単純なプロンプトでは実現できなかった複雑なタスクの実行が可能になってきています。
最新のプロンプトテクニックの代表的なものとして以下の3つを調べてみました。これらは既に実装され始めています。
- Tree of Thoughts (ToT、思考の木)
複雑な課題に対して、探索や戦略的な先読みが必要な場合、従来の単純なプロンプト技術では不十分です。ToTは、思考が問題解決への中間ステップとなる一貫した言語の連続を表す思考の木を保持します。このアプローチにより、LMは熟考プロセスを通じて中間の思考の達成度を自己評価することが可能です。
- 検索により強化された生成 (Retrieval Augmented Generation、RAG)
汎用の言語モデルは学習したデータ以外の最新情報をもたないため、ChatGPTなどでも、「2021年以降のデータはありません」というような回答を得たり、嘘の回答をする「幻覚(hallucination)」問題があります。このような対処のために、RAG(Retrieval Augmented Generation)と呼ばれる手法が考案されました。RAGは、外部ソースから取得した情報を用いて、生成 AI モデルの精度と信頼性を向上させるテクノロジで、LLM の機能不足を補います。
- ReAct Prompting
ReAct Promptingは、リーズニング(推論)とアクション(行動)を組み合わせて、コンテキストに対応するプロンプトを生成する手法です。単に質問をするだけでなく、従来の手法とは異なり、コンテキストを理解し、最適なアクションを推論し、それに基づいてタスクを実行します。
最新のプロンプトテクニックは、まだ研究レベルのものも多く、実用化されていないものもあります。しかし、今後、より高度なAIモデルの開発が進むにつれて、実用化が進んでいくことが期待されています。
今後は実際に実装することにトライしていきたいと思います。その報告は近くしていきたいと思います。
コメント