DECOMP

prompt提示词2026年6月7日5

Decomposed Prompting(DECOMP,Khot et al., 2022)的核心是:用 Few-shot 示例把“可用的函数/工具”教给模型,然后让模型在解决一个大问题时,主动把任务拆成若干子问题,并把子问题分别“派发”给这些函数(很多实现里确实是多次 LLM 调用或“LLM + 外部工具”流水线)。在一些任务上,它比 Least-to-Most(先易后难逐步扩展)更好,因为它把“拆解+调用专用能力”做得更明确、更可控。

下面用初学者视角讲清楚:它是什么、怎么写提示词、以及一个中文例子。


1) DECOMP 是什么:把“拆解”变成“调用函数的工作流”

你可以把 DECOMP 理解为一种 函数式/工具式推理:

  • 你先给模型一个“工具箱”:例如
    • 字符串切分():把文本按规则拆开
    • 检索():去查资料(工程上可是真搜索 API / RAG 检索)
    • 计算器():做精确运算
    • 表格解析():从表格提取字段
  • 然后给模型 few-shot 示例,演示:
    “遇到某类子问题时,就调用某个函数,并把函数返回结果再用于后续步骤”

最终模型会输出类似:

  1. 把原问题拆成子任务 A/B/C
  2. 对每个子任务选择合适函数
  3. 汇总各函数结果得到最终答案

2) 和 Plan-and-Solve / Least-to-Most 的区别

  • Plan-and-Solve:拆解主要是“写计划 + 按步骤推理”,通常还是在一次回答里完成(不一定调用外部函数)。
  • Least-to-Most:会先解简单子问题,再用答案去解决更难的子问题;但不强调“工具/函数调用”。
  • DECOMP:重点是**“把子问题交给不同函数/模块处理”**,更像工程中的“编排器(orchestrator)”。

3) DECOMP 的 Prompt 一般怎么写(模板)

关键点有三块:定义函数 → few-shot 演示怎么用 → 让模型按格式分解并调用。

模板:定义函数 + 规定输出(中文)

你可以使用以下函数来解决问题。请在需要时调用它们:
1) split(text, sep): 按分隔符 sep 切分字符串,返回列表
2) search(query): 检索并返回与 query 最相关的3条结果(标题+摘要+链接)
3) calc(expression): 计算表达式并返回数值
4) extract(table_text, fields): 从表格文本中抽取指定字段

规则:
- 先将任务分解为若干子问题。
- 每个子问题选择最合适的函数调用。
- 函数调用请严格用以下格式输出:CALL[函数名](参数...)
- 当获得函数返回结果后,再继续下一步。
- 最终给出简洁的结论。

下面是示例(Few-shot):
【示例略...】

现在请解决:
{用户问题}

工程上:你真的可以让系统看到 CALL[...] 就去执行工具,然后把工具返回结果再喂回模型,形成多轮“分解-执行-汇总”。


4) 实际例子(中文,演示 DECOMP 的“函数化拆解”)

我们用一个很典型、适合拆分的任务:把一段日志里提取字段并计算。

任务

“下面是订单日志,每行:订单号|用户|金额。请统计每个用户的总金额,并找出消费最高的用户。”

日志:

A01|张三|19.9
A02|李四|120
A03|张三|80
A04|王五|35.5
A05|李四|20

用 DECOMP 风格的提示词(你给模型)

你可以使用函数:
- split(text, sep): 切分字符串
- calc(expression): 计算表达式

请将问题分解成子问题并调用函数完成:
1) 先按行切分日志
2) 再按“|”切分每行,得到用户与金额
3) 汇总每个用户金额
4) 找出最高者并输出

函数调用格式:CALL[函数名](...)
在拿到函数结果后再进行下一步。

日志如下:
A01|张三|19.9
A02|李四|120
A03|张三|80
A04|王五|35.5
A05|李四|20

典型的 DECOMP 执行过程(示意)

  • 子问题1:按行拆分
    CALL[split]("A01|张三|19.9\nA02|李四|120\n...", "\n")
    → 返回行列表
  • 子问题2:逐行再按 | 拆分
    CALL[split]("A01|张三|19.9", "|") → 得到字段
  • 子问题3:金额相加可用 calc(可选)
    CALL[calc]("19.9+80") → 99.9
    CALL[calc]("120+20") → 140
  • 子问题4:比较并输出
    结论:李四 140 最高

这就是“模型做编排,函数做专用子任务”的典型 DECOMP 思路。


5) 另一个更贴近论文描述的例子:带“搜索”的分解(概念演示)

比如用户问:“请比较 A 公司和 B 公司 2024 年财报的营收,并给出结论。”

DECOMP 会倾向于:

  1. 子问题A:搜索 A 公司 2024 营收(search)
  2. 子问题B:搜索 B 公司 2024 营收(search)
  3. 子问题C:统一口径(是否为全年/季度、币种)(可能再 search 或规则处理)
  4. 汇总对比输出

工程上这比“让模型凭印象编”可靠很多。


6) 为什么它可能比 Least-to-Most 更好

在一些任务中,难点不是“从易到难推理”,而是:

  • 需要不同类型的能力(检索/解析/计算/抽取)
  • 需要可复用模块(把复杂任务拆成稳定子函数)
  • 需要可控与可审计(每一步做了什么更清晰)

DECOMP 把“能力边界”明确化:模型不必在一个大段推理里硬扛全部困难,而是把子任务交给更合适的模块。


如果你告诉我你现在的应用场景(例如:写作、数据分析、客服、代码、RAG 问答、信息抽取),我可以按你的场景给你一套“DECOMP 函数清单 + Few-shot 示例 + 可直接运行的 CALL 格式模板”。你希望用 DECOMP 来解决哪类问题?