「CoT」巧思还是骗局?

CoT是什么

Cot(Chain of Thought) 最初是由Google Research在2022年发表的论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中正式提出的概念。

论文中,Cot被定义为:

"A method that enables language models to decompose multi-step problems into intermediate steps, enabling them to solve complex reasoning tasks by generating a series of intermediate reasoning steps before arriving at the final answer."

【主观理解】本质上可以理解为一种prompt的优化手段---通过让模型输出思考过程的方式来拆解复杂任务,提升模型输出的表现。

arduino 复制代码
传统prompt: "直接回答X"
CoT prompt: "请一步步思考并回答X,展示你的推理过程"

CoT示例

传统Prompt(直接回答)

Prompt:

复制代码
一个商店有120个苹果,第一天卖出总数的1/3,第二天卖出剩余苹果的1/4,第三天又进了50个苹果。现在商店里有多少个苹果?

模型回复:

复制代码
现在商店里有90个苹果。

CoT优化版本

Prompt:

复制代码
请一步步思考并解决这个问题:
​
一个商店有120个苹果,第一天卖出总数的1/3,第二天卖出剩余苹果的1/4,第三天又进了50个苹果。现在商店里有多少个苹果?
​
请详细展示你的计算过程。

模型回复:

ini 复制代码
让我一步步计算:
​
1. 初始状态:商店有120个苹果
​
2. 第一天卖出总数的1/3:
   - 卖出的数量 = 120 × (1/3) = 40个
   - 剩余数量 = 120 - 40 = 80个
​
3. 第二天卖出剩余苹果的1/4:
   - 卖出的数量 = 80 × (1/4) = 20个
   - 剩余数量 = 80 - 20 = 60个
​
4. 第三天进了50个苹果:
   - 最终数量 = 60 + 50 = 110个
​
答案:现在商店里有110个苹果。

自Cot概念的提出以来,也有非常多的实验与理论佐证---Cot确实对模型输出的优化起到了非常好的正向作用,这里也不再赘述:

Cot相关原理可参考:zhuanlan.zhihu.com/p/629087587

质疑与思考

CoT骗局?

近期一篇集结了多位大佬(包括图灵奖得主Bengio)心血的论文,其核心观点犀利指出:

即使语言模型通过思维链一步步展示了推理过程,但这并不等同于真正意义上的"可解释性",看起来很靠谱的推理步骤,其实只是一个精彩的表演,而不是我们理解的思考真相

结论确实有些反直觉,但确实我们日常使用大模型的过程中,推导与结论并不一致的情况时有发生,虽然没有深入研究论文中的论述,但对于llm界的吃瓜大众来说,也确实埋下了质疑的种子。

个人观点

其实不难理解,不仅思维链,llm本身的内部执行对用户,甚至对模型的缔造者来说,都是一个"黑盒"。这种黑盒属性,让模型的可解释性受到质疑。

虽然llm大模型的代码、参数和训练方法是公开透明的,但我们仍然难以追踪和理解它们如何从特定的输入生成特定的输出。这种复杂性源自于模型内部多层次的非线性数据处理和海量参数的复杂交互,使得追溯和理解其决策路径成为一项巨大挑战

但作为ai时代下的冲浪人,无论那个最终的结果,或者说真相如何,在ai探索与使用过程中,只要是能对我们的使用体验起到正向作用的方法,就应该踊跃的去尝试。

CoT使用巧思

既要结构化出参,又要 CoT ?可以试试这样写 Prompt

背景

业务场景下,尤其是在workflow搭建agent应用时,经常需要让大模型以JSON的格式进行输出

示例

比如我们可以用大模型来构造一个意向分类器,将意向分类结果作为某个规则引擎的入参去触发一些外部动作,由于规则引擎接收的输入是一串 JSON,所以我们需要大模型在输出分类结果时直接输出 JSON,其 Prompt 可以是这样的:

bash 复制代码
# 你的角色是意向分类机器人,需要根据对话上下文从意向集合中选出一个最合适的用户意向,这是可选的意向及其描述
  {{用户意向列表}}
​
# 你给出的用户意向应当以 JSON 格式返回,这是你所需要遵循 JSON 的进行返回的示例:
  {
    'identifiedIntent':'情况属实',
    'confidenceScore':'高'
  }
​
# JSON 字段解释
  - identifiedIntent:你根据对话上下文所匹配出来的意向;
  - confidenceScore:你匹配意向的置信度,分为「高」「中」「低」三个档:
    「高」代表对话上下文中明确、显性、直接的表达了匹配意向;
    「中」代表可以通过对话上下文较有把握的推理出匹配意向;
    「低」代表了在可选意向列表中该意向相对于其它是可以勉强进行匹配的;
    
# 对话记录
===以下是对话记录===
<histories>
      {{对话记录}}     
</histories>
​
# 下面请输出你的意向分类JSON

在很多情况下,上述的 Prompt 可能就已经可以正常工作了。但是还有些情况,比如用户表述较为模糊,需要结合上下文进行适当推理,就可能出现大模型直接进行意向输出不够准确的问题,这时候引入 CoT 便是一个常见的选择。

