Datawhale AI 夏令营——阅读理解题库构建——Task1,2学习笔记

本次赛题任务概述

本次赛题的任务是利用讯飞的大模型定制训练平台和微调后的 spark-13b 模型,生成高考语文现代文阅读和英语阅读的题目及其对应的问答对。具体来说,我们需要:

  1. 基于讯飞大模型:使用讯飞提供的大语言模型,进行定制化训练,以适应高考阅读理解题目的生成需求。
  2. 微调 spark-13b 模型:在已有的 spark-13b 模型基础上进行微调,使其能够生成与高考语文和英语阅读相关的高质量问答对。
  3. 生成阅读问题和答案:通过上述训练和微调过程,自动生成高考语文现代文和英语阅读理解题目的问题和答案对。

该任务的目标是通过大语言模型的强大能力,提升自动生成考试题目和答案的质量和准确性,为高考阅读理解的题库建设提供有力支持。


前言

        我很高兴参与 Datawhale 2024 年 AI 夏令营第四期的学习活动,本期聚焦“大模型技术”方向。活动是基于讯飞开放平台的“星火大模型驱动阅读理解题库构建挑战赛”展开的一次实践学习。

        在整个学习过程中,我将从最基础的 Baseline 入手,逐步深入了解竞赛的全流程。从跑通最简易的 Baseline 模型,到深入剖析竞赛的各个环节,再到精读 Baseline 代码并进行进阶实践——这些关键步骤我一个都不会错过!

        让我感到特别兴奋的是,这一环节只需要 30 分钟,就能让我这个完全小白的选手顺利跑通“星火大模型驱动阅读理解题库构建挑战赛”!通过这次学习,我将打开通向大模型世界的大门,快速迈入 AI 技术的前沿领域。

一、数据处理

        在高考备考过程中,语文现代文阅读和英语阅读理解是两个重要的环节。这些部分不仅考察考生的语言理解能力,还对其分析、推理、综合和表达能力提出了较高的要求。为了更好地帮助考生提高在这些部分的得分,我们通过大规模的数据处理与分析,生成了一系列针对高考语文现代文阅读和英语阅读理解问题的问答(QA)对。

        本数据处理流程旨在从海量的文本资源中提取有代表性的阅读材料,并构建相关的阅读理解问题及答案。通过对这些QA对的深度分析,我们能够为考生提供更加精准的练习素材和学习指导,从而提升其应考能力。数据处理的目标是确保生成的问题具有高质量和多样性,覆盖高考中可能出现的各种题型与难度,为考生的复习备考提供全方位的支持。

# coding~

import pandas as pd
import re

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


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

# 显示第二行“选项”列的内容
print(second_row_option_content)
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)

    # 找到所有问题
    questions = question_pattern.findall(text)

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

        # 处理每个问题
    for id,question in enumerate(questions):
        # 检查是否是选择题
        if re.search(r'[A-D]', question):
            
            choices = choice_pattern.findall(question)
            question_text = re.split(r'\n', question.split('(')[0])[0]
            
            
            pattern_question = re.compile(r'(\d+)\.(.*)')
            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
In [4]
questions_list = []
for data_id in range(len(df[:3])):
    second_row_option_content = df.loc[data_id, '选项']
    questions_list.append(chinese_multiple_choice_questions(second_row_option_content))
In [5]
def chinese_multiple_choice_answers(questions_with_answers):
    questions_with_answers = questions_with_answers.replace(" ", "").replace("\n", "")
    
    # print(questions_with_answers)
    # 使用正则表达式匹配答案
    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
In [6]
# 读取第二行(即第三行)“选项”列的内容
second_row_option_content = df.loc[60, '答案']

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


chinese_multiple_choice_answers(second_row_option_content)
4.B
5.窗子既是指现实世界中的窗子,可以是铁纱窗,或者是玻璃窗;窗子又是指隔绝自己生活与他人世界的象征。
有的人坐在窗子里面,有的人行走在窗子外面,而一扇窗子隔绝出来的,是两个截然不同的世界,窗外的人固然不了解窗里的人,窗里的人,也永远不能了解窗外的人。
6.你、我的代表了两种不同的人生视角,观看自己生活的视角和观看他人生活的视角。窗外是劳作、奔波、挣扎、穷苦,窗内是奢侈、悠闲、烦闷、无聊。这是两个世界,两种生活。蕴含着作者的态度:窗里窗外是两个世界,窗外的人无法理解窗内,窗内的人也无法走进窗外,我们只能以一个旁观者的角度对待世界,不要以为自己真正的解了什么而私下满足,“天知道那是罪过”。
['1. B']

