Datawhale AI夏令营 从零入门大模型微调

文章目录


一.小白零基础30分钟速通
1.报名赛事
2.运行baseline:数据处理
3.模型微调
这部分主要包括四步:数据上传,等待处理,模型训练,模型发布。
4.模型测试
5.提交文件,拿下第一个分数
(1)学习率:0.00008 训练次数:16
(2)学习率:0.00008 训练次数:15
在这里插入图片描述
二.baseline1精读
1.数据处理思路介绍
1.1赛题讲解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面的描述我们能看到在图1数据说明及图2提交界面中需要我们进行数据处理,然后进行微调。我们要做的是通过大语言模型,输入阅读材料,阅读材料是高考的语文和英语阅读材料,大模型输出选择题及对应的答案,选择题根据阅读材料进行出题。
好的。我们从微调需要的输入输出两方面来看。也就是图4中的input与traget部分。
在这里插入图片描述
1.2 微调数据
1.3 数据处理方案
1.3.1 python正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
本章节主要介绍Python中常用的正则表达式处理函数。
1.3.2 Pandas库
Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
Pandas 名字衍生自术语 “panel data”(面板数据)和 “Python data analysis”(Python 数据分析)。
Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。
1.3.3 处理目标
我们需要将文件中的数据读取出来,将语文数据与英语数据整理好后存储成可以微调的数据格式。可以微调的数据格式我们可以选择csv与jsonl类型。
1.4 处理流程
将语文、英语训练集按照下图结构,选项与答案组成output模块,prompt+阅读文本组成input模块。这样就是我们的处理流程结构啦。
在这里插入图片描述
2.微调流程介绍
2.1 大语言模型介绍
大语言模型的概念
大语言模型(英文:Large Language Model,缩写LLM),也称大型语言模型,是一种人工智能模型,旨在理解和生成人类语言。
通常,大语言模型 (LLM) 指包含数十亿(Billion或更多)参数的语言模型,这些模型在大量的文本数据上进行训练,例如国外的有GPT-3 、GPT-4、PaLM 、Galactica 和 LLaMA 等,国内的有ChatGLM、文心一言、通义千问、讯飞星火等。
大模型的能力和特点

  1. 大模型的能力
    大语言模型(LLM)与以前的预训练语言模型(PLM)的主要区别在于其涌现能力。这种能力在小型模型中不明显,但在大型模型中显著。例如:
  • 上下文学习:首次由GPT-3引入,允许模型在提供自然语言指令或多个任务示例的情况下,通过理解上下文并生成相应输出来执行任务。
  • 指令遵循:通过指令微调,LLM可以根据任务指令执行未见过的任务,展示出强大的泛化能力。
  • 逐步推理:通过"思维链(Chain of Thought, CoT)"策略,LLM能够解决多步推理任务,例如数学问题。
  1. 大模型的特点
    • 巨大的规模:参数规模达数十亿甚至数千亿,使其能捕捉更多语言知识和复杂语法结构。
  • 预训练和微调:在大规模无标签文本数据上预训练,然后通过有标签数据微调,适应特定任务。
  • 上下文感知:具备强大的上下文感知能力,能够理解和生成依赖前文的文本内容。
  • 多语言支持:支持多种语言,促进跨文化和跨语言的应用。
  • 多模态支持:一些LLM支持文本、图像和语音的多模态数据。
  • 涌现能力:在大规模模型中表现出明显的性能提升,能处理更复杂的任务。
  • 多领域应用:广泛应用于文本生成、自动翻译、信息检索、摘要生成、聊天机器人等多个领域。
  • 伦理和风险问题:需要谨慎处理生成有害内容、隐私问题和认知偏差等伦理和风险问题。
    2.2 微调介绍
    什么是模型微调?
    相当于给你一个预训练模型(Pre-trained model),基于这个模型微调(Fine Tune)。
    预训练模型就是已经用数据集训练好了的模型。
    两种 Finetune 范式
  1. 增量预训练微调 (Continue PreTraining)
    使用场景:让基座模型学习到一些新知识,如某个垂类领域的常识
    训练数据:文章、书籍、代码等
  2. 指令跟随微调 (Supervised Finetuning)
    使用场景:让模型学会对话模板,根据人类指令进行对话
    训练数据:高质量的对话、问答数据
    为什么要微调?
    相对于从头开始训练(Training a model from scatch),微调可以省去大量计算资源和计算时间,提高了计算效率,甚至提高准确率。
    普通预训练模型的特点是:用了大型数据集做训练,已经具备了提取浅层基础特征和深层抽象特征的能力。
    不做微调:
    (1)从头开始训练,需要大量的数据,计算时间和计算资源。
    (2)存在模型不收敛,参数不够优化,准确率低,模型泛化能力低,容易过拟合等风险。
    使用微调:避免了上述可能存在的问题。
    什么情况下使用微调?
    (1) 你要使用的数据集和预训练模型的数据集相似
    如果不太相似,效果可能就没有那么好了,特征提取是不同的,所以相应的参数训练后也是不同的。
    (2) 自己搭建或者使用的模型正确率太低。
    (3)数据集相似,但数据集数量太少。
    (4)计算资源太少。
    不同数据集下使用微调
  • 数据集1 - 数据量少,但数据相似度非常高在这种情况下,我们所做的只是修改最后几层或最终的softmax图层的输出类别。
  • 数据集2 - 数据量少,数据相似度低在这种情况下,我们可以冻结预训练模型的初始层(比如k层),并再次训练剩余的(n-k)层。由于新数据集的相似度较低,因此根据新数据集对较高层进行重新训练具有重要意义。
  • 数据集3 - 数据量大,数据相似度低在这种情况下,由于我们有一个大的数据集,我们的神经网络训练将会很有效。但是,由于我们的数据与用于训练我们的预训练模型的数据相比有很大不同。使用预训练模型进行的预测不会有效。因此,最好根据你的数据从头开始训练神经网络(Training from scatch)。
  • 数据集4 - 数据量大,数据相似度高这是理想情况。在这种情况下,预训练模型应该是最有效的。使用模型的最好方法是保留模型的体系结构和模型的初始权重。然后,我们可以使用在预先训练的模型中的权重来重新训练该模型。
    微调指导事项
    1.通常的做法是截断预先训练好的网络的最后一层(softmax层),并用与我们自己的问题相关的新的softmax层替换它。例如,ImageNet上预先训练好的网络带有1000个类别的softmax图层。如果我们的任务是对10个类别的分类,则网络的新softmax层将由10个类别组成,而不是1000个类别。然后,我们在网络上运行预先训练的权重。确保执行交叉验证,以便网络能够很好地推广。

