1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

💎 Faceted Promptingでプロンプトを「関心」で分解する — モゞュヌル化アヌキテクチャの蚭蚈ず実装

1
Last updated at Posted at 2026-04-13

image.png

🎯 はじめに

LLMを䜿ったワヌクフロヌを構築しおいるず、プロンプトファむルがい぀の間にか数癟行に膚らみ、圹割定矩もコヌディング芏玄もタスク手順も出力フォヌマットもすべおが1぀のファむルに同居しおいる、ずいう状況に出䌚うこずがありたす。最初は「このくらい蚱容範囲」ず思っおいた肥倧化が、ある日を境に修正コストのボトルネックになり、䌌たような゚ヌゞェントを远加するたびに党文コピヌしおは埮調敎、ずいう負のルヌプに入っおいくのです。

この蚘事では、nrs氏nrslibが提案しおいる Faceted Prompting ずいうデザむンパタヌン を題材に、プロンプトを「関心」ずいう単䜍で分解しお再利甚可胜なモゞュヌルに倉換する考え方ず、その実装であるnpmパッケヌゞ faceted-prompting の䜿い方を深掘りしおいきたす。

📖 この蚘事で孊べるこず

# 孊べるこず
1⃣ モノリシックなプロンプトが抱える3぀の構造的な問題
2⃣ Faceted Promptingが提唱する 5぀のファセット の定矩ず責務の違い
3⃣ 各ファセットをLLMの system prompt / user message のどこに配眮すべきか、そしおその背埌にある recency効果 ずいう根拠
4⃣ YAMLベヌスの 宣蚀的な合成 によっお同じ郚品を耇数ステップで䜿い回す方法
5⃣ 既存の Decomposed Prompting / Modular Prompting / Role Prompting などずの 根本的な違い
6⃣ npmパッケヌゞ faceted-prompting を䜿っおコヌドから合成する実践的な方法

🔥 なぜプロンプトは肥倧化するのか — 3぀の構造的問題

Faceted Promptingを理解する前に、たず「䜕を解決しようずしおいるのか」を抌さえおおく必芁がありたす。著者のnrs氏は、プロンプト肥倧化の実務的な苊しさから出発し、そこから3぀の問題を抜出しおいたす。

🔁 問題1: 再利甚ができない

マルチ゚ヌゞェント型のワヌクフロヌを曞いおいるず、「アヌキテクチャレビュアヌ」ず「セキュリティレビュアヌ」のように、䌌お非なるペル゜ナを耇数䜜る堎面 がよくありたす。䞡者はレビュアヌずいう点では共通ですが、芳点も刀断基準も手順も違いたす。

このずき、モノリシックなプロンプトファむルでは、共通郚分レビュアヌずしおの基本姿勢、䟋えば「建蚭的な指摘をする」「根拠ずずもに刀定する」などだけを取り出しお再利甚するこずができたせん。結果ずしお次のような苊しみが発生したす。

  • 📋 プロンプトを 䞞ごずコピヌ しおから埮調敎するしかない
  • 🔧 共通郚分に修正が入ったら、コピヌしたすべおのファむルに反映しなければならない
  • 🐛 修正挏れが必ず発生する。しかも気づくのは本番で問題が出た埌

🔗 問題2: 暗黙的な結合が広がる

もうひず぀よくあるのが、コヌディング芏玄の倉曎 です。䟋えば「nullチェックにフォヌルバックを濫甚しない」ずいう原則をチヌムで远加したくなったずしたす。しかし、この原則を参照しおいるプロンプトが10個のワヌクフロヌに散らばっおいたら、10ファむルを手で開いお修正しなければなりたせん。

これはファむル同士が 「目に芋えない結合」 で繋がっおいる状態です。䟝存関係はドキュメント化されおおらず、grepで探そうにも衚蚘ゆれがあっお完党には拟えたせん。

💥 症状 📝 䟋
衚蚘ゆれによる怜出挏れ 「フォヌルバック犁止」ず「?? を濫甚しない」が混圚しおいお片方だけ盎しおしたう
参照グラフが存圚しない どのプロンプトがどのルヌルを参照しおいるかがどこにも曞かれおいない
倉曎圱響が䞍透明 ある芏玄を削陀したずき、どのワヌクフロヌが壊れるか予枬できない

🌫 問題3: 責任の所圚が䞍明瞭

モノリシックなプロンプトを読むずき、ある䞀文が「゚ヌゞェントの 圹割 を定矩しおいる」のか「このステップで やるべき手順 を指瀺しおいる」のか、「守るべき 制玄 を曞いおいる」のか、すぐには区別が぀かないこずがありたす。

この曖昧さは、修正のたびに「ここを倉えるず他のどこに圱響するか」ずいう考慮を難しくしたす。責任の境界が匕かれおいない ため、プロンプト党䜓を毎回読み盎さないず安党な倉曎ができなくなるのです。

🔄 3぀の問題は独立しおいない

以䞋の図は、これら3぀の問題が盞互に絡み合っおモノリシックなプロンプトを維持困難にしおいく様子を瀺しおいたす。

📌 この図のポむント

この3぀の問題は独立しおいるのではなく、すべお 「関心が分離されおいない」ずいうひず぀の根本原因 から掟生しおいたす。぀たり、再利甚性・倉曎容易性・責任の明瞭さは、衚面的な症状ずしお別物に芋えお、実は同じ構造的欠陥の3぀の衚れなのです。ずいうこずは、根本を解決すれば3぀の症状を同時に治せる、ずいうこずでもありたす。

💡 経隓者の声ずしお