在这段代码中,主要的目标是处理语文选择题和对应的答案,通过对原始文本数据的解析,提取出题目及其选项,并从答案文本中提取正确答案。

1.1 chinese_multiple_choice_questions 函数
  • 功能:解析输入的包含题目和答案的文本,提取出选择题的题干和选项,并重新编号。
  • 流程
    1. 通过正则表达式将题目与选项分离。
    2. 针对每一个题目,判断是否是选择题(是否包含选项A-D),并且提取题干与选项。
    3. 将处理过的题目与选项按字典的形式存储,供后续使用。
  • 结果:该函数返回一个包含多选题题目、选项的列表,用于进一步处理。
1.2 chinese_multiple_choice_answers 函数
  • 功能:从输入的答案文本中提取出选择题的正确答案,并重新编号。
  • 流程
    1. 使用正则表达式匹配出选择题的序号与对应的答案。
    2. 对匹配到的答案根据题号进行排序,并将结果保存为一个列表。
    3. 返回处理后的答案列表,按题号输出正确选项。
      1. 结果:该函数返回一个按照题号排序的答案列表,列出每道题的正确选项。

process_cn 函数用于处理一个包含语文试题的 DataFrame,并将其转换为适合模型输入输出的格式。具体来说,这个函数提取了每个样本的阅读文本、选项和答案,并将它们格式化为输入和输出的文本数据。

1.3 主要流程
  1. 初始化:函数开始时,初始化了两个空列表 res_inputres_output,分别用于存储处理后的模型输入和输出数据。

  2. 遍历数据

    • 通过 for 循环遍历整个 DataFrame 的每一行,分别提取每一行的选项、答案和阅读文本。
  3. 调用辅助函数

    • 使用 chinese_multiple_choice_questions 函数处理选项数据,将其格式化为题目和选项的字典形式。
    • 使用 chinese_multiple_choice_answers 函数处理答案数据,提取并排序选择题的正确答案。
    • 使用 get_prompt_cn 函数处理阅读文本,生成模型的输入提示。
  4. 构建输出

    • 如果处理后的选项数量和答案数量一致,则将它们组合起来。具体来说,对于每个问题:
      • 构建问题的字符串,包括题干和选项。
      • 将正确答案附加到每个问题的后面,形成一个完整的QA对。
    • 处理后的字符串被添加到 res_output 列表中,而相应的阅读文本被添加到 res_input 列表中。
  5. 返回结果

    • 最终,函数返回 res_inputres_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)
        data_prompt = get_prompt_cn(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'''
{question['question']}?
                '''+'\n'
                for choise in question['choices']:
                    res = res+ choise[0] + choise[1]+ '\n'
                res = res + '答案:' + str(data_answers[id_].split('.')[-1])  + '\n'
            res_output.append(res)
            res_input.append(data_prompt)
        # break
    return res_input,res_output
1.4 作用
  • 统一格式:通过对数据的处理,函数将原始的语文试题转化为统一的格式,便于后续使用,如用于训练或评估自然语言处理模型。
  • 自动化处理:该函数简化了大批量试题的格式化工作,自动生成了标准化的输入输出对,减少了手工处理的时间和错误率。

这个函数非常适合用于生成用于机器学习模型训练的数据集,特别是在处理涉及阅读理解、选择题的场景中。

1.5 英语问答制作

# coding~

import pandas as pd

# 读取Excel文件
df = pd.read_excel('训练集-英语.xlsx')
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)
import json


# 打开一个文件用于写入 JSONL,并设置编码为 UTF-8
with open('output.jsonl', 'w', encoding='utf-8') as f:
    # 遍历每一行并将其转换为 JSON
    for index, row in df_new.iterrows():
        row_dict = row.to_dict()
        row_json = json.dumps(row_dict, ensure_ascii=False,)
        # 将 JSON 字符串写入文件,并添加换行符
        f.write(row_json + '\n')

# 打印确认信息
print("JSONL 文件已生成")

 全部代码可以在此处找到https://aistudio.baidu.com/projectdetail/8225663

        这段代码的目的是将Excel文件中的数据进行处理和清理,然后转换为JSONL格式并保存到文件中。这包括读取数据、替换特定字符、提取特定内容、最后将整个表格数据转化为标准化的JSONL格式保存。这个过程有助于将原始数据整理为更适合后续处理或模型训练的格式。

