一、前言
好了,经过了前三次任务的学习,终于到了激动人心的“见真章”的时候了!在本次任务中,我们需要独立完成大赛的所有要求,这无疑是难度最大的一次挑战!
二、比赛限制回顾
我们这次比赛主要限制的无非就三大点:
①提交docker内存限制50G(因此建议把参数选择在20B以内)
②推理与评测时间限制为3个小时,所提供的显卡为单卡V100(32G显存)
③容器中无可用网络(即无法通过API调用闭源模型)
解决策略
所以,为了尽可能在限制范围之内达到云电脑推理的最佳结果,我们需要选择一个合适的模型来进行我们的推理过程。
这个链接包含了诸多开源大模型的各项参数:
https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard
在表格中有这5个参数:
IFEval、BBH MATH Lvl 5、GPQA、MUSR、MMLU-PRO
其中,与对大模型的逻辑推理能力相关性较大的参数为BBH MATH Lvl 5与MMLU-PRO。在寻找榜单的过程中,我们最终发现‘MaziyarPanahi/Qwen2-7B-Instruct-v0.1’模型在这两项参数上要比我们之前使用的‘Qwen/Qwen2-7B-Instruct’模型要好,但是其他参数的比较上前者却不如后者,因此在均分上处于劣势。
![](https://i-blog.csdnimg.cn/direct/2b45938351c34c35a24257fee483e757.png)
但考虑到我们使用的模型只有7B的参数,在显存上似乎还有多余的空间。
我在这里有个疑问:能不能同时运行两个模型呀。这样的话我们显存空余的空间也能得到充分利用。我的思路就是:一个模型和我们原来的思路一样,进行逻辑推理;另一个模型对前者推理的思路进行检验(相当于审核,类似于“结对编程”的原理),但我不知道该如何用具体的代码来实现这样的功能。
(不知道有没有大佬在评论区教我)
三、上分方法:prompt工程
一个好的prompt是大语言模型给出好的回答的关键,因此,改善prompt可以提升大语言模型的准确性。
Datawhale有一份学习prompt以及相关内容的课程,链接如下:
https://github.com/datawhalechina/llm-cookbook/tree/main/content/%E5%BF%85%E4%BF%AE%E4%B8%80-Prompt%20Engineering%20For%20Developers
由于测试集的逻辑推理题可以分为多个种类,因此,我们可以采用聚类分析的方法将测试集中的题目分别标记为:①数学题;②计算机理论题;③物物关系题(包含了人际关系与人物关系)。因此,我们可以对这三类题目分别用不同的prompt,这样可以得到更高的分数。
原本的prompt是:
你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。最后一行的格式为"答案是:A"。题目如下:
我们可以进行如下修改,例如:
你是一个逻辑推理专家,擅长解决逻辑推理问题,尤其是理论数学的相关知识。以下是一个与数学高度相关的逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请根据问题给出7步以内的思考思路,并给出可能的结果。最后一行的格式为"答案是:A"。题目如下:
这样的话,大语言模型可以更加精准地得到正确的结果。
四、上分方法:agent设计
agent设计分为两部分:
agent1_分析器:对题目进行分析,给出可能的结果。
agent2_评分器:对答案的合理性排序,最后给出可能性最大的答案。
例如:
你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请根据问题给出5步以内的思考思路。并给出可能的结果:
### 题目:
以下是一个关于温度转换的问题,其中有一个函数用来将摄氏温度转换成华氏温度,并评估该温度是"太高"、"高"、"寒冷"还是"宜人"。
该函数的工作原理如下:
- 把摄氏度(C)乘以9/5,然后加上32,得到华氏度(F)。
- 然后根据华氏度的数值评估温度状态:
- 如果华氏度大于150,则输出"温度太高"。
- 如果华氏度介于90到150之间,则输出"温度高"。
- 如果华氏度低于30,则输出"温度寒冷"。
- 否则输出"温度宜人"。
根据以上信息回答以下选择题:
### 问题:
选择题 1:
当摄氏度为5度时,对应的华氏度是多少?
A. 23.0
B. 36.0
C. 41.0
D. 54.0
你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。根据思考思路,将每个答案带入问题,你可以参考参考结果,如果觉得不正确可以更正结果,给出最可能的答案,最后一行的格式为"答案是:A"。
### 题目:
以下是一个关于温度转换的问题,其中有一个函数用来将摄氏温度转换成华氏温度,并评估该温度是"太高"、"高"、"寒冷"还是"宜人"。
该函数的工作原理如下:
- 把摄氏度(C)乘以9/5,然后加上32,得到华氏度(F)。
- 然后根据华氏度的数值评估温度状态:
- 如果华氏度大于150,则输出"温度太高"。
- 如果华氏度介于90到150之间,则输出"温度高"。
- 如果华氏度低于30,则输出"温度寒冷"。
- 否则输出"温度宜人"。
根据以上信息回答以下选择题:
### 问题:
选择题 1:
当摄氏度为5度时,对应的华氏度是多少?
A. 23.0
B. 36.0
C. 41.0
D. 54.0
### 思考思路:
1. **理解转换公式**:摄氏度(C)转换成华氏度(F)的公式是 \( F = C \times \frac{9}{5} + 32 \)。
2. **代入具体数值**:将摄氏度 \( C = 5 \) 代入公式中。
3. **计算**:计算 \( 5 \times \frac{9}{5} + 32 \)。
4. **简化计算**:首先计算 \( 5 \times \frac{9}{5} = 9 \),然后加上32,得到 \( 9 + 32 = 41 \)。
5. **选择正确答案**:根据计算结果,选择正确的选项。
### 可能的结果:
根据以上计算,当摄氏度为5度时,对应的华氏度是41.0。因此,正确答案是C。
当然了,这只是Datawhale提供的agent设计思路(不过,我没自己的思路),如果有更好的agent设计的话欢迎交流,其实最好的方案莫过于微调与agent结合。
五、上分方法:数据集扩充
方法一:附加子问题
我们可以先分析一遍测试集给出的几道子问题,然后在提出的子问题之外再生成一些问题,让大语言模型自己解决自己的问题,这也就相当于给了大语言模型多一轮的学习机会。
方法二:相似题生成
我们可以先分析一遍测试集给出的问题,然后对原问题的数值,人际、人物或是物物关系亦或是人名进行修改,让大语言模型根据相似的思路,自己解决自己的问题。
方法三:使用开源数据集
六、总结
在经过了一次次的训练之后,我们终于可以提交出一份完美的答卷了!
再一次点开比赛的官网,上传数据集,漂亮!0.7274拿下!(这个0.8479是我用gpt-4o的API跑出来的数据,算作弊了哈)
也算是圆满地结束了本次夏令营。感谢Datawhale团队一路以来的辛苦付出!开源是世界上最伟大的思想!让我们这些小白才有了接触这些知识的机会!