【LLM 论文】Least-to-Most Prompting 让 LLM 实现复杂推理

论文:Least-to-Most Prompting Enables Complex Reasoning in Large Language Models
⭐⭐⭐
Google Research, ICLR 2023

论文速读

Chain-of-Thought(CoT) prompting 的方法通过结合 few-show prompt 的思路,让 LLM 能够挑战更具复杂性的问题。但是 CoT 的方法存在一个关键限制:它在需要泛化性来解决比 demonstration examples 更困难的问题的 task 上,通常表现不佳。

为了克服这个缺点,本论文提出了 least-to-most prompting 的方法,它先让 LLM 将原来的问题分解为多个需要预先解决的 sub-questions,然后依次按顺序让 LLM 去解决这些 sub-questions,在解决每个 sub-question 的时候,LLM 可以看到之前的每个 sub-question 以及回复。如下图:
请添加图片描述
可以看到,它包含两个 stage,每个 stage 都是通过 few-shot prompt 来实现的,并且整个过程没有任何 model 被训练

阶段 1: 问题分解(Decomposition)

  • 在这个阶段,目标是将一个复杂的问题分解成几个更小、更易于解决的子问题。这个过程通常通过提供几个示例来演示如何将问题分解。例如,如果问题是“Amy 可以在滑水道关闭前滑几次?”这个问题可以被分解为两个子问题:

每次上滑和下滑的总时间是多少?
滑水道关闭前有多少时间?

  • 在提供的示例中,问题被分解为第一个子问题:“每次来回需要多长时间?”通过计算上滑和下滑的时间(4分钟上滑 + 1分钟下滑 = 5分钟),我们得到了每次来回所需的时间。

阶段 2: 子问题解决(Subproblem solving):

  • 在这个阶段,目标是使用已经解决的子问题的答案来解决原始问题。这个过程包括以下几个部分:

  • 示例:提供几个已经解决的子问题和答案的示例,以展示如何解决类似的子问题。【用于演示子问题如何被解决的 few-shot examplers】
    已知子问题和答案:展示之前已经回答的子问题及其答案,例如,每次来回需要5分钟。
    原始问题:然后,使用这些已知的子问题的答案来解决原始问题。在这个例子中,我们知道滑水道将在15分钟后关闭,而每次来回需要5分钟,所以Amy可以在滑水道关闭前滑3次(15分钟 / 5分钟/次 = 3次)。

实验

论文做了 symbolic manipulationcompositional generalizationmath reasoning tasks 三个实验,并主要与 CoT 进行了对比。

总的来说,本文提出的 Least-to-Most Prompting 相比于 CoT 的优势主要在于:

在长度泛化方面更好。面对比 few-shot exemplars 更长的问题,比 CoT 解决地更好
在困难泛化方面更好。面对比 few-shot exemplars 更困难的问题,也比 CoT 解决地更好

总结与分析

论文指出,该方法的 decomposition prompt 不能很好地跨域泛化,在一个 domain 上 decomposition 的示例无法有效地用在另一个 domain(task)上。

总的来说,本工作提出了 least-to-most prompting 的方法,通过自顶向下的问题分解和自底向上的子问题解决实现了最终的解决问题。在该方法中,prompt 由以前的单向与 LLM 交流变成了双向的互动。通过双向交互来指导 LLM 仍然值得探索。
pt 由以前的单向与 LLM 交流变成了双向的互动。通过双向交互来指导 LLM 仍然值得探索。