二、模型微调

         拿着微调文件到飞书文档使用平台微调(大模型定制训练平台)。

        训练和评分过程的时间较长,大约需要一个多小时。这主要是因为当前服务器的使用负载较高,可能有多个用户同时在使用该资源,从而导致系统资源的竞争和性能下降。这种情况会增加计算任务的等待时间和处理时间。为了提高效率,建议在服务器负载较低的时段进行训练和评分,或者考虑使用更高性能的计算资源来减少等待时间。

三、模型测试

  1. 导入必要的模块: 代码从 sparkai.llmsparkai.core.messages 模块中导入了相关的类和方法,用于初始化大语言模型并处理对话消息。

  2. 配置模型参数:

    • SPARKAI_URL:设置了星火大模型的API服务端点。        
    • SPARKAI_APP_IDSPARKAI_API_SECRETSPARKAI_API_KEY:这些是与讯飞星火大模型相关的认证信息(需要在讯飞微调控制台获取)。
    • serviceIdresourceId:指定了模型的服务和资源标识。
  3. 初始化大语言模型:__main__ 块中,使用提供的API信息初始化了 ChatSparkLLM 对象。这个对象配置了API的访问端点、认证信息以及模型的相关参数。streaming=False 表示不使用流式处理,而是一次性生成结果。

  4. 设置对话消息: 创建了一个 ChatMessage 对象,将用户的输入内容作为对话消息传递给模型。这个消息将被送入模型进行处理。

  5. 生成对话内容: 使用 spark.generate 方法生成对话内容,并通过 ChunkPrintHandler 处理输出。generate 方法返回的结果被打印出来。

from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler
from sparkai.core.messages import ChatMessage

SPARKAI_URL = 'wss://xingchen-api.cn-huabei-1.xf-yun.com/v1.1/chat'
#星火认知大模型调用秘钥信息,请结合飞书文档,前往讯飞微调控制台(https://training.xfyun.cn/modelService)查看
SPARKAI_APP_ID = ''
SPARKAI_API_SECRET = ''
SPARKAI_API_KEY = ''
serviceId = ''  
resourceId = ''

if __name__ == '__main__':
    spark = ChatSparkLLM(
        spark_api_url=SPARKAI_URL,
        spark_app_id=SPARKAI_APP_ID,
        spark_api_key=SPARKAI_API_KEY,
        spark_api_secret=SPARKAI_API_SECRET,
        spark_llm_domain=serviceId,
        model_kwargs={"patch_id": resourceId},
        streaming=False,
    )
    messages = [ChatMessage(
        role="user",
        content=prompt
    )]
    handler = ChunkPrintHandler()
    a = spark.generate([messages], callbacks=[handler])
    print(a.generations[0][0].text)

 得到结果:

1. What is the best title for this passage?
                A. Amsterdam's Attractions
                B. MacBike: A Bike Rental Company
                C. Amsterdam: A City of Canals
                D. Cycling in Amsterdam
                answer:B
                

                2. How much does a tour last?
                A. 30 minutes.
                B. 1 hour.
                C. 2 hours.
                D. 2 and a half hour.
                answer:D
                

                3. Which of the following bikes can be hired from MacBike?
                A. Only those with hand brake and gears.
                B. Only those with foot brake and no gears.
                C. Those with child seats, children's bikes and foot brake, No Gears.
                D. All of the above.
                answer:D

总结

这段代码演示了如何配置并使用讯飞的星火认知大模型进行对话生成。通过提供API访问信息和对话消息,代码实现了与大语言模型的交互,并生成了相应的回复。整体流程涵盖了模型的初始化、消息传递和结果处理,为使用大语言模型进行实际对话提供了基本示例。

四、模型提交

 提交链接地址(http://challenge.xfyun.cn/topic/info?type=question-bank-construction&option=tjjg

 

接着拿好我们的prompt:

中文部分

(1)理解文中重要概念的含义 (2)理解文中重要句子的含意 (3)分析论点、论据和论证方法

英文部分

(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

        最终得到模型微调之后的分数52分(分数很低),会在task2和3之后的学习中继续优化!

总结

        通过这次学习,我不仅掌握了如何配置和调用大语言模型,还理解了在实际应用中如何准备输入消息并处理模型的输出。整体流程从环境配置、模型初始化到消息处理和结果生成,都为我提供了清晰的操作步骤和实践经验。这些技能将帮助我在未来的项目中有效地应用大语言模型技术,进行更复杂的对话生成任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值