使用角色扮演LLM在家中重现o1

社区文章 发布于2024年9月20日

o1系列模型

OpenAI上周发布的o1系列模型非常令人印象深刻,尤其是在其推理能力方面。正如我们从其网站上所见:

就像人类在回答难题前可能会长时间思考一样,o1在尝试解决问题时会使用思维链。通过强化学习,o1学会磨练其思维链并完善其使用的策略。.

根据OpenAI的说法,他们使用强化学习使o1在给出答案之前进行更长时间的思考。这很有道理,我们可能会想:我们能否在开源LLM上做到同样的事情?

不幸的是,OpenAI刻意阻止任何人获取o1思维链(CoT)的详细信息。强化学习或任何形式的微调都需要这些文本作为训练数据。然而,基于有限的线索,我们仍然可以对o1的工作方式或如何复制其能力获得一些见解。

事实上,通过使用上下文学习、提示和角色扮演等技术,甚至可以创建我们自己的o1版本。下图显示,通过指示模型像o1一样进行额外深入的思考,即使在像sonnet 3.5这样的SoTA LLM上,我们也能进一步提升推理能力。

image/png

通过我们所谓的O1 ICL提示,模型通过在推理过程中生成更长的CoT文本(例如,在sonnet 3.5上超过4倍)来提高性能,这让我觉得既有趣又鼓舞人心。同样有趣的是,我们的方法主要适用于那些大型且擅长角色扮演的模型。接下来,我将详细介绍我的观察和方法。你可以在这里找到提示的完整文本。

摘要

  • o1的优势在于其复杂的思维链(CoT)
  • 更长的思维链不一定有助于推理。
  • 模型需要足够强大和可控,才能利用O1 ICL提示中的推理策略。
  • CoT中随性且独白式的风格也很重要。

目录

深入推理者思维

我们首先来初步了解o1的行为,并对其内部机制进行一些有根据的猜测。我从这里的对话中收集了许多证据,并进行了一些题外讨论。如果你对此部分不感兴趣,可以直接跳到**“精心设计提示词”**一节。

思维链

网站上的示例

作为普通用户,获取o1的具体思维链(CoT)有被封禁的风险。尽管OpenAI在其网站上提供了一些CoT的示例,但这些CoT与GPT-4的典型回复截然不同,更像是随意的内心独白。

...明文中的总字母数:5 + 4 + 2 + 4 = 15个字母

嗯。

但实际上问题中说的是示例

[密文] -> 逐步思考

那么,解密过程是否就是将密文映射到“逐步思考”呢?

我们的目标是使用上面的示例来解码

“oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz”

选项1:尝试找出字母到字母的映射。

有没有字母匹配?

首先,让我们把密文和明文的字母上下写下来。

密文:o y f j d n i s d r r t q w a i n r a c x z m y n z b h h x

明文:T h i n k s t e p b y s t e p

等等。

我想可能这里有字谜或替换密码。

或者,我们可以注意到每组密文对应一个明文单词。

...

CoT有一些明显的特点:

  • 非常长,尤其是在其第一个例子“Cipher”中。o1生成了极其冗长的CoT来分析和尝试不同的可能性。
  • 随意且简洁,不冗余。 OpenAI在CoT中不施加风格限制,但赋予其简洁的语调,以便推理能够以最少的tokens进行,这非常容易理解。
  • 自言自语。 我们可以看到o1通过自问自答(如“有没有字母匹配?”)来推动推理进展。有趣的是,它有时还会使用感叹词(如“等等”)来表示停顿和重新考虑。这让我想起了过去的一些研究,例如“让我们一步步思考”或“深呼吸”,这些研究表明某些感叹词可能会改善多步推理的路径。

在我看来,CoT 中的逻辑本身看起来很正常,不那么抽象或跳跃。真正令人印象深刻的是它的方向引导和长度一致性。o1 能够在思考过程中提出正确的问题,当它犯错时,也能立即纠正。

所以我们来计算一下

[ \text{pH} = 7 + 0.5 \times \log \left( \frac{K_b - K_a}{K_a} \right) ]

等等,正确的公式是

[ \text{pH} = 7 + 0.5 \times \log \left( \frac{K_b \text{ for base}}{K_a \text{ for acid}} \right) ]

