一个 Prompt 塞太多任务:怎么拆才能每件都做完

一个 prompt 塞 5 件事,结果一件做得好、一件糊弄、三件做一半?教你怎么拆,让每个任务都落地。

你写了一个 prompt,让模型 (1) 总结客户邮件、(2) 分类情绪、(3) 起草回复、(4) 必要时标记升级、(5) 写一条内部 Slack 消息。结果 task 1 做得不错,task 2 给了个通用答案,task 4 直接跳过,task 3 只写了半截回复,task 5 根本没碰。你追问”5 个都做”,得到的还是同样的形态,只是漏掉的地方稍微不同。

最快的修法:把这一摞任务拆成”一个任务一个 prompt”。互相独立的并行跑,真正有依赖的才串起来。单个 prompt 会逼模型用一份输出预算去做所有任务,而靠后的任务总是只能拿到剩下的边角。下面讲清楚:哪些任务该拆、哪些该串,以及怎么确认每个任务真的都做完了。

为什么会这样(不是你的错)

这是被实测出来的效应,不是你措辞的问题。2025 年一项覆盖六个 NLP 任务、多个模型家族的研究(MDPI《Electronics》)发现:把多个任务捆进一个 prompt,准确率的下降幅度高度依赖模型——有的模型相对单任务基线只掉了约 3.7%,有的却崩了约 38.8%;其中一个细粒度任务(情绪分类)在被和别的任务捆在一起后,准确率从 31.1% 掉到了 1.5%。结构化任务(抽字段、返回 JSON)扛捆绑的能力,比细粒度语义任务(情绪、语气、判断)强得多。

截至 2026 年 6 月,实操结论是:不存在一个”安全”的任务数量上限。任务越偏语义、越需要判断,被共享一个 prompt 时受的伤就越重,而且你没法单凭模型大小预测这个损失。

常见原因

1. 为省事叠任务

你之所以批量,是觉得写 5 个 prompt 太浪费。结果是一个 prompt 把 5 件事都做糟,而不是 5 个 prompt 各做好一件。

如何判断:prompt 里有 3 个以上编号任务。

2. 输出预算用完了

模型的输出是有限的。5 个任务塞进一个回答,等于每个都在抢同一份 token 预算,哪怕有的任务需要很大一块才能做好。靠后的任务被截断或跳过,是因为模型还没轮到它们,预算就已经”花光”了。

如何判断:靠后的任务更短、被截断、或干脆没了。

3. 早任务给模型定了”状态”

task 1 用正式语气答完后,task 2 会继承这个语气,哪怕换个语域更合适。在单个回答内部,模型是路径依赖的:它已经吐出的 token,会带偏后面的 token。

如何判断:靠后的任务不恰当地沿用了前面任务的语气、格式或框架。

4. 没有给每个任务定成功标准

你说”5 个都做”,却没说每一个做成什么样算成功。模型就挑最容易满足的做,剩下的悄悄丢掉。

如何判断:prompt 只有一个成功标准,被 5 个任务共用。

5. 任务之间有隐性依赖

task 3 依赖 task 2 的输出。模型按顺序处理,但 task 2 的答案次优,于是 task 3 把错误级联放大了。

如何判断:一个任务出错,会污染下一个。

你属于哪一种

动手重写前,先用这张表判断该拆、该串、还是该批。

信号大概率原因修法
3 个以上编号任务,彼此无关为省事叠任务一任务一 prompt,并行跑(Step 2)
末尾任务被截断或空白输出预算耗尽拆开,让每个任务独占输出(Step 1)
后任务沿用前任务语气/格式路径依赖的状态拆成独立 prompt 或 planner 拆分(Step 3、5)
所有任务共用一条成功标准没有每任务标准编号标号 + 每任务成功标准(Step 4)
修好 task 2 就修好了 task 3隐性依赖顺序串联,显式 handoff(Step 3)

动手前先确认

  • 列出你叠的每个任务,数一数总共几个。
  • 标出哪些任务真正独立、哪些依赖另一个任务的输出。
  • 给每个任务写一行:正确答案长什么样。
  • 决定并行(独立)还是顺序(依赖)。
  • 决定每个任务能不能独占一次请求,还是共享一个 system prompt、每轮只做一个任务。

最短修复路径

Step 1:列任务,默认”1 prompt = 1 任务”

任务 1:总结邮件。
任务 2:分类情绪。
任务 3:起草回复。
任务 4:标记升级。
任务 5:内部 Slack 消息。

默认就是 5 个 prompt。只有当存在真实依赖、或这个工作流里 token 成本确实压过质量时,才批量。

Step 2:独立任务并行跑

平台支持的话,把独立的几个 prompt 当作并发 API 调用一起发出去。每个都拿到完整的输出预算,而总延迟是最慢的那一个调用,而不是所有调用之和。PARALLELPROMPT 基准测试发现,独立子任务能干净地并行,最高约 5x 提速,且在高创意类工作之外几乎不损质量。

import asyncio

results = await asyncio.gather(
    call_model(prompt_1),
    call_model(prompt_2),
    call_model(prompt_3),
    call_model(prompt_4),
    call_model(prompt_5),
)

如果你不是在自己的代码里、而是在单个 agent 循环内,可以让模型在一轮里发出多个独立的 tool call。截至 2026 年 6 月,OpenAI 通过 parallel_tool_calls 标志默认开启这一行为(设为 false 可强制串行调用),Claude 在判断工具彼此独立时会在一个回答里返回多个 tool_use 块(见 Anthropic 的 parallel tool use 文档)。你的运行器会一次性把它们派发出去,等全部结果回来再进入下一步推理。

