初心者必見!プロンプトエンジニアリング入門ガイド ~応用編②~

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【6/19開催】Kong Community Japan Meetup #4
本イベントでは、Kong Inc. のVP of ProductであるReza Shafii氏もプレゼンターとして参加。当社からはアーキテクト マネージャーの槌野の登壇が決定!参加無料です!!
https://column.api-ecosystem.sios.jp/connect/kong/1081/

【6/21開催】開発者目線でのSBOMとの向き合い方
SBOMの導入から開発者がSBOMの作成・管理を自動で行っていくための方法(デモ)を紹介します。SBOMを全く知らない人から、開発との統合までを紹介するので様々なレベルの方に学びがあるライブとなる予定です!
https://tech-lab.connpass.com/event/321422/

【7/19開催】現場で役立つAzure神小技10+α 〜生成AI,RAG,コスト削減など旬な技術満載のLT大会〜
Azureの最新技術や実用的な小技を紹介する特別なライトニングトーク大会を開催します!
https://tech-lab.connpass.com/event/319077/

【7/26開催】最適なIaCツールを選ぼう
プロジェクトでのツール選びに困らないための重要な観点をご説明します!
https://tech-lab.connpass.com/event/319532/

こんにちは、サイオステクノロジーの佐藤 陽です。
前回に引き続き、プロンプトエンジニアリングの応用編について解説していきたいと思います。

  • 思った回答が得られないんだよな
  • もっと生成 AI をうまく使いこなしたいな

といった方は最後までご覧ください。

チートシート

テクニック(個人的)要約
知識生成プロンプティングSupporting contentをAIに用意してもらう
Prompt Chaining複雑なプロンプトを簡単なプロンプトに分割する
Tree of Thoughts(ToT)

1. AIに出力させる
2. AIに出力を評価させる
3. 再度AIに出力させる
4. 再度AIに出力を評価させる
を繰り返す

はじめに

前回はプロンプトエンジニアリングの応用編の第1弾として、X-shot LearningやCoTなどのテクニックを紹介しました。
今回はこれに続く第2弾として、さらに応用的なテクニックを紹介したいと思います。

弁明

前回同様にはなりますが、プロンプトの投げ方(文章の構成など)によっては正解にたどり着けなかったケースが多々ありました。
そのため、本記事では試行錯誤したうえでうまくいったったケースのみ載せています。(回答の捏造はしていません。)

環境

前回に引き続き、Azure OpenAI Service を利用していきたいと思います。
モデルは gpt-35-turbo-16k を利用します。

ChatGPT を利用したり、別のモデルを利用した場合でも、問題なくプロンプトエンジニアリングの効果は得られます。
ただし、得られる回答が異なる場合がありますので、その点ご了承ください。

テクニック

知識生成プロンプティング

最初のテクニックは、知識生成プロンプティング(Generate Knowledge Prompting)です。

これは基礎編におけるSupporting contentのテクニックを応用したものであり
Supporting contentとして与える補助知識を事前に生成AIに回答してもらい、その回答を併せて再度プロンプトに投げるテクニックになります。

早速やってみたいと思います。
まずは知識生成プロンプティングを利用しない例から

プロンプト

バスケットボールにおいて、ボールを持ったままドリブルをせず3歩以上歩いた場合の反則を「ウォーキング」という。「はい」か「いいえ」か。

回答

はい、バスケットボールにおいて、ボールを持ったままドリブルをせずに3歩以上歩くことは「ウォーキング」と呼ばれる反則です。ウォーキングが犯されると、相手チームにボールが与えられ、違反を犯した選手のチームにはターンオーバーとなります。この反則は、プレイヤーがボールを持って移動するためには、ドリブルをする必要があるというルールに基づいています。

間違えてますね、3歩以上歩くことはウォーキングではなくトラベリングです。
ではこのやり取りを改善するために、まずはバスケットボールに関する知識を習得していきたいと思います。

