【datawhale AI夏令营】复杂推理能力评估竞赛学习笔记(2)- Lora微调+Agent评估
一. 前言
二. 整体方案设计
整体方案思路如上图所示:
- 数据先经过
Answer Agent
输出解答问题思路和可能的答案 Evaluate Agent
通过分析Answer Agent
输出的解答思路和答案,通过反思最终确定最终答案并输出Error Agent
记录过程中出现的问题以便调试Qwen2-7B-Answer
和Qwen2-7B-Evaluate
为两个基于Qwen2-7b-instruct专门微调的模型。一是提升回答准确性,二是提升回答速度
三. 数据集准备
为了微调训练Qwen2-7B-Answer
和Qwen2-7B-Evaluate
这两个模型,首先分别为这两个模型准备数据集,整体准备思路如下:
首先读取训练数据集通过构造Prompt,利用DeepSeek大模型生成输出,保存进行答案数据集,最后转换成alpaca 格式的数据集
alpaca 格式的数据集应遵循以下格式:
[ { "instruction": "user instruction (required)", "input": "user input (optional)", "output": "model response (required)", "system": "system prompt (optional)", "history": [ ["user instruction in the first round (optional)", "model response in the first round (optional)"],
["user instruction in the second round (optional)", "model response in the second round (optional)"]
]
}
]
- Qwen2-7B-Answer数据集 构造Prompt如下:
def get_prompt(problem, question, options):
options = "\n".join(f"{'ABCDEFG'[i]}. {o}" for i, o in enumerate(options))
prompt = f"""你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请根据问题给出5步以内的思考思路。并给出可能的结果:
### 题目:
{problem}
### 问题:
{question}
{options}
输出格式如下:
### 思考思路:
1 ~ 5个思考思路
### 可能的结果:
根据思考思考分析得到的答案
"""
return prompt
最终构造的数据形式如下
[{
"instruction": "你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请根据问题给出5步以内的思考思路。并给出可能的结果:\n\n### 题目:\n有几种不同的方法来计算数字的幂。在这里,你需要根据不同的计算步骤确定相应的结果。\n\n### 问题:\n选择题 3:\n若数 9 将自己乘 9 次,最终结果是多少?\nA. 387420489\nB. 3486784401\nC. 43\nD. 59049\n",
"input": "",
"output": "### 思考思路:\n1. 确定题目要求计算的是 9 的 9 次幂,即 \\(9^9\\)。\n2. 使用幂的定义,\\(9^9\\) 表示 9 乘以自己 9 次。\n3. 计算 \\(9^9\\) 的具体数值。可以通过计算器或编程工具来验证。\n4. 对比计算结果与选项 A、B、C、D。\n5. 确定哪个选项与计算结果匹配。\n\n### 可能的结果:\n根据计算 \\(9^9\\) 的结果,正确答案是 B. 3486784401。"
},
{
"instruction": "你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请根据问题给出5步以内的思考思路。并给出可能的结果:\n\n### 题目:\n有几种不同的方法来计算数字的幂。在这里,你需要根据不同的计算步骤确定相应的结果。\n\n### 问题:\n选择题 4:\n若数 0 将自己乘 5 次,最终结果应为多少?\nA. 0\nB. 1\nC. 5\nD. 无效的计算\n",
"input": "",
"output": "### 思考思路:\n1. 首先,明确题目中的操作:数 0 将自己乘 5 次。\n2. 理解乘法的性质:任何数乘以 0 都等于 0。\n3. 确定计算步骤:0 乘以 0 再乘以 0 再乘以 0 再乘以 0。\n4. 应用乘法性质:每次乘法操作结果都是 0。\n5. 最终结果:经过 5 次乘法操作后,结果仍然是 0。\n\n### 可能的结果:\nA. 0"
}
]
- Qwen2-7B-Evaluate数据集 构造Prompt如下:
def get_prompt(problem, question, options, think):
options = "\n".join(f"{'ABCDEFG'[i]}. {o}" for i, o in enumerate(options))
prompt = f"""你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。根据思考思路,将每个答案带入问题,你可以参考参考结果,如果觉得不正确可以更正结果,给出最可能的答案,最后一行的格式为"答案是:A"。
### 题目:
{problem}
### 问题:
{question}
{options}
{think}
只要输出最终你分析的正确答案即可,最终输出格式如下
答案是:X
例如:答案是:A
"""
# print(prompt)
return prompt
可以看到Evaluate数据集的构造是依赖于Answer数据集的输出
最终构造的数据形式如下
[{
"instruction": "你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。根据思考思路,将每个答案带入问题,你可以参考参考结果,如果觉得不正确可以更正结果,给出最可能的答案,最后一行的格式为\"答案是:A\"。\n\n### 题目:\n有几种不同的方法来计算数字的幂。在这里,你需要根据不同的计算步骤确定相应的结果。\n\n### 问题:\n选择题 3:\n若数 9 将自己乘 9 次,最终结果是多少?\nA. 387420489\nB. 3486784401\nC. 43\nD. 59049\n\n### 思考思路:\n1. 确定题目要求计算的是 9 的 9 次幂,即 \\(9^9\\)。\n2. 使用幂的定义,\\(9^9\\) 表示 9 乘以自己 9 次。\n3. 计算 \\(9^9\\) 的具体数值。可以通过计算器或编程工具来验证。\n4. 对比计算结果与选项 A、B、C、D。\n5. 确定哪个选项与计算结果匹配。\n\n### 可能的结果:\n根据计算 \\(9^9\\) 的结果,正确答案是 B. 3486784401。\n",
"input": "",
"output": "答案是:B"
},
{
"instruction": "你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。根据思考思路,将每个答案带入问题,你可以参考参考结果,如果觉得不正确可以更正结果,给出最可能的答案,最后一行的格式为\"答案是:A\"。\n\n### 题目:\n有几种不同的方法来计算数字的幂。在这里,你需要根据不同的计算步骤确定相应的结果。\n\n### 问题:\n选择题 4:\n若数 0 将自己乘 5 次,最终结果应为多少?\nA. 0\nB. 1\nC. 5\nD. 无效的计算\n\n### 思考思路:\n1. 首先,明确题目中的操作:数 0 将自己乘 5 次。\n2. 理解乘法的性质:任何数乘以 0 都等于 0。\n3. 确定计算步骤:0 乘以 0 再乘以 0 再乘以 0 再乘以 0。\n4. 应用乘法性质:每次乘法操作结果都是 0。\n5. 最终结果:经过 5 次乘法操作后,结果仍然是 0。\n\n### 可能的结果:\nA. 0\n",
"input": "",
"output": "答案是:A"
}
]
构造好训练数据集后,我们开始训练
四. Lora微调
1. 环境准备
在AutoDL租了一个服务器,配置如下
训练环境:
- PyTorch 2.1.0
- Python 3.10(ubuntu22.04)
- Cuda 12.1
- RTX 4090D(24GB) * 115 vCPU Intel(R) Xeon(R) Platinum 8474C
- 内存 80GB
训练框架 LLaMA-Factory 详细训练方案详见官方文档
2. 下载基础模型
from modelscope import snapshot_download
model_dir = snapshot_download('qwen/Qwen2-7B-Instruct', cache_dir='/root/autodl-tmp', revision='master')
3.安装LLaMA-Factory 框架
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .
4.修改训练数据集
上传训练数据集,修改LLaMA-Factory/data/dataset_info.json
"train_answer_instruct": {
"file_name": "train_answer_instruct.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
}
5.启动LLaMA-Factory
cd LLaMA-Factory
llamafactory-cli webui
6.设置参数
7.开始训练
等待完成训练
上述步骤对Qwen2-7B-Answer
和Qwen2-7B-Evaluate
是同样的训练过程
8.模型合并
将 base model 与训练好的 LoRA Adapter 合并成一个新的模型。
五.多Agent协同
参考整体方案,主要通过Evaluate Agent
通过分析Answer Agent
输出的解答思路和答案,通过反思最终确定最终答案并输出。
目前采用的是手工分步加载模型和分别执行 📅 TODO:计划采用LangGraph来完成整个工作流
最终上传评测得分
总分 0.7613,提升还不是很明显,下一步可以进一步扩展数据,找一些外部数据集来进行训练或者RAG
继续加油~
转载自:https://juejin.cn/post/7398747864996741157