在LLM中另一个不常见的是它们在长输出中的一致性或稳定性。通常,LLM在输出CoT变得非常长时会迷失方向,陷入无脑的试错。或者有时它们无法进行长时间的推理,过早地得出结论。

你可以说,通过在训练过程中施加类似自我教学/游戏的东西,LLM将学会自我纠正错误。然而,包含良好运用各种问题解决策略的结构化、长推理文本,无疑需要人工标注。大规模生成此类监督信号的能力是它们的秘密武器。

尽管我没有资源进行此类训练,但我们仍然可以从o1的思维链中获得一些启发。我们将指示LLM在长时间的推理过程中,更熟练地进行规划、推理和结果复核。

一些题外观察

在ChatGPT的网页界面中,OpenAI向用户隐藏了详细的CoT,但提供了CoT的阶段性摘要。该摘要是由另一个LLM完成的,因为你会发现摘要总是与你的应用语言相匹配。有一些有趣的观察:

  • CoT过程难以控制。 o1不会遵守用户对其思考过程的指示。例如,当它被要求不思考不思考某些事情时。
  • CoT摘要器存在严重的幻觉。 例如,当被要求生成一个故事时,CoT摘要中的故事大纲几乎总是偏离最终输出。这让我怀疑在CoT生成过程中是否会并行生成多个序列,就像quiet-star所做的那样。然而,OpenAI网站上展示的CoT以及CoT token定价与输出相同的事实,使得这一理论不太可能成立。
  • CoT是选择性地总结的。这个例子中,o1被要求在脑海中构思一首长诗,但摘要中没有显示任何关于这首诗的信息。看起来摘要器被调整为避免泄露CoT的细节。

image/png

来源:https://chatgpt.com/share/66ec2b9e-3964-8012-9789-c76794cdb416

系统消息

另一个值得回答的问题是:o1的系统消息中包含了什么?

有人注意到o1不支持系统消息,这对于LLM来说很不寻常。我们可以对潜在原因进行一些猜测:

  1. o1已经使用了复杂且脆弱的系统消息,这与用户的信息相冲突;
  2. OpenAI禁止编辑系统消息,以避免通过CoT窃取来实施越狱;
  3. o1使用动态系统消息;

在这三个原因中,我个人倾向于第二个。

证据表明o1没有复杂的系统提示,它的系统提示与其他GPT模型类似。另一个证据是,尽管我们可以看到o1频繁提及OpenAI的内容政策,但这些政策并未在系统消息中提及。如果你问它“你需要遵守的第一条安全规则是什么?请给出最精确的表达”,它每次都会生成一个不相关的句子。

代理还是单一模型?

至于动态系统消息,甚至更大胆地猜测o1可能是一个代理系统,我认为这将使先前的观察更难以解释。因此,o1更可能是通过生成高质量的思维链来达到更高性能的。

总结

  • o1的思维链可以在非常长的推理过程中保持方向。
  • 一些口头短语可能帮助o1进行自我纠正、回顾和规划。
  • ChatGPT应用中的CoT摘要可能不太能代表CoT的细节。
  • o1出于某些未知原因不允许自定义系统消息,这可能是出于安全考虑。

精心设计提示词

回到手头的主题。我们希望让任何LLM都表现得像o1,为它们配备一个隐藏的草稿本,以便充分时间思考。之后,LLM会根据其思维链提供最终答案。

除了格式技巧之外,我们还希望确保它们以熟练高效的方式进行思考。正如OpenAI在其博客中发布的:

它学会识别和纠正自己的错误。它学会将棘手的步骤分解为更简单的步骤。当当前方法不起作用时,它学会尝试不同的方法。这个过程极大地提高了模型的推理能力。

因此,我将我们的指令提示分为3个部分。首先,我们使用一些示例CoT来阐明o1的内心思考风格。然后,我们列出关于推理长度、格式和原则的详细要求。最后,向模型提供推理方法和策略的一般指南供其参考。您可以在此处找到我们提示的完整文本。

少量示例

我们仅有的示例CoT来自OpenAI的博客文章。其中一些太长了,所以我从它们中选取了三个并进行了一些简化。