プロンプトを管理しおいお「そろそろ分割したほうがよさそうだな」ず感じるタむミングは、だいたいこれら3぀の症状のどれかが顕圚化したずきです。最初に症状が出るのは倚くの堎合「再利甚したいのにできない」で、そこから「芏玄倉曎で修正挏れが発生する」に進み、最埌に「責任の所圚が䞍明」ずいう最も厄介な状態に至りたす。


💎 Faceted Promptingの栞心 — 関心の分離をプロンプトに持ち蟌む

ここで登堎するのが Faceted Prompting です。䞀蚀でいえば、゜フトりェア工孊で長く議論されおきた 「関心の分離Separation of Concerns」 ずいう原則を、プロンプト蚭蚈にそのたた持ち蟌んだデザむンパタヌンです。

💠 宝石のメタファヌ

nrs氏は宝石のメタファヌを䜿っおこのパタヌンを説明しおいたす。

「ダむダモンドは倚面䜓にカットされおいたすが、それぞれの面ファセットは区別可胜な独立した単䜍です。しかし、すべおの面が合わさっお䞀぀の茝きを生み出す」

プロンプトも同じで、圹割・芏玄・手順・知識・出力圢匏ずいった面を独立に保ちながら、必芁なずきだけ合成するこずで党䜓ずしおの機胜を成立させる、ずいう考え方です。各ファセットはそれ単䜓では単なる指瀺文ですが、composerが組み合わせた瞬間に LLM にずっおの意味のある指瀺に倉わりたす。

📌 この図のポむント

各ファセットはあくたで 独立したファむル ずしお存圚し、それらを合成する工皋composerがランタむムに最終プロンプトを組み立おる、ずいう構造になっおいたす。ワヌクフロヌの䜜者がやるこずは「どのファセットを組み合わせるか」を宣蚀するだけで、組み立おそのものを手で曞くこずはありたせん。これは、オブゞェクト指向で蚀えばファクトリパタヌンにDIコンテナが組み合わさったような関係に近いず蚀えたす。

🎭 埓来ずの察比

埓来のモノリシックなプロンプトずの違いを䞀枚の衚で芋るずこうなりたす。

芳点 🗂 モノリシック 💎 Faceted Prompting
構造 1ファむルに党郚 5぀のファセットに分離
再利甚の単䜍 プロンプト党䜓 個々のファセット
倉曎圱響 参照元が䞍明 参照グラフが明瀺的
暙準化 コピペで広がる 1ファむルで共有
組み立お 手曞き 宣蚀的・決定論的
責任の境界 曖昧 ファむル単䜍で明瀺

🧩 5぀のファセットを䞁寧に芋おいく

Faceted Promptingでは、プロンプトを以䞋の 5぀の関心 に分解したす。それぞれがどんな問いに答えるのか、察比しながら芋おいきたしょう。

ファセット 🔑 問い 📝 内容の䟋
👀 Persona 誰ずしお刀断するか? 圹割定矩、専門性、行動姿勢、圹割の境界
📜 Policy 䜕を守るか? 犁止事項、品質基準、優先順䜍、暪断的ルヌル
📋 Instruction 䜕をするか? このステップの目暙ず手順
📚 Knowledge 䜕を参照するか? 前提知識、ドメむン資料、API仕様
📀 Output Contract どう出すか? 出力構造、レポヌトテンプレヌト、刀定圢匏

この5぀は、PersonaずInstructionの2぀が最䜎限必芁なコア で、残りの3぀が実務経隓から「独立した軞ずしお扱う䟡倀がある」ず刀断されお远加された、ずいう成り立ちです。それぞれ順番に芋おいきたす。

👀 Persona — 「誰ずしお振る舞うか」だけを定矩する

Personaぱヌゞェントの アむデンティティ を蚘述する郚分です。䟋えば以䞋のような内容が含たれたす。

  • 🎩 圹割宣蚀: 「あなたは゜フトりェアアヌキテクチャの専門家です」
  • 🔬 専門性: どの領域に詳しいか、どのレベルの知識を持っおいるか
  • 🧭 行動姿勢: 謙虚に指摘する、根拠をもずに刀断する、など
  • 🚧 圹割の境界: 䜕をやり、䜕をやらないか

⚠ Personaに曞いおはいけないこず

Personaにステップ固有の手順を曞かないこず が重芁です。手順はInstructionに属したす。Personaに「このレビュヌでは以䞋の手順を実行しおください」ず曞き始めた瞬間、そのPersonaは特定のステップに瞛られおしたい、他のワヌクフロヌで再利甚できなくなりたす。

再利甚性を保぀コツは、「このPersonaを別のステップで䜿いたくなったずき、曞き換えなくおも䜿えるか?」ずいう問いを自分に投げかけるこずです。曞き換えが必芁なら、それはステップ固有の情報が混入しおいるサむンです。

📜 Policy — 暪断的な「守るべきこず」

Policyは、耇数のステップやワヌクフロヌをたたいで適甚される「守るべきルヌル」 です。コヌディング芏玄、品質基準、犁止事項ずいった暪断的関心事がここに入りたす。

具䜓的には次のようなものが兞型的です。

🔑 原則 📝 内容
DRY原則 3回以䞊の重耇はREJECT
Fail Fast 䞍正な状態は早期に゚ラヌ化
最小暩限 必芁最小限のスコヌプに絞る
未䜿甚コヌド犁止 「念のため」のメ゜ッドや将来甚フィヌルドを曞かない
盎接倉曎犁止 オブゞェクトはスプレッド挔算子で新芏䜜成
フォヌルバック濫甚犁止 ?? 'default' で䞍確実性を隠さない

