Skip to content

システムプロンプト構築

源码版本v0.73.1

system-prompt.ts は pi のデフォルトシステムプロンプトを組み立てる工房だ。一つのファイル、一つの buildSystemPrompt 関数が、ツールリスト、guidelines、pi ドキュメントのパス、プロジェクトのコンテキストファイル、スキル、日付、cwd を最終的なプロンプト文字列に組み上げる。createAgentSession は直接これを呼ばない——AgentSession が毎回のプロンプト送信前に現在アクティブなツールに基づいて再構築し、ツールの増減がプロンプトに即反映されるようにする。

責務

  1. デフォルトプロンプト組み立て:buildSystemPromptcustomPrompt なしで呼ばれたときデフォルトパスを通り、「You are an expert coding assistant operating inside pi」で始まる完全なプロンプトを生成する。packages/coding-agent/src/core/system-prompt.ts:28-80packages/coding-agent/src/core/system-prompt.ts:131-171 参照。
  2. custom prompt パス:customPrompt を渡すとデフォルトテンプレートをスキップし、contextFiles、skills、日付、cwd だけを末尾に追加する。packages/coding-agent/src/core/system-prompt.ts:53-80 参照。
  3. ツールリストと guidelines:selectedTools に応じて可視ツールを決め、ツールの組み合わせで guidelines を動的生成する(bash+grep が同時にあるときは grep 優先を推奨するなど)。packages/coding-agent/src/core/system-prompt.ts:89-129 参照。
  4. prompt snippet 注入:各ツールの promptSnippet は一行の短い説明で、「Available tools」リストに組み込まれ、LLM はこれでツールの用途を判断する。packages/coding-agent/src/core/system-prompt.ts:89-92 参照。
  5. スキル追加:formatSkillsForPrompt が可視スキル(disableModelInvocation でないもの)を <available_skills> XML セクションに組み上げる。packages/coding-agent/src/core/system-prompt.ts:162-165 参照。
  6. ドキュメント自己案内:プロンプト内に pi 自身のドキュメントパス(readme、docs、examples)を明記し、ユーザが pi について質問したときはこれらのファイルを読むよう LLM に指示する。packages/coding-agent/src/core/system-prompt.ts:141-147 参照。

設計動機

なぜ AgentSession にプロンプト文字列を直接持たせないのか?ツール集合が動的だからだ——ユーザは session の途中で /tools してツールを増減できるし、拡張も新たなツールを登録できる。プロンプトが静的文字列だと、ツールが変わった後も LLM は古いプロンプトに従って無効化されたツールを呼ぼうとする。buildSystemPrompt は呼ぶたびに再生成し、プロンプトが現在のアクティブツール集合と厳密に整合するようにする。

なぜデフォルトプロンプトと custom プロンプトのパスを分けるのか?デフォルトプロンプトは pi 公式にチューニングされたバージョンで、ツールリスト、guidelines、ドキュメント自己案内を含む。custom プロンプトはユーザや拡張が提供する完全カスタム版で、contextFiles と skills だけを追加したい。二つのパスは contextFiles、skills、日付、cwd の追加ロジックを共有するが、デフォルトパスだけが toolsList と guidelines の組み立てを余分に持つ。

guidelines の動的化は一見の価値がある:bash と grep/find/ls が同時に有効なら、プロンプトは「Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)」を推奨する。bash だけで grep/find/ls がない場合は「Use bash for file operations like ls, rg, find」を推奨する。これで LLM はどのツール集合でも効率的なパスを選べる。

主要ファイル

guidelines は動的生成され、set で重複除去する:

typescript
// packages/coding-agent/src/core/system-prompt.ts:105-129
const hasBash = tools.includes("bash");
const hasGrep = tools.includes("grep");
const hasFind = tools.includes("find");
const hasLs = tools.includes("ls");

if (hasBash && !hasGrep && !hasFind && !hasLs) {
	addGuideline("Use bash for file operations like ls, rg, find");
} else if (hasBash && (hasGrep || hasFind || hasLs)) {
	addGuideline("Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)");
}

for (const guideline of promptGuidelines ?? []) {
	const normalized = guideline.trim();
	if (normalized.length > 0) {
		addGuideline(normalized);
	}
}

// Always include these
addGuideline("Be concise in your responses");
addGuideline("Show file paths clearly when working with files");

デフォルトプロンプトの末尾に日付と cwd を追加する。あえて最後に置くことで LLM の注意を引く:

typescript
// packages/coding-agent/src/core/system-prompt.ts:167-171
if (hasRead && skills.length > 0) {
	prompt += formatSkillsForPrompt(skills);
}

// Add date and working directory last
prompt += `\nCurrent date: ${date}`;
prompt += `\nCurrent working directory: ${promptCwd}`;

return prompt;

データフロー

プロンプト構築の流れ:

境界と失敗

まとめ

buildSystemPrompt はプロンプト組み立て工房で、現在のツール集合に応じて guidelines を動的生成する。custom とデフォルトの二つのパスは contextFiles/skills/日付/cwd 追加ロジックを共有する。スキルシステムのロードとフォーマットは スキルシステム、メッセージ変換は メッセージ型と convertToLlm、ツール集合自体は ツール集合 read/bash/edit/write/grep/find/ls 参照。