一、什么是 Prompt Decomposition

Prompt Decomposition(提示分解)是将一个复杂的任务分解为多个简单的子任务,分别通过不同的 Prompt 或步骤执行,最终组合结果的技术。

1.1 为什么需要分解

问题单一 Prompt 的表现分解后的表现
步骤过多遗漏30-50% 概率跳过步骤每步逐一执行
上下文稀释长 prompt 中关键指令被稀释每步聚焦单一目标
输出质量不均各部分质量参差不齐每一步可控可调
调试困难无法定位错误环节每步独立可观测

1.2 分解 vs 不分对比

# ❌ 不分解:所有要求挤在一个 Prompt
undivided_prompt = """
请为我们的新产品写一篇营销文案:
1. 分析目标受众
2. 列出 3 个核心卖点
3. 写一个引人注目的标题
4. 写产品描述(200 字)
5. 写行动号召(CTA)
要求:用活泼的语气,包含 SEO 关键词,检查错别字
"""

# ✅ 分解为 5 个独立步骤
decomposed_pipeline = [
    {"step": "受众分析", "prompt": "分析以下产品的目标受众...", "output_var": "audience"},
    {"step": "卖点提取", "prompt": "基于产品特性,提取 3 个核心卖点...", "output_var": "features"},
    {"step": "标题创作", "prompt": "基于目标受众和卖点,创作 5 个标题候选...", "output_var": "headlines"},
    {"step": "正文生成", "prompt": "使用选定标题和卖点,撰写产品描述...", "output_var": "body"},
    {"step": "质量检查", "prompt": "检查以下文案的语法、SEO 和长度...", "output_var": "review"},
]

二、分解策略

2.1 管道式分解(Pipeline)

子任务按顺序执行,前一步的输出是后一步的输入。

from openai import OpenAI

class PipelineDecomposer:
    def __init__(self):
        self.client = OpenAI()
    
    def execute_pipeline(self, pipeline: list, initial_input: dict) -> dict:
        context = initial_input
        
        for step in pipeline:
            # 注入前一步结果
            prompt = step["prompt"].format(**context)
            
            response = self.client.chat.completions.create(
                model="gpt-4",
                messages=[{"role": "user", "content": prompt}]
            )
            
            # 存储当前步骤输出
            context[step["output_var"]] = response.choices[0].message.content
            
            # 可选:中间验证
            if step.get("validator"):
                assert step["validator"](context[step["output_var"]]), \
                    f"Step {step['name']} validation failed"
        
        return context

# 使用示例:简历筛选
pipeline = [
    {
        "name": "信息提取",
        "prompt": "从以下简历中提取:姓名、学历、工作年限、技能列表:\n{resume_text}",
        "output_var": "candidate_info",
        "validator": lambda x: len(x) > 20
    },
    {
        "name": "匹配度评估",
        "prompt": "基于岗位要求 {job_requirements} 和候选人信息 {candidate_info}\n给出匹配度评分(0-100):",
        "output_var": "match_score"
    },
    {
        "name": "面试建议",
        "prompt": "根据匹配度 {match_score},生成面试建议:\n1. 需重点考察的能力\n2. 建议的面试问题",
        "output_var": "interview_tips"
    }
]

result = PipelineDecomposer().execute_pipeline(pipeline, {
    "resume_text": "...",
    "job_requirements": "3年+ Python 开发经验..."
})

2.2 并行式分解(Parallel)

子任务间无依赖,可同时执行,最后合并。

import asyncio
from openai import AsyncOpenAI

class ParallelDecomposer:
    def __init__(self):
        self.client = AsyncOpenAI()
    
    async def execute_parallel(self, subtasks: list) -> dict:
        async def run_subtask(name: str, prompt: str):
            response = await self.client.chat.completions.create(
                model="gpt-4",
                messages=[{"role": "user", "content": prompt}]
            )
            return name, response.choices[0].message.content
        
        tasks = [run_subtask(s["name"], s["prompt"]) for s in subtasks]
        results = await asyncio.gather(*tasks)
        
        return dict(results)
    
    def merge_results(self, results: dict, merge_prompt: str) -> str:
        """合并所有并行结果"""
        merged = self.client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": merge_prompt.format(**results)}]
        )
        return merged.choices[0].message.content

# 使用示例:市场分析报告
subtasks = [
    {"name": "competitor", "prompt": "分析产品 X 的 3 个主要竞争对手..."},
    {"name": "trends", "prompt": "分析 2026 年本行业 5 大趋势..."},
    {"name": "swot", "prompt": "分析产品 X 的 SWOT..."},
    {"name": "target", "prompt": "分析产品 X 的目标用户画像..."},
]

merge_template = """已获得以下分析维度:
竞争对手:{competitor}
行业趋势:{trends}
SWOT 分析:{swot}
目标用户:{target}

请将这些维度整合为一份完整的市场分析报告。
"""

2.3 层次式分解(Hierarchical)