※いったんここで会話のやり取りをリセットしてください。

なお、知識を得るための質問群はこちらの内容を流用させてもらっています。

プロンプト

入力:ギリシャはメキシコよりも大きい。 
知識:ギリシャは約131,957平方キロメートルであり、メキシコは約1,964,375平方キロメートルであり、メキシコはギリシャよりも1,389%大きい。

入力:眼鏡は常に曇ります。 
知識:冷たい表面に汗、呼気、および周囲の湿度から水蒸気が着陸し、冷却されて液体の微小な滴に変化して、あなたが霧として見るフィルムを形成すると、眼鏡レンズに結露が生じます。あなたのレンズは、特に外気が寒い場合、あなたの呼気に比べて比較的冷たくなります。

入力:魚は考えることができる。
 知識:魚は出現よりも知能が高い。記憶などの多くの分野で、魚の認知能力は、非人間の霊長類を含む「より高い」脊椎動物と同等またはそれ以上です。魚の長期記憶は、彼らが複雑な社会的関係を追跡するのを助けます。

入力:一生にたくさんのタバコを吸うことの共通の影響の1つは、肺がんの発生率が高くなることです。 
知識:生涯にわたり平均して1日に1本未満のタバコを吸った人は、非喫煙者に比べて肺がんで死亡するリスクが9倍高かった。一日あたり1〜10本のタバコを吸った人の中で、肺がんで死亡するリスクは、非喫煙者の約12倍高かった。

入力:岩と小石は同じ大きさです。 
知識:小石は、堆積学のUdden-Wentworthスケールに基づく4〜64ミリメートルの粒子サイズを持つ岩塊です。小石は、一般的に粒度(直径2〜4ミリメートル)よりも大きく、コブル(直径64〜256ミリメートル)よりも小さいと見なされます。

入力:ギリシャはメキシコよりも大きい。 
知識:ギリシャは約131,957平方キロメートルであり、メキシコは約1,964,375平方キロメートルであり、メキシコはギリシャよりも1,389%大きい。

入力:眼鏡は常に曇ります。 
知識:冷たい表面に汗、呼気、および周囲の湿度から水蒸気が着陸し、冷却されて液体の微小な滴に変化して、あなたが霧として見るフィルムを形成すると、眼鏡レンズに結露が生じます。あなたのレンズは、特に外気が寒い場合、あなたの呼気に比べて比較的冷たくなります。

入力:魚は考えることができる。 
知識:魚は出現よりも知能が高い。記憶などの多くの分野で、魚の認知能力は、非人間の霊長類を含む「より高い」脊椎動物と同等またはそれ以上です。魚の長期記憶は、彼らが複雑な社会的関係を追跡するのを助けます。

入力:一生にたくさんのタバコを吸うことの共通の影響の1つは、肺がんの発生率が高くなることです。 
知識:生涯にわたり平均して1日に1本未満のタバコを吸った人は、非喫煙者に比べて肺がんで死亡するリスクが9倍高かった。一日あたり1〜10本のタバコを吸った人の中で、肺がんで死亡するリスクは、非喫煙者の約12倍高かった。

入力:岩と小石は同じ大きさです。 
知識:小石は、堆積学のUdden-Wentworthスケールに基づく4〜64ミリメートルの粒子サイズを持つ岩塊です。小石は、一般的に粒度(直径2〜4ミリメートル)よりも大きく、コブル(直径64〜256ミリメートル)よりも小さいと見なされます。

入力:バスケットボールにおいて、ボールを持ったままドリブルをせず3歩以上歩いた場合の反則を「ウォーキング」という。
知識:

回答

バスケットボールにおいて、ボールを持ったままドリブルをせずに3歩以上歩くことは「トラベリング」という反則です。ウォーキングは、ボールを持たずに歩いてしまうことであり、これも反則とされます。

正しい知識を得ることができました。
では今回得られた知識を用いて、再度最初に行った質問を行います。