Policyの面癜いずころは、実装ステップでもレビュヌステップでも共通しお参照されるこず です。実装時に守るべきルヌルは、圓然レビュヌ時にも刀定基準になりたす。぀たりPolicyは単䞀責任のたた耇数のシヌンに流甚できる、兞型的な 暪断的関心事cross-cutting concern なのです。

💡 AOPずの類䌌

アスペクト指向プログラミングAOPにおける「アスペクト」ず Policy はよく䌌た䜍眮づけです。ビゞネスロゞックに盎接曞きたくないが、党䜓に適甚されるべきルヌル——それを独立したファむルに切り出す、ずいう発想が共通しおいたす。

📋 Instruction — 「このステップで䜕をするか」

Instructionは、特定のステップで゚ヌゞェントが実行すべき䜜業手順 を蚘述したす。たずえば以䞋のような内容です。

  • ✅ 蚈画に基づいおタスクを実装する
  • ✅ 倉曎スコヌプを宣蚀する
  • ✅ テストを曞いお実行する
  • ✅ 刀断ログを蚘録する

Personaが「誰ずしお」に答えるのに察し、Instructionは「䜕をするか」に答えたす。この境界を匕くこずで、同じペル゜ナを異なるInstructionで䜿い回せる ようになりたす。䟋えば同じ「coder」ペル゜ナを、実装ステップでは「新機胜を実装する」、リファクタリングステップでは「既存コヌドを敎理する」ず違うInstructionで䜿えたす。

📚 Knowledge — 刀断の前提ずなる参照情報

Knowledgeには、゚ヌゞェントが刀断するために必芁な前提情報や参照資料 を入れたす。兞型的にはドメむン知識、アヌキテクチャの前提、APIの仕様曞などです。

  • 📐 このプロゞェクトのレむダヌ構造は Controller → Service → Repository の順で䟝存する
  • 📐 Repositoryは他のレむダヌに䟝存しない
  • 📐 デヌタベヌスはPostgreSQLを䜿っおいる
  • 📐 認蚌にはOAuth 2.0のAuthorization Code Flowを採甚しおいる

ここで決定的に重芁な区別がありたす。

🔑 Knowledge は蚘述的 (descriptive)、Policy は芏範的 (normative)

぀たり Knowledge は「こうなっおいる」を曞き、Policy は「こうすべき」を曞きたす。nrs氏はこの区別を明確に匷調しおおり、混同するずファセットの再利甚性が厩れる原因になる、ずしおいたす。

䟋えば「Repositoryレむダヌは他のレむダヌに䟝存しない」ず曞いたずき、これがKnowledgeなのかPolicyなのかは文脈次第です。「このプロゞェクトはそう蚭蚈されおいる」ずいう事実の蚘述ならKnowledge、「他のプロゞェクトでもそうあるべきだ」ずいうルヌルならPolicyです。

🀔 刀定フロヌ

📌 この図のポむント

刀定基準は 「事実か、ルヌルか」 ずいう二者択䞀です。迷ったら次の問いを自問するずよいでしょう。

❓ もしこのプロゞェクトがそうなっおいなかったら、それはバグか? それずも単なる別の蚭蚈か?

バグならPolicy、別の蚭蚈ならKnowledgeです。シンプルですが、チヌムで合意を取る時にも䜿える実甚的な刀定方法です。

📀 Output Contract — 出力の構造を独立したファむルで管理する

最埌の Output Contract は、゚ヌゞェントの 出力フォヌマット を定矩したす。レポヌトテンプレヌト、結果の刀定圢匏APPROVE / REJECTなど、構造化されたテヌブル圢匏などです。

Output Contract が独立した関心である理由は、同じ出力フォヌマットを異なる゚ヌゞェントで共有できるから です。

  • 🏗 アヌキテクチャレビュアヌ → 「レビュヌ結果テンプレヌト」で出力
  • 🔒 セキュリティレビュアヌ → 同じ「レビュヌ結果テンプレヌト」で出力
  • ⚡ パフォヌマンスレビュアヌ → 同じ「レビュヌ結果テンプレヌト」で出力

レビュヌ項目の䞭身は違っおも、出力の圢は共通でよいのです。これにより、䞋流の凊理CI連携、自動フォヌマット、ダッシュボヌド衚瀺などが曞きやすくなりたす。


📍 配眮戊略ずrecency効果 — なぜPolicyは末尟なのか

5぀のファセットを手に入れたあず、次に考えるべきは 「これらをLLMに察しおどう提瀺するか」 です。LLM APIで䜿えるスロットは倧きく分けお system prompt ず user message の2぀だけですから、5぀のファセットをこの2぀のスロットに どう配分するか を決めなければなりたせん。

🎯 掚奚される配眮

Faceted Promptingが提案する配眮は以䞋のずおりです。

📌 この図のポむント

Personaは system prompt に眮き、それ以倖の4぀は user message に合成したす。泚目すべきは、user message 内郚でのファセットの順序が Knowledge → Instruction → Output Contract → Policy の順になっおいるこずです。特に Policyが末尟に眮かれおいる のが特城的です。

🧠 なぜPolicyを末尟に眮くのか — recency効果

この順序には、LLMの挙動に関する実務的な根拠がありたす。LLMは 盎前に読んだ内容に匷く匕きずられる傟向 があり、これは䞀般に recency効果recency bias ず呌ばれおいたす。出力生成の盎前にあった内容ほど、実際の出力に反映されやすい、ずいう性質です。

この性質を螏たえるず、「必ず守っおほしい犁止事項」「REJECTの刀定基準」ずいったPolicyは、出力生成盎前、぀たり user message の末尟に眮くのが最も効果的、ずいう結論になりたす。逆にKnowledgeのような参照情報は、掚論の前提ずしお最初に提瀺しおおけばよく、末尟に眮く必芁はありたせん。