Step 3:依赖任务顺序串联,显式 handoff

Pass 1:总结邮件。                                  -> <summary>
Pass 2:给定 <summary>,分类情绪。                  -> <sentiment>
Pass 3:给定 <summary> 和 <sentiment>,起草回复。   -> <reply>
Pass 4:给定 <summary>、<sentiment>,决定是否升级。 -> <bool>
Pass 5:综合以上,写 Slack 消息。                   -> <message>

把每一步的结果作为命名变量往下传,既保住质量、又把依赖链摆明,这样上游一旦答错,下一步还没被污染前就能抓出来。

Step 4:必须批量,就清晰标号 + 给每任务成功标准

处理下面这封邮件。对每个编号任务,输出一个带标签的分块。
不要跳过任何任务。若某任务不适用,输出标签并写 "N/A"。

任务 1:SUMMARY(最多 30 词)
任务 2:SENTIMENT(positive | neutral | negative | frustrated)
任务 3:REPLY_DRAFT(50-100 词、第二人称、不带 emoji)
任务 4:ESCALATION(yes/no + 一句话理由)
任务 5:SLACK_MSG(少于 40 词、口语化)

严格按这些标签输出:
TASK 1: ...
TASK 2: ...
TASK 3: ...
TASK 4: ...
TASK 5: ...

明确的标签、硬性的长度上限、再加一条”不要跳过”的指令,能削弱那种”做着做着没劲了”的形态。准确率要紧时,把需要判断的任务(情绪、升级)排除在批量之外——研究显示,正是这类细粒度任务在被捆绑时掉得最狠。

Step 5:复杂多任务用 planner / executor 拆

Planner prompt:给定输入 X,产出一份分步计划。对每一步,
                说明它的目标,以及它必须返回的确切输出 schema。

然后把每个计划好的步骤当作独立 prompt 来跑,
只把下一步需要的东西往下传。

这把庞大、模糊的工作分解成 scope 清晰的子 prompt。它背后正是 least-to-most prompting 那类分解思路——prompt engineering 综述把它记录为多步推理上一个可靠的准确率收益。

Step 6:审完成度

跑完后,用程序检查每个任务的输出都存在且良构(例如断言每个预期标签都存在且非空)。哪个任务漏了,就只重跑那一个,而不是整摞重来。

怎么确认已经修好

  • 每个任务都有完整输出,不只是 task 1。
  • 每个任务的输出都过它在 Step 4 里的成功标准。
  • 最后一个任务的深度,和第一个相当。
  • 同事看输出,说不出哪个任务先跑。
  • 总质量胜过批量版本,代价只是多几个调用或几次串联。

如果还是没修好

  1. 任务之间的依赖可能比你以为的多。把它们排序串起来(Step 3)。
  2. 模型可能背了太多任务。砍掉价值最低的那个。
  3. 把最重要的任务路由到更强的模型,其余的用便宜的。
  4. 高风险工作就别批量。永远 1 prompt 1 任务。

常见问题

一个 prompt 塞几个任务算太多? 没有固定数字。2025 年的 MDPI 研究发现,下降幅度取决于模型和任务类型——语义任务(情绪、分类、判断)比结构化任务(抽取、格式化)崩得早得多。把任何含 3 个以上任务的 prompt 都当成风险点,信任它之前先和单任务基线对比测一下。

拆成很多 prompt 是不是更贵? 通常只贵一点点。每次调用会多付一点输入开销,但你避免了重跑一整摞砸掉的批量,而且独立任务并行调用不增加实际墙钟时间。如果成本是真正的瓶颈,就只把便宜的结构化任务批在一起,把需要判断的任务单拆出来。

让模型”慢慢来、5 个都做”能解决吗? 不能。这个失败是结构性的,不是态度问题。模型仍然在共享一份输出预算,仍然在回答内部路径依赖。带硬性上限的每任务标号(Step 4)有帮助,但拆开 prompt 帮助更大。

用自己的并行 API 调用,还是用一个能发并行 tool call 的 prompt? 代码在你手里、任务又独立时,用你自己的并行调用。在单个 agent 循环里时,用原生并行 tool call。截至 2026 年 6 月,OpenAI 的 parallel_tool_calls 默认开启,Claude 在判断工具独立时会发出多个 tool_use 块。

为什么每次跳过的都是同一个靠后的任务? 一旦模型把前面的分块都吐完,剩下的输出预算和这段回答的”惯性”都会催它收尾。靠后的任务、尤其是开放式的,最先被砍掉。把 prompt 拆开、或把被跳过的任务挪到最前面,很快就能验证这一点。

预防建议

  • 默认规则:1 prompt = 1 任务。
  • 批量工作流用 planner + executor 模式,配显式子 prompt。
  • 给自己留一条反模式检查:“我又叠任务了吗?” 发送前过一遍。
  • 审生产管线。任何含 3 个以上任务、尤其是语义任务的 prompt,都算风险。
  • 把”批量省 token”当成一种气味,除非质量已被经验证明等价。
  • 反问自己”如果中途失败,哪些是可恢复的?” 批量 prompt 是半完全失败。

相关阅读

标签: #排查 #Prompt #Prompt 质量 #Prompt 工程