<think>好的,我现在需要帮助用户了解提示工程(prompt engineering)、代理(agent)和函数调用(function call)在AI或编程中的概念和实现方法。首先,我需要理清每个概念的定义和它们之间的关系。 首先,提示工程是指设计和优化输入提示,以引导AI模型生成更准确的输出。根据引用[1],分解复杂问题为更简单的子问题可以提升大语言模型(LLM)的解决能力,这可能涉及到像思维链(CoT)这样的技术。用户提到的提示工程结合代理和函数调用,可能需要将这些技术结合起来,使AI系统更有效地处理任务。 接下来是代理(agent)的概念。在AI中,代理通常指能够自主执行任务或决策的实体。比如,一个代理可能需要调用工具或函数来完成目标,这涉及到函数调用。例如,一个代理可能需要使用搜索API获取实时数据,或者执行代码进行计算,这都需要函数调用的支持。 然后是函数调用,这允许AI模型与外部系统或API交互,执行具体操作。例如,当模型需要获取天气数据时,可以调用相应的API函数。结合提示工程,可以设计提示让模型明确何时以及如何调用这些函数,从而增强其功能。 现在需要将这些概念结合起来,思考它们如何协同工作。比如,提示工程可以设计特定的指令,让代理根据输入的提示分解任务,然后通过函数调用执行具体步骤。这可能涉及到分步提示(Step-by-Step Prompting),将复杂任务拆解,并指导代理逐步完成,同时适时调用必要的函数。 此外,引用[1]提到的Least-to-Most提示方法,可能类似于逐步引导模型解决子问题,再整合结果。这可能应用于代理的工作流程中,先分解问题,再通过函数调用处理每个子问题,最后汇总结果。 用户还可能需要了解具体的实现方法,比如在编程中如何将提示工程与函数调用结合。例如,使用LangChain框架,可以创建代理,根据提示解析用户请求,决定调用哪个工具,执行函数,并返回结果。代码示例可能包括定义工具、设置提示模板、初始化代理并运行。 最后,需要考虑可能的相关问题,如不同提示技术的对比、代理设计的最佳实践、函数调用的安全性和效率等。这些都需要在回答中提及,以帮助用户全面理解。 总结,我需要分步骤解释每个概念,结合引用中的研究,给出实际示例,并生成相关问题供用户深入探索。</think>### 提示工程与代理、函数调用的结合 #### 1. **核心概念** - **提示工程(Prompt Engineering)** 通过设计特定结构的输入提示(prompt),引导大语言模型(LLM)生成更符合目标的输出。例如: - **思维链(CoT)**:要求模型分步骤推理,如“请逐步解释如何计算圆的面积”[^1]。 - **函数调用提示**:明确指示模型调用外部工具,如“调用天气API获取北京今日温度”。 - **代理(Agent)** 代理是能够自主决策并执行任务的AI实体。例如: - **工具调用代理**:根据输入决定调用搜索引擎、计算器或数据库。 - **多步任务代理**:分解复杂任务为多个子步骤,如“规划旅行路线”需依次处理交通、住宿等。 - **函数调用(Function Call)** 允许AI模型与外部系统交互,执行具体操作。例如: - 调用Python函数处理数据:`calculate_average([1,2,3])`。 - 调用API获取实时信息:`get_stock_price("AAPL")`。 #### 2. **结合方式与实现** - **步骤分解与函数调用** 1. **提示设计**:通过CoT将任务分解为子问题,例如: ``` 用户输入:“帮我分析某公司近三年营收增长率。” 提示模板: 1. 调用API获取2019-2021年财务数据。 2. 计算每年增长率:(当年营收 - 前年营收)/前年营收。 3. 生成可视化图表。 ``` 2. **代理决策**:代理根据提示选择需调用的函数(如财务API、计算函数、绘图库)。 3. **执行与整合**:依次执行函数并汇总结果。 - **代码示例(基于LangChain框架)** ```python from langchain.agents import initialize_agent, Tool from langchain.llms import OpenAI # 定义工具函数 def fetch_financial_data(company: str) -> dict: # 模拟API调用 return {"2019": 100, "2020": 120, "2021": 150} def calculate_growth(data: dict) -> float: return (data["2021"] - data["2019"]) / data["2019"] # 创建工具列表 tools = [ Tool(name="FinancialDataFetcher", func=fetch_financial_data, description="获取公司财务数据"), Tool(name="GrowthCalculator", func=calculate_growth, description="计算增长率") ] # 初始化代理 agent = initialize_agent(tools, OpenAI(), agent="zero-shot-react-description", verbose=True) agent.run("请分析公司XYZ的三年营收增长率。") ``` 输出可能为: ``` 1. 调用FinancialDataFetcher获取数据 → {2019:100, 2020:120, 2021:150} 2. 调用GrowthCalculator → 增长率=(150-100)/100=50% ``` #### 3. **应用场景** - **自动化数据分析**:代理根据自然语言指令调用清洗、计算、可视化函数[^1]。 - **智能客服**:通过函数调用查询订单、生成解决方案,如“查询订单123状态 → 调用`get_order_status(123)`”。 - **科研辅助**:分解复杂问题为文献检索、公式推导、图表生成等步骤。 #### 4. **优化策略** - **精准提示设计**:明确函数调用条件和参数,例如: “若用户需要实时数据,调用`search_web(query)`;若需要计算,调用`math_solver(expression)`。” - **错误处理机制**:在提示中要求代理验证函数输出,如“检查API返回是否为空,若空则重试”。 - **多模态扩展**:结合图像处理函数,如“调用`ocr(image_path)`提取文本,再调用`translate(text)`翻译”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fairy要carry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值