2.使用较小的学习率来训练网络。由于我们预计预先训练的权重相对于随机初始化的权重已经相当不错,我们不想过快地扭曲它们太多。通常的做法是使初始学习率比用于从头开始训练(Training from scratch)的初始学习率小10倍。

  1. 如果数据集数量过少,我们进来只训练最后一层,如果数据集数量中等,冻结预训练网络的前几层的权重也是一种常见做法。
    这是因为前几个图层捕捉了与我们的新问题相关的通用特征,如曲线和边。我们希望保持这些权重不变。相反,我们会让网络专注于学习后续深层中特定于数据集的特征。
    LoRA
    LoRA是一种高效微调方法,深入了解其原理可参见博客:[知乎|深入浅出Lora]
    LoRA的优势
  • 可以针对不同的下游任务构建小型 LoRA 模块,从而在共享预训练模型参数基础上有效地切换下游任务。
  • LoRA 使用自适应优化器(Adaptive Optimizer),不需要计算梯度或维护大多数参数的优化器状态,训练更有效、硬件门槛更低。
  • LoRA 使用简单的线性设计,在部署时将可训练矩阵与冻结权重合并,不存在推理延迟。
  • LoRA 与其他方法正交,可以组合。
    LoRA的原理
    在这里插入图片描述
  • https://github.com/microsoft/LoRA?tab=readme-ov-file
  • https://arxiv.org/pdf/2106.09685
  • https://huggingface.co/docs/peft/quicktour
    微调处理流程
    在这里插入图片描述
    3.baseline1精讲
    3.1 环境准备
    相关库的下载与安装
!pip install pandas openpyxl

3.2 语文数据处理
3.2.1 数据加载
这里我们使用pandas加载xlsx中的数据,这里面我们使用全局匹配,将训练集中的中文点与左侧括号匹配为英文类型。

# coding~

import pandas as pd
import re

# 读取Excel文件
df = pd.read_excel('训练集-语文.xlsx')
df = df.replace('.', '.', regex=True)
df = df.replace('(', '(', regex=True)

# 读取第二行(即第三行)“选项”列的内容
# 可以使用loc获取某行的数据
second_row_option_content = df.loc[2, '选项']

# 显示第二行“选项”列的内容
print(second_row_option_content)

3.2.2 抽取问题
这里主要是为了抽取题目及答案,并且过滤简答题。大家可以阅读详细的注释理解问题抽取的函数如何工作。

def chinese_multiple_choice_questions(questions_with_answers):
    # 输入的题目文本
    text = questions_with_answers

    
    question_pattern = re.compile(r'\d+\..*?(?=\d+\.|$)', re.DOTALL)
    # 这一行作用是匹配一个以数字开头、后面跟着一个点字符的字符串,
    #。直到遇到下一个数字和点字符或字符串结束。
    choice_pattern = re.compile(r'([A-D])\s*(.*?)(?=[A-D]|$|\n)', re.DOTALL)
    # 这一行作用是匹配一个以字母[A到D]开头、后面跟着一个点字符的字符串,
    #直到遇到下一个[A到D]或字符串结束。
    
    
    # 找到所有问题
    questions = question_pattern.findall(text)

    # 初始化选择题和简答题列表
    multiple_choice_questions = []
    short_answer_questions = []

        # 处理每个问题
    for id,question in enumerate(questions):
        # 这里取到的question,如果是选择题会带着选择题的选项。
        # 检查是否是选择题 因为选择题内有ABCD这样的选项
        if re.search(r'[A-D]', question):
            # 如果有选项,提取出选项的内容
            choices = choice_pattern.findall(question)
            # 这里提取了题目的内容,因为每个题目都会有一个打分的(X分)这样的标记
            # 以左括号为目标,截取选择题选项中的内容
            question_text = re.split(r'\n', question.split('(')[0])[0]
            
            
            pattern_question = re.compile(r'(\d+)\.(.*)')
            # 这里清洗了选择题的编号,重新用循环中的id进行编号。
            # 如果不做这一步可以发现给定的数据中编号是乱序的。
            matches_question = str(id+1)+'.'+ pattern_question.findall(question_text)[0][1] # 取出问题后重排序
            # print(str(id+1)+'.'+matches_question)
            
            # 这里我们实现声明好了存储的列表
            # 将每个问题和选项以字典的形式存入方便我们处理
            multiple_choice_questions.append({
                'question': matches_question,
                'choices': choices
            })
        else:
            # 大家可以想想这里怎么用?
            short_answer_questions.append(question.strip())
    # 最后我们返回抽取后的选择题字典列表
    return multiple_choice_questions

