AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


提到大模型思维链,不要只会“Let's think step by step”了
发布日期:2024-04-24 15:40:42 浏览次数: 2381


这篇文章的初衷,是笔者近期在做一个结构化问答的任务,其中一个部分是nl2dsl,将用户query转换成 elastic search 的 dsl 查询语句。初体验如下

主要使用模型包括Qwen14b、CodeQwen7b、llama3 8b,举例使用的索引为简历知识库

1.幻觉C1 (输出了不存在的筛选条件,在3个模型均会出现)
query:帮我找中山大学硕士以上的简历
dsl:
{"query": {"bool": {"must": [{"match": {"school_level""985"}}, {"match": {"degree""硕士"}}]}}, "_source": ["name""jiaoyu_record"], "size": 10}

2. 幻觉C2 (字段对应错误,在7b规模的模型上更容易出现)
杨x与梁xx企业工作经验谁更丰富?
{"size": 2, "_source": ["name""work_record"], "query": {"bool": {"should": [{"nested": {"path""work_record""query": {"match": {"work_record.company""杨x"}}}}, {"nested": {"path""work_record""query": {"match": {"work_record.company""梁xx"}}}}]}}}

整体的指标挺低的,包括用api构造几百条数据微调,效果没有明显的好转(dsl有效率提高,但是准确率不高),api使用gpt4-0313-turbo

通过对llama3 8b的详细的各种修改prompt测试,最终应用提示词技巧+ft获得了巨大幅的效果提升。感觉大模型复杂问题推理方面的知识有一些欠缺。花了一下午,看了10来篇关于大模型知识推理思维链相关的paper之后,写个文档记录一下,尽可能的让知识串起来。

背景

最早的一篇文章《Large Language Models are Zero-Shot Reasoners》,提出了zero-shot模板的方式,来提高大模型的推理能力,原文中是一个2阶段的流程,reasoning extraction -> answer extraction,如下图所示

第一阶段会在生成之前拼接"Let's think step by step.",这里instruct gpt还没发,应该还是纯粹的补全的时候?所以不会类似chatml一样有明显的角色区分标识。通过这个特殊句子,可以让模型自动的去补全解决答案的思考过程。当然这个句子在这个工作中做了一些测试,现在流传的最广的"Let's think step by step.",是效果最好的。

通过这一个小小的trick,就可以让llm在推理任务上的指标大幅提升,如下图:

上述工作被后人成为zero-shot-cot,但是最早用cot的论文是这个《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》,比上一篇工作早了几个月,使用的是few-shot的形式,在后来的文章有挺多叫法,本文统一称few shot cot。原理没啥好说的,就是给例子,给什么样的例子,输出什么样的格式。但是例子怎么设计,后面有一篇论文有更详细的研究。

这个开山之作的结论是1.cot 提示词对小模型的性能没有很大影响,仅在与∼100B参数的模型一起使用时产生性能增益 2.cot 对于更复杂的问题有更大的性能提升 3.对于gpt 3 175B和palm 540B 在一些数据集上刷到了最高的分数。

到这里,背景铺垫基本就结束了,然后大佬们开始各个环节的改造表演了。打开思路~

思路一:大模型生成本来就是个概率事件,随机采样一波cot结构,投票一波看看呢

论文是《Self-Consistency Improves Chain of Thought Reasoning in Language Models》,在tree of though文章中有一张图很直观,如下图,作者的观点是:不同的人有不同的思维方式,并且,一个问题很多时候也有不同的解法。所以可以通过从语言模型的解码器中采样,在语言模型中模拟这种过程。尽管模型也可能产生不正确的推理路径或在推理步骤之一中犯错误,但这样的错误的推理,不太可能得到相同的答案。也就是说,假设正确的推理过程,即使它们是多样化的,但是也往往比不正确的过程在最终答案中具有更大的一致性。

这个工作对标的是zero shot cot,采样40次,除了开销比较大,效果提升明显,如下图:

思路二:在few-shot cot中,例子是人工编写的,突然有一天,人工不想编写了,能自动吗?

论文是《Automatic Chain of Thought Prompting in Large Language Models》,在few shot cot中,例子是人工编写的,但是有个小实验发现,使用不同的标注人员的例子,最高会出现28.2%的准确率差,如果变换例子的顺序,差距不到2%。

回到这个工作,先看个基础思路,从一个问题库中通过向量搜索相似的问题,用zero shot cot的方式生成例子,称为retrieval-q-cot,还有一种对比就是随机抽,称为random-q-cot,baseline效果如下图:上图可以看到第一个数据集MultiArith,retrieval的效果不如random的。那为什么呢?作者通过一些数据分析发现,zero-shot-cot的错误是具备相似性的,也就是一个类型的n条数据,可能会大批量的出现错误。错误的例子从而误导了真实问题的答案解码。而random是多样性,多样性可以减少相似带来的误导。

到这里,铺垫就结束了,文章的核心思路是,对问题库聚类,每个类选一个离簇心最近的代表性问题,生成zero-shot cot,作为few-shot的例子

附带一张效果如下:

思路三:好像有了思维链之后,大模型推理也这么牛皮了。但是实际场景一些场景,用户的输入意图可能是混杂在一大片文本中的,就很乱,很容易误导模型的生成,例如RAG场景。

2个论文,都是跟微软占点关系,第一个论文是《Thread of Thought Unraveling Chaotic Contexts》,作者写道,这个是模仿人在面对复杂信息时使用的认知策略,将其分解为可消化的片段,提取关键点,并持续专注地浏览材料。这种增量方法促进了更结构化和更连贯的推理,被证明在混乱环境中特别有利。

