当前位置:首页|资讯|大语言模型|ChatGPT|编程|搜索引擎

增强LLM大语言模型的推理能力的几种方式总结

作者:周一爱喝龙瑾发布时间:2023-06-26

LangChain

 LangChain简介

我们都知道,LLM模型本身是不支持多轮对话的,比如ChatGPT,他是在GPT-3.5的基础上额外加了Memory,才得以实现多轮对话的能力;

那么,除此之外,我们还能叠加什么能力呢:

1)代码执行能力:计算复杂数学问题;

2)搜索引擎能力:提高模型回答内容的时效性;

3)数据库检索能力:实现自定义数据的分析、总结;

这里就需要用到LangChain这个框架;

LangChain是一个能够让LLMs快速的落地的部署框架,相当于给你的LLM套上了一层盔甲,构建属于你自己的AI产品;

LangChain目前有两个语言的实现:python和nodejs。

 LangChain的主要模块

LangChain主要包括以下几个主要的模块:

1.Prompt Templates

支持自定义Prompt工程的快速实现以及和LLMs的对接;

2.LLMs

提供基于OpenAI API封装好的大模型,包含常见的OpenAI大模型,也支持自定义大模型的封装;

3.Utils

大模型常见的植入能力的封装,比如搜索引擎、Python编译器、Bash编译器、数据库等等;

LangChain支持的外挂1
LangChain支持的外挂2

4.Chains

大模型针对一系列任务的顺序执行逻辑链;

5.Agents

通常Utils中的能力、Chains中的各种逻辑链都会封装成一个个工具(Tools)供Agents进行智能化调用;

其中,Chains和Agents两个模块是LangChain的亮点。

 LangChain中的组件

一个LangChain应用是通过很多个组件实现的,LangChain主要支持6种组件:

1.Models:模型

各种类型的模型和模型集成,比如GPT-4;

LangChain 中的模型主要分为三类:

1)LLM(大型语言模型):

这些模型将文本字符串作为输入并返回文本字符串作为输出。它们是许多语言模型应用程序的支柱。

2)聊天模型( Chat Model):

聊天模型由语言模型支持,但具有更结构化的 API。他们将聊天消息列表作为输入并返回聊天消息。这使得管理对话历史记录和维护上下文变得容易。

3)文本嵌入模型(Text Embedding Models):

这些模型将文本作为输入并返回表示文本嵌入的浮点列表。这些嵌入可用于文档检索、聚类和相似性比较等任务。

2.Prompts:提示

包括提示管理、提示优化和提示序列化,目前只支持字符形式的提示;

3.Memory:记忆

用来保存和模型交互时的上下文状态;模型是无状态的,不保存上一次交互时的数据,回想一下OpenAI的API服务,它是没有上下文概念的,而chatGPT是额外实现了上下文功能。

为了提供上下文的功能,LangChain提供了记忆组件,用来在对话过程中存储数据。

4.Indexes:索引

用来结构化文档,以便和模型交互

5.Chains:链

一系列对各种组件的调用,就是将其他各个独立的组件串联起来

6.Agents:智能体

决定模型采取哪些行动,执行并且观察流程,直到完成为止

 LangChain的使用场景

1.个人助手

2.基于文档的问答系统

3.聊天机器人

4.Tabular数据查询

5.API交互

6.信息提取

7.文档总结

zero-shot CoT

 zero-shot CoT简介

直接在问题上追加辅助推理Prompt

Paper地址:https://arxiv.org/abs/2205.11916

 zero-shot CoT 技术原理


Zero-shot CoT原理图


分为两个阶段(如上图所示),第一阶段在提问的问题上追加“Let’s think step by step”这句提示语,LLM会输出具体的推理过程;第二阶段,在第一阶段的问题后,拼接LLM输出的具体推理过程,并再追加Prompt=“Therefore, the answer (arabic numerals) is”,此时LLM会给出答案。如此简单的操作,却可以大幅增加LLM在各项推理任务中的效果,比如在数学推理测试集GSM8K上,加上提示语后,推理准确率直接从原先的10.4%提升到了40.4%,可谓神奇。

CoTChain of Thought

 CoT简介

首先来看一个简单的例子:计算 3 * (4 + 5)

1.将问题输入模型:“计算 3 * (4 + 5)”

2.模型输出第一步的结果:“计算 4 + 5”

3.将上一步的结果作为输入,再次输入模型:“计算 3 * 9”

4.模型输出最终结果:“结果是 27”

我们可以看到模型是怎么样通过一系列连贯的思考链(步骤)来逐步解决问题的,这种能力就较多CoT(chain-of-thought)技术。通过思维链式方法训练大型语言模型需要将训练过程分解成较小、相互关联的任务,以帮助模型理解和生成连贯、上下文感知的响应。

