在之前的文章中有提到,当零样本提示和少样本提示不足时,这可能意味着模型学到的东西不足以在任务上表现良好。少样本提示的效果对示例的选择非常敏感。示例的质量、多样性、代表性等因素都会影响模型的学习效果。如果示例过于简单或复杂、缺乏代表性或者存在错误,都可能导致模型学习到错误的任务模式。除此之外,这样做的代价是消耗更多的token,并且当输入和输出文本较长时,可能会达到上下文长度限制。

以下是让模型不用链式思考直接通过少样本提示返回结果的示例:

public class FewShotPromptingDemo {

    public static void main(String[] args) {
        String input = "不用链式思考,参考下面的示例直接下面的问题。" +
                "这组数字中的奇数加起来是一个偶数:4、8、9、15、12、2、1。" +
                "A:答案是False。" +
                "这组数字中的奇数加起来是一个偶数:17、10、19、4、8、12、24。" +
                "A:答案是True。" +
                "这组数字中的奇数加起来是一个偶数:16、11、14、4、8、13、24。" +
                "A:答案是True。" +
                "这组数字中的奇数加起来是一个偶数:17、9、10、12、13、4、2。" +
                "A:答案是False。" +
                "这组数字中的奇数加起来是一个偶数:15、32、5、13、82、7、1。" +
                "A:";
        String output = DeepSeekModelUtils.textModelExecution("deepseek-chat",input);
        System.out.println(output);
    }

}


输出:
答案是True。

通过示例输出可以看到对问题的响应并不可靠。

上面的示例提供了任务的基本信息。但是引入的任务类型涉及几个更多的推理步骤。换句话说,如果我们将问题分解成步骤并向模型演示,这可能会有所帮助。

链式思考(CoT)提示

定义:链式思考(Chain-of-Thought) 是一种提示技术,通过中间推理步骤实现了复杂的推理能力。可以将其与少样本提示相结合,以获得更好的结果,以便在回答之前进行推理的更复杂的任务。

Standard Prompting Chain-of-Thought Prompting
prompt

Q:罗杰有5个⽹球。他⼜买了2罐⽹球。每个罐⼦有3个⽹球。有多少他现在有多少个⽹球?

A:答案是11个

Q:⾃助餐厅有23个苹果。如果他们⽤20做午餐,⼜买了6个,他们有多少个苹果?

Q:罗杰有5个⽹球。他⼜买了2罐⽹球。每个罐⼦有3个⽹球。他现在有多少个⽹球?

A:罗杰⼀开始有5个球。2罐3个⽹球,等于6个⽹球。5 + 6 = 11。答案是11。

Q:⾃助餐厅有23个苹果。如果他们⽤20做午餐,⼜买了6个,他们有多少个苹果?

output A:答案是27个

A:⾃助餐厅最初有23个苹果。他们使⽤20个做午饭。23 - 20 = 3。他们⼜买了6个苹果,得到3

+ 6= 9。答案是9个。

Java示例:

public class CoTPromptingDemo {

    public static void main(String[] args) {
        String input =  "这组数中的奇数加起来是偶数:4、8、9、15、12、2、1。" +
                "A:将所有奇数相加(9、15、1)得到25。答案为False。" +
                "这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。" +
                "A:";
        String output = DeepSeekModelUtils.textModelExecution("deepseek-chat",input);
        System.out.println(output);
    }

}

输出:
将所有奇数相加(15、5、13、7、1)得到 41。  
41 是奇数,不是偶数。  
答案为 False。

可以看到在提供推理步骤时得到了正确的结果,并且可以通过提供更少的示例来解决此任务。

零样本 COT 提示

思维链(CoT)提示是一种通过逐步回答示例来引发复杂多步推理的新技术,在算术和符号推理方面取得了最优表现。我们可以通过在每个答案前简单添加“让我们一步步思考”来证明LLM是不错的零样本推理者。

Java示例:

public class CoTPromptingDemo {

    public static void main(String[] args) {
        String input =  "我去市场买了10个苹果。我给了邻居2个苹果和修理工2个苹果。然后我去买了5个苹果并吃了1个。我还剩下多少苹果?" +
                "让我们逐步思考。";
        String output = DeepSeekModelUtils.textModelExecution("deepseek-chat",input);
        System.out.println(output);
    }

}


输出:
好的,我们一步步来算。  

1. 最初买了 **10 个苹果**。  
   \[
   10
   \]

