likes
comments
collection
share

【datawhale AI夏令营】复杂推理能力评估竞赛学习笔记(2)- Lora微调+Agent评估

作者站长头像
站长
· 阅读数 18

一. 前言

二. 整体方案设计

【datawhale  AI夏令营】复杂推理能力评估竞赛学习笔记(2)- Lora微调+Agent评估 整体方案思路如上图所示:

  1. 数据先经过Answer Agent输出解答问题思路和可能的答案
  2. Evaluate Agent通过分析Answer Agent输出的解答思路和答案,通过反思最终确定最终答案并输出
  3. Error Agent记录过程中出现的问题以便调试
  4. Qwen2-7B-AnswerQwen2-7B-Evaluate为两个基于Qwen2-7b-instruct专门微调的模型。一是提升回答准确性,二是提升回答速度

三. 数据集准备

为了微调训练Qwen2-7B-AnswerQwen2-7B-Evaluate这两个模型,首先分别为这两个模型准备数据集,整体准备思路如下: 【datawhale  AI夏令营】复杂推理能力评估竞赛学习笔记(2)- Lora微调+Agent评估 首先读取训练数据集通过构造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.设置参数

【datawhale  AI夏令营】复杂推理能力评估竞赛学习笔记(2)- Lora微调+Agent评估

7.开始训练

【datawhale  AI夏令营】复杂推理能力评估竞赛学习笔记(2)- Lora微调+Agent评估 等待完成训练 上述步骤对Qwen2-7B-AnswerQwen2-7B-Evaluate是同样的训练过程

8.模型合并

将 base model 与训练好的 LoRA Adapter 合并成一个新的模型。

五.多Agent协同

参考整体方案,主要通过Evaluate Agent通过分析Answer Agent输出的解答思路和答案,通过反思最终确定最终答案并输出。

目前采用的是手工分步加载模型和分别执行 📅 TODO:计划采用LangGraph来完成整个工作流

最终上传评测得分

【datawhale  AI夏令营】复杂推理能力评估竞赛学习笔记(2)- Lora微调+Agent评估

总分 0.7613,提升还不是很明显,下一步可以进一步扩展数据,找一些外部数据集来进行训练或者RAG

继续加油~

【datawhale  AI夏令营】复杂推理能力评估竞赛学习笔记(2)- Lora微调+Agent评估

转载自:https://juejin.cn/post/7398747864996741157
评论
请登录