各位同学大家好,今天的TASK2主题非常明确:
第一节课我们跑了一次baseline,相当于参加赛车比赛,你在赛前跑完了一次全程,对于这个比赛的总体流程有了初步了解,也拿到了一个初次的分数。
那么接下来,我们肯定回想着,再走一遍赛道,看看哪些弯道可以更快出弯,哪里的障碍物可以更好的避免,也就是尽可能拿到更好的成绩。
TASK2的目标就是带着我们搞清楚baseline到底做了哪些工作,以及为什么要这么用。也就是将这些代码分成一个个模块,每个模块实现了什么功能,每个模块中又有哪些注意点。
在所有部分的学习之前,你应该了解大模型的原理是什么。
如果你对大模型的原理完全没有了解,你可以将大模型的原理类比作输入法的联想功能,他是在不断根据已经学习过的内容,和你给的内容,一直猜后面的字,是个猜字游戏。
举个例子。当你问一个读幼儿园的小朋友:
明月几时有,把酒问青___
他没学过这个古诗,他就不知道后面这个字是该填什么。
经过训练和学习的我们知道,这个后面最大概率应该接“天”字。
为什么我说最大概率,因为我如果接:把酒问青苹果,把酒问青青草原,你也不能说我错。
大模型就是在后面猜一个概率最高的字,并且不断猜下去。
如果想要通俗易懂的了解大模型的原理,可以参考这个b站视频:【硬核科普】GPT等大模型是怎么工作的?为啥要预测下一个词?_哔哩哔哩_bilibili
看完你就明白了,接下来进入今天TASK2的学习。
一、最重要的部分,框架逻辑
以下这张图是我个人认为今天学习最重要的部分,就是当我们拿到这样一个比赛题目,如何去解决这个问题,也就是确定我们的方法论,构建整个代码的框架。
这次负责上课的大佬用这一张图就完成了对框架思路的确定。
非常清晰地讲明白了我们想要完成这个任务的功能模块需要。
在这里,我尝试用一段话,重新复述一下我们究竟要完成什么任务:
用经过调试的开源模型或自有模型,来解决一张包含500道逻辑推理题的卷子。
500道题中正确的答题数就决定了我们的分数。
1.1框架整体解释
我将框架中的各个模块做了一个划分:
蓝色是功能型的技术功能模块,主要是为了是整个运行逻辑不出错,或是必须的部分,对我们来说,通常是不做修改的(大佬除外)。
黄色是导致分数结果不同的主要差异模块,有python语言基础和大模型的基础的同学可以修改这个部分,来使结果更好。
红色是基础差异模块,只有一个,就是prompt配置,代码知识体系不完善,或者完全不懂代码的同学,重点看这个部分。
1.2各模块功能解释
接下来解释一下这个框架流程的各个部分(标注了对应颜色,可以看自己需要的):
答案生成部分是最重要的部分:
① API的配置与调用,就是你决定要让什么人来写这张卷子,是初中生还是高中生。
调用的模型不同,则答题的人就不同。
② retry模块,就是在网络出错,延迟,传输问题时,把没答的题再答一次。
③ prompt配置,重中之重!解释一下就是你虽然决定了要一个初中生还是高中生来答题,但是 他不知道自己是文科生还是理科生,擅长数学还是生物。而prompt的作用,就是告诉他, 在 解决这个问题时,他扮演了一个什么角色,对!就是让大模型做一个合适的角色扮演。 你提 示他的越详细,约准确,他就能扮演得更好,也就能更好地完成任务。这个模块,我们在后 面还会讲到。
④ 答案抽取。有的同学不明白答案抽取什么意思,实际上,当你把问题给到大模型,他返回给
你的答案不一定是一个言简意赅的答案。
我们来举个例子,你给他的问题是
花生是食物,苹果是食物,X吃了Y没有死,则Y是食物。小王吃了花生,小明吃了苹果。
问:谁喜欢吃花生?A.小王 B.小明 C.苹果 D.老王
大模型在回答你时,不一定会直接回答你:A 因为我们用的模型还不够聪明
他可能会回答:A小王吃了花生,花生是食物,Y是食物
一段可能包含了正确答案的话,我们要做的就是从这段话中提取出答案:A、小王
⑤ 多线程处理。是一段为了提高效率的代码,缩短我们的运行时间。详细的可以看老师的解说,如果展开的话,有点复杂。我们只需要根据模型量修改线程数就可以了,也完全可以不改。
⑥ 主函数。顾名思义,就是前面定义的都是方法函数,主函数就是一段调用各种方法达到目的的函数,基本可以不改。
⑦ 答案去重与重排。也是顾名思义,就是对获得的答案进行结构上的优化。因为多线程的缘故,返回回来的答案不一定是完全按照原本的题目顺序的,需要对他进行重新排序,还有把重复答题的部分去掉。
⑧ 缺失检测与补齐。上一篇笔记中说到,大模型不够聪明,会有因为各种原因,答不出的一些题目。那怎么样去将这部分的答案补上也是一个改进点。
⑨ 最终文件生成。这个不用解释。
二、如何对黄色和红色模块进行改进
① API的配置与调用。这个模块的修改,就是用别的开源模型或者自有模型进行替换,来看看效果会不会更好。可以用阿里或者其他公司的开源大模型,付费的或者免费,如果不是为了比赛拿名次,免费的用用就好了。看看效果有什么区别。讲解的老师提到模型的参数最好不要超过20B,不然可能会不符合比赛要求。
④ 答案抽取。这一块的话,可以用不同的识别策略去改进一下,以解决标准答案隐藏在返回答案中未被识别的情况。
⑧ 缺失检测与补齐。目前了解到的有几种方法:
一是原始的统一填A,因A这个选项是一定有的,你蒙C、D可能不是所有题都有这个选项。
二是识别打包之后重新输入给大模型,让他再次计算。
三是看看能否先对识别出来的未完成的题目进行初步的数据处理,再喂给大模型,以获得更好的效果。
四是重新根据缺失答案,补充prompt,再喂给大模型。
以上是我非常浅薄的认知,希望更多大佬再群里分享好的方法。
③ prompt配置。如果你没有代码基础,不懂代码,我们能做的最大提升就是在prompt上下功夫。
写出更好的prompt的关键在于明确指令、指定输出格式、增加强调词和符号、以及进行多样尝试。
-
明确指令:确保你的prompt清晰、具体,让模型明白你想要它做什么。例如,如果你需要模型提取文本中的实体信息,应明确指出需要抽取的人名、地名和机构名,并指定返回的格式。
-
指定输出格式:对于信息处理类任务,显式规定模型返回结果的格式,如使用特定的分隔符来区分不同类别的信息,这样便于后续处理。
-
增加强调词和符号:当prompt包含多个指令时,通过增加强调词和符号来确保模型关注重要的指令。例如,使用特殊符号或强调词汇来突出关键需求。
-
多样尝试:prompt不是唯一的答案,通过尝试不同的关键词、开头句、引导词和参数等,观察模型的不同反应和结果。这样可以发现更多有趣和有用的内容,提高生成多样性和创造性。
其中强调词是很有用的方法,重复一个重要的词也会让大模型更加具有专业化和领域化。
这一块和教学比较像,就是要我们教他,让他更好地代入角色,做好角色扮演。在这个方向下功夫地同学可以看看吴恩达教你提示词ChatGPT提示工程师&AI大神吴恩达教你写提示词|prompt engineering【完整中字九集全】_哔哩哔哩_bilibili