3.2.3 抽取问题的结果
这里我们抽取刚才我们拿到的选择题的答案部分。

def chinese_multiple_choice_answers(questions_with_answers):
   # 首先清洗输入字段,因为答案字段中的格式不统一,清洗后便于统一处理。
   # 这里删除了所有的换行和空格
    questions_with_answers = questions_with_answers.replace(" ", "").replace("\n", "")
    
    # print(questions_with_answers)
    # 使用正则表达式匹配答案
    # 这里我们主要使用第一个匹配 一个数字+点+字母ABCD之间一个
    choice_pattern = re.compile(r'(\d+)\.([A-Z]+)')
    # 下面这句匹配的是简答题答案~  目前可以忽略
    short_pattern = re.compile(r'(\d+)\.([^A-Z]+)')

    # 找到所有匹配的答案
    choice_matches = choice_pattern.findall(questions_with_answers)
    short_matches = short_pattern.findall(questions_with_answers)

    # 将匹配结果转换为字典
    choice_answers = {int(index): answer for index, answer in choice_matches}
    short_answers = {int(index): answer for index, answer in short_matches}

    # 按序号重新排序
    sorted_choice_answers = sorted(choice_answers.items())
    sorted_short_answers = sorted(short_answers.items())
    
    answers = []

    # 输出结果
    
    # print("选择题答案:")
    for id in range(len(sorted_choice_answers)):
    # 这里我们也将重新编号号的答案作为返回,返回的是一个列表,方便与问题字典列表匹配~
        answers.append(f"{id+1}. {sorted_choice_answers[id][1]}")
    return answers

这里是一个样例

在这里插入图片描述
3.2.4 prompt 设计

def get_prompt_cn(text):
    prompt = f'''
    你是⼀个⾼考选择题出题专家,你出的题有⼀定深度,你将根据阅读文本,出4道单项选择题,包含题目选项,以及对应的答案,注意:不⽤给出原文,每道题由1个问题和4个选项组成,仅存在1个正确答案,请严格按照要求执行。 阅读文本主要是中文,你出的题目需要满足以下要点,紧扣文章内容且题干和答案为中文:
    
    ### 回答要求
    (1)理解文中重要概念的含义
    (2)理解文中重要句子的含意
    (3)分析论点、论据和论证方法
    
    
    ### 阅读文本
    {text}
    '''
    
    return prompt   

可以看到代码里面首先对大模型做了声明,声明如下:
你是⼀个⾼考选择题出题专家,你出的题有⼀定深度,你将根据阅读文本,出4道单项选择题,包含题目选项,以及对应的答案,注意:不⽤给出原文,每道题由1个问题和4个选项组成,仅存在1个正确答案,请严格按照要求执行。 阅读文本主要是中文,你出的题目需要满足以下要点,紧扣文章内容且题干和答案为中文:
这里是官方的声明,不建议修改~

接下来是要求部分:(这里建议大家根据出题要求做修改尝试~)
### 回答要求
(1)理解文中重要概念的含义
(2)理解文中重要句子的含意
(3)分析论点、论据和论证方法

最后是阅读材料,这里其实是我们传入的阅读材料参数。
### 阅读文本
{text}
3.5 中文数据处理主函数
这段代码将input与output部分进行组合,按照列表序号一一对应~
可以看看注释中的实现细节~

def process_cn(df): 
    # 定义好返回列表
    res_input = []
    res_output = []

    for id in range(len(df)):
        # 逐个遍历每行的选项、答案、阅读文本的内容
        data_options = df.loc[id, '选项']
        data_answers = df.loc[id,'答案']
        data_prompt = df.loc[id,'阅读文本']
        # 处理选项部分,抽取出选择题题目及选项
        data_options = chinese_multiple_choice_questions(data_options)
        # 处理答案部分,抽取出选择题答案
        data_answers = chinese_multiple_choice_answers(data_answers)
        # 抽取阅读材料组合成input内容
        data_prompt = get_prompt_cn(data_prompt)
        # print(data_options)
        # print(data_answers)
        # 做数据验证,因为训练数据格式不能确定每组数据都能被正常处理(会有一部分处理失败)
        # 我们验证一下两个列表的长度 如果相同代表数据处理正确
        if(len(data_answers)==len(data_options)):
            # 定义output的数据字符串
            res = ''
            # 处理选择题目中的每个数据,逐个拼入到output字符串
            for id_,question in enumerate(data_options):
            # 首先放入题目
                res += f'''
{question['question']}?
                '''+'\n'
                # 然后找到选择题的每个选项,进行choices列表循环
                for choise in question['choices']:
                # 逐个将选项拼接到字符串
                    res = res+ choise[0] + choise[1]+ '\n'
                #  最后将答案拼接到每个选择题的最后
                # 以 答案:题号.选项的格式
                res = res + '答案:' + str(data_answers[id_].split('.')[-1])  + '\n'
            # 最后将处理得到的input、output数据存入到列表
            res_output.append(res)
            res_input.append(data_prompt)
        # break
    return res_input,res_output
    

3.3 英文数据加载
3.3.1 数据加载

# coding~

import pandas as pd

# 读取Excel文件
df = pd.read_excel('训练集-英语.xlsx')
# 英文数据处理中有一部分ocr识别的题目,这种题目中看上去是字母A,但是实际为俄文的字母,,
# 所以开始使用全局匹配做了清洗……
df = df.replace('.', '.', regex=True).replace('А.', 'A.', regex=True).replace('В.', 'B.', regex=True).replace('С.', 'C.', regex=True).replace('D.', 'D.', regex=True)
# df = df.replace('(', '(', regex=True)