プロンプト

質問:バスケットボールにおいて、ボールを持ったままドリブルをせず3歩以上歩いた場合の反則を「ウォーキング」という。「はい」か「いいえ」か。
知識:バスケットボールにおいて、ボールを持ったままドリブルをせずに3歩以上歩くことは「トラベリング」という反則です。ウォーキングは、ボールを持たずに歩いてしまうことであり、これも反則とされます。
説明と回答:

回答

バスケットボールにおいて、ボールを持ったままドリブルをせずに3歩以上歩くことは「ウォーキング」という反則ではありません。正しい反則名は「トラベリング」です。したがって、回答は「いいえ」です。

正しい答えが得られました。
このように補助知識についても生成AIを使用して取得し、正しい回答に近づけることができます。

ただし、今回は得られた「知識」が正しいものと判断できましたが、正しい/正しくないの判断ができないケースも往々にしてあるかと思います。
誤った知識を補助知識として与えてしまうと、結局誤った回答が得られてしまいそうなので、このあたり気を付ける必要がありそうです。

Prompt Chaining

次はPrompt Chainingです。
ChainingはChain(鎖)を表しており、言ってしまえばプロンプトを繋げて利用しようということです。

非常に複雑なプロンプトを投げる際、1長文のプロンプトを投げるよりは、シンプルなプロンプトを複数回に分けて投げた方が正確な回答が得られることが言われています。

まずは事前準備として、生成AIに適当な物語を考えてもらいます。

プロンプト

400文字程度のSF映画のあらすじを考えてください。

回答

2045年、タイムトラベルが現実のものとなり、エージェントのアレックス・カーンは未来の自分からの警告を受け取る。 
それは、2030年に起こる未曾有の災害を防ぐための手がかりを示していた。 
アレックスはタイムトラベルの許可を得て、2030年へ向かう。
そこで若き日の自分と出会い、協力して災害の原因を探る中、巨大企業クロノス社の歴史改変の陰謀を突き止める。 
アレックスは未来の記憶が薄れつつあることに気づきながらも、日記に重要な情報を記録し続ける。 
クロノス社の施設に潜入して決定的な証拠を手に入れるが、追跡者に襲われる。 
アレックスは若き自分を守るために戦い、重傷を負うが、未来を託してタイムコードへ戻す。 
若きアレックスは証拠を持ち帰り、陰謀を暴いて歴史を修正する。 
未来では新たな法律が制定され、アレックスは次の冒険の始まりを予感しながら微笑む。

この文章を扱ってPrompt Chainingを試してみたいと思います。
※これ以降 {あらすじ} と表記してあるところは、この回答で得られた物語の文章が入ります。

まずは、Prompt Chainingを利用せず、複雑なタスクを1発のプロンプトで投げてみたいと思います。

プロンプト

以下の文章において、質問「陰謀を暴いて歴史を修正するためには何が必要ですか? 」に対する回答を作成してください。
回答が正確であり、誤った情報が含まれていないことを確認してください。
--
{あらすじ}

回答

陰謀を暴くためには、以下の要素が必要です: 

タイムトラベル技術: アレックスが未来からの警告を受け取り、過去に戻るためには、タイムトラベル技術が必要です。2045年の時点では、タイムトラベルが現実のものとなっているため、アレックスは2030年に向かうことができます。 警告の情報: 未来の自分からの警告を受け取ったアレックスは、2030年で起こる災害を防ぐための手がかりを得る必要があります。この情報は、陰謀を暴くための重要な要素となります。 

協力者: アレックスは若き日の自分と出会い、協力して災害の原因を探ります。若きアレックスは証拠を持ち帰り、陰謀を暴くために重要な役割を果たします。 

証拠: クロノス社の歴史改変の陰謀を暴くためには、決定的な証拠が必要です。アレックスはクロノス社の施設に潜入し、証拠を手に入れます。 