CoT 输出对于结构并没有严格的要求,还是上面的例子,一种常见的Prompt修改是:

bash 复制代码
# 你的角色是意向分类机器人,需要根据对话上下文从意向集合中选出一个最合适的用户意向,这是可选的意向及其描述
  {{用户意向列表}}
​
# 为了分类的准确性你需要将你进行分类的思考过程一步一步的展示出来
​
# 在思考过程输出完成后,紧接着你需要将你识别出的用户意向以 JSON 格式返回,这是你所需要遵循 JSON 的进行返回的示例:
  {
    'identifiedIntent':'情况属实',
    'confidenceScore':'高'
  }
​
# JSON 字段解释
  - identifiedIntent:你根据对话上下文所匹配出来的意向;
  - confidenceScore:你匹配意向的置信度,分为「高」「中」「低」三个档:
    「高」代表对话上下文中明确、显性、直接的表达了匹配意向;
    「中」代表可以通过对话上下文较有把握的推理出匹配意向;
    「低」代表了在可选意向列表中该意向相对于其它是可以勉强进行匹配的;
    
# 对话记录
===以下是对话记录===
<histories>
      {{对话记录}}     
</histories>
​
# 下面请输出你的思考过程及意向分类JSON

这是将以上 Prompt 给到 GPT-4 后得到的输出:

在输出结果中,思考过程和和意向分类JSON是一起给出的,无法直接给到规则引擎触发下一步动作,而是需要自己写个方法或借助 LangChain 等库提供的方法进行 JSON 提取,不怎么奥卡姆剃刀。还有一个问题,是如果我们需要把 CoT 过程落库,用作审计或Prompt优化,那我们要提取的不光是JSON,还要把Cot过程也给提取出来。

再就是,像 OpenAI 提供的JSON-mode:platform.openai.com/docs/guides...;只支持JSON格式的输出,有些解决方案是把CoT和JSON输出分成两次请求来做,这未免也是有点麻烦了。

好的,下面就是这个 trick 的本体了😂,那就是:让大模型在输出时直接把Cot过程塞到一个字段里:

bash 复制代码
# 你的角色是意向分类机器人,需要根据对话上下文从意向集合中选出一个最合适的用户意向,这是可选的意向及其描述
  {{用户意向列表}}
​
# 你需要识别的用户意向,以 JSON 格式返回,这是你所需要遵循 JSON 的进行返回的示例:
  {
    'inferenceDetails':'第一步xxx\n第二步xxx...'
    'identifiedIntent':'情况属实',
    'confidenceScore':'高',
  }
​
# JSON 字段解释
  - inferenceDetails:你需要将你判断用户最终意图的推理过程一步一步写入该字段
  - identifiedIntent:你根据对话上下文所匹配出来的意向;
  - confidenceScore:你匹配意向的置信度,分为「高」「中」「低」三个档:
    「高」代表对话上下文中明确、显性、直接的表达了匹配意向;
    「中」代表可以通过对话上下文较有把握的推理出匹配意向;
    「低」代表了在可选意向列表中该意向相对于其它是可以勉强进行匹配的;
    
# 对话记录
===以下是对话记录===
<histories>
      {{对话记录}}     
</histories>
​
# 下面请输出你的意向分类JSON

这样在后续的处理过程中如果不需要CoT的内容落库就直接丢弃,需要的话也很方便能拿到。

特别注意:大模型需要消耗Token来思考(大意就是大模型只有输出了才能作用于后续,这个表述可能不是那么准确,意会一下) ,所以:

  • 你如果在Prompt里要求大模型一步一步思考,但是不输出思考过程,那么是没有CoT的效果的。
  • 同理,如果先给结论,再CoT,那也是不生效的,所以inferenceDetails 字段的排序需要在其它字段之前

时代演进

CoT不久后提出的ReAct(Reasoning + Acting),本质上也是通过应用层的手段,不断提高大语言模型的推理和行动能力,最终优化输出。

plus:ReAct结合了两个关键能力

  1. Reasoning(推理):像CoT一样进行逻辑思考
  2. Acting(行动):能够执行具体的动作来获取信息(本质上就是模型的工具调用,无论以特定的Function call还是Mcp的形式)
相关推荐
pe7er5 分钟前
使用CDN、ImportMap增强Vue playground
前端
ze_juejin15 分钟前
Angular的懒加载由浅入深
前端
JSON_L15 分钟前
Vue 详情模块 4
前端·javascript·vue.js
码间舞21 分钟前
什么是Tearing?为什么React的并发渲染可能会有Tearing?
前端·react.js
gnip33 分钟前
做个交通信号灯特效
前端·javascript
小小小小宇34 分钟前
Webpack optimization
前端
尝尝你的优乐美36 分钟前
前端查缺补漏系列(二)JS数组及其扩展
前端·javascript·面试
咕噜签名分发可爱多38 分钟前
苹果iOS应用ipa文件安装之前?为什么需要签名?不签名能用么?
前端
她说人狗殊途1 小时前
Ajax笔记
前端·笔记·ajax
yqcoder1 小时前
33. css 如何实现一条 0.5 像素的线
前端·css