# 读取第二行(即第三行)“选项”列的内容
second_row_option_content = df.loc[0, '选项']

# 显示第二行“选项”列的内容
print(second_row_option_content)

3.3.2 抽取问题
英文问题数据相对标准,但是也有不少小问题。比如ABCD的顺序可能是ACBD。我们看看这些如何解决。

import re

# 示例文本
text = second_row_option_content

def get_questions(text):
    # 数据清洗,将所有换行改为两个空格方便统一处理
    text = text.replace('\n', '  ')+'  '
    # print(text)
    # 正则表达式模式
    # 通过匹配以数字开头然后带一个点,为题干
    # 然后抽取选项A  以A开头 后面带一个点 最后以两个空格结尾
    # 为什么是两个空格?部分数据换行时为换行符,我们已经换成了两个空格,有些是以多个空格分割,我们默认为两个空格
    # 接着匹配B C D选项内容
    # 最后有一个
    pattern = re.compile(r'(\d+\..*?)(A\..*?\s{2})([B-D]\..*?\s{2})([B-D]\..*?\s{2})(D\..*?\s{2})', re.DOTALL)

    # 查找所有匹配项
    matches = pattern.findall(text)

    # 存储结果的字典列表
    questions_dict_list = []

    # 打印结果
    for match in matches:
        question, option1, option2, option3, option4 = match
        pattern_question = re.compile(r'(\d+)\.(.*)')
        # 第一个为选择题的题目 提前存到question_text 
        question_text = pattern_question.findall(question.strip())[0][1]
        
        # 提取选项字母和内容
        options = {option1[0]: option1, option2[0]: option2, option3[0]: option3, option4[0]: option4}
        
        question_dict = {
            'question': question_text,
            # 这一步就是防止ACBD这种乱序,我们进行重新匹配,将可能是ACBD的数据以首字母按位置排好号
            'options': {
                'A': options.get('A', '').strip(),
                'B': options.get('B', '').strip(),
                'C': options.get('C', '').strip(),
                'D': options.get('D', '').strip()
            }
        }
        
        questions_dict_list.append(question_dict)
    # 最后获得
    return questions_dict_list

# 调用函数并打印结果
questions = get_questions(text)
for q in questions:
    print(q)

3.3.3 抽取问题的结果

# 首先做数据清洗,将空格、换行符及点都删除
def remove_whitespace_and_newlines(input_string):
    # 使用str.replace()方法删除空格和换行符
    result = input_string.replace(" ", "").replace("\n", "").replace(".", "")
    return result
import re

# 示例文本
text = """
32. B. The underlying logic of the effect.                                                   33.D. estimates were not fully independent.
34.C. The discussion process.            35.D. Approving.
"""
def get_answers(text):
    text = remove_whitespace_and_newlines(text)
    # 正则表达式模式
    # 这里是一个数字加一个A-D的大写字母表示为答案区域,因为有些答案中有解释,这样的匹配规则可以尽可能匹配到答案
    pattern = re.compile(r'(\d)\s*([A-D])')

    # 查找所有匹配项
    matches = pattern.findall(text)
    res = []
    # 打印结果
    for match in matches:
        number_dot, first_letter = match
        res.append(first_letter)
    return res

3.3.4 prompt设计

def get_prompt_en(text):
    prompt = f'''
    你是⼀个⾼考选择题出题专家,你出的题有⼀定深度,你将根据阅读文本,出4道单项选择题,包含题目选项,以及对应的答案,注意:不⽤给出原文,每道题由1个问题和4个选项组成,仅存在1个正确答案,请严格按照要求执行。
The reading text is mainly in English. The questions and answers you raised need to be completed in English for at least the following points:
    
    ### 回答要求
    (1)Understanding the main idea of the main idea.
    (2)Understand the specific information in the text.
    (3)infering the meaning of words and phrases from the context
    
    
    ### 阅读文本
    {text}
    '''
    
    return prompt   

可以看到代码里面首先对大模型做了声明,声明如下:
你是⼀个⾼考选择题出题专家,你出的题有⼀定深度,你将根据阅读文本,出4道单项选择题,包含题目选项,以及对应的答案,注意:不⽤给出原文,每道题由1个问题和4个选项组成,仅存在1个正确答案,请严格按照要求执行。
The reading text is mainly in English. The questions and answers you raised need to be completed in English for at least the following points:
这里是官方的声明,不建议修改~

接下来是要求部分:(这里建议大家根据出题要求做修改尝试~)
### 回答要求
(1)Understanding the main idea of the main idea.
(2)Understand the specific information in the text.
(3)infering the meaning of words and phrases from the context

最后是阅读材料,这里其实是我们传入的阅读材料参数。
### 阅读文本
{text}
3.3.5 英文数据处理主函数

def process_en(df): 
    res_input = []
    res_output = []
    for id in range(len(df)):
        data_options = df.loc[id, '选项']
        data_answers = df.loc[id,'答案']
        data_prompt = df.loc[id,'阅读文本']
        data_options = get_questions(data_options)
        data_answers = get_answers(data_answers)
        data_prompt = get_prompt_en(data_prompt)
        # print(data_options)
        # print(data_answers)

        if(len(data_answers)==len(data_options)):
            res = ''
            for id,question in enumerate(data_options):
                res += f'''
                {id+1}.{question['question']}
                {question['options']['A']}
                {question['options']['B']}
                {question['options']['C']}
                {question['options']['D']}
                answer:{data_answers[id]}
                '''+'\n'
            res_output.append(res)
            res_input.append(data_prompt)
    return res_input,res_output
    # break

