DECOMP
Decomposed Prompting(DECOMP,Khot et al., 2022)的核心是:用 Few-shot 示例把“可用的函数/工具”教给模型,然后让模型在解决一个大问题时,主动把任务拆成若干子问题,并把子问题分别“派发”给这些函数(很多实现里确实是多次 LLM 调用或“LLM + 外部工具”流水线)。在一些任务上,它比 Least-to-Most(先易后难逐步扩展)更好,因为它把“拆解+调用专用能力”做得更明确、更可控。
下面用初学者视角讲清楚:它是什么、怎么写提示词、以及一个中文例子。
1) DECOMP 是什么:把“拆解”变成“调用函数的工作流”
你可以把 DECOMP 理解为一种 函数式/工具式推理:
- 你先给模型一个“工具箱”:例如
字符串切分():把文本按规则拆开检索():去查资料(工程上可是真搜索 API / RAG 检索)计算器():做精确运算表格解析():从表格提取字段
- 然后给模型 few-shot 示例,演示:
“遇到某类子问题时,就调用某个函数,并把函数返回结果再用于后续步骤”
最终模型会输出类似:
- 把原问题拆成子任务 A/B/C
- 对每个子任务选择合适函数
- 汇总各函数结果得到最终答案
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 会倾向于:
- 子问题A:搜索 A 公司 2024 营收(
search) - 子问题B:搜索 B 公司 2024 营收(
search) - 子问题C:统一口径(是否为全年/季度、币种)(可能再
search或规则处理) - 汇总对比输出
工程上这比“让模型凭印象编”可靠很多。
6) 为什么它可能比 Least-to-Most 更好
在一些任务中,难点不是“从易到难推理”,而是:
- 需要不同类型的能力(检索/解析/计算/抽取)
- 需要可复用模块(把复杂任务拆成稳定子函数)
- 需要可控与可审计(每一步做了什么更清晰)
DECOMP 把“能力边界”明确化:模型不必在一个大段推理里硬扛全部困难,而是把子任务交给更合适的模块。
如果你告诉我你现在的应用场景(例如:写作、数据分析、客服、代码、RAG 问答、信息抽取),我可以按你的场景给你一套“DECOMP 函数清单 + Few-shot 示例 + 可直接运行的 CALL 格式模板”。你希望用 DECOMP 来解决哪类问题?