Menu

プロンプトチェーンとは?タスクをステップに分ける方法

プロンプトチェーンとは、1つの仕事を小さなプロンプトの連続に分け、各ステップの出力を次のステップの入力にする方法です。各ステップは1つのことだけをし、次を実行する前に結果を確認できます。

このページのプロンプトはすべて編集でき、そのまま ChatGPT や Claude などの AI アプリで開けます。

プロンプトチェーンとは、1つの仕事をプロンプトの連続に分け、あるプロンプトの出力を次のプロンプトの入力の一部にすることです。50件のレビューを読み、問題を見つけ、順位を付け、レポートを書くのを一度にモデルに頼む代わりに、それぞれを順番に頼みます。各プロンプトには1つの仕事があり、ステップのあいだで、あなた(またはあなたのコード)が結果を見て、直すか、止めるかを決められます。

下のブロックは、顧客のレビューをプロダクトチーム向けのメモに変える3ステップのチェーンです。各タブが1つのステップです。ステップ2の入力はステップ1への返答を貼り付けたもので、ステップ3の入力はステップ2への返答です。

Fill in
<reviews> タグの中のレビューに含まれる不満をすべて挙げてください。称賛は無視してください。キー "review"(レビューの番号)と "complaint"(20字以内)を持つオブジェクトの JSON 配列で返してください。JSON だけを返してください。 <reviews> 1. 4時間でバッテリーが切れた。充電ケーブルも短すぎる。 2. 音はすばらしい。ただアプリが何度もログアウトする。 3. 気に入っているけど、帰りの通勤中にバッテリーがもたない。 4. ペアリング中にアプリが2回落ちたし、バッテリーの減りも早い。 5. ケーブルが短すぎて、机で充電しながら使えない。 </reviews>
Try it
Example replyReplies vary between models and runs.
[
  {"review": 1, "complaint": "4時間でバッテリーが切れる"},
  {"review": 1, "complaint": "充電ケーブルが短すぎる"},
  {"review": 2, "complaint": "アプリが何度もログアウトする"},
  {"review": 3, "complaint": "通勤中にバッテリーがもたない"},
  {"review": 4, "complaint": "ペアリング中にアプリが落ちる"},
  {"review": 4, "complaint": "バッテリーの減りが早い"},
  {"review": 5, "complaint": "ケーブルが短く充電中に使えない"}
]

ステップ1は読んで抜き出すだけです。ステップ2はレビューを一切見ず、リストだけを見るので、レビューの要約に逆戻りすることがありません。ステップ3は書くだけです。ステップ3のトーンが違っていたら、ステップ3だけを再実行します。抽出とグループ化はそのまま残ります。

ステップ3が書いていないことに注目してください。あるバッテリーが4時間で切れたことや、アプリの問題がログアウトとクラッシュだったことです。ステップ3が受け取ったのはテーマ名だけなので、その詳細は入力に含まれていませんでした。各ステップに何を渡すかを決めることがチェーンの主な設計上の選択で、最終的な答えに入れたい詳細は、最後まで受け渡さなければなりません。

1つの大きなプロンプトではなくチェーンにする理由

各ステップに1つの仕事と1つの基準がある。 抽出、分析、洗練された文章を1つのプロンプトで頼むと、バランスをとるべき目標が3つになり、どれが手薄になったのかはわかりません。1つの仕事だけのプロンプトなら、その仕事にとっての良い結果を正確に書けて、返答をそれに照らして判断できます。

途中を確認できる。 1つのプロンプトでは、拾いそこねた不満はきれいに書かれた段落の中に消え、目にすることはありません。チェーンなら、ステップ1のリストがすぐそこにあります。確認には数秒しかかからず、ステップ2の前に直すほうが、最終レポートで誤りを見つけるより安くつきます。

各ステップで別々の設定を使える。 抽出とグループ化には低い temperature と、コードでパースできる構造化出力が向いています。執筆のステップはもっと自由でかまいません。コードなら、抽出には小さく速いモデルを使うように、ステップごとに違うモデルに送ることもできます。

失敗が局所的になる。 チェーンが壊れたら、どのステップが壊れたかがわかり、そのステップだけを再実行できます。

コストもあります。チェーンは呼び出しが多いので、1つのプロンプトより時間もお金もかかります。そして前のステップをすり抜けた間違いは、そのあとのすべてのステップに持ち込まれます。だからこそ、あいだのステップを確認する価値があるのです。

チェーンの設計方法

  1. 手作業でするときのステップを書き出す。まずリストを作り、次に並べ替え、それからまとめるなら、それが3つのプロンプトです。違う種類の考え方が必要なステップが、自然な分け目になります。
  2. プロンプトを書く前に、各ステップの出力形式を決める。次のステップが受け取るものは、読みやすく確認しやすいものにします。JSON の配列、番号付きリスト、表などです。自由な文章でよいのは最後のステップだけです。
  3. 次のステップに必要なものだけを渡す。上のステップ2が受け取るのは不満のリストで、レビューではありません。入力が少なければ気が散る要素も少なく、各ステップを単独でテストできます。
  4. ステップのあいだに確認を入れる。コードなら JSON をパースしてフィールドがあるかを確かめます。判断が必要な確認は、それ自体をプロンプトにできます。「このリストには、これらのレビューに含まれる不満がすべて入っていますか?はいかいいえで答え、足りないものがあれば挙げてください。」
  5. 貼り付けた素材をはっきり示す。各ステップの入力は前のステップが生成したテキストなので、区切り文字を使い、モデルがそれを新しい指示として読まないようにします。

上のチェーンのための確認ステップを、不満を1つ拾いそこねたステップ1の出力で実行した例です。このような確認は、狭い質問を1つだけする別のプロンプトなので、抽出そのものより正しくやりやすくなります。

次に渡す前にステップを確認する
<reviews> タグの中のレビューと、<complaints> タグの中の不満のリストを比べてください。リストにはレビューに含まれる不満がすべて入っていますか?1行目に「完全」か「不完全」で答えてください。不完全なら、足りない不満をレビュー番号とともにそれぞれ挙げてください。 <reviews> 1. 4時間でバッテリーが切れた。充電ケーブルも短すぎる。 2. 音はすばらしい。ただアプリが何度もログアウトする。 3. 気に入っているけど、帰りの通勤中にバッテリーがもたない。 4. ペアリング中にアプリが2回落ちたし、バッテリーの減りも早い。 5. ケーブルが短すぎて、机で充電しながら使えない。 </reviews> <complaints> レビュー1:4時間でバッテリーが切れる レビュー1:充電ケーブルが短すぎる レビュー2:アプリが何度もログアウトする レビュー3:通勤中にバッテリーがもたない レビュー4:ペアリング中にアプリが落ちる レビュー5:ケーブルが短く充電中に使えない </complaints>
Try it
Example replyReplies vary between models and runs.

不完全

  • レビュー4:バッテリーの減りが早い

確認で「不完全」と出たら、ステップ2を実行する前に、ステップ1を再実行するか、足りない項目を手で足してください。

コードで書くチェーン

コードでは、チェーンは呼び出しの連続で、各プロンプトは前の答えから組み立てられます。この版は Anthropic の Python SDK を使っていますが、同じ形はどの提供元でも使えます。

import json
import anthropic

client = anthropic.Anthropic()
MODEL = "your-model-id"  # e.g. from your provider's model list

def ask(prompt):
    response = client.messages.create(
        model=MODEL,
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    )
    return response.content[0].text

reviews = open("reviews.txt", encoding="utf-8").read()

complaints = ask(
    "List every complaint in the reviews inside the <reviews> tags. Ignore praise. "
    'Return a JSON array of objects with the keys "review" and "complaint". '
    "Return only the JSON, with no code fence.\n\n"
    f"<reviews>\n{reviews}\n</reviews>"
)
json.loads(complaints)  # raises an error here if step 1 did not return valid JSON

themes = ask(
    "Group these complaints into themes. Return only a JSON array with the keys "
    '"theme", "count" and "reviews", sorted by count, highest first.\n\n'
    f"<complaints>\n{complaints}\n</complaints>"
)

note = ask(
    "Write a note of at most four sentences to the product team based on these "
    f"themes. Lead with the most common one.\n\n<themes>\n{themes}\n</themes>"
)
print(note)

json.loads の行は、考えられる最も単純な確認です。ステップ1が文章で答えていたら、チェーンは悪い入力を渡さずにそこで止まります。本番のチェーンなら、さらにフィールドを確認し、失敗したステップを1回再試行し、途中の結果をそれぞれ記録して、悪い最終答えをそれを引き起こしたステップまでさかのぼれるようにします。

チャットアプリでのチェーン

プロンプトをチェーンにするのにコードは要りません。ステップ1を実行して答えを読み、間違っているところを直して、ステップ2のプロンプトに貼り付けます。ステップごとに新しいチャットで行えば、前の会話がコンテキストに入らないので、あるステップのために書いた指示が次に影響しません。1つのチャットで続けるほうが早く、ステップ同士が密接に関係しているならそれでもうまくいきますが、新しいメッセージのたびに履歴全体がついて回ります。

関連するテクニックとの比較

Chain-of-Thought は1つの返答の中に書き出される推論です。プロンプトチェーンは複数の返答で、そのあいだで何を渡すかをあなたが管理します。この2つはうまく組み合わせられます。チェーンのどのステップでも、ステップごとの推論を頼めます。

チェーンでは、ステップはあなたが前もって決めます。検索して結果を読み、次の行動を選ぶ、というように次のステップをモデル自身が決める場合、それはエージェントのループと呼ばれる別のパターンで、ReAct プロンプティングで説明しています。固定のチェーンはテストも予測もしやすいので、ステップがすでにわかっているなら、そちらから始めるのがよいでしょう。

よくある質問

プロンプトチェーンとは何ですか?

プロンプトチェーンとは、タスクを順番に実行する複数のプロンプトに分け、各プロンプトの出力を次のプロンプトに入れるテクニックです。たとえば1つ目のプロンプトでレビューから不満を抜き出し、2つ目でそれをテーマにまとめ、3つ目でテーマからレポートを書きます。

プロンプトチェーンと Chain-of-Thought の違いは何ですか?

Chain-of-Thought は1つの返答の中で起きます。モデルが答えの前に推論を書き出します。プロンプトチェーンは別々の呼び出しを複数使い、あなたかあなたのコードが1つの結果を次に渡します。チェーンならどのステップでも個別に確認、修正、再実行できますが、1つの返答の中の推論ではそれができません。

コードを書かずに ChatGPT や Claude でプロンプトチェーンはできますか?

できます。1つ目のプロンプトを実行して答えを確認し、それを次のプロンプトに貼り付けます。同じチャットでも新しいチャットでもかまいません。ステップごとに新しいチャットを始めると、前の下書きや指示があとのステップに影響しません。

1つのプロンプトではなくプロンプトチェーンを使うべきなのはどんなときですか?

1つのプロンプトで抽出、分析、執筆のような種類の違う仕事をいくつも頼んでいるとき、あるいは途中の結果を確認したり再利用したりする必要があるときにチェーンを使います。1つのプロンプトですでに安定した答えが得られるなら、チェーンは呼び出し、コスト、待ち時間を増やすだけです。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める