首页 > 科技周边 > 人工智能 > 高级及时工程:思想链(COT)

高级及时工程:思想链(COT)

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2025-02-26 03:17:10
原创
657 人浏览过

大型语言模型的推理能力:链式思维及其他技术

Advanced Prompt Engineering: Chain of Thought (CoT)_如果您不是会员但想阅读本文,请查看此好友链接。_

链式思维 (CoT) 已经存在一段时间了,从技术上讲是一种高级提示工程,但即使在首次引入几年后的今天,它仍然具有重要意义。各种形式的 CoT 通常都是为了迫使大型语言模型进行推理。

今年9月OpenAI发布其模型o1预览版后,我们看到围绕CoT的热度有所提升。

没有人完全知道o1是如何工作的(除了OpenAI),它是否是组合系统,它使用什么数据进行微调,是否使用强化学习,或者是否有几个模型一起工作。

也许一个模型负责规划,另一个负责思考,第三个负责评估。但我们知道他们正在采用某种逐步推理的方法。

围绕这一问题已经进行了大量的公开研究,您可能需要深入研究。因此,在这篇文章中,我将介绍现有的方法,以便您知道可以使用哪些方法。当然,我会测试不同的技术,看看我们能否取得任何真正的改进。

然后,如果您热衷于进行一些技术工作,我将帮助您构建一个系统,该系统查看模型的内部置信度级别以生成答案。

研究成果

在过去两年中,已经发表了许多论文,我已经收集了我在这里找到的许多论文。

您将在下面的图片中看到他们讨论的推理技术。

大部分工作直接来自 DeepMind 或普林斯顿大学。感谢他们开源了如此多的工作。

Advanced Prompt Engineering: Chain of Thought (CoT)CoT一词来自DeepMind在2022年的论文,仅在提示中使用它,最新的论文探索了具有蒙特卡洛搜索的三思而后行以及无需提示的CoT。

在这篇文章中,我们将介绍简单的链式思维 (CoT)、CoT 链、贪婪解码、CoT-SC、解码 CoT 和具有蒙特卡洛树搜索的三思而后行 (ToT)。

我们还将使用我们自己的一组数据来了解在采用这些推理技术时我们可以取得的改进。

大型语言模型的基准分数

为了了解如何改进大型语言模型的结果,我们首先需要建立某种基准分数。

当引入一个模型时,它通常会带有评估指标。有一些流行的指标,例如 MMLU(语言理解)、BigBench(推理)、HellaSwag(常识推理)等等。

Advanced Prompt Engineering: Chain of Thought (CoT)但是,您应该知道,其中一些数据集已经过时,并且可能有点被污染。

Hugging Face 在 12 月推出了一份新的 LLM 排行榜,该榜单基于较新的数据集进行评估,您可以清楚地看到,大多数模型的分数都比原始数据集低得多。

值得在这里进行一些研究,以了解您应该如何考虑模型评估以及您和您的组织应该基于什么理由进行评估。拥有一个内部私有数据集进行测试可能并非最糟糕的主意。

但无论如何,我从各种数据集以及我在网上找到的一些流行问题中提取了大约 350 个问题,以评估多达 11 个不同的模型。

我还需要了解这些数据集以及大型语言模型生成的答案是什么样的。

因此,我构建了自己的脚本来循环遍历这些问题,然后使用每个问题的 0 或 1 来评估大型语言模型。

你可以叫我完美主义者。您可以在下面看到我发现的结果。

Advanced Prompt Engineering: Chain of Thought (CoT)这告诉我们什么?嗯,不多。

我使用了来自 Big Bench、MMLU、Putnam 的问题,以及诸如“草莓中有多少个 r”之类的流行问题,但我们无法知道这些问题是否已被这些问题污染。此外,这是一个相当小的数据集。

但是,我们可以清楚地看到,更大的模型性能更好。

有趣的是,通过应用使模型在回答之前进行推理和“思考”的方法,我们能否提高这些分数。