Paper地址:https://arxiv.org/abs/2201.11903(最早提出CoT)

CoT相关发展paper参考:https://github.com/mattian7/CoT-Papers-Note

二 CoT技术原理

原理

CoT的主体思想其实很直白;为了教会LLM模型学会推理,给出一些人工写好的推理示例,示例里把得到最终答案前,一步步的具体推理步骤说清楚,而这些人工写的详细推理过程,就是思维链Prompting,具体例子可参照上图中蓝色文字部分。CoT的意思是让LLM模型明白一个道理;就是在推理过程中,步子不要迈得太大,否则很容易出错,改变思维模式,化大问题为小问题,步步为营,积小胜为大胜。

在数学计算数据集上的跑分

这里用GPT-3为例,用Chain-of-thought方法训练一个更先进的GPT-3模型,来简单介绍下CoT有关的实现原理:

  1. 收集大量的语料库,包括各种主题和风格的文本。可以从各种来源获取数据,如网站、社交媒体、新闻、书籍等。

  2. 对语料库进行预处理,包括分词、标记化、去除停用词、处理语法结构等。

  3. 3.定义一个上下文窗口,即模型需要考虑的前面和后面的文本内容。

4.将训练过程分解为一系列逐步更复杂的子任务。例如,可以将训练过程分解为理解语法和词汇、生成单词和短语、生成连贯的句子和段落、理解上下文等子任务。

5.为每个子任务定义适当的训练目标和损失函数,并使用训练数据来训练模型。例如,为了训练模型理解上下文,可以定义一个损失函数,它评估模型生成的响应与上下文的相关性。

6.在训练完成后,使用测试数据来评估模型的性能。例如,检查模型是否能够生成连贯的响应,以及是否能够维护文本中的思维链。

7.迭代地对模型进行微调和优化。

可以看到,在Chain-of-thought训练中,将数据集中的输入分解为一系列任务是非常关键的一步。一般来说,这个过程需要根据特定的任务和数据集来进行定制。以下是一些通用的方法:

1)首先,需要定义一个目标任务,即要求模型完成的最终任务。例如,如果目标任务是自然语言生成,那么数据集中的输入可能是一句话或一个段落,模型需要将其转化为自然语言响应。

2)然后,需要将目标任务分解为一系列子任务。这些子任务应该是相互关联的,每个子任务的输出都可以作为下一个子任务的输入。例如,在自然语言生成任务中,可以将其分解为理解输入的语义、确定输出的语法结构、生成文本等子任务。

每个子任务的输入和输出都需要定义。例如,在自然语言生成任务中,输入可能是一组与上下文相关的单词,输出可能是下一个单词或整个句子。

3)然后,为每个子任务定义一个训练目标和相应的损失函数。这些目标和损失函数应该与任务相关,并帮助模型学习与该任务相关的知识。

4)最后,需要将所有子任务组合起来,构建一个完整的模型。每个子任务的输出都将成为下一个子任务的输入,直到完成目标任务。

需要注意的是,如何分解数据集中的输入取决于特定的任务和数据集。一个好的分解方案应该具有适当的层次结构,使得模型能够在学习过程中逐步掌握更加复杂的任务。在实际应用中,可能需要进行多次尝试和调整,才能找到最优的分解方案。

尽管 chain-of-thought 方法在处理一些复杂问题时可能有所帮助,但它并非万能的。有时,模型可能无法生成正确的答案,或者在多次迭代中陷入死循环。

总之,chain-of-thought 是一种有效的技巧,可以帮助大型预训练语言模型在多步骤任务和复杂问题中生成连贯的输出。然而,在实际应用中,可能需要结合其他技巧来克服其局限性,以实现更好的性能。

SCSelf-Consistency

 SC简介

CoT提出不久,很快在22年3月份,一项被称为“Self-Consistency”的改进技术就将GSM8K测试集准确率提高到74.4%;

Paper地址:https://arxiv.org/abs/2203.11171

 SC技术原理

SC思路原理

Self-Consistency”的思路也很直观(参考上图):首先可以利用CoT给出几个写了推理过程的示例,然后要求LLM对给定的问题进行推理,如果是CoT,直接输出一个推理过程和答案,整个过程就结束了。“Self-Consistency”则不然,它要求LLM输出多个不同的推理过程和答案,然后采用投票的方式选出最佳答案,思路非常简单直接,但是效果也确实好。“Self-Consistency”其实是教导LLM学会这么一个道理:孔乙己说过茴香豆的“茴”字有四种写法,类似的,一个数学题的正确解法也可以有很多种,每个不同的推导过程都指向最终的答案。条条大路通罗马,虽说也有个别迷路走到北京的,但是迷路的毕竟是少数,看看大多数人走到哪里,哪里就是正确答案。简单的方法往往蕴含着深刻的哲学含义,是不是这道理?