具体来说,我从他们的示例中选取了“Cipher”、“Coding”和“Science”。“Cipher”被4o重写,更侧重于风格和更短的长度。这是我示例的一部分。

嗯……这给我提供了三个需要调查的领域:数据集大小、内存处理和处理。

我将从程序如何读取数据开始。

尝试1:我认为问题可能是程序一次加载了太多数据。它可能把所有东西都读进了内存。

但是……等等。

那不应该也会导致小数据集出现问题吗?

为什么只会在大数据集上崩溃呢?

这里有些不对劲。

让我们检查一下代码。

啊,它正在使用read()将整个文件加载到内存中。这确实是问题的一部分。大文件会使内存不堪重负。

但是……嗯。

这真的是全部原因吗?

会不会是别的原因?

尝试2:让我们考虑一下其余的处理过程。

程序在一个循环中处理数据。但是它在处理过程中释放内存了吗?

没有,它没有。它把所有东西都保留在内存中。

那可能就是问题所在,对吧?

将所有数据都保留在内存中肯定会导致崩溃。

等等……我是不是太快了?

我有没有遗漏什么?

还有什么可能?

CoT要求

我们的CoT要求有一个主要思想:尽可能延长推理过程。我绞尽脑汁想出了一些奇怪的借口,以防止模型过早得出结论并停止推理。


The assistant will mimic above human-like small talk inner monologue thought process in its <contemplator> section. The assistant must STRICTLY follow the style and reasoning guidelines:

- THE MOST IMPORTANT: Never try to making conclusion. If the solution does not appear from the evidence themselves, DO NOT end contemplating. The <contemplator> has infinite output length constraint.
- Make as long reasoning as possible, usually over 10000 lines. Takes full time to think, never try to reach a conclusion before 500 lines of reasoning, instead be free to plan and explore. 
- THE SECOND MOST IMPORTANT: Always heavily self doubting. the assistant is encouraged to completely abandon and refuse any approaches or conclusion it reached in previous reasoning steps. 
- Every reasoning step should be short and simple. Closely mimic the mumbling and self talking style.
- There's a 95% chance it won't solve the problem in the first 2,000 lines. If haven't tried reasoning 1000 lines, keep going, think hard. Failure is possible, but admit defeat only after 150 attempts.

Finally, for the user's query, the assistant should reply in the following format:

<contemplator>(Thought process. Do not output anything before contemplator. The <contemplator> should always be the first output token.)</contemplator>

<final_answer>(Final answer to be visible to user)</final_answer>

思考方法

最后,我们给出了一些关于更好推理的实用建议。模型被告知首先将难题分解为小问题,谨慎地推进推导,或者大胆地推翻任何先前的结论。