链式思维 (CoT)

链式思维 (CoT) 提示由 DeepMind 的大脑团队在 2022 年的论文“链式思维提示在大型语言模型中引发推理”中提出。

因此,CoT 的想法已经存在了相当长一段时间。

然而,这篇第一篇论文是对如何通过使用提示策略激活模型固有的推理能力来迫使模型对问题进行推理的研究。

那时,人们只是通过要求模型“逐步思考”来以正确的方式进行提示,这可以通过零样本(不提供示例)或少样本(提供一些示例)方法来实现。

Advanced Prompt Engineering: Chain of Thought (CoT)今天,您可以通过在提示的末尾简单地添加“让我们一步一步地思考”来对各种模型(例如 Claude、ChatGPT 或其他模型)执行此操作。如果您想尝试少样本学习,您可以在提示中提供一些示例。

DeepMind 报告说,他们可以通过正确地进行提示来验证性地看到使用 CoT 技术有显著的改进。

从那时起,许多论文都基于这些技术构建,扩展到越来越先进的路径。

构建推理链

提示工程社区中有许多人使用 CoT 风格的技术进行实验。我已经收集了我在这里找到的大多数存储库,因此很容易找到。

Advanced Prompt Engineering: Chain of Thought (CoT)不久前,Benjamin Klieger 突出了一点,他构建了一个提示风格的应用程序,通过进一步分解思考过程,使用 Groq 和 Llama 3.1 70b 来引发链式思维。

您可以在此处找到他的应用程序。

其想法是要求大型语言模型将其思维分解成链,它会继续思考,直到对答案充满信心为止。

然后,系统将继续为链的每个部分生成大型语言模型调用,而不是在一个响应中拥有整个思考过程。

请参阅将此应用于 Grok-Beta 的示例,问题是“草莓中有多少个 R?”

Advanced Prompt Engineering: Chain of Thought (CoT)模型本身正在设置每个部分,为其命名,并决定是否需要另一个“想法”并应该继续,或者它是否已经达到最终答案。

这仍然是一种 CoT 风格的技术,因为它具有线性关系,但它比简单地要求模型“逐步思考”略微先进。

我使用了他的一些代码来构建一个脚本来循环遍历一些大型语言模型的基准问题,以了解这种系统实际上会产生多少改进。我还调整了 Claude 和 Grok 的脚本以评估这种策略。

您将在下面看到百分比改进。

Advanced Prompt Engineering: Chain of Thought (CoT)Llama 3.1 70B 在前三类中取得了最佳改进。Grok 在流行问题上的表现更差(Haiku 也是如此)。

Putnam 数据集是高级数学,很少有大型语言模型能够在这方面做得很好,因此当 Claude Sonnet 3.5 能够在这些 CoT 链中以 68.75% 的成绩优于 o1-preview(o1-preview 为 63%)时,我很惊讶。

总的来说,Sonnet 使用 CoT 在高级数学方面提高了 81%。

请记住,我在这里使用了一个非常小的数据集,它只是为了了解它们在哪些方面做得很好以及我们能否提高分数。如果没有在更大的数据集上进行测试,它并不能告诉我们任何具体的东西。

然而,我还观察到,如果较小的模型开始过度分析简单的问题,则可能会产生更糟糕的结果。这在 Grok-Beta 和 Haiku 的流行“更容易”问题上很明显。

更容易的非数学问题可能不会获得 CoT 的相同好处。

我们还必须记住,我们可以推动模型在其能力范围内发挥作用,但很少超过其能力。如果它不知道答案,它就不知道。

用于推理的微调

在继续之前,我想提一下微调。

一个非常有趣的领域是尝试在 CoT 数据集上微调较小的模型,以提高其准确性,使其达到比大 1-2 倍的模型的准确性。

我已经找到了多个资源,但不幸的是,我没有发现任何我认为值得进行适当分析的基准模型的重大改进。

您将在下面看到我找到的开源模型。