然后,还有一篇paper:https://arxiv.org/abs/2206.02336,他在SC的基础上进行拓展,将一个prompt问题拓展到了多个,检查推理中间步骤的正确性,以及对多个输出的回答加权投票:

SC变体

PHP

 PHP简介

华为联和港中文发表论文《Progressive-Hint Prompting Improves Reasoning in Large Language Models》,提出 Progressive-Hint Prompting (PHP),用来模拟人类做题过程。在 PHP 框架下,Large Language Model (LLM) 能够利用前几次生成的推理答案作为之后推理的提示,逐步靠近最终的正确答案。

论文链接:https://arxiv.org/abs/2304.09797

代码链接:https://github.com/chuanyang-Zheng/Progressive-Hint

 PHP技术原理

基本思想:将当前推理后得到的答案,作为提示,与原始问题进行合并,再送给模型推理,如果两次得到的答案一致,就认为是得到的是准确答案并返回,相当于做了一次double check;

所以,要使用 PHP,需要满足两个要求:

1)问题能够和推理答案进行合并,形成新的问题;

2) 模型可以处理这个新的问题,给出新的推理答案。

推理过程

但是,有个问题,如果回答出了错误答案,作为提示以后会不会对准确答案有干扰呢?

于是,作者希望 PHP prompt 能够让大模型学习到两种映射模式:

1)如果给的 Hint 是正确答案,那么返回的答案依然要是正确答案 (具体如上图所示的「Hint is the correct answer」);

2)如果给的 Hint 是错误答案,那么 LLM 要通过推理,跳出错误答案的 Hint,返回正确答案(具体如上图所示的「Hint is the incorrect answer」)。

ToT

 ToT简介


人的认知过程


由普林斯顿和谷歌DeepMind联合提出的全新「思维树」框架,让GPT-4可以自己提案、评估和决策,推理能力最高可提升1750%。

2022年,前谷歌大脑华人科学家Jason Wei在一篇思维链的开山之作中首次提出,CoT可以增强LLM的推理能力。但即便有了思维链,LLM有时也会在非常简单的问题上犯错。最近,来自普林斯顿大学和Google DeepMind研究人员提出了一种全新的语言模型推理框架——「思维树」(ToT)。
ToT将当前流行的「思维链」方法泛化到引导语言模型,并通过探索文本(思维)的连贯单元来解决问题的中间步骤。

论文地址:https://arxiv.org/abs/2305.10601

项目地址:https://github.com/kyegomez/tree-of-thoughts

 ToT技术原理


现有使用LLM解决通用问题方法的2个主要缺点:

  1. 局部来看,LLM没有探索思维过程中的不同延续——树的分支。

  2. 总的来看,LLM不包含任何类型的计划、前瞻或回溯,来帮助评估这些不同的选择。


基于上述2个缺陷,提出了ToT,简单来说,「思维树」可以让LLM:

  • 自己给出多条不同的推理路径

  • 分别进行评估后,决定下一步的行动方案

  • 在必要时向前或向后追溯,以便实现进行全局的决策

ToT

添加代码程序

 简单铺垫

上面提到的集中方式,可以说都是基于prompt的方式,核心思想是通过合适的提示语或提示样本,更好地激发出LLM本身就具备的推理能力,Google在这个方向做了大量很有成效的工作。


但是同时,关于LLM的推理能力,目前还观察到一个有趣且费解的现象:除了文本外,如果能够加入程序代码一起参与模型预训练,则能大幅提升LLM模型的推理能力;

这就是另一类提高LLM推理能力的做法,基于代码程序的方法,这类方法的代表就是OpenAI的GPT3.5,ChatGPT肯定具备很强的推理能力,但它并不要求用户必须提供一些推理示例,所以ChatGPT强大的推理能力,大概率来源于使用代码参与GPT 3.5的预训练。

 核心原理

核心思想是在预训练过程中引入程序代码,和文本一起参与预训练,以此进一步增强LLM的推理能力;

对比推理能力

图出自这篇论文:https://arxiv.org/abs/2206.02336


总结和思考

利用代码增强LLM推理能力,这体现出一种通过增加多样性的训练数据,来直接增强LLM推理能力的思路;

而基于Prompt的方法,它并不会促进LLM本身的推理能力,只是让LLM在解决问题过程中更好地展示出这种能力的技术方法。


可以看出,前者治本,后者治标。当然,两者其实也是互补的,但从长远看,治本的方法更重要。



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1