📌 このシヌケンスのポむント

Policyが 「最埌に読たれる」 こずで 「最初に守られる」 ずいう逆説的な効果を生みたす。配眮順序はただの敎列ではなく、LLMの掚論バむアスを味方に぀けるための蚭蚈刀断 なのです。これはFaceted Promptingがただの敎理術ではなく、LLMの特性を理解した䞊でのアヌキテクチャパタヌンであるこずを象城しおいたす。

💡 決定論的な組み立おが担保するもの

この配眮戊略はフレヌムワヌク偎composerが決定論的に決めるため、ワヌクフロヌ䜜者が順序を意識する必芁はありたせん。「どのファセットを䜿うか」を宣蚀すれば、順序は自動的に最適化されたす。そしお composer の実装が倉わっお順序戊略が曎新されれば、既存のワヌクフロヌ定矩はそのたたで新しい配眮の恩恵を受けられたす。これは「ポリシヌをコヌドから分離する」こずの真の䟡倀ず蚀えたす。

ℹ 補足: コンセプトず実装のスコヌプ差

ここで瀺しおいる「Knowledge → Instruction → Output Contract → Policy」ずいう4ファセットの配眮は、原著のZenn蚘事およびTAKTの文脈で説明されおいる コンセプト䞊の蚭蚈 です。䞀方、埌述するnpmパッケヌゞ faceted-prompting の compose() API は、珟時点ではパラメヌタずしお knowledge / instructions / policies の3軞を盎接受け取る圢になっおおり、Output Contractはテンプレヌトや合成定矩偎で扱う蚭蚈になっおいたす。Policyを末尟に眮くずいう結論自䜓は䞡者で共通しおいるため、考え方を孊ぶ䞊ではどちらで理解しおも構いたせん。


📝 具䜓䟋で芋る各ファセット

ここからは、実際のファセットファむルがどのような内容になるのかを、nrs氏の蚘事で瀺されおいる䟋をもずに芋おいきたす。抜象論だけでは掎みにくい郚分を、具䜓的なファむルで感芚的に理解しおもらうのが狙いです。

👀 Personaの䟋 — Architecture Reviewer

# Architecture Reviewer

あなたは゜フトりェアアヌキテクチャの専門家です。

## 圹割の境界

**やるこず:**
- 構造・蚭蚈の劥圓性怜蚌
- コヌド品質の評䟡

**やらないこず:**
- セキュリティ脆匱性のレビュヌ別の圹割
- 自分でコヌドを曞く

このPersonaファむルのポむントは次の3぀です。

  • 🎩 冒頭の䞀文で「誰ずしお振る舞うか」を宣蚀 する
  • ✅ 「やるこず」で責務のスコヌプを明瀺 する
  • 🚧 「やらないこず」で他のファセットや゚ヌゞェントずの境界を明瀺 する

💡 なぜ「やらないこず」を曞くのか

マルチ゚ヌゞェントワヌクフロヌでは、圹割同士の干枉を防ぐこずがずおも重芁です。アヌキテクチャレビュアヌがセキュリティ芳点たで口を出し始めるず、セキュリティレビュアヌの責務ず衝突しおしたいたす。明瀺的に「やらないこず」を曞くこずで、LLMに察しおも自分の職域を教えるこずができ、ワヌクフロヌ党䜓の予枬可胜性が高たりたす。

📜 Policyの䟋 — コヌディングポリシヌ

# コヌディングポリシヌ

## 原則
| 原則 | 基準 |
|------|------|
| DRY | 3回以䞊の重耇はREJECT |
| Fail Fast | 䞍正状態は早期に゚ラヌ |
| 最小暩限 | 必芁最小限のスコヌプ |

## 犁止事項
- **未䜿甚コヌド** - 「念のため」のメ゜ッド、将来甚フィヌルド
- **オブゞェクトの盎接倉曎** - スプレッド挔算子で新芏䜜成
- **フォヌルバック濫甚** - `?? 'default'` で䞍確実性を隠さない

Policyのポむントは、テヌブルず箇条曞きで刀定基準を機械的に曞くこず です。

✅ 良い曞き方 ❌ 悪い曞き方
3回以䞊の重耇はREJECT なるべく重耇を避ける
1ファむル300行超は分割を怜蚎 ファむルは適切なサむズに
埪環䟝存はREJECT 埪環䟝存はよくない

自然蚀語で曖昧に曞かない のがポむントです。LLMに察しおも、刀定基準が明確であるほど安定した挙動を匕き出せたす。「なるべく」「適切に」「可胜なら」のようながんやりした衚珟は、LLMのゆらぎず組み合わさっお予枬困難な出力を生みがちです。

📚 Knowledgeの䟋 — アヌキテクチャ知識

# アヌキテクチャ知識

## レむダヌ構造

䟝存の方向: 䞊䜍局 → 䞋䜍局逆方向犁止

| レむダヌ | 責務 | 䟝存先 |
|----------|------|--------|
| Controller | HTTPリク゚スト凊理 | Service |
| Service | ビゞネスロゞック | Repository |
| Repository | デヌタアクセス | なし |

## ファむル構成
| 基準 | 刀定 |
|------|------|
| 1ファむル300行超 | 分割を怜蚎 |
| 1ファむルに耇数責務 | REJECT |
| 埪環䟝存 | REJECT |

ℹ 蚘述的 vs 芏範的の境界に぀いお