Advanced Prompt Engineering: Chain of Thought (CoT)您将在下面看到我还找到的已开源的 CoT 数据集。

Advanced Prompt Engineering: Chain of Thought (CoT)这并不是说用于 CoT 的微调不会起作用,只是需要构建更好的、有良好文档记录的模型。

如果您热衷于自己尝试微调,请查看这些资源。我相信还有更多资源。

替代生成技术

到目前为止,我们一直在研究模型在一个线程(或链)中生成输出的线性技术。

但在第一篇 CoT 论文发表后不久,DeepMind 就提出了一种更先进的技术,称为具有自一致性的链式思维 (CoT-SC)。

此技术创建多个推理路径,并使用某种方法在最后选择最一致的答案(或路径)。

Advanced Prompt Engineering: Chain of Thought (CoT)他们报告说,使用这种方法在算术推理方面获得了大约 1-8% 的改进。

今年刚刚提出的一种方法遵循使用多条路径的相同思想,但不使用任何提示。

还记得我在上一节中讨论过的贪婪解码的想法吗?

这种方法类似,只是它不仅仅是强制使用最可能的标记,还查看整个响应的置信度分数。

Advanced Prompt Engineering: Chain of Thought (CoT)为此,系统首先启动一定数量 k 的初始顶级标记,然后从每个标记生成路径。生成答案后,它通过分析不同路径中每个标记的概率(logit)来计算置信度分数。

返回具有最高概率的答案(或路径)。

这种方法称为解码 CoT,由 DeepMind 提出。这种方法的思想是查看模型对返回答案的内部置信度。

但是,如果它没有固有的知识来回答问题会发生什么?与 CoT-SC 一样,这种方法在很大程度上取决于模型是否首先拥有正确的答案。

然而,这并不意味着我们不应该测试它。

对于所有这些技术,都有人在开源不同的实际实现,而这个也不例外。

因此,我很容易建立一个系统来测试这些方法,并使用较小的开源模型 Llama 3 8b 来比较哪个更好。

Advanced Prompt Engineering: Chain of Thought (CoT)感谢 Codelion 开源了他的实现,这使得我很容易复制。

查看上面的结果,您可以看到与其他方法(例如熵或仅对该特定模型使用贪婪解码)相比,我们使用解码 CoT 明显产生了最佳结果。

我们将在技术部分创建一个将使用此解码 CoT 系统的 API,以便您可以了解其工作原理。

更新的技术

很难跟上,但研究已经远远超出了在更高风险领域内使用简单的 CoT 进行推理。

我现在不会介绍所有这些策略,因为那是另一个主题,但我确实想提到三思而后行 (ToT),尤其是在与蒙特卡洛搜索结合使用的情况下。

ToT 于 2023 年底由普林斯顿大学和 DeepMind 提出,但通常基于先前基于树的推理方法。

三思而后行 (ToT) 与具有自一致性的链式思维 (CoT-SC) 有些不同。它不是生成多个路径并在生成后才对其进行评估,而是动态地评估 ToT 随着其进展而产生的想法。

Advanced Prompt Engineering: Chain of Thought (CoT)可以将其想象为 4 个不同的人一起解决问题。在每一步中,他们都会提出自己的想法,并共同评估哪些想法最具前景。如果一个人的推理似乎有缺陷,他们就会离开,因此其他人会继续努力解决他们的问题。

最后,能够正确推理的人将能够提供他们的答案。

这允许模型动态地修剪看起来不佳的路径,专注于更有前景的线程,从而可能节省资源。

但是,人们可能会质疑,系统如何决定哪个线程是对的,哪个线程是错的?这由模型本身决定。

这也是为什么像蒙特卡洛树搜索 (MCTS) 这样的扩展会提供更无偏见的评估机制的原因。MCTS 允许反向传播,这意味着它可以根据新信息重新访问和改进早期步骤,而简单的 ToT 只会向前移动。

对于 4 个人解决问题的案例,MCTS 将允许人们有不太理想的想法,并且仍然可以在游戏中停留更长时间。评估方法将有所不同。