身体的な戦い: アレックスは追跡者に襲われ、重傷を負いますが、若き自分を守るために戦います。この身体的な戦いは、陰謀を暴くために不可欠な要素となります。 

歴史の修正: アレックスは証拠を持ち帰り、陰謀を暴くことで歴史を修正します。未来では新たな法律が制定され、アレックスは次の冒険の始まりを予感しながら微笑みます。

以上の要素が揃った場合、アレックスは陰謀を暴き、歴史を修正することができます。ただし、この物語はフィクションであり、実際の歴史修正には異なる要素や手法が必要です。

内容としては正しいですし、別に悪くない気はしますね。

次に比較としてPrompt Chainingを試してみたいと思います。
なお、ここで注意するポイントが2つあります。

サブタスクをシンプルかつ明確にする各サブタスクには、明確に定義された目的とシンプルな指示が必要です。これにより、Claude が理解して従いやすくなります。
(今回利用するのはClaudeではありませんが、根本は同じかと思うのでそのまま利用します。)
XML タグを使用する入力と出力をXML タグで囲むと、データを構造化するのに役立ち、プロンプトを連鎖させるときにデータを抽出して次のステップに渡すのが容易になります。

参考:https://docs.anthropic.com/en/docs/chain-prompts

では実際にプロンプトを投げてみます。
まずは、質問の回答に関係する文章だけを抽出します。

プロンプト1:引用文の抽出

 XML タグで囲まれたドキュメントは次のとおりです:

<document>{あらすじ}</document>

--

質問 「陰謀を暴いて歴史を修正するためには何が必要ですか?」 に関連する引用を逐語的に抽出してください。
 引用の完全なリストを  XML タグで囲んでください。 
このドキュメントにこの質問に関連すると思われる引用がない場合は、「関連する引用が見つかりません」と記入してください。

回答1:

クロノス社の施設に潜入して決定的な証拠を手に入れるが、追跡者に襲われる。
アレックスは若き自分を守るために戦い、重傷を負うが、未来を託してタイムコードへ戻す。
若きアレックスは証拠を持ち帰り、陰謀を暴いて歴史を修正する。

文章から適切な場所を抜き出してくれているのが分かります。
XMLタグで囲ってくれませんでしたが…

これを踏まえて2つ目のプロンプトを投げます。
2つ目のプロンプトは抽出した文章を利用して実際に回答してもらいます。

プロンプト2:質問に答える

質問に回答するために、文書と、その文書からの関連する引用文を使用してください。
文書は<document>タグで囲われた次のとおりです:

<document>{あらすじ}</document>
質問に最も関連する文書からの直接引用文は次のとおりです:

<quotes>
クロノス社の施設に潜入して決定的な証拠を手に入れるが、追跡者に襲われる。アレックスは若き自分を守るために戦い、重傷を負うが、未来を託してタイムコードへ戻す。若きアレックスは証拠を持ち帰り、陰謀を暴いて歴史を修正する。
</quotes>
これらを使用して、質問「陰謀を暴いて歴史を修正するためには何が必要ですか? 」に対する回答を作成してください。
回答が正確であり、引用文で直接裏付けられていない情報が含まれていないことを確認してください。

回答

陰謀を暴いて歴史を修正するためには、クロノス社の施設に潜入して決定的な証拠を手に入れる必要があります。
アレックスはこの証拠を持ち帰り、陰謀を明らかにすることで歴史を修正します。
また、彼は若き自分を守るために戦い、重傷を負いながらも未来を託してタイムコードへ戻しました。
若きアレックスはこの証拠を使って陰謀を暴き、歴史を修正することができました。

先程よりも非常に自然な回答をしてくれました。
プロンプトを投げかけたユーザーにとって、より優しいの回答は後者ですね。

質問している内容としては、Prompt Chainingあり/なしの場合でほとんど変わりませんが
複数回に分割して投げることにより、より質の高い回答が得られることが分かりました。