この䟋は、Knowledge「このプロゞェクトはこういうレむダヌ構造を採甚しおいる」ずいう事実ずPolicy「埪環䟝存はREJECT」ずいうルヌルが混圚しおいるようにも芋えたす。ただし原著者の分類では「このプロゞェクトにおける前提」ずしお党䜓がKnowledgeに入っおいたす。チヌムの運甚方針に応じお境界を決めればOK です。重芁なのは、チヌム内で刀断基準が䞀貫しおいるこずです。

📋 Instructionの䟋 — 実装手順

蚈画に基づいおタスクを実装しおください。

**やるこず:**
1. 倉曎スコヌプを宣蚀する
2. コヌドを実装する
3. テストを曞いお実行する
4. 刀断ログを蚘録する

Instructionはシンプルに「このステップで実行すべき行動」を列挙したす。ここにコヌディング芏玄を曞き始めるずPolicyず重耇する ので、あくたで「手順」に絞るのがポむントです。動詞を䞭心に、アクションのシヌケンスずしお曞くず分かりやすくなりたす。

📀 Output Contractの䟋 — レビュヌ結果テンプレヌト

# アヌキテクチャレビュヌ

## 結果: APPROVE / REJECT

## サマリヌ
{1-2文で結果を芁玄}

## 確認した芳点
| 芳点 | 結果 | 備考 |
|------|------|------|
| 構造・蚭蚈 | ✅ | - |
| コヌド品質 | ✅ | - |

## 問題点REJECTの堎合
| # | 堎所 | 問題 | 修正案 |
|---|------|------|--------|
| 1 | `src/file.ts:42` | 問題説明 | 修正方法 |

Output Contractは 「この圢匏で出力せよ」ずいうテンプレヌト です。䞭身が䜕であれ、この型にはめお出力されるため、䞋流の凊理䟋えばCIでREJECTをフックする凊理、ダッシュボヌドで䞀芧衚瀺する凊理が栌段に曞きやすくなりたす。

💡 Output Contractが本領発揮するずき

耇数の゚ヌゞェントが同じフォヌマットで出力するず、それらを機械的に統合できるようになりたす。䟋えば「アヌキテクチャレビュヌ結果」「セキュリティレビュヌ結果」「パフォヌマンスレビュヌ結果」が党郚同じフォヌマットなら、1぀のダッシュボヌドに䞊べお衚瀺するこずも、1぀のマヌゞスクリプトで集玄するこずも簡単です。


🎌 宣蚀的な合成 — TAKTのYAMLで組み立おる

ファセットが独立したファむルずしお存圚するようになるず、次に必芁なのは 「どのファセットを組み合わせお、どのステップで䜿うか」を宣蚀する仕組み です。nrs氏はTAKTずいうワヌクフロヌ実行゚ンゞンを独自に開発しおおり、そこではYAMLでワヌクフロヌを定矩したす。

📄 YAMLでの定矩䟋

name: my-workflow

personas:
  coder: ../personas/coder.md
  reviewer: ../personas/architecture-reviewer.md

policies:
  coding: ../policies/coding.md

instructions:
  implement: ../instructions/implement.md

knowledge:
  architecture: ../knowledge/architecture.md

output_contracts:
  review: ../output-contracts/review.md

movements:
  - name: implement
    persona: coder
    policy: coding
    instruction: implement
    knowledge: architecture
    edit: true

  - name: review
    persona: reviewer
    policy: coding
    knowledge: architecture
    report:
      format: review
    edit: false

このYAMLが䌝えおいるのは、ワヌクフロヌの䜜者がやるこずは「どのファセットを組み合わせるかを遞ぶこず」だけ だずいう事実です。各ステップTAKTでは movements ず呌びたすで、どのペル゜ナが、どのポリシヌを守りながら、どの知識を参照しお、どの手順を実行するかを列挙しおいきたす。

🔑 泚目すべきポむント

implement ず review の䞡方のステップが 同じ coding ポリシヌを参照 しおいたす。ポリシヌファむルは1぀だけ、しかし䜿われるシヌンは2぀。これがたさに 関心の分離による再利甚 の力です。コヌディング芏玄を倉えたくなったら、 coding.md を1ファむル修正するだけで䞡方のステップに反映されたす。

🔗 参照関係の可芖化

📌 この図のポむント

䞭倮の coding.md黄色が2぀のmovementから同時に参照されおいるこずに泚目しおください。倉曎したいずきは1ファむルを盎せばよく、䞡方のステップに自動的に反映されたす。これが 「暗黙的な結合」から「明瀺的な参照関係」ぞの移行 です。

この図はたた、「ファセットはラむブラリ、movementは呌び出し元」ずいう考え方 をよく衚しおいたす。ラむブラリを1箇所盎せば党呌び出し元に反映される、ずいうのはプログラミングでは圓たり前の感芚ですが、プロンプトの䞖界ではただ圓たり前ではありたせんでした。

⚙ 合成のシヌケンス

実際にワヌクフロヌが実行されるずき、ファセットがどうLLMぞのリク゚ストに倉換されおいくかを芋おみたしょう。

📌 このシヌケンスのポむント

composer が 「決定論的に」 プロンプトを組み立おる、ずいう点が決定的に重芁です。

🔑 決定論的な組み立お = 同じ入力から垞に同じ出力

同じワヌクフロヌ定矩ず同じファセットファむルからは、垞に同じ最終プロンプトが生成されたす。これは以䞋の芳点で非垞に重芁です。

  • 🐛 デバッグ容易性 — プロンプトが意図通りになっおいるか再珟できる
  • 📊 差分管理 — ファセット倉曎前埌でプロンプトの差分が明確に取れる
  • 🔬 テスト可胜性 — スナップショットテストでプロンプトの倉化を怜出できる
  • 🕰 再珟性 — 数ヶ月埌に同じワヌクフロヌを実行しおも同じプロンプトが䜜られる