3.4 数据合并
因为微调需要150条数据,数据处理后得到有效数据为102,从中文抽取30条,英文抽取20条组成152条数据作为微调数据。

# 将两个列表转换为DataFrame

df_new = pd.DataFrame({'input': cn_input+cn_input[:30]+en_input+en_input[:20], 'output': cn_output+cn_output[:30]+en_output+en_output[:20]})

4.结果提交
(1)学习率:0.00008 训练次数:17
在这里插入图片描述
(2)学习率:0.00008 训练次数:17 修改prompt
在这里插入图片描述
分数下降很多,还需要好好学习一下如何写好ptompt,不能盲目修改。
三. 数据增强与评分
1.数据增强
1.1 星火大模型api申请与使用
1.2 数据增强思路
数据增强为了补充一些数据,一方面是在先前生成的结果上做一些优化,一方面可以再生成一些补充数据以作增强。
1.2.1 使用大模型完成答案生成
还记得我们的训练数据吗?
|| 阅读文本 || 选项 || 答案 ||
大概是上面三部分,那么如果咱们使用大模型,如何直接生成我们需要的QA数据呢?
这里我们使用大模型完成,想必聪明的大家已经想到了这个方法,不过不知道怎么入手。
这里我就从prompt到实践介绍核心代码,大家自行再baseline1上修改即可!
prompt设计
给出主要需求:
你是一个高考英语阅读题出题专家,请阅读材料,需要参考参考内容 按照要求将题目、选项、答案对其补充完整。
【这里我们要给定大模型身份,这是一般书写prompt的第一句。接着向大模型指定任务,按照我们的要求做一些事情,还有一些参考内容。】
接着给出参考材料:
###阅读材料
{reading}

接着给出具体要求:
###要求
1.需要将序号对应的题目与答案做匹配。
2.匹配后格式按照问题、ABCD四个选项顺序、答案的结构组合,按照参考内容格式输出。
3.如果选择题目数量不够四个请根据阅读材料及出题思路再生成题目,总题目达到四个。
4.题目中不能出现任何不合理的词汇、语法错误。
5.如果有简答题目与答案请忽略这部分内容,只处理选择题目。
【这里是需要大模型一步步去完成的任务,每一条都是大模型需要遵守并实现的。再开头我们只是粗劣的告诉大模型干嘛,但是想大模型老老实实听话干活,需要我们将每个任务都拆解清晰逐步明确!】

接着给出参考内容:
{cankao_content}

cankao_content = '''
1. 以下哪个选项是“具身认知”的定义?
A. 认知在功能上的独立性、离身性构成了两种理论的基础。
B. 认知在很大程度上是依赖于身体的。
C. 认知的本质就是计算。
D. 认知和心智根本就不存在。

答案:B

2. 以下哪个实验支持了“具身认知”的假设?
A. 一个关于耳机舒适度的测试。
B. 一个关于眼睛疲劳程度的测试。
C. 一个关于人类感知能力的实验。
D. 一个关于人类记忆力的实验。

答案:A

3. 以下哪个选项是“离身认知”的教育观的特点?
A. 教育仅仅是心智能力的培养和训练,思维、记忆和学习等心智过程同身体无关。
B. 教育观认为身体仅仅是一个“容器”,是一个把心智带到课堂的“载体”。
C. 教育观认为知识经验的获得在很大程度上依赖于我们身体的体验性。
D. 教育观认为知识经验的获得在很大程度上依赖于我们大脑的记忆能力。

答案:A

4. 以下哪个选项是“具身认知”带来的教育理念和学习理念的变化?
A. 更强调全身心投入的主动体验式学习。
B. 更注重操作性的体验课堂,在教学过程中将学生的身体充分调动起来,这在教授抽象的概念知识时尤为重要。
C. 更强调教师的教学方法和学生的学习方法。
D. 更注重教师的教学技巧和学生的学习技巧。

答案:A'''

【这里的参考内容即为我们的标准参考答案,这里给出了语文部分,如果大家想对英语部分修改直接拿输出样例文件中的英语部分即可(我个人觉得英语的结构不规范,建议修改一下)。为什么我们要给参考内容呢,其实我们使用了one shot learining策略,具体内容请学习这篇论文One-Shot Learning as Instruction Data Prospector for Large Language Models】
最后给出题目和答案

def get_adddata_prompt_zero(reading, cankao_content, question, answer):
    prompt = f'''你是一个高考英语阅读题出题专家,请阅读材料,需要参考参考内容 按照要求将题目、选项、答案对其补充完整。

###阅读材料
{reading}

###要求
1.需要将序号对应的题目与答案做匹配。
2.匹配后格式按照问题、ABCD四个选项顺序、答案的结构组合,按照参考内容格式输出。
3.如果选择题目数量不够四个请根据阅读材料及出题思路再生成题目,总题目达到四个。
4.题目中不能出现任何不合理的词汇、语法错误。
5.如果有简答题目与答案请忽略这部分内容,只处理选择题目。

###参考内容
{cankao_content}

###题目
{question}

###答案
{answer}
'''
    return prompt

最终prompt完整的例子我取出来一条,大家可以看看。

你是一个高考英语阅读题出题专家,请阅读材料,需要参考参考内容 按照要求将题目、选项、答案对其补充完整。

###阅读材料
    书匠(节选)葛亮