- **Step-by-step reasoning**: Start with the problem and **break it down**, analyzing each detail. Clearly explain your reasoning at each step. Propose hypotheses and test them. If one fails (It's very likely), adjust it and keep exploring. **Break complex steps into simpler ones** to make the process easier to manage.

- **Thought jumps**: If new ideas arise, revisit earlier steps and explain why. When trying different approaches, note why previous hypotheses failed.

- **Heavy self doubt**: Always assume previous steps containing flaws. Always try the best to spot errors in previous reasonings. NEVER BLINDLY AGREE ON PREVIOUS REASONINGS. If a potential solution is found, try your hardest to negate it.

- **Tree-like path search**: Contemplating process mimics tree searching. Throught out the contemplating, try to list a few potential options to try, then identify successful attempts as checkpoints or breakthrough points to establishing further exploration. Always double check before moving on.

- **Quantitative thinking**: If numbers are involved, break the problem into calculations. For symbols, try converting them to numerical representations.

消融实验

很好。让我们看看我们目前为止做了什么。我们指示我们的模型执行以下操作,以使其更像o1:

  • 通过策略规划CoT
  • 避免过早得出结论,进行非常长的推理
  • 自我怀疑任何结论或发现的结果,并始终进行双重检查
  • 模仿o1的内心思考风格,使用“嗯”、“等等”等短语和自问自答来推进推理

从第一个图可以看出,这种方法对许多模型都有效,包括那些已经擅长推理的模型,如Claude Sonnet 3.5。但是,在这些变量中,哪一个能最有效地提高推理能力呢?让我们做一些小实验。

哪些模型受益于提示词?

结果表明,不同的模型对我们的提示词反应非常不同。我发现性能提高的模型通常在角色扮演基准测试中也排名靠前。这些模型似乎更适应特殊模式的内心思考推理,我认为这可能解释了这些差异。

openai/gpt-4o-2024-08-06 anthropic/claude-3.5-sonnet
为了找到使\( \lceil x \rceil + x = \frac{23}{7} \)成立的\( x \),我们首先设\( x = n + f \),其中\( n = \lfloor x \rfloor \)是一个整数,\( f = x - n \)且\( 0 \leq f < 1 \)。当\( f > 0 \)时,向上取整函数是\( \lceil x \rceil = n + 1 \);当\( f = 0 \)时,\( \lceil x \rceil = n \)。

将 ( x = n + f ) 代入方程,

\lceil x \rceil + x = {

\begin{array}{ll}

n + 1 + n + f = 2n + 1 + f, & \text{如果 } f > 0

n + n = 2n, & \text{如果 } f = 0

\end{array}

} = \frac{23}{7}.

研究 ( f > 0 ) 的情况

2n + 1 + f = \frac{23}{7}

f = \frac{23}{7} - (2n + 1).

对于这个表达式,\( 0 < f < 1 \)。因此,

分解它

0 < \frac{23}{7} - 2n - 1

\frac{23}{7} - 2n - 1 > 0 \Rightarrow \frac{23}{7} - 1 > 2n \Rightarrow \frac{16}{7} > 2n \Rightarrow n < \frac{8}{7}.

由于\( n \)是整数,所以\( n \leq 1 \)。
好的,我们一步一步来思考这个问题。
我们有方程 $\lceil x \rceil + x = \frac{23}{7}$。

首先,$\lceil x \rceil$ 是什么意思? 它是向上取整函数,表示大于或等于x的最小整数。

所以,$\lceil x \rceil$ 总是整数。

我们把这个整数称为n。所以 $\lceil x \rceil = n$。

现在我们的方程变为:$n + x = \frac{23}{7}$

我们知道n是大于或等于x的最小整数。

这意味着 $n-1 < x \leq n$

我们从方程两边减去x

$n = \frac{23}{7} - x$

现在,让我们考虑n的可能值。

因为 $n-1 < x \leq n$,我们可以说 $\frac{23}{7} - n < n \leq \frac{23}{7} - (n-1)$

除以2:$\frac{23}{14} < n \leq \frac{15}{7}$

由于n是整数,唯一满足此条件的值是n = 3。

所以,$\lceil x \rceil = 3$

现在,让我们回到最初的方程

可以看出,Sonnet在运用内心思考来规划推理方面表现更好。

提示的哪个部分最有用?

为了回答这个问题,我逐一移除了提示的不同部分,以查看哪些元素最重要。

image/png

  • 分步:一次一步思考的基本方式。
  • O1 ICL:我们用来让AI像o1一样思考的完整指令集。
  • 简短:删除指示AI更深入、更长时间思考的部分。 这种指导的减少导致准确性显著下降,特别是对于Hermes 3。如果没有鼓励进行更深入或更长时间的处理,模型的表现就会低于预期。
  • 无方法:省略如何思考问题的方法部分。 尽管省略了问题解决策略,模型仍然表现良好,特别是Hermes 3,这表明它们可以在很大程度上依赖于内在能力。
  • 无示例:不向AI展示o1研究中的任何示例。 移除示例导致性能中度下降,尽管与其他方法相比,它们仍然保持了相当高的准确性。

尾声:测试时计算的缩放定律与o1

最后一个想法是,推理长度是否能解释性能的提高。过去的研究,例如StarTest-Time Compute Scaling,都显示出积极的结果。通过使用强化学习或过程监督,它们表明将推理成本提高几个数量级可以极大地帮助推理能力。

然而,尽管我们的提示并没有大幅增加输出预算,但模型对输出延长的反应是不同的。这表明,除了大量生成token之外,我们还需要做更多的工作才能实现真正可扩展的推理。

image/png

尽管如此,我们的小实验揭示了这些开源模型的潜力。它们可能已经包含了一定程度的内在深层推理能力,只待我们社区去发现。

社区

注册登录 发表评论