2. 给了邻居 2 个,给了修理工 2 个。  
   \[
   10 - 2 - 2 = 6
   \]
   此时剩下 **6 个苹果**。

3. 又买了 5 个苹果。  
   \[
   6 + 5 = 11
   \]
   现在有 **11 个苹果**。

4. 吃了 1 个苹果。  
   \[
   11 - 1 = 10
   \]

**最终剩下:**  
\[
\boxed{10}
\]

这在没有太多示例可用于提示时有显著效果。

自动思维链(Auto-CoT)

当使用思维链提示时,这个过程需要手工制作有效且多样化的例子。这种手动工作可能会导致次优解决方案。 Zhang et al. (2022) 提出了一种消除人工的方法,即利用 LLMs “让我们一步一步地思考” 提示来生成一个接一个的推理链。这种自动过程仍然可能在生成的链中出现错误。为了减轻错误的影响,演示的多样性很重要。这项工作提出了Auto-CoT,它对具有多样性的问题进行采样,并生成推理链来构建演示。

自动思维链(Auto - CoT)是一种在自然语言处理领域,特别是针对复杂任务推理的自动化技术。它是思维链(CoT)方法的一种扩展,旨在自动生成思维链提示,而不是像传统 CoT 那样依赖人工设计的带有推理步骤的示例。其核心目标是通过自动化手段,让语言模型能够自动生成连贯的推理步骤来解决复杂问题,进一步提升模型在复杂任务中的性能。

Auto-CoT 主要由两个阶段组成:

  • 阶段1:问题聚类:将给定问题划分为几个聚类
  • 阶段2:演示抽样:从每组数组中选择一个具有代表性的问题,并使用带有简单启发式的 Zero-Shot-CoT 生成其推理链

Java示例:

public class CoTPromptingDemo {

    public static void main(String[] args) {
        String input =  "请根据问题的描述," +
                "自动生成推理步骤并得出答案。回答时使用以下结构:" +
                "1. 问题描述" +
                "2. 推理过程" +
                "3. 答案" +
                "问题为:小明买了8个苹果和6个橙子,一个苹果3元,一个橙子5元。他用了50元纸币支付," +
                "请问他应该找回多少钱?";
        String output = DeepSeekModelUtils.textModelExecution("deepseek-chat",input);
        System.out.println(output);
    }

}

输出:
1. 问题描述  
小明买了8个苹果和6个橙子,苹果单价3元,橙子单价5元。他用一张50元纸币支付,需要计算找回多少钱。

2. 推理过程  
- 计算苹果总价:8个 × 3元/个 = 24元  
- 计算橙子总价:6个 × 5元/个 = 30元  
- 计算总花费:24元 + 30元 = 54元  
- 计算应找回金额:支付金额 - 总花费 = 50元 - 54元 = -4元  
- 由于总花费54元大于支付的50元,小明支付的钱不够,因此他需要补钱而不是被找回钱。但问题问的是“应该找回多少钱”,在常规交易逻辑中,若支付不足则无法完成交易,或需补足差额。然而根据数学计算,找回金额为负数表示需额外支付。

3. 答案  
小明支付的钱不够,他还需要补4元才能完成购买,因此找回的金额是 -4元(即需再付4元)。

自我一致性

定义:在提示工程中更高级的技术之一是自我一致性。自我一致性旨在“替换链式思维提示中使用的天真贪婪解码方法”。其想法是通过少样本 CoT 采样多个不同的推理路径,并使用生成结果选择最一致的答案。这有助于提高 CoT 提示在涉及算术和常识推理的任务中的性能。适用于数学、逻辑、多跳问答、需要严谨推理的任务。

方法 描述 缺点
标准提示(Standard Prompting) 直接问问题,模型直接输出答案 容易出错,尤其在数学/逻辑题上
思维链(Chain-of-Thought, CoT) 引导模型“一步步推理”再给出答案 依赖单一推理路径,仍可能因随机性出错
自我一致性(Self-Consistency) 多次运行 CoT,生成多条推理路径,投票选最一致答案 计算成本略高,但显著提升准确率

论文参考:SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHTREASONING IN LANGUAGE MODELS

Prompt Chaining

定义:为了提高大语言模型的性能使其更可靠,一个重要的提示工程技术是将任务分解为许多子任务。 确定子任务后,将子任务的提示词提供给语言模型,得到的结果作为新的提示词的一部分。 这就是所谓的链式提示(prompt chaining),一个任务被分解为多个子任务,根据子任务创建一系列提示操作。