MCTS 可以模拟多个未来路径,评估其潜力,并回溯以改进早期决策。它引入了外部指标(奖励),而不是完全依赖模型。

像 UCB(上限置信界)这样的统计数据使用这些奖励来决定进一步探索或重新访问哪些想法。

MCTS 比简单的 ToT 复杂一些,可能应该单独成文。

CoT 的经济性

因此,到目前为止,您可能会认为,好吧,我们有一些改进,为什么不总是使用更高级形式的链式思维呢?

好吧,首先是成本(以及思考时间)。

对于我应用于不同模型的链,我计算了平均推理步骤数。

Advanced Prompt Engineering: Chain of Thought (CoT)看看这个,您平均每个问题要多付 8 倍的费用。对于在高级数学问题上表现最佳的 Sonnet,您将为每 500 个问题支付高达 15 美元。

这看起来可能不多,但是一旦您每天都使用此系统为客户服务或您的团队生成答案,您每月就要花费数百甚至数千美元。

在某些情况下,使用高级推理方法是有意义的,但并非总是如此。

现在可能有一种情况是针对 CoT 进行微调,基本上消除了产生多个调用的需要,但我到目前为止还没有看到任何做得很好的开源模型。

这里有点权衡。我们希望增加思考时间,以便模型有足够的时间有效地进行推理,但这样做也会增加用户的挫败感和成本。

构建智能系统

今年 9 月,发表了一篇题为“To CoT or not to CoT?”的论文,该论文认为,应用 CoT 的大多数改进主要体现在数学和复杂推理方面。

我们在这里也看到了这一点,简单的問題改进有限。

当我们应用这些链时,我们必须等待更长时间才能得到响应。值得吗?不过,应该注意的是,所有这些策略对于简单的任务来说都可能过于复杂。

这就是为什么您在大多数问题中使用 OpenAI 的 o1 时可能会感到沮丧的原因,而简单的答案通常就足够好了。

但是,如果您正在构建一个需要确保答案正确的系统,那么采用某种形式的 CoT 或解码可能是一个好主意。

可能值得使用一个模型根据问题的难度来设置第一步,然后分析它是否确信自己能够首先回答它。然后让模型进行推理(通过链),并在最后让另一个模型对响应进行评分。

注意

除了我在这里介绍的内容之外,还有更多框架吗?绝对有,但我只介绍了我认为理解起来很有趣的那些。这可以让您了解我们在没有信息过载的情况下取得了多大的进展。

大多数人工智能工程师都精通这些框架,但很可惜,这项研究并没有像预期的那样迅速传播到公众。

了解如何实现 CoT 应该是构建 LLM 应用程序的基础知识的一部分,即使您决定不使用它们也是如此。

技术工作

让我们付诸实践。

我们将使用开源模型 Llama 3.1 8b 实现解码 CoT 系统。

解码 CoT 的方法来自今年发布的论文“无需提示的链式思维推理”,实现是从此处找到的 Codelion 获取的。我添加了一些功能,以便系统检查难度级别以决定路径数量 (k)。

由于我上次使用的是 Modal,这次我们可以使用 Beam,这也是一个无服务器 LLM 服务平台。他们提供 15 小时的免费套餐,因此这是免费的。我们将使用的脚本可以在此处找到。

如果您更愿意使用 Colab 进行测试,则可以在此处运行此脚本。

结果应该是一个 API 端点,让我们可以提出问题,它将评估难度,然后对问题执行解码 CoT 并返回如下响应。

Advanced Prompt Engineering: Chain of Thought (CoT)您将看到对大型语言模型的请求数量以及系统如何对问题进行分类。您还会注意到,该系统相当缓慢,因为它正在生成多个答案进行评估。

但是,如果我们使用相同的 8b 模型尝试 Groq,我们会发现它无法正确回答问题。

Advanced Prompt Engineering: Chain of Thought (CoT)正确答案是 27.3,额外燃料可获得额外积分。