秋天的时候,我父亲接到了小龙的电话。小龙说,毛羽,这个老董,差点没把我气死。父亲问他怎么回事。他说,馆里昨天开了一个古籍修复的研讨会,请了许多业界有声望的学者。我好心让老董列席,他竟然和那些权威叫起板来。说起来,还是因为馆里来了本清雍正国子监刊本《论语》,很稀见。可是书皮烧毁了一多半,给修复带来很大难度。省外的专家,都主张将整页书皮换掉。没承想老董跟人家轴上了,说什么“不遇良工,宁存故物”,弄得几个专家都下不了台。其中一个,当时就站起身要走,说,我倒要看看,到哪里找这么个“良工”。老董也站起来,说,好,给我一个月,我把这书皮补上。不然,我就从馆里走人,永远离开修书行。你说说看,仪器做了电子配比都没辙。你一个肉眼凡胎,却要跟自己过不去,还立了军令状。毛羽,再想保他,我怕是有心无力了。父亲找到老董,说,董哥,你怎么应承我的?老董不说话,闷着头,不吱声。父亲说,你回头想想,当年你和夏主任那梁子,是怎么结下的。你能回来不容易,为了一本书,值得吗?老董将手中那把乌黑发亮的竹起子,用一块绒布擦了擦,说,值得。后来,父亲托了丝绸研究所的朋友,在库房里搜寻,找到了一块绢。这块绢的质地和经纬,都很接近内府绢。但可惜的是,绢是米色的。老董摸- -摸说,毛羽,你是帮了我大忙。剩下的交给我,我把这蓝绢染出来。父亲说,谈何容易,这染蓝的工艺已经失传了,老董笑笑,凡蓝五种,皆可为靛。《天工开物》里写着呢,无非“菘、蓼、马.吴、苋”。这造靛的老法子,是师父教会的。我总能将它试出来,此后很久,没见着老董,听说这蓝染得并不顺利。老董家里,沙发套和桌布、窗帘,都变成了靛蓝色。这是让老董拿去当了实验品。中秋后,我照旧去老董家练书法。父亲拎了一笼螃蟹给他家。老董说,毛羽,今天放个侵。我带孩子出去玩玩. 老董穿了一件卡其布的工作服,肩膀上挎了个军挎。父亲笑笑,也没有多问,只是让我听伯伯的话。老董就踩着一辆二八型的自行车,带着我,穿过了整个校园。老董踩得不快不慢,中间经过了夫子庙,停下来,给我买了一串糖葫芦。我问老董,伯伯,我们去哪里啊?老董说,咱们看秋去。也不知骑了多久,我们在东郊一处颓败的城墙处停住了。这里是我所不熟悉的南京。萧瑟、空阔,人烟稀少,但是似乎充满了野趣,沿着水塘,生着许多高大的树。枝叶生长蔓延,彼此相接,树冠于是像伞一祥张开来。我问,这是什么树?老董抬着头,也静静地看着,说,橡树。老董说,这么多年了。这是寿数长的树啊。老董说,我刚刚到南京的时候,老师傅们就带我到这里来,后来,我每年都来,有时候自己来,有时和人结伴。有一次,我和你爷爷一起来,那你爷爷那次带了画架,就支在那里,老董抬起胳膊,指了指一个地方。那里是一人高的芦苇丛,在微风中摇荡。IV你爷爷说,这是个好地方,有难得的风景啊,他说这个话,已经是三十年前了。老董的目光,渐渐变得肃穆。他抬起头,喃喃说,老馆长,我带您的后人来了。我问,伯伯,我们来做什么呢?老董俯下身,从地上捡起-一个东西,放在我手里。那东西浑身毛刺刺的,像个海胆。老董说,收橡碗啊.我问,橡碗是什么呢?老董用大拇指,在手里揉捏一下,说,你瞧,橡树结的橡子,熟透了,就掉到地上,壳也爆开了。这壳子就是橡碗。这时候,忽然从树上跳下来个毛茸茸的东西。定睛一看,原来是一只松鼠。它落到了地上,竟像人一样站起了身,前爪紧紧擒着- -颗橡子。看到我们,便慌慌张张地跑远了。老董说,它也识得宝呢。我问,橡碗有什么用呢?老董这才回过神,说,捡回去洗洗干净,在锅里煮到咕嘟响,那汤就是好染料啊。哪朝哪代的旧书,可都补得赢喽。我们这些人啊,一年也盼中秋,不求分月饼吃螃蟹,就盼橡碗熟呢:我听了恍然大悟,说,原来是为了修书啊,那咱们赶快捡吧。老董到底把那块蓝绢染出来了.据说送去做光谱检测,色温、光泽度与成分配比率,和古书的原书皮相似度接近百分之九十。也就是说,基本完美地将雍正年间的官刻品复制了出来。因为本地一家媒体的报道,老董成了修书界的英雄。图书馆要给老董转正,请他参与主持修复文澜阁《四库全书》的工作。老董摇摇头,说,不了。还是原来那样吧,挺好。
(有删改)
    


###要求
1.需要将序号对应的题目与答案做匹配。
2.匹配后格式按照问题、ABCD四个选项顺序、答案的结构组合,按照参考内容格式输出。
3.如果选择题目数量不够四个请根据阅读材料及出题思路再生成题目,总题目达到四个。
4.题目中不能出现任何不合理的词汇、语法错误。
5.如果有简答题目与答案请忽略这部分内容,只处理选择题目。

###参考内容

1. 以下哪个选项是“具身认知”的定义?
A. 认知在功能上的独立性、离身性构成了两种理论的基础。
B. 认知在很大程度上是依赖于身体的。
C. 认知的本质就是计算。
D. 认知和心智根本就不存在。

答案:B