もちろん今回は手動で2回のプロンプトを投げましたが、システム化する際はこれをブラックボックス化してユーザーに利用してもらうのだと思います。
プロンプト1とプロンプト2を裏側でChainする感じですね。

今回は文章の要約としてこのテクニックを利用しましたが、 並列処理や出力のエラーチェックなど、様々な用途に使えるようです。
このテクニックだけで記事が一本書けそうですね。
今回は概要だけにとどめますが、また他に利用できるケースについても調査してみたいと思います。

参考:https://promptengineering.org/getting-started-with-prompt-chaining/

Tree of Thoughts (ToT)

次はTree of Thoughtsです。
ここまで来ると、だいぶ難解になってきます。
基礎編のところで「丁寧な言葉でプロンプトを投げてあげましょう」って言ってたのが懐かしいです。

こちらは探索木で想像されるようなTreeを使って回答にたどり着くテクニックです。

以下の論文の図が分かりやすいかと思います。
本記事でも、図で示されているGame-of-24というゲームを用いて解説していきたいと思います。

出典: Yao et el. (2023)

Game-of-24とは、与えられた4つの数字と算術操作(+,-,*,/)を使って24を作り出すゲームです。
これまで通りに、シンプルなプロンプトを投げてみたいと思います。

プロンプト

4, 9, 10, 13の数字を使って24のゲームを行ってください。

回答

以下は、与えられた数字4, 9, 10, 13を使って24になる式の1つです:

10 - 4 + 9 + 13 = 24

他にも解があるかもしれませんが、これは一例です。他にも解法がある場合は教えてください。

うーん、間違えてますね…。
これをToTのテクニックで解いていくプロセスを解説していきます。

なお、実際にAzure OpenAI Service上のチャットベースで試したのですが、うまくいかず…
机上の話にはなりますが、論文の情報を交えて解説していきたいと思います。

step1:出力

プロンプト

4, 9, 10, 13の数字を使って24のゲームを行ってください。
まず4つの数字のうち2つの数字を使った計算をいくつかピックアップしてください。

回答例

10 - 4 = 6 (残り 6, 9, 13)
9 + 13 = 22 (残り 4, 10, 22) 
... more

step2:AIによる評価

プロンプト

6, 9, 13 
4, 10, 22 
... more
これらの数字のうち、24に近づきそうなものはありますか? [確実]/[おそらくできる]/[不可能]の3つにカテゴライズしてください。

回答例

6, 9, 13 (おそらくできる) 
4, 10, 22 (不可能) ...

step3:再度出力

[確実]/[おそらくできる]にカテゴライズされた数字の組み合わせについて、再度step1から繰り返す。

プロンプト

残った6, 9, 13の数字を使って24のゲームの続きを行います。
3つの数字のうち2つの数字を使った計算をいくつかピックアップしてください。

といった流れです。

流れの確認

  1. まず生成AIに出力を行わせ(step1)、その出力に対する評価も生成AIに行わせる(step2)
  2. そして、再度確度が高いものに対して計算の出力を行わせて、再度評価させる

という繰り返しになります。

こうすることで正解にたどり着けるようですが、自分が試行した限りでは正解にたどり着くことができませんでした…。

原因としては以下のことが考えられました。

  1. いちいちチャット形式で投げていたので試行回数が圧倒的に少なかった
  2. step2におけるAIによる判定が誤っていた

1.に関しては、システム化して試行回数を膨大にすることで、正解にたどり着ける枝を見つけることができるようにも思いました。
2.に関しては、CoTなどを併用して判定精度を上げる等でしょうか…。

残念ながら今回は正解にたどり着くことができなかったですが
この手法を取ることで、正解への到達率がCoTなどの手法より優れていることが論文の中で述べられています。

ToTプロンプティング

もっと分かりやすくToTを利用したプロンプティングの例も見つけました。

参考:https://github.com/dave1010/tree-of-thought-prompting