层级粒度示例控制方式
L1 - 任务级整体“写一篇 2000 字的行业分析”顶层 Prompt
L2 - 步骤级子任务“收集数据→分析→撰写→润色”中间调度
L3 - 操作级原子操作“查询最新数据→计算增长率→生成图表”具体执行
class HierarchicalDecomposer:
    def __init__(self):
        self.client = OpenAI()
    
    def decompose_task(self, task: str) -> list:
        """让 LLM 自己分解复杂任务"""
        response = self.client.chat.completions.create(
            model="gpt-4",
            messages=[{
                "role": "user",
                "content": f"""请将以下任务分解为 3-5 个步骤,每个步骤可独立执行。
输出格式(JSON):
[{{"step": "步骤名", "description": "描述", "dependencies": []}}]

任务:{task}"""
            }]
        )
        return json.loads(response.choices[0].message.content)
    
    def execute_hierarchical(self, task: str):
        plan = self.decompose_task(task)
        results = {}
        
        for step in plan:
            # 注入依赖结果
            context = "\n".join([
                f"## {k}\n{v}" for k, v in results.items()
                if k in step.get("dependencies", [])
            ])
            
            response = self.client.chat.completions.create(
                model="gpt-4",
                messages=[{
                    "role": "user",
                    "content": f"{context}\n\n执行以下步骤:{step['description']}"
                }]
            )
            results[step["step"]] = response.choices[0].message.content
        
        return results

三、分解粒度控制

3.1 粒度选择矩阵

任务复杂度模型能力推荐粒度原因
简单不分解单次调用就够了
中等2-3 步关键检查点分离
复杂3-5 步质量保证 + 可调试
复杂5-10 步每步足够简单
开放生成任意不分解创造力需要自由度

3.2 过度分解的问题

过度分解的代价:
- 总 token 消耗增加 200-400%
- API 调用延迟叠加(每步 ~2-5 秒)
- 上下文传递中的信息丢失
- 管道链式错误传播

经验法则:子任务在 1-2 次 API 调用内可完成,则粒度已足够。

四、实际案例

4.1 论文摘要生成器

def generate_paper_summary(paper_text: str) -> dict:
    pipeline = [
        {
            "name": "结构解析",
            "prompt": f"从以下论文文本中识别出:研究背景、方法、实验结果、结论四个部分。\n\n{paper_text[:3000]}",
            "output": "structure"
        },
        {
            "name": "关键数据提取",
            "prompt": "从上一步解析的结构中,提取关键数据:准确率、样本量、p 值等:{structure}",
            "output": "key_data"
        },
        {
            "name": "摘要生成",
            "prompt": """基于以下内容生成一段 200 字以内的论文摘要:
结构:{structure}
关键数据:{key_data}

要求:客观、包含核心贡献和主要发现。
""",
            "output": "abstract"
        },
        {
            "name": "质量检查",
            "prompt": """检查以下摘要是否符合要求:
1. 是否包含核心贡献 ✓/✗
2. 是否包含主要发现 ✓/✗
3. 是否在 200 字以内 ✓/✗
4. 语言是否客观 ✓/✗

摘要:{abstract}""",
            "output": "quality_check"
        }
    ]
    
    return execute_pipeline(pipeline)

4.2 多语言内容本地化

步骤处理内容输入/输出
1. 语义保持分析识别源语言中的文化特定表达原文 → 文化标记列表
2. 术语表建立提取专业术语并翻译术语 → 双语术语表
3. 初译逐段翻译原文段 → 翻译段
4. 本地化适配替换文化引用为本地等效物翻译+文化标记 → 本地化
5. 回译验证翻译回源语言验证准确性目标文本 → 回译 → 对比

五、性能评估

5.1 质量指标

def evaluate_decomposition(original: str, decomposed: list, results: dict):
    metrics = {
        "completeness": 0,    # 是否覆盖原任务所有要求
        "coherence": 0,       # 结果是否连贯一致
        "accuracy": 0,        # 各步骤正确率
        "efficiency": 0,      # token 消耗比
    }
    
    # 计算效率比
    tokens_decomposed = sum(r["tokens"] for r in results["steps"])
    tokens_single = results["single_shot_tokens"]
    metrics["efficiency"] = tokens_decomposed / tokens_single
    
    return metrics
指标单一 Prompt分解 Pipeline提升
步骤完成率72%95%+23pp
用户满意度3.8/54.5/5+0.7
平均 Token 消耗8502100+147%
调试时间45min10min-78%

六、总结

Prompt Decomposition 是提升复杂任务质量的利器,但也需要权衡成本和效益:

  1. 复杂任务必分解 — 超过 3 个独立步骤的任务不应使用单一 Prompt
  2. 选择合适模式 — 管道式适合有依赖的任务,并行式适合独立子任务
  3. 粒度要适中 — 每步聚焦一件事,但不要过度拆分导致上下文碎片化
  4. 验证要嵌入 — 关键步骤后加入中间验证,及时止损
  5. 成本要计算 — 分解会增加 token 消耗和延迟,评估 ROI 后再决定分解程度

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。