链式提示可以完成很复杂的任务。LLM 可能无法仅用一个非常详细的提示完成这些任务。在链式提示中,提示链对生成的回应执行转换或其他处理,直到达到期望结果。

public class PromptChainingDemo {

    public static void main(String[] args) {
        String input =  "请按照以下步骤完成:" +
                "1. 确定问题的核心内容。" +
                "2. 提供关于问题中涉及的历史事件的简要背景。" +
                "3. 分析该事件的主要原因。" +
                "4. 解释该事件对历史发展的主要影响。" +
                "5. 总结回答。" +
                "问题:请描述第二次世界大战的起因,并分析其对世界格局的影响。";
        String output = DeepSeekModelUtils.textModelExecution("deepseek-chat",input);
        System.out.println(output);
    }

}


输出:
1. **确定问题的核心内容**  
   问题的核心是分析第二次世界大战的起因及其对世界格局的影响,需要从历史背景、原因和后果等方面进行系统性阐述。

2. **关于问题中涉及的历史事件的简要背景**  
   第二次世界大战(1939-1945年)是人类历史上规模最大、影响最广泛的全球性冲突之一,涉及全球绝大多数国家,主要分为以纳粹德国、日本、意大利等为首的轴心国阵营,以及以美国、苏联、英国、中国等为首的同盟国阵营。战争起源于1939年德国入侵波兰,最终以1945年轴心国战败告终。

3. **分析该事件的主要原因**  
   - **《凡尔赛条约》的遗留问题**:一战后对德国的严苛惩罚导致其经济崩溃、民族主义情绪高涨,为纳粹崛起埋下伏笔。  
   - **经济大萧条的影响**:1929年全球经济危机加剧了各国社会矛盾,促使德、日、意等国通过对外扩张转移国内危机。  
   - **极端意识形态的蔓延**:法西斯主义、军国主义在德、日、意等国盛行,强调民族优越性与领土扩张。  
   - **国际联盟的失效**:一战后建立的国际组织未能有效制止侵略行为(如日本侵华、意大利入侵埃塞俄比亚)。  
   - **绥靖政策的失败**:英法等国对德、意扩张的妥协(如《慕尼黑协定》)助长了轴心国的侵略野心。

4. **解释该事件对历史发展的主要影响**  
   - **政治格局重组**:欧洲传统强国衰落,美苏崛起形成两极格局,冷战序幕拉开。  
   - **殖民体系瓦解**:战争削弱了欧洲列强对亚非拉殖民地的控制,民族独立运动蓬勃发展。  
   - **国际秩序重建**:联合国成立,旨在通过多边合作维护和平;《世界人权宣言》等文件奠定国际法基础。  
   - **科技与军事变革**:核武器、喷气式飞机、雷达等技术发展改变了战争形态,也推动了战后科技革命。  
   - **全球经济体系变革**:布雷顿森林体系建立,美元成为国际货币,世界银行、IMF等机构促进全球经济合作。  
   - **人道主义反思**:纳粹大屠杀等暴行促使国际社会加强对人权、种族平等的关注,推动国际刑事司法发展。

5. **总结回答**  
   第二次世界大战的起因是多重因素交织的结果,包括一战后国际秩序失衡、经济危机、极端意识形态扩张及外交政策失误。战争不仅造成巨大生命财产损失,更彻底改变了世界格局:推动殖民体系崩溃、催生美苏两极对抗、建立以联合国为核心的国际体系,并为科技、经济与人权领域的全球合作奠定基础。这场战争警示人类,和平需要基于公平的国际秩序、有效的集体安全机制以及对极端主义的警惕。

如示例可见,简化并创建提示链是一种有用的提示方法,其中响应需要经过多个操作或转换。

思维树 (ToT)

定义:对于需要探索或预判战略的复杂任务来说,传统或简单的提示技巧是不够的。思维树(Tree of Thoughts,ToT)框架基于思维链提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。

ToT 维护着一棵思维树,思维由连贯的语言序列表示,这个序列就是解决问题的中间步骤。使用这种方法,LM 能够自己对严谨推理过程的中间思维进行评估。LM 将生成及评估思维的能力与搜索算法(如广度优先搜索和深度优先搜索)相结合,在系统性探索思维的时候可以向前验证和回溯。