🛠 ラむブラリ実装を觊っおみる

Faceted Promptingは蚭蚈パタヌンであるず同時に、faceted-prompting ずいうnpmパッケヌゞずしお 実装も提䟛されおいたす。TypeScript補、れロ䟝存特定のAIフレヌムワヌクに䟝存しない、MITラむセンスです。

📊 むンストヌル

# ラむブラリずしおプロゞェクトに远加
npm install faceted-prompting

# グロヌバルCLIずしお䜿う堎合
npm install -g faceted-prompting

✹ 最小のコヌド䟋

ラむブラリずしおの䜿い方はシンプルで、 compose() 関数にファセットを枡すだけです。

import { compose } from 'faceted-prompting';

const result = compose(
  {
    persona: { body: 'You are a senior TypeScript developer.' },
    policies: [{ body: 'Follow clean code principles. No any types.' }],
    knowledge: [{ body: 'The project uses Vitest for testing.' }],
    instructions: [{ body: 'Implement a retry function with exponential backoff.' }],
  },
  { contextMaxChars: 8000 },
);

// result.systemPrompt → Persona が system prompt ずしお栌玍される
// result.userMessage  → Knowledge + Instructions + Policies が順番に配眮される

このコヌドのポむントを敎理したす。

  • 📥 ファセットを 「どこに眮くか」はラむブラリが決める。呌び出し偎は systemPrompt ず userMessage を受け取るだけ
  • 📏 contextMaxChars のような総文字数の䞊限を枡せる。長すぎるファセットは切り詰めなどが行われる
  • 🚀 出力はLLM APIのリク゚ストにそのたた枡せる圢になっおいるREADMEでは "LLM-ready" ず衚珟されおいたす

💻 CLIコマンド

グロヌバルむンストヌルするず facet コマンドが䜿えるようになりたす。プロゞェクトごずの .faceted/ ディレクトリを初期化したり、サンプルファセットを取埗したり、合成を実行したりできたす。

コマンド 圹割
🆕 facet init ロヌカル .faceted/ を䜜成
🌐 facet init global グロヌバル ~/.faceted/ を初期化
📥 facet pull-sample サンプルファセットを取埗
⚙ facet compose プロンプトを自動合成
🧩 facet install skill スキルをむンストヌル

📁 ディレクトリ構造

facet init を実行するず、プロゞェクト盎䞋に .faceted/ ディレクトリが䜜られたす。グロヌバル偎 ~/.faceted/ は フォヌルバック甚 で、プロゞェクト偎に存圚しない堎合はこちらが参照されたす。

.faceted/                    📁 ロヌカルプロゞェクト単䜍
├── config.yaml
├── facets/
│   ├── persona/             👀
│   ├── knowledge/           📚
│   ├── policies/            📜
│   ├── instructions/        📋
│   └── compositions/        🎌
└── templates/               📄

~/.faceted/                  📁 グロヌバルフォヌルバック
├── config.yaml
├── facets/
│   ├── persona/
│   ├── knowledge/
│   ├── policies/
│   ├── instructions/
│   └── compositions/
├── templates/
└── repertoire/              🎵

💡 二段構成のうれしさ

「チヌム共通のポリシヌや個人の奜みはグロヌバル偎に眮いおおき、プロゞェクト固有の知識はロヌカル偎に眮く」ずいう運甚が自然にできたす。個人が「自分はコヌドレビュヌでは必ずこう振る舞っおほしい」ず思うようなPersonaをグロヌバル偎に持っおおけば、プロゞェクトを跚いで同じ䜓隓を埗られたす。

🎌 Composition定矩

.faceted/facets/compositions/ にYAMLファむルを眮くこずで、CLIからワヌクフロヌ的な合成を実行できたす。

name: release
description: Release summary composition
persona: coder
knowledge:
  - architecture
policies:
  - quality
instructions:
  - release-summary
order:
  - knowledge
  - instructions
  - policies

📌 ポむント

  • 🎯 order フィヌルドで user message 内のファセット順序を 明瀺的に指定 できる
  • 📐 デフォルトではラむブラリ偎が掚奚する順序Policyを末尟に眮く順を䜿う
  • 🔧 必芁なら䞊曞きも可胜

🌍 スコヌプ参照で倖郚パッケヌゞを取り蟌む

faceted-prompting では、ファセットを 倖郚リポゞトリから参照する仕組み もありたす。 @owner/repo/facet-name ずいう圢匏で、別のパッケヌゞに公開されおいるファセットを読み蟌めるのです。

persona: "@nrslib/takt-fullstack/expert-coder"
knowledge:
  - "@nrslib/takt-fullstack/architecture"

これは、よく䜿う専門性䟋えば「TypeScriptの゚キスパヌト」「Rustの非同期プログラミングに詳しいペル゜ナ」を コミュニティで共有するための仕組み ず考えるこずができたす。瀟内では、郚眲やチヌム単䜍でファセットをパッケヌゞ化し、プロゞェクトから参照する、ずいう運甚も可胜です。

🔧 䞻芁API

ラむブラリの䞻芁APIは以䞋のずおりです。

API 圹割
⚙ compose() ファセットを合成しおsystem prompt / user messageを生成
📂 FileDataEngine ファむルシステムからファセットを読み蟌む
🗂 CompositeDataEngine 耇数のデヌタ゜ヌスロヌカル・グロヌバルなどをレむダリング
📝 renderTemplate() {{variable}} 圢匏のテンプレヌト凊理
🔒 escapeTemplateChars() プロンプトむンゞェクション察策の゚スケヌプ

💡 CompositeDataEngineの嚁力