こちらはプロンプト上で3人の専門家を登場させ、複雑な問題に対して議論させています。
先程の24のゲームとは違い、1回のプロンプト内で複数回の評価を行わせてる形になります。

参考にした例と同じプロンプトを投げてみたいと思います。

プロンプト

この質問について、3人の異なる専門家が回答していると想像してください。
すべての専門家は、自分の思考の1つのステップを書き留め、それをグループと共有します。
その後、すべての専門家は次のステップに進みます。以後同様です。
もし専門家の中に、いかなる時点で誤りに気づいた場合は、退場します。
質問は...

ボブはリビングルームにいる。
カップを持ってキッチンに行く。
コップの中にボールを入れ、寝室まで運ぶ。
コップを逆さまにし、庭に行く。
庭にコップを置き、車庫まで歩く。
ボールはどこにある?

回答

専門家1: ボールは庭にあります。ボブがコップを庭に置いたので、ボールも一緒に庭に置かれたはずです。

専門家2: ボールは車庫にあります。ボブがコップを逆さまにして庭に置いた後、車庫まで歩いたので、ボールも車庫にあるはずです。

専門家3: ボールは寝室にあります。ボブがリビングルームからキッチンに行き、コップの中にボールを入れ、寝室まで運んだので、ボールは寝室にあるはずです。

専門家1: しかし、ボブはコップを庭に置いた後、車庫まで歩いたので、ボールも車庫にある可能性があります。

専門家2: その通りです。ボールは庭にある可能性もありますが、車庫にある可能性もあります。

専門家3: しかし、ボブは寝室までボールを運んだので、ボールは寝室にある可能性もあります。

専門家1: なるほど、確かに寝室にもボールがある可能性がありますね。

専門家2: そうですね、寝室にもボールがあるかもしれません。

専門家3: では、ボールは庭にあるかもしれないし、車庫にあるかもしれないし、寝室にあるかもしれないという結論になりますね。

専門家1: その通りです。ボールの位置は確定できないようです。

…うーん、「確定できない」という結論で終わってしまいました。

ちなみに英語の原文そのままコピペでもダメでした。
利用するモデルによっても差が出てくるかもしれません…。

プロンプトの文章を少しずつ修正していったら、もしかしたら正解にたどり着けるかもしれませんが、
ToTの本質とはずれるように思うので、今回はここで断念したいと思います。
ただ、ToTの雰囲気はなんとなく掴んでいただけたのではないでしょうか!

なお、今回は正解がある問題に対して利用しましたが、正解がない問題に対しても利用できそうです。
例えば有効なマーケティングの調査方法だったり、PV数が上がるブログの書き方だったりですね。

まとめ

今回は

  • 知識生成プロンプティング
  • Prompt Chaining
  • Tree of Thoughts

の3つのテクニックを紹介しました。
基礎編に比べるとだいぶ複雑になってきており、LLMを理解して、使いこなしてる感が出てきました。

ただ一方で、これらのテクニックをお手軽使いこなせないケースもあるように見られました。
相変わらずですが、このあたりの再現や評価が難しいのが生成AIを活用するうえでの課題な気がしています。

本記事は一応「初心者向け」と題して書いてあるのであまり深堀りはしていませんが、
今回紹介した方法はいずれも論文が書かれており、より詳細を知りたい方はそちらをご覧いただければと思います。

自分もまだ論文まではしっかり読めていないので、Prompt Chainingを利用して頑張って読んでみたいと思います。

ではまた!

参考

Prompt Engineering Guide

Getting Started with Prompt Chaining

Chain prompts – ANTHROPIC 

tree-of-thought-prompting

アバター画像
About 佐藤 陽 57 Articles
ロードバイクやランニングなど、走ることが好きなサーバーサイドエンジニア。組み込み系からWeb系へとジョブチェンジし、現在はAzureを使ったWebアプリの開発や、DevOpsの構築を行っています。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる