ここでは10回に渡って、生成AI「Claude」を使いこなすためのプロンプトエンジニアリングのコツを紹介しています。前回の第3回目は、「役割を与える」について解説してきました。
第4回目は「XMLタグで構造化された指示を与える」というテクニックを中心に解説していきます。
XMLタグとは?
XMLタグとは、のような山括弧で囲まれたタグのことです。これらは常にペアで使われ、のような開始タグと、のような/(スラッシュ)で終わる終了タグで構成されます。XMLタグは、contentのようにコンテンツを囲むために使われるんですね。
開始タグと終了タグは、必ず同じ名前にしなければなりません。タグ名は山括弧で囲む限り何でも構いませんが、囲んでいるコンテンツに関連した名前をつけることをおすすめします。
XMLタグを使う理由
では、なぜプロンプトにXMLタグを取り入れるのでしょうか?
まず、正確性の向上が挙げられます。XMLタグを使うことで、指示、例、入力データなどのプロンプトの異なる部分を区別しやすくなります。これにより、Claudeがプロンプトをより正確に解析でき、特に数学やコード生成などの分野で、より適切で正確な応答が期待できます。
次に、構造の明確化です。見出しやセクションが人間にとって文書を理解しやすくするのと同じように、XMLタグはClaudeにプロンプト内の階層や関係性を理解させやすくします。
さらに、後処理の容易化も重要なポイントです。Claudeの応答にもXMLタグを使うよう求めることで、プログラム的に重要な情報を抽出するのが簡単になります。
XMLタグの使い方
では、XMLタグをどのように使えばいいのでしょうか?
XMLタグを使って、指示と内容、例と指示などのプロンプトの各部分を区切ることができます。以下のように使ってみてください。
<instructions>
以下の文書を分析し、指示に従って詳細な要約メモを作成してください。
フォーマットは例に従ってください。
</instructions>
<document>
{{文書}}
</document>
<example>
{{例}}
</example>
このように、タグで指示を囲み、タグで分析対象の文書を囲み、タグで例を囲むことで、Claudeにプロンプトの構造をはっきりと伝えることができます。以下に具体的な例をあげます。
<instructions>
以下の文書を分析し、指示に従って詳細な要約メモを作成してください。 フォーマットは例に従ってください。
</instructions>
<example>
要約メモのフォーマット:
- 主題: 文書の主なトピックや目的
- キーポイント: 1. 文書の重要なポイントや結論 2. 文書の重要なポイントや結論 3. 文書の重要なポイントや結論
- 所感: 文書から受けた印象や思ったこと
</example>
<document>
私は先日、とある会議に出席した。会議の目的は、新製品の開発計画について討議することであった。
参加者は様々な部署から集まり、活発な意見交換が行われた。開発チームからは、製品の革新的な特徴について説明があった。
一方、マーケティングチームからは、市場調査の結果に基づく提案がなされた。
議論の末、プロジェクトの実施が決定し、各チームが担当する役割が明確になった。
会議は成功裏に終了し、新製品の開発に向けて一同の士気は高まったように感じられた。
</document>
変数入力の扱い方
変数入力を含むプロンプトテンプレートを使う場合は、XMLタグを使って変数コンテンツを挿入する場所を示すのが効果的です。例えばこんな感じですね。
<animal>{{動物名}}</animal>の鳴き声は何ですか?
このように、変数入力は常にXMLタグを使って残りのプロンプトから分離するのがルールです。こうすることで、例やデータがどこで始まってどこで終わるのかがClaudeにはっきりと伝わり、より正確な応答が得られます。
この場合、例えば普通に「ネコの鳴き声は何ですか?」と直接値を書いてもよさそうに思えますが、XMLタグを使う主な利点は以下の通りです。
- 変数の明確化: XMLタグを使うことで、どの部分が変数であるかが一目瞭然になります。これにより、プロンプトのテンプレートと変数の値が明確に区別されます。
- 構造化された入力: XMLタグを使うことで、入力データに構造を与えることができます。これにより、Claudeは入力をより正確に解析し、適切な応答を生成できます。
- 柔軟性: XMLタグを使う方法では、変数の値を動的に変更することが容易です。プロンプトのテンプレートはそのままで、XMLタグ内の値だけを変更すればよいからです。
- 複数のプロンプトで同じ変数を使う場合、XMLタグを使うことで変数の表現を一貫させることができます。これにより、プロンプト全体の可読性と保守性が向上します。
一方、直接値を記述する方法は、シンプルで読みやすいというメリットがあります。ただし、変数であることが明示されないため、プロンプトの意図が曖昧になる可能性があります。
したがって、プロンプトの複雑さや変数の数に応じて、XMLタグを使うか直接値を記述するかを選択するのが良いでしょう。シンプルなプロンプトなら直接値を記述し、複雑なプロンプトや変数が多い場合はXMLタグを使うのが効果的です。
以下に、複雑なプロンプトや変数が多い場合の例をあげます。
<system_prompt>
以下の条件に基づいて、新製品のプレスリリースを作成してください。
製品名は<product>タグで囲まれた値を使用する
発売日は<release_date>タグで囲まれた値を使用する
製品の主な特徴は、<features>タグ内の<item>タグで囲まれた値を箇条書きで記載する
プレスリリースの本文は、<body>タグで囲んで出力する
</system_prompt>
<product>スマートウォッチXYZ</product>
<release_date>2023年9月1日</release_date>
<features>
<item>健康管理機能: 心拍数、血中酸素濃度、ストレスレベルのモニタリング</item>
<item>フィットネス機能: 50種類以上のワークアウトモード、GPSによるルートトラッキング</item>
<item>スマート通知: 通話、テキスト、SNSアプリの通知をディスプレイに表示</item>
</features>
<body> {{Claudeが生成するプレスリリース本文}} </body>
この例では、プレスリリースに必要な情報をXMLタグで構造化し、変数として使用しています。
このように、複雑な条件を含むタスクをClaudeに依頼する際に、変数を使ってプロンプトを構成することで、より明確で詳細な指示を与えることができます。
構造化された出力の要求
Claudeの応答にXMLタグを使うよう求めることで、出力の解析や処理がしやすくなります。例えばこんな風に指示してみましょう。
以下のメールから重要な詳細情報を抽出し、XMLタグを使って返してください。
- 送信者名は<sender></sender>タグで囲んでください
- 主なトピックは<topic></topic>タグで囲んでください
- 期日や日付は<deadline></deadline>タグで囲んでください
<email>
From: 佐藤花子
To: 田中一郎
Subject: 新製品開発プロジェクトの進捗報告
田中様
お世話になっております。佐藤です。
新製品開発プロジェクトの進捗についてご報告いたします。
現在、プロトタイプの製作が順調に進んでおり、当初の予定通り6月末までには完成する見込みです。
その後、7月中に社内でのテストを実施し、問題がなければ8月上旬にはプレス発表を行う予定です。
つきましては、プレス発表の準備を進めるため、7月15日までにプレスリリース案をご提出いただきたく存じます。
ご多忙とは存じますが、ご協力のほどよろしくお願いいたします。
今後とも、プロジェクトの成功に向けて尽力してまいりますので、引き続きご指導ご鞭撻を賜りますようお願い申し上げます。
佐藤花子
</email>
こうすることで、Claudeは次のような応答を返してくれるはずです。
佐藤花子
新製品開発プロジェクトの進捗報告
- 6月末: プロトタイプ完成予定
- 7月15日: プレスリリース案の提出期限
- 8月上旬: プレス発表予定
このように、具体的な変数の値やメールの例を示すことで、XMLタグの使い方がより明確になり、読者の理解が深まるでしょう。Claudeへの指示とそれに対する期待される応答も具体的に示されているため、プロンプトの設計方法がイメージしやすくなります。
XMLタグを使うことで、特定のタグに囲まれた内容をプログラム的に抽出するのが容易になり、Claudeの応答から必要な情報を取り出しやすくなります。
XMLタグを最大限活用するには、こんなコツを意識しましょう。
- 内容を反映した記述的なタグ名(<instructions>、<example>、<input>など)を使う
- プロンプト全体で一貫したタグ名を使う
- 開始タグ(<tag>)と終了タグ(</tag>)の両方を必ず含める(参照時も同様)
- XMLタグはネストできるが、使用例の複雑さによっては5層以上のネストでパフォーマンスが低下する可能性がある
以上、XMLタグの基本と使い方についてお伝えしました。XMLタグを効果的に使うことで、Claudeにプロンプトの構造と意図をより明確に伝え、求めるアウトプットに近づけられることがお分かりいただけたでしょうか。次回は「Chainプロンプト」というテクニックを紹介します。お楽しみに!