提到大模型思维链,不要只会“Let's think step by step”了

技术

欢迎关注我的公众号“ NLP前沿 ”,日更最新论文/博客速读,周更AI领域近一周发生的那些事儿 。欢迎投稿! 行文仓促,有理解错误,欢迎指正

这篇文章的初衷,是笔者近期在做一个结构化问答的任务,其中一个部分是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,如下图所示

picture.image

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

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

picture.image

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

picture.image这个开山之作的结论是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文章中有一张图很直观,如下图,作者的观点是:不同的人有不同的思维方式,并且,一个问题很多时候也有不同的解法。所以可以通过从语言模型的解码器中采样,在语言模型中模拟这种过程。尽管模型也可能产生不正确的推理路径或在推理步骤之一中犯错误,但这样的错误的推理,不太可能得到相同的答案。也就是说,假设正确的推理过程,即使它们是多样化的,但是也往往比不正确的过程在最终答案中具有更大的一致性。

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

picture.image

思路二:在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效果如下图:picture.image上图可以看到第一个数据集MultiArith,retrieval的效果不如random的。那为什么呢?作者通过一些数据分析发现,zero-shot-cot的错误是具备相似性的,也就是一个类型的n条数据,可能会大批量的出现错误。错误的例子从而误导了真实问题的答案解码。而random是多样性,多样性可以减少相似带来的误导。

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

picture.image附带一张效果如下:

picture.image

思路三:好像有了思维链之后,大模型推理也这么牛皮了。但是实际场景一些场景,用户的输入意图可能是混杂在一大片文本中的,就很乱,很容易误导模型的生成,例如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.picture.image在检索增强生成数据上效果提升

picture.image

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

picture.image

思路四 :链在形成的过程中,因为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,也是有提升的,如下图picture.image

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

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

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

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

要获取到,通过提示词让llm生成即可,例如“It is false to say Ti” 或者 “Negate Ti”。因为Ti本省就是一句话,可能会跨越多个句子。为了获取更可靠的结果,引入一个事后分析的概念E,他的获取方式是用提示词,例如“Ti is true because” 或者 “Ti is false because”, 最终,cmps-lot的方式就是每个节点比较picture.image下图的伪代码很好的描述了上面这些文字:

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

picture.image

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

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

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

picture.image

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

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

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

。。。(别的没看了)

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动大数据容器化构建与落地实践
随着字节跳动旗下业务的快速发展,数据急剧膨胀,原有的大数据架构在面临日趋复杂的业务需求时逐渐显现疲态。而伴随着大数据架构向云原生演进的行业趋势,字节跳动也对大数据体系进行了云原生改造。本次分享将详细介绍字节跳动大数据容器化的演进与实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论