2. 以下哪个实验支持了“具身认知”的假设?
A. 一个关于耳机舒适度的测试。
B. 一个关于眼睛疲劳程度的测试。
C. 一个关于人类感知能力的实验。
D. 一个关于人类记忆力的实验。

答案:A

3. 以下哪个选项是“离身认知”的教育观的特点?
A. 教育仅仅是心智能力的培养和训练,思维、记忆和学习等心智过程同身体无关。
B. 教育观认为身体仅仅是一个“容器”,是一个把心智带到课堂的“载体”。
C. 教育观认为知识经验的获得在很大程度上依赖于我们身体的体验性。
D. 教育观认为知识经验的获得在很大程度上依赖于我们大脑的记忆能力。

答案:A

4. 以下哪个选项是“具身认知”带来的教育理念和学习理念的变化?
A. 更强调全身心投入的主动体验式学习。
B. 更注重操作性的体验课堂,在教学过程中将学生的身体充分调动起来,这在教授抽象的概念知识时尤为重要。
C. 更强调教师的教学方法和学生的学习方法。
D. 更注重教师的教学技巧和学生的学习技巧。

答案:A

###题目
7.下列对文本相关内容和艺术特色的分析鉴赏,不正确的一项是(3)
A.作者在写南国的风物时,用了“那一块一块的稻田”那--堆的房屋”等,语言的节奏感符合火
车行进时的动态感。
B.作者认为车过潭江的部分是“新宁铁路中的一段最美丽的工程”,既在于这里风景的优美,更在于
工程体现了机械的诗意。
C.作者认为如果只把“月夜”“ 花朝”“青山” 一类的东西当作写诗的材料,其实是不懂诗,依
据是这些材料本身缺乏生命力.
D.“诗应该给人以创造的喜悦,诗应该散布生命”是作者对诗的认识,也是他认为机械具有诗意的一一
个重要前提.
8.本文在写“机械的诗”时再写到工人,请简要分析二者之间的内在联系。(6)
9.这篇随笔的最后段跳转到作者在上海的生活见闻,这样写有什么好处?请结合文本简要分析.

###答案
7.C
8. (1) 工人是机械的操控者、管理者、指挥者,是机器背后的灵魂。(2) 机器的创造,本质上还是人的创
造,在人的控制下,机械的力量才是完美的。(3) 对机械力量的赞美,实则是对人能力的肯定.
9. (1)这是联想,由轮船上的机器联想到上海的建筑所用的机器,二者都体现机器的力量,具有相似性.
(2)拓展文章的广度,丰富其内容. (3) 由“我"一个人的喜悦,拓展到“许多人”的喜悦,表明对机器
力量的欣赏是普遍存在的,深化了文章的主题。

大模型返回结果
可以看到效果是蛮不错的,后面我们可以试试评分大模型对这个结果评价一下。

1. 作者在旅途中乘坐新宁铁路的主要目的是什么?
A. 探访朋友。
B. 观赏南国的风景。
C. 体验机械的诗意。
D. 研究铁路工程。

答案:A

2. 根据文本,作者对“机械的诗”的理解主要强调了哪方面?
A. 机械的实用价值。
B. 机械与自然景观的结合。
C. 机械运动中的美感和创造性。
D. 机械操作的技术细节。

答案:C

3. 作者认为真正的诗应该具备哪些特质?
A. 描述自然风景。
B. 表达爱情情感。
C. 散布生命,给人以创造的喜悦。
D. 只关注传统主题如月夜、花朝。

答案:C

4. 作者在上海观察到的建筑场景中,机械的作用体现在哪个方面?
A. 破坏自然环境。
B. 创造建筑奇迹。
C. 增加土地价值。
D. 引起公众担忧。

答案:B

1.2.2 使用大模型增强数据
之前大家在讯飞平台上看到数据增强,但未必适合我们。这里因为题目要求,我们使用大模型自己实现一下数据增强吧。
增强思路1.补全四个选项及答案
由于之前生成的数据中我们处理的数据不一定满足四个选项与答案,这里我们需要将答案补全,我们看看如何使用大模型补全。
这里面我们的增强prompt如下,和直接生成的思路很想们这里的不同点是要求,这里的题目与答案是我们baseline1生产的output部分内容。
这里我们主要要求大模型生成四个答案,这是我们的核心目标。

def get_adddata_prompt_rebuild(reading, cankao_content, output):
    prompt = f'''你是一个高考英语阅读题出题专家,请阅读材料,需要参考参考内容 按照要求将题目、选项、答案对其补充完整。

###阅读材料
{reading}

###要求
1.如果选择题目不足四个需要根据参考内容出选择题补充。
2.补充内容格式按照问题、ABCD四个选项顺序、答案的结构组合,按照参考内容格式输出。
3.如果选择题目数量不够四个请根据阅读材料及出题思路再生成题目,总题目达到四个,如果够四个则不做多余补充。
4.题目中不能出现任何不合理的词汇、语法错误。

###参考内容
{cankao_content}

###题目与答案
{output}
'''
    return prompt

这里#####之后是大模型补充的内容。


1.'下列对本文相关内容和艺术特色的分析鉴赏,不正确的一项是?
                
A.小龙与“我"父亲毛羽的电话,既介绍了本文故事发生的起因,表现了书匠老董
B.“老董穿了一件卡其布的工作服,肩膀上挎了个军挎”,“踩着辆二八型的自行
C.小松鼠跳到地上,“像人- -样站起了身,前爪紧紧擒着一颗橡子”,渲染了此处的
D.“仪器做了电子配比都没辙”,老董却用传统工艺修复了稀见典籍,说明在科技发
答案: C
 