关于最终答案,我将注意到,虽然这样一个较小的模型只能让我们走这么远。不幸的是,使用更大的模型需要更多工作,因为我们需要将其存储在某个地方,这可能很昂贵。

为了设置此系统,我将占用您 5 分钟的时间。您可以按照以下说明进行操作。

Hugging Face

我们将首先获得对我们将使用的模型的访问权限。要使用 Llama 3 8b 模型,您需要通过 Hugging Face 获得对它的访问权限。

如果您已经拥有 Hugging Face 帐户,此过程通常非常快。如果您没有帐户,您可以免费创建一个帐户,然后导航到模型卡。

Advanced Prompt Engineering: Chain of Thought (CoT)一旦我们进入模型卡,我们不妨测试一下模型,看看我们可以使用哪个问题来测试这个新系统。

Advanced Prompt Engineering: Chain of Thought (CoT)这是一个相当标准的问题,我之前在评估中使用过它,但标准的 Llama 3 8b 模型很难处理这个问题。

获得访问权限后,请导航到“设置”以获取访问令牌。

Advanced Prompt Engineering: Chain of Thought (CoT)将此令牌保存在某个地方,因为我们需要在 Beam 中设置它。

Beam.Cloud

如果您没有 Beam 帐户,则需要创建一个帐户(除非您选择直接使用 Colab)。当然,您也可以在不同的平台上构建自己的系统。

如果您决定使用 Beam,请从其仪表板获取 API 密钥。

Advanced Prompt Engineering: Chain of Thought (CoT)### 设置环境

现在,我们可以开始了。打开一个新的终端并创建一个新目录,然后 cd 到该目录。

<code>mkdir my-testing-dir
cd my-testing-dir</code>
登录后复制
登录后复制

克隆我设置的存储库。

<code>git clone https://github.com/ilsilfverskiold/decoding-cot-beam.git </code>
登录后复制
登录后复制

创建一个虚拟环境(您需要为此安装 python)。

<code>python3 -m venv .venv && source .venv/bin/activate</code>
登录后复制

安装 beam 并进行身份验证。

<code>pip install beam-client
beam configure default --token "your_token_here"</code>
登录后复制

确保您设置了我们之前从 Hugging Face 获取的 HF_TOKEN。

<code>beam secret create HF_TOKEN</code>
登录后复制

您可以直接从此处提供服务,但让我们简要介绍一下代码。

如果您不感兴趣,可以跳过下一部分。

代码

根文件夹中有三个 python 文件。

<code>│
├── app.py
├── question_classifier.py
└── cot_decoder.py </code>
登录后复制

在 app.py 中,我们有来自 Beam 的代码,允许我们(在启动时)从 Hugging Face 下载模型的权重并通过卷缓存它。这意味着我们第一次运行它时,它可能很笨拙且缓慢。

Beam 还允许我们在脚本在 Beam 上远程运行时加载包。

以下是带有我的注释的 app.py 的开头:

<code>[...]
# 这确保了这些包仅在脚本在 Beam 上远程运行时加载
if env.is_remote():
    import torch
    from transformers import AutoModelForCausalLM, AutoTokenizer
    from cot_decoder import cot_decode
    from question_classifier import get_k_value

# 模型参数和在卷中缓存的位置
MODEL_NAME = "meta-llama/Meta-Llama-3-8B-Instruct"
CACHE_PATH = "./cached_models2"

# 加载模型和标记器
def load_models():
    tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, cache_dir=CACHE_PATH)
    tokenizer.pad_token = tokenizer.eos_token
    model = AutoModelForCausalLM.from_pretrained(
        MODEL_NAME, device_map="auto", torch_dtype=torch.float16, cache_dir=CACHE_PATH
    )
    return model, tokenizer