ToT框架原理:

思维树的推理流程为:

  1. 语义理解:对输入的文本进行语义理解,将自然语言转换为计算机能够理解的形式,通常会使用一系列预训练的语义表示模型,如 BERT、GPT 等,来对输入文本进行编码和表示,从而捕捉到输入文本中的语义信息。
  2. 构建思维树:基于对输入文本的语义表示,构建一个思维树,以表示文本中的不同思维路径和关系。这个过程涉及到树状结构的设计和构建算法。
  3. 路径选择:在生成输出文本时,根据输入文本和构建的思维树选择合适的思维路径。该过程通常涉及到路径搜索算法,以确定最相关和最合适的思维路径,ToT 可以考虑到多个可能的思维路径,并根据输入文本的不同语义信息动态调整路径选择策略。
  4. 整合信息:选择了合适的思维路径后,从不同路径中获取信息,并将其整合起来,形成一个综合的理解。此过程涉及到信息融合和加权的算法,以确保生成的输出文本能够考虑到多个因素和可能性。
  5. 生成输出:根据整合的信息生成输出文本,通常采用生成式模型,如 GPT,来生成连贯、自然的文本。ToT 会根据整合的信息和选择的思维路径来指导文本生成过程,以生成准确、多样化的输出。

Java示例:

public class ToTPromptingDemo {

    public static void main(String[] args) {
        String input =  "任务:请解决以下迷宫路径规划问题,找到从起点 S 到终点 E 的最短路径。" +
                "采用树状推理(Tree of Thoughts, ToT)方法逐步展开路径选择。" +
                "问题:  " +
                "迷宫如下(S为起点,E为终点,X为障碍):  " +
                "S 0 0 X 0  " +
                "X X 0 X 0  " +
                "0 0 0 0 0  " +
                "0 X X X E  " +
                "步骤:" +
                "1. 在当前位置(初始为S)生成所有可能的下一步移动(上、下、左、右)。" +
                "2. 对每个移动进行评估(sure/maybe/impossible):  " +
                "   - sure:该路径通畅,且可能是通往终点的最优路径。  " +
                "   - maybe:该路径可能可行,但需要进一步尝试。  " +
                "   - impossible:该路径不可行或为死路。  " +
                "3. 从评估结果中保留最佳候选路径,继续展开下一步。  " +
                "4. 如果当前路径无解,回退到上一步并重新选择路径。  " +
                "要求:  " +
                "- 展示每一步的候选路径及其评估结果。  " +
                "- 输出最终的最短路径及其总步数。";
        String output = DeepSeekModelUtils.textModelExecution("deepseek-chat",input);
        System.out.println(output);
    }

}


输出:
好的,我们先明确迷宫结构。  

根据你给的描述,我先把迷宫画成网格形式(假设坐标从左上角开始为 (0,0)):  

```
(0,0) S  (0,1) 0  (0,2) 0  (0,3) X  (0,4) 0  
(1,0) X  (1,1) X  (1,2) 0  (1,3) X  (1,4) 0  
(2,0) 0  (2,1) 0  (2,2) 0  (2,3) 0  (2,4) 0  
(3,0) 0  (3,1) X  (3,2) X  (3,3) X  (3,4) E  
```
S 在 (0,0),E 在 (3,4)。  
0 表示可通过的空格,X 表示障碍。  

---

**采用 ToT 方法逐步推理:**

---

### **第 1 步:起点 S (0,0)**
可能的移动:右 (0,1)、下 (1,0)、左(越界)、上(越界)。  
- 右 (0,1):空格 0 → 可行  
- 下 (1,0):X → 障碍,不可行  

候选:  
1. (0,0) → (0,1)  

评估:  
- (0,1) 是空格,且可以继续向右或向下,可能是通路 → **maybe**(因为刚出发,不确定是否最优)  

---

### **第 2 步:从 (0,1) 展开**
从 (0,1) 可走:上(越界)、下 (1,1)、左 (0,0)、右 (0,2)。  
- 左 (0,0):回到起点,不考虑(除非必要回退)  
- 下 (1,1):X → 不可行  
- 右 (0,2):空格 0 → 可行  

候选路径:  
A: (0,0)→(0,1)→(0,2)  

评估:  
- (0,2) 可以继续向右到 (0,3) 吗?(0,3) 是 X,不行;可以向下到 (1,2) 吗?(1,2) 是 0,可行。  
所以 (0,2) 仍然可能通向终点 → **maybe**  