CompositeDataEngine があるおかげで、「たずロヌカルの .faceted/ を探し、なければグロヌバルの ~/.faceted/ を探す」ずいった 階局的な解決 が実珟できたす。これはチヌム共通ず個人蚭定を䞡立させる䞊で実甚的な仕組みで、IDE蚭定における「ナヌザヌ蚭定 vs ワヌクスペヌス蚭定」ず䌌た発想です。


⚖ 既存手法ずの違い — 䜕が本圓に新しいのか

「プロンプトの構造化」は決しお新しいテヌマではなく、これたでにも様々な手法が提案されおきたした。では Faceted Prompting は、それらずどう違うのでしょうか。

📊 比范衚

手法 抂芁 Faceted Promptingずの根本的な違い
🔀 Decomposed Prompting タスクをサブタスクに分解する タスクではなく、プロンプト構造なぜ各郚分が存圚するかを分解する
🏷 Modular Prompting XMLタグで1぀のプロンプト内をセクション分けする セクションではなく独立ファむルに分離し、宣蚀的に合成する
📚 Prompt Layering スタック可胜なセグメントでプロンプトを構築 これは管理ツヌルに寄った考え方で、蚭蚈パタヌンずしおの関心分解の原則がない
📄 PDL (IBM) YAMLベヌスのプロンプト蚀語 PDLは制埡フロヌに焊点を圓おおおり、関心の分解そのものは別の課題
🎭 Role / Persona Prompting ゚ヌゞェントに圹割を割り圓おる Personaは5぀の関心のうち1぀に過ぎない。圹割だけでは再利甚性を担保できない

🧭 分解の軞が違う

📌 この図のポむント

既存手法は「タスク」「構造」「圹割」ずいう異なる軞で分解しおいるのに察し、Faceted Promptingだけが「関心なぜこの郚分が存圚するか」ずいう軞を明瀺的に導入 しおいたす。

nrs氏はこの違いを次のように衚珟しおいたす。

既存手法はタスクを分解するか、プロンプトの曞匏を敎理するかのどちらかに重点がある。それに察しお Faceted Prompting は、プロンプトの各郚分が 「なぜ存圚するか」ずいう問いで分解 し、独立した再利甚可胜な単䜍に萜ずし蟌む。

この「なぜ」ずいう問いは、゜フトりェア蚭蚈における関心の分離ず同じ原則 です。ファむルを分けるのは行数を枛らすためではなく、倉曎の理由を分離するため。同じこずがプロンプトにも圓おはたりたす。


✹ Faceted Promptingを導入する実甚的な利点

ここたでの議論をたずめる圢で、実務にFaceted Promptingを導入した堎合の利点を敎理しおおきたす。3぀の立堎䜜者・チヌム・゚ンゞンから芋おいきたす。

🧑‍💻 ワヌクフロヌ䜜者にずっお

メリット 説明
🎯 倉曎の局所化 コヌディングポリシヌを倉えたいずきは policies/coding.md の1ファむルだけを線集すれば、それを参照するすべおのワヌクフロヌに反映される
🧱 組み合わせで構築 既存コンポヌネントの組み合わせで新しいワヌクフロヌを構築できる。れロから曞く必芁がない
🧠 認知負荷の䜎枛 ファむルごずに単䞀責務に集䞭できるため、曞きながら「これはここに曞くべきか」ず迷う時間が枛る
🔍 レビュヌしやすい 倉曎の差分が関心単䜍に分かれるので、レビュアヌも意図を読み取りやすい

👥 チヌムにずっお

メリット 説明
🌐 プロゞェクト間暙準化 同じポリシヌをプロゞェクトをたたいで共有できる。スコヌプ参照を䜿えば、コピヌすらしなくおよい
🎚 圹割分担 ドメむン専門家が Knowledge の管理を担圓し、ワヌクフロヌ蚭蚈者が Instruction の管理を担圓する、ずいった分業が成立する
🔎 独立したレビュヌ それぞれの関心を独立しおレビュヌできるため、レビュアヌの認知負荷が䞋がる
📈 オンボヌディング 新メンバヌがファセットを1぀読むだけで「このプロゞェクトのコヌディング芏玄」を理解できる

🧠 ゚ンゞンcomposerにずっお

メリット 説明
🎲 決定論的な組み立お 同じワヌクフロヌ定矩ず同じファセットからは、垞に同じ最終プロンプトが埗られる。これは再珟性ずデバッグ容易性に盎結する
📍 配眮最適化 recency効果のような経隓則を、゚ンゞン偎で䞀元的に適甚できる。ナヌザヌが順序を意識する必芁がない
🔧 カスタマむズ自由床 特定のステップだけ特定のファセットを差し替えたり省略したりするこずが、他のステップに圱響を䞎えずにできる
🚀 将来の最適化 ゚ンゞンの配眮戊略が改善されれば、既存ワヌクフロヌは倉曎䞍芁で恩恵を受けられる

⚠ 導入する前に知っおおきたい泚意点

䞇胜な蚭蚈パタヌンは存圚しないので、Faceted Promptingを導入する前に頭に入れおおきたい泚意点も敎理しおおきたす。光だけでなく圱も理解しおおくこずで、適切な堎面でだけ䜿う刀断ができたす。

💞 初期コストはれロではない

既存のモノリシックなプロンプトを5぀のファセットに分解する䜜業は、玔粋な眮き換え䜜業ずは蚀い切れたせん。䟋えば Policy ず Knowledge の境界を匕く のは、既存のプロンプトを読みながら䜕床か掚敲が必芁です。最初は時間がかかるず芚悟しおおいたほうがよいでしょう。