# 定义端点
# 您可以指定 CPU/内存/GPU + 图像
@endpoint(
    secrets=["HF_TOKEN"],
    on_start=load_models, # 启动时加载模型以进行缓存
    name="meta-llama-3-8b-instruct",
    cpu=2,
    memory="32Gi",
    gpu="A100-40",
    image=Image(
        python_version="python3.9",
        python_packages=["torch", "transformers", "accelerate"],
    ),
    volumes=[Volume(name="cached_models2", mount_path=CACHE_PATH)],
)
[...]</code>
登录后复制

我们定义了一个 @endpoint,其中包含我们想要使用的资源(A100 GPU 和 2 个 CPU 内核)。您还会看到我们在启动时加载模型。

收到 API 调用后,我们将运行 generate_text() 函数。

<code>[...]

def generate_text(context: Dict[str, Any], **inputs: Dict[str, Any]) -> Dict[str, Any]:
    # 从 on_start 检索模型和标记器
    model, tokenizer = context.on_start_value

    # 根据问题的复杂性获取自适应 k 值
    classification_type = None
    if k is None:
        k, classification_type = get_k_value(messages, context)

    try:
        output_text, confidence, llm_calls = cot_decode(
            model=model,
            tokenizer=tokenizer,
            messages=messages,
            k=k,  # 使用自适应 k 值
            **inputs  # 将任何其他参数直接传递给 cot_decode
        )

        # 返回输出
        return {
            "output": output_text,
            "confidence": confidence,
            "complexity_info": {
                "k": k,
                "total_calls": llm_calls + 1,  # + 分类调用
                "classification": classification_type
            }
        }
    except Exception as e:
        return {"error": f"Error during generation: {str(e)}"}</code>
登录后复制

我们有一个函数,它首先使用 get_k_value() 根据复杂性计算 k。但这里的关键函数是 cot_decode(),它将对我们的问题执行解码链式思维。

此函数将接收消息、模型和标记器,并进行第一次初始调用以使用最高 logit 预测 k 个可能的下一个标记。

logit 是模型为每个可能的下一个标记分配的原始分数,让我们知道模型对每个选项的置信度分数。

这些将作为生成多个答案的潜在起点。对于每个这些起点或起始标记,我们都会生成一个完整的答案,然后将其整体评分。

还记得我们讨论过的贪婪解码吗?如果下一个标记的概率很高,我们只生成它?这将通过计算反映模型对完整答案的确定程度的置信度分数来查看整个句子,而不是逐个标记。

获得具有最高置信度分数的路径后,它将与 k 值一起返回。

还有一些其他选项,例如在模型返回多个高置信度答案时添加 aggregate_answers bool,但我们这里没有使用它。

让我们运行它

现在我已经简要解释了代码,我们将运行它以查看它的效果。

如果您一切设置正确,则应该能够简单地调用 serve。

<code>beam serve app.py:generate_text</code>
登录后复制

如果超时,请再次运行 serve,它将为您缓存模型。

要查看模型的存储位置,您可以转到 Beam.Cloud 平台中的

一旦它运行起来,您将看到如下内容。

Advanced Prompt Engineering: Chain of Thought (CoT)这意味着它已准备好进行测试。

您可以启动 Postman 或使用 cURL(这意味着您在终端窗口中运行对端点的调用)

<code>mkdir my-testing-dir
cd my-testing-dir</code>
登录后复制
登录后复制

响应应该类似于以下内容。

Advanced Prompt Engineering: Chain of Thought (CoT)正如您所看到的,它的性能略好一些。

如果您想部署模型,您可以简单地运行 deploy。

<code>git clone https://github.com/ilsilfverskiold/decoding-cot-beam.git </code>
登录后复制
登录后复制

我只是用它来测试,所以我现在可以关闭它了。

希望这篇文章具有教育意义和趣味性,并且您有所收获。

如果您想查看大型语言模型和 CoT 技术的结果,您可以查看此表格以及您在此存储库中可以找到的所有其他资源。

如果它对您有所帮助,请留下评论并为我鼓掌。

以上是高级及时工程:思想链(COT)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板