Let's think step by step. ->  Walk me through this context in manageable parts step by step, summarizing and analyzing as we go.在检索增强生成数据上效果提升

另外一篇为《System 2 Attention (is something you might need too)》 ,2阶段,第一阶段让模型重新生成上下文,第二阶段使用新上下文生成答案。用到的改写提示词如下:

一些测试如下图,浅蓝色条条 orade prompt是指无干扰的prompt,左右2边分别对应随机添加一些噪声文本进去、添加一些主题相关的噪声进去,粉色的instructed prompting指在提示词中添加,忽略无关句子的指令。baseline与orade prompt对比,说明大模型的结果会很大程度收到不相关上下文的干扰,尤其是来自相同领域的噪声,影响会更明显。而system2attention方法可以大幅提高这个鲁棒性,尽管在右图,添加主题相关噪声时,打不过无噪声情况。

思路四 :链在形成的过程中,因为clm的结构问题,导致某一步骤的推理/思考 出现错误,将会影响到后续所有的步骤的生成。那能不能在生成完,校验一下看看推理的对不对?有问题再重新生成

论文是《RCOT: Detecting and Rectifying Factual Inconsistency in Reasoning by Reversing Chain-of-Thought》,这个文章的步骤有点多,但是他的一些思想可以指导日常的很多工作。

  • step1: zero/few shot cot不变,生成一个问题的一连串的推理
  • step2: 重构,作者提到,就像人一样,看到一些推理过程/解题步骤,可以还原出真实的用户问题是什么。这里编辑区分一下,原始问题使用P,重构问题使用Q

下一步之前小小铺垫一下,P和Q的关系,这里会出现3种情况,1.条件幻觉(Q中出现了P中没有的条件) 2.条件忽略 (Q中忽略了P中提到的某些条件)3. 模型理解错误 (Q、P表达的不是一个意思,例如:P是,小明在睡觉,他早上有10块钱,中午买了个热狗,花了三块,小明在干啥? 模型的思维链可能去计算小明还有几块钱了,实际上跟问题Q冲突了)。那如果直接让模型比较P和Q,可能会得到次优的结果,因为P和Q包含很多信息,粗粒度的比较,必然可能忽略细粒度信息。

  • step3: 问题拆解. P -> Lp = [p1, p2, ...pm]  Q -> Lq=[q1, q2, ...,qn]
  • step4: 问题比较,让llm判断Lp能否推出来每一个qi,以及每Lq能否推出来每一个pi,如果推不出,这分别对应了条件幻觉和条件忽略。这会比较mXn次,第三个情况是比较P和Q是否是一个意思。
  • step5:反馈修改,有不一致就修改,没有就跳过,论文附录有具体的提示词。

这样折腾下来,对比前面提到的投票方案Self-Consistency,也是有提升的,如下图

思路五 :链在形成的过程中,因为clm的结构问题,导致某一步骤的推理/思考 出现错误,将会影响到后续所有的步骤的生成。不想等生成完了,能不能生成过程中,就校验一下呢?考虑到这点,逻辑链出来了,引入自我完善的机制。

论文是《Enhancing Zero-Shot Chain-of-Thought Reasoning in Large Language Models through Logic》

cot的图对比lot(logical thought),绿色的表示实际路线,蓝色的节点表示抉择胜利的节点。

假如,cot的链可以表示成{prompt,T1,T2...Tn},一般Tn会包含最终的答案。lot,原文的逻辑如下:假如有2个命题P,Q,如果存在一个证据,在前提P下断言结论Q,那可以表示为,要证明这个关系成立,用反证法,也就是说取Q的反命题,验证 是否为真。对应到cot中,就是验证下式如果验证失败,则说明前提不能推导出Ti,则需要对Ti及以后的节点进行修改。

要获取到,通过提示词让llm生成即可,例如“It is false to say Ti”  或者 “Negate Ti”。因为Ti本省就是一句话,可能会跨越多个句子。为了获取更可靠的结果,引入一个事后分析的概念E,他的获取方式是用提示词,例如“Ti is true because” 或者 “Ti is false because”, 最终,cmps-lot的方式就是每个节点比较因为大模型可能很难发现自身的错误,所以第二个方式让它做选择题,二选一,如下:称为Adpt-LoT.下图的伪代码很好的描述了上面这些文字:

在一些数据集上对比cot的表现如下:

思路六:链已经满足不了,能不能生成树呢?

论文是《Tree of Thoughts: Deliberate Problem Solving with Large Language Models》 与链的差异如下图,前面提到的多词投票得到的cot-sc策略,就类似于只在根节点分叉的树,后面一直走到叶子节点。tree ot thoughts(tot),则是在每一层都可能有不同的选择。在每一步会存在一个value函数,来决策每个节点到当前的路径价值。这个价值函数可以通过投票或者提示词模板生成来实现。最后就是通过dfs,或者bfs来搜索了。

通过定制模板分类的价值函数,来完成24点游戏、以及通过投票模板来做节点选取的价值函数,来完成创意写作的价值函数,如下图:

思路七+:思维链的场景衍生

在《Chain-of-Symbol Prompting Elicits Planning in Large Langauge Models》中,来让思维链完成需要空间感的任务,比如几个字母,变换顺序之后,排序的结果。

在《Chain-of-table: Evolving tables in the reasoning chain for table understanding》中,让思维链完成复杂的表格推理任务。

。。。(别的没看了)



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询