########### 2. 老董为什么要自己染制蓝色的绢?
A. 因为市面上找不到合适的蓝色绢。
B. 因为老董对现代染色技术不满意。
C. 因为老董想要证明传统技艺的可行性。
D. 因为老董需要修复一本珍贵的古籍。
答案:D

3. 根据文章内容,老董为什么每年都会去东郊的城墙处?
A. 为了寻找橡碗用于制作染料。
B. 为了纪念已故的老馆长。
C. 为了享受大自然的美景。
D. 为了教授“我”关于自然的知诀。
答案:B

4. 以下哪个选项不是老董使用传统技艺修复书籍的原因?
A. 传统技艺可以更精确地匹配原书皮的颜色和质地。
B. 老董想通过这种方式保存并传承传统的修书技艺。
C. 老董认为只有传统方法才能达到他想要的修复效果。
D. 老董希望通过现代科技手段来提高修复效率。
答案:D

增强思路2.拿到思路1的数据后做答案扩展
这里需要大家自行尝试,阅读题目不变,然后再生成四组QA。这样生成几次就可以把数据集扩充几倍!这个思路如果不新增阅读材料的情况下很有效果。
2.结果评分
为什么要在这里讲结果评分?因为目前我们给出的结果提交后是用大语言模型评分后给出初赛成绩。但是目前我们需要等待漫长的时间等大语言模型给出评分结果,还需限制了我们的提交次数(每周仅可提交4次!)。大大影响了我们调整的进度,为此这里给出测评方案,大家学习后可以自行评分~
2.1 大模型评分
大模型目前可以弥补一些人类评分的痛点,提升评分效率。掌握这个方法对日后完成评价类任务有很大帮助。评分技术不光用在agent设计,还可以优化推荐算法等等,帮你提升算法质量。
在这里插入图片描述
2.2 星火大模型评分
定义了一下评分思路,赋分情况以及打分标准。
首先满足题目数量及含有对应答案。
接着对给出的答案匹配情况做打分设定。
对选项和文章匹配程度做打分设定。
对选项和高考考试要求做打分设定。
对输出情况做设定。
满足上面条件后输出结果。

judgement = f'''
你是一个高考阅读题目出题专家,你需要根据下面要求结合阅读文章对题目及答案这样的出题情况进行打分,根据要求一步一步打分,得到有效分数后你将得到100万元的报酬,给出最终得分情况,以“总分:XX分”的形式返回。

### 阅读文章
{reading}

### 题目及答案
{QA}

### 要求

1. 判断给出的题目及答案,题目是否为四道,如果不满足四道,少一道题扣10分,如果每个题目没有答案,少一个答案扣5分。
1. 给出题目选项与答案匹配正确度给分,通过阅读文章每分析道题目正确,则给5分,如果错误给0分。四道题满分20分。
2. 给出题目与选项在阅读文章中的匹配程度给分,每道题目符合阅读文章且选择答案复合题目并可用通过阅读文章分析得到,完全符合给3分,完全不符合给0分。四道题满分12分。
3. 给出题目与选项是否符合高考难度,每道题目与答案是否符合高考的难度,完全符合给3分,完全不符合给0分。四道题满分12分。
4. 给出最终得分情况,对上面三个分数进行求和得到总分,以“总分:XX分”的形式返回,三个问题满分共44分。
'''

score = call_sparkai(judgement)
score

星火Max模型输出样例
‘### 题目分析与评分\n\n#### 1. 题目选项与答案匹配正确度评分\n- 第一题:作者在旅途中乘坐新宁铁路的主要目的是什么?\n - 文章中提到“为了去看一个朋友”,因此答案是A。正确\n- 第二题:根据文本,作者对“机械的诗”的理解主要强调了哪方面?\n - 文章中指出机械的力量、灵妙、优雅和完备,符合C选项的描述。正确\n- 第三题:作者认为真正的诗应该具备哪些特质?\n - 文章提到诗应给人以创造的喜悦和散布生命,与C选项相符。正确\n- 第四题:作者在上海观察到的建筑场景中,机械的作用体现在哪个方面?\n - 文中提到机械完成了奇迹,并给了每个人一种喜悦,这与B选项相符。正确\n\n 得分: 5 + 5 + 5 + 5 = 20分\n\n#### 2. 题目与选项在阅读文章中的匹配程度评分\n- 第一题:直接引用文章中的目的描述,非常匹配。3分\n- 第二题:准确捕捉到作者对机械美感和创造性的表述,完全匹配。3分\n- 第三题:紧密关联作者对诗的定义和感受,完全匹配。3分\n- 第四题:准确反映了文中关于建筑和机械作用的描述,完全匹配。3分\n\n 得分: 3 + 3 + 3 + 3 = 12分\n\n#### 3. 题目与选项是否符合高考难度评分\n- 第一题:问题直接且容易理解,适合高考水平。3分\n- 第二题:需要学生理解和分析作者对机械美学的观点,适合高考水平。3分\n- 第三题:涉及对文中情感和定义的理解,适合高考水平。3分\n- 第四题:要求学生从具体例子中抽象出机械的作用,适合高考水平。3分\n\n 得分: 3 + 3 + 3 + 3 = 12分\n\n### 最终得分情况\n总分: 44分
这里我们使用正则表达式简单处理就能得到数字分数

import re

text = score.replace(' ', '')

# 使用正则表达式匹配阅读文本后的内容

match = re.search(r'总分:(\d+)分', text)

if match:
    content = match.group(1)
    print(int(content))
else:
    print("未找到匹配的内容")
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值