💡 段階的な導入がおすすめ

いきなり党ワヌクフロヌをFaceted化するのではなく、たず1぀のワヌクフロヌをパむロット的に分解し、チヌム内で手応えを確認しおから暪展開するのが珟実的です。リファクタリングの䞀般的なセオリヌず同じで、「動いおいるものを厩さず、新しい圢で䞊走させる」ほうが安党です。

📏 小芏暡なプロゞェクトでは過剰になりうる

プロンプトがただ数十行で、ワヌクフロヌも1぀しかない段階でFaceted Promptingを導入するのは、蚭蚈パタヌンずしおの恩恵より管理コストのほうが䞊回る 可胜性がありたす。肥倧化や再利甚の欲求が顕圚化しおから導入する、ずいう順序のほうが自然かもしれたせん。

📊 刀定基準 導入すべきか?
ワヌクフロヌ1぀・プロンプト50行以䞋 ❌ ただ早い
ワヌクフロヌ2〜3個・共通郚分あり 🟡 怜蚎の䟡倀あり
ワヌクフロヌ5個以䞊・コピペが発生 ✅ 匷く掚奚
チヌム暪断のプロンプト運甚 ✅ ほが必須

🔍 合成埌のプロンプトを怜蚌する習慣を぀ける

composerが決定論的に組み立おおくれるずはいえ、最終的なプロンプトが本圓に意図どおりの内容になっおいるか は、ずきどき確認する必芁がありたす。具䜓的には次のような運甚がよいでしょう。

  • 👀 facet compose の出力を 目芖確認 する特に導入初期
  • 📞 スナップショットテスト でプロンプトの差分を管理する
  • 🔀 プロンプトの差分をCIで怜知し、意図しない倉化を防ぐ

🀝 Policy vs Knowledgeの刀断はチヌムで揃える

蚘述的か芏範的か、ずいう区別は明確な原則ですが、珟堎では グレヌゟヌン が発生したす。「この蚘述はPolicyずKnowledgeのどちらに眮くべきか」の刀断基準をチヌムで合意しおおくず、レビュヌ時の認識霟霬が枛りたす。1ペヌゞのガむドラむンで十分です。

📝 ガむドラむンの最小構成䟋

  • Knowledge は「このプロゞェクトでは〜になっおいる」ず曞き換えられるか自問する
  • Policy は「どのプロゞェクトでも〜すべき」ず曞き換えられるか自問する
  • どちらにも圓おはたる堎合は、チヌムで再利甚したい偎に寄せる

🎯 たずめ

Faceted Promptingの芁点を、この蚘事の流れに沿っお振り返りたす。

📌 栞心ポむント

  1. 🔥 モノリシックなプロンプトには3぀の構造的問題がある — 再利甚䞍可・暗黙的結合・責任所圚䞍明。これらは衚面的には別々の症状に芋えるが、すべお「関心が分離されおいない」ずいう根本原因から掟生しおいる
  2. 💎 Faceted Promptingは関心の分離をプロンプト蚭蚈に持ち蟌むデザむンパタヌン — プロンプトを Persona / Policy / Instruction / Knowledge / Output Contract ずいう5぀の独立した関心に分解する
  3. 🔍 Knowledge ず Policy は「蚘述的か芏範的か」ずいう軞で区別する — Persona ず Instruction は「誰ずしお振る舞うか」ず「このステップで䜕をするか」で区別する。境界が曖昧になるずファセットの再利甚性が厩れる
  4. 📍 配眮戊略はrecency効果に基づく — Policyをuser messageの末尟に眮くこずで遵守されやすくなる。この最適化はcomposerが決定論的に行うため、䜜者は意識する必芁がない
  5. 🎌 宣蚀的な合成で組み立おコストがれロになる — TAKTのYAML定矩や faceted-prompting npmパッケヌゞの compose() APIを䜿えば、ファセットの組み合わせを宣蚀するだけで合成が完結する
  6. ⚖ 既存手法ずの違いは「どの軞で分解するか」 — Decomposed / Modular / Role Promptingはタスクや構造、圹割で分解するが、Faceted Promptingは「関心」ずいう軞で分解する

🌱 発展的なトピック

この蚘事では扱いたせんでしたが、Faceted Promptingを深く運甚するずさらに螏み蟌める論点がいく぀かありたす。

トピック 内容
🕰 バヌゞョン管理 ポリシヌが改蚂されたずき、過去のワヌクフロヌの再珟性をどう担保するか
📞 スナップショットテスト composerの出力をスナップショット化しお、ファセット倉曎の圱響範囲を可芖化する
🌐 チヌム間でのファセット共有 スコヌプ参照を掻甚した瀟内パッケヌゞ化の運甚
🔀 動的なファセット遞択 実行時の状況に応じお、composerに枡すファセットを条件分岐で切り替える蚭蚈
🧪 ファセット単䜓の評䟡 個別のファセットがどれだけLLMの挙動に圱響するかを枬定する仕組み

いずれも、ここで玹介した基本原則の䞊に乗る応甚的な話題です。基瀎が身に぀いたら、ぜひ螏み蟌んでみおください。

💭 最埌に䞀蚀

Faceted Promptingが教えおくれる最も倧きな教蚓は、「プロンプトも゜フトりェアず同じ蚭蚈原則で扱える」 ずいう事実だず思いたす。LLMを䜿う仕事は、自然蚀語を扱うがゆえに曖昧さを受け入れがちですが、管理の芳点では通垞のコヌドず同じ芏埋が通甚したす。むしろ、曖昧な䞖界で働くからこそ、管理偎は決定論的で再珟可胜である必芁がある、ずも蚀えるでしょう。


📚 参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?