---

### **第 3 步:从 (0,2) 展开**
从 (0,2) 可走:上(越界)、下 (1,2)、左 (0,1)、右 (0,3)。  
- 右 (0,3):X → 不可行  
- 左 (0,1):回头路,不考虑  
- 下 (1,2):空格 0 → 可行  

候选路径:  
A: (0,0)→(0,1)→(0,2)→(1,2)  

评估:  
- (1,2) 可以向下 (2,2)、右 (1,3)、左 (1,1)、上 (0,2)。  
(1,3) 是 X,不行;(1,1) 是 X,不行;所以只能下 (2,2) 或上 (0,2)。上 (0,2) 是回头路。  
所以唯一新方向是下 (2,2) → **maybe**(因为还在探索)  

---

### **第 4 步:从 (1,2) 展开**
从 (1,2) 可走:下 (2,2)、上 (0,2)、左 (1,1)、右 (1,3)。  
- 右 (1,3):X → 不可行  
- 左 (1,1):X → 不可行  
- 上 (0,2):回头路  
- 下 (2,2):空格 0 → 唯一新方向  

路径:  
A: (0,0)→(0,1)→(0,2)→(1,2)→(2,2)  

评估:  
- (2,2) 是中心点,可以上下左右:  
上 (1,2) 回头;下 (3,2) 是 X;左 (2,1) 是 0;右 (2,3) 是 0。  
所以有两个新方向:左 (2,1) 和右 (2,3)。  
→ **maybe**(需要分支)  

---

### **第 5 步:分支展开**
我们保留两个候选:  
A1: (0,0)→(0,1)→(0,2)→(1,2)→(2,2)→(2,1)  
A2: (0,0)→(0,1)→(0,2)→(1,2)→(2,2)→(2,3)  

先评估 A1 (2,1):  
从 (2,1) 可走:上 (1,1) X,下 (3,1) X,左 (2,0) 0,右 (2,2) 回头。  
唯一新方向是左 (2,0)。  

A1 延伸:→(2,0)  
(2,0) 可走:上 (1,0) X,下 (3,0) 0,左 (1,0) 越界?不对,(2,0) 左是 (2,-1) 越界,右 (2,1) 回头。  
所以唯一新方向是下 (3,0)。  

A1: →(3,0)  
(3,0) 可走:上 (2,0) 回头,右 (3,1) X,下 越界,左 越界。  
**死路**!因为 (3,0) 只能回到 (2,0),而 (2,0) 除了 (3,0) 和 (2,1) 无其他新方向,且 (2,1) 也是死胡同。  
所以 A1 分支是死路 → **impossible** 到达 E。  

---

再看 A2 (2,3):  
从 (2,3) 可走:上 (1,3) X,下 (3,3) X,左 (2,2) 回头,右 (2,4) 0。  
唯一新方向是右 (2,4)。  

A2: →(2,4)  
(2,4) 可走:上 (1,4) 0,下 (3,4) E,左 (2,3) 回头,右 越界。  
下 (3,4) 就是终点!  
所以 A2 可以直达终点。  

---

### **第 6 步:验证是否更短路径**
当前路径:  
(0,0)→(0,1)→(0,2)→(1,2)→(2,2)→(2,3)→(2,4)→(3,4)  
步数:从 S 到 E 共 7 步(移动次数 7 次,路径长度 7 条边,8 个点)。  

检查是否有更短路径:  
从 (0,0) 只能先到 (0,1),然后必须到 (0,2),然后必须到 (1,2),然后必须到 (2,2)。  
从 (2,2) 如果直接去 (2,3) 再到 (2,4) 再到 E,这是唯一可行路径吗?  
尝试 (2,2)→(2,3)→(2,4)→(3,4) 是最短的,因为 (2,4) 直接下方是 E。  

如果从 (2,2) 先去 (2,1) 分支已证明死路。  
如果从 (2,2) 先去 (2,3) 是唯一可行。  

所以这是最短路径。  

---

### **最终结果:**
**最短路径**:  
S (0,0) → (0,1) → (0,2) → (1,2) → (2,2) → (2,3) → (2,4) → E (3,4)  

**总步数**:7 步(从起点到终点移动次数)。

思维树(ToT)提示法,将 ToT 框架的主要概念概括成了一段简短的提示词,指导 LLM 在一次提示中对中间思维做出评估。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