Prompt 工程的链式组合:多步任务不是把所有指令塞进一个 Prompt

📅 2026/7/9 13:16:09
Prompt 工程的链式组合:多步任务不是把所有指令塞进一个 Prompt
Prompt 工程的链式组合多步任务不是把所有指令塞进一个 Prompt一、链式 Prompt 的动机是单次 Prompt 的容量和精度矛盾复杂任务用单个 Prompt 处理时面临容量和精度矛盾。Prompt 太长模型容易遗漏部分指令太短又无法覆盖所有步骤。比如根据用户日记内容分析情绪倾向提取关键事件生成本周情绪总结报告——这个指令包含了三个子任务每个子任务需要不同的输出格式和精确度要求。把所有子任务塞进一个 Prompt 时模型可能只做了情绪分析就跳过了事件提取或者把三个子任务的输出混在一起格式混乱。链式 Prompt 把多步任务拆成独立的步骤每步有专门优化的 Prompt输出格式更可控中间结果可以检查和修正。二、链式 Prompt 的编排与中间结果传递链式 Prompt 不是简单串联而是有明确的输入输出契约。每一步的输出是下一步的输入中间结果需要结构化传递。flowchart TD A[原始日记内容] -- B[步骤1情绪倾向分析] B -- C[输出情绪标签倾向描述] C -- D[步骤2关键事件提取] D -- E[输出事件列表时间标注] E -- F[步骤3总结报告生成] F -- G[输出结构化情绪周报] C -- F E -- F步骤1和步骤2的输出同时传递给步骤3。总结报告既需要情绪趋势来自步骤1也需要关键事件来自步骤2。这种并行-汇聚结构比纯串联更灵活让每步只需要关注自己的子任务。三、链式 Prompt 的编排引擎实现type PromptStep { name: string; instruction: string; inputKeys: string[]; // 从哪些步骤的输出获取输入 outputFormat: string; // 要求模型输出的格式说明 }; type StepResult { stepName: string; output: string; success: boolean; }; // 链式Prompt编排按依赖关系执行步骤 const diaryAnalysisChain: PromptStep[] [ { name: emotion_analysis, instruction: 分析以下日记内容的情绪倾向。输出格式JSON包含emotion_tags数组最多3个标签和trend描述一句话。, inputKeys: [raw_diary], outputFormat: json, }, { name: event_extraction, instruction: 从以下日记中提取关键事件。输出格式JSON数组每个事件包含description一句话和date字段。, inputKeys: [raw_diary], outputFormat: json, }, { name: weekly_summary, instruction: 根据情绪分析结果和关键事件列表生成本周情绪总结报告。输出格式段落文本不超过200字。, inputKeys: [emotion_analysis, event_extraction], outputFormat: text, }, ]; export async function executeChain( chain: PromptStep[], initialInput: Recordstring, string ): PromiseStepResult[] { const results: Recordstring, string { ...initialInput }; const stepResults: StepResult[] []; for (const step of chain) { // 组合当前步骤的输入从已有结果中提取需要的字段 const stepInput step.inputKeys .map((key) results[key] ?? ) .join(\n\n); const fullPrompt ${step.instruction}\n\n输入内容\n${stepInput}; try { const output await callModel(fullPrompt); results[step.name] output; stepResults.push({ stepName: step.name, output, success: true }); } catch (error) { // 单步失败时不中断整个链路用空输出占位让后续步骤继续 results[step.name] [步骤${step.name}执行失败]; stepResults.push({ stepName: step.name, output: , success: false }); console.error(链式步骤 ${step.name} 失败:, error); } } return stepResults; }单步失败时不中断整个链路是关键设计。情绪分析失败了事件提取仍然可以执行。总结报告虽然缺少情绪数据但可以用事件列表单独生成一个简化版报告。这比整个链路失败后什么都得不到更实用。每步的outputFormat明确指定格式要求让模型输出更可控。四、链式 Prompt 的成本和延迟叠加链式 Prompt 的代价是成本和延迟叠加。三步链路需要三次模型调用总延迟是三次之和总成本是三次之和。如果一个任务可以用单个 Prompt 完成不应该为了更可控而拆成三步链路。链式拆分的判断标准是单 Prompt 的输出质量是否满足要求。如果单 Prompt 能稳定输出高质量结果不需要链式拆分。只有单 Prompt 输出不稳定或格式混乱时才值得拆成链式。中间结果的质量也要检查。步骤1输出了错误的情绪标签步骤2和步骤3都会基于错误数据继续推理错误会被放大。解决方案是在关键步骤后加人工确认节点——情绪分析结果先展示给用户确认确认后再执行后续步骤。这增加了交互轮次但保证了数据质量。五、总结链式 Prompt 把多步任务拆成独立步骤每步有专门优化的 Prompt 和输出格式要求。中间结果结构化传递并行-汇聚结构比纯串联更灵活。单步失败不中断整个链路用空输出占位让后续步骤继续。链式拆分的判断标准是单 Prompt 质量是否满足要求。关键步骤后可加人工确认节点防止错误放大。链式代价是成本和延迟叠加不应为了可控性而过度拆分。