Datawhale AI 夏令营|大模型技术( 让AI理解列车排期表)
Task1:
1.选择Qwen3-8B,使用 微调数据集 进行 LoRA 精调
2.提交微调好的模型resourceId,自动测评
*LoRA是一种参数高效微调的方法,能够在低资源条件下有效提升模型性能。
Task2:
知识点提要 : 表结构数据处理、微调数据集构造、模型蒸馏

赛事背景
在智慧交通平台中,乘客和调度人员需快速从庞杂的列车时刻表中获取精准信息(如检票口位置、停留时间、跨车次关联)。
传统方法依赖人工查询和分析,效率低且难以应对复杂问题。
大模型在表格理解方面已经取得了显著的进展,正在帮助用户以更直观、更高效的方式处理和解释数据。
本次赛事聚焦 铁路运输场景 ,基于真实列车时刻表数据,要求参赛者 构建能够理解表格语义、处理时间计算、跨字段推理的大模型 问答系统 ,提升信息查询自动化水平。
赛题解读
本次大赛提供了结构化数据表格(列车时刻表)作为数据集,参赛者需基于讯飞星辰MaaS平台构建一个人工智能模型。
该模型能基于给定表格中的结构化数据,结合表格内容提取信息并回答指定的问题。
赛事任务分为两个阶段:
1.让模型学习如何解析和表示表格数据。【生成可用于微调的QA对】
2.回答与表格数据对应的自然语言问题。【微调,让大模型掌握这个表格的知识并进行回答】
应能解决以下问题:

这意味着我们主要的解题手段将围绕 微调(学会列车信息表的)模型 展开,核心在于 构建高质量的(围绕列车信息表的信息的)微调数据集(QA对)。
思路:

数据分析与探索
核心任务目标是构造覆盖关于给定列车时刻表的多类型问题的问答对,供大模型在讯飞星辰MaaS平台进行微调。

整体查看数据我们可以了解到,数据当中存在一些信息缺失,我们可以针对性进行人工清洗、补充
SFT数据:基于输入数据,生成的可在星辰MaaS平台上微调模型的数据(QA对)
格式:Alpaca 或 Sharegpt
Alpaca字段举例:一定要有“instruction”和“output”
Alpaca基本格式:
{"instruction": "Z152次列车的终到站是哪里?", "output": "Z152次列车的终到站是北京西。"}
数据处理的关键点:
1.时间格式统一化处理:原始数据中时间格式可能不统一,需要进行标准化处理,便于后续的时间计算和推理。
2.缺失值处理策略:数据中可能存在“无数据”或空值,需要定义合适的填充或处理策略。
3.字段间关系分析:理解各字段之间的逻辑关系,例如“车次”与“检票口”、“站台”的对应关系,以及“到点”、“开点”与“停留时长”的计算关系。
4.数据清洗和标准化:确保数据质量,移除异常值或不一致的数据。
主要难点
复杂问题的处理:
1.多条件组合查询(如同时筛选候车厅和发车时间)。
2.跨行数据计算(如计算不同列车运行时间并比较)。
3.时间计算与推理(如停留时长、延误后新开点时间)。
Baseline:理解数据、训练数据构造、模型训练
提升:Agent工具构造、模型蒸馏
模型蒸馏(Model Distillation)的思想:
1.编程生成问题(确保问题正确性):我们不再让大模型凭空生成问题,而是通过编程(例如使用Pandas结合模板)来构造基于表格数据的确定性问题。例如,针对每一行数据,我们可以生成“X车次的终到站是哪里?”、“Y车次应该从哪个检票口检票?”等单字段查询问题。对于更复杂的问题类型,也可以设计相应的编程逻辑来生成。这样,我们能确保问题的正确性和相关性。
2.使用更强大的大模型(教师模型)生成答案(确保答案质量):对于这些编程生成的问题,我们再将其输入给一个能力更强、更稳定的教师模型(例如一个大型的通用LLM,如Qwen3-8B),让教师模型根据给定的表格数据和问题来生成答案。由于教师模型能力更强,它生成答案的准确性会更高。
3. 构建高质量SFT数据集:将编程生成的“正确问题”和教师模型生成的“高质量答案”配对,形成{"instruction": "问题", "output": "答案"}格式的SFT(Supervised Fine-Tuning)数据集。
1.微调目标模型(学生模型):最后,使用这个高质量的SFT数据集来微调我们的目标模型(学生模型)。通过这种方式,我们让学生模型学习如何从结构化数据中提取信息并生成准确的答案,从而在讯飞星辰MaaS平台上达到更好的性能。
这种方法的优点在于:
1.保证了问题的正确性:避免了模型生成无效或错误的问题。
2.提升了答案的质量:通过强大的教师模型生成答案,确保了训练数据的准确性。
3.实现了模型蒸馏:将大模型的知识“蒸馏”到我们微调的小模型中,使其在特定任务上表现优异,同时可能具备更快的推理速度,这对于赛题的“回答响应时长”指标至关重要。
4.契合平台限制:由于平台只支持微调,这种数据构建方式是克服平台无Agent功能限制的有效途径。
更好的方法可能是构造一个表格问答Agent,这个Agent拥有7个解决相应问题的工具(tool)

baseline概况

代码:
import pandas as pd
import requests
import re
import json
from tqdm import tqdm
# 读取数据
data = pd.read_excel('data/info_table(训练+验证集).xlsx')
data = data.fillna('无数据')
def call_llm(content: str):
    """
    调用大模型
    
    Args:
        content: 模型对话文本
    
    Returns:
        list: 问答对列表
    """
    # 调用大模型(硅基流动免费模型,推荐学习者自己申请)
    url = "https://api.siliconflow.cn/v1/chat/completions"
    payload = {
        "model": "Qwen/Qwen3-8B",
        "messages": [
            {
                "role": "user",
                "content": content  # 最终提示词,"/no_think"是关闭了qwen3的思考
            }
        ]
    }
    headers = {
        "Authorization": "", # 替换自己的api token
        "Content-Type": "application/json"
    }
    resp = requests.request("POST", url, json=payload, headers=headers).json()
    # 使用正则提取大模型返回的json
    content = resp['choices'][0]['message']['content'].split('</think>')[-1]
    pattern = re.compile(r'^```json\s*([\s\S]*?)```$', re.IGNORECASE)  # 匹配 ```json 开头和 ``` 结尾之间的内容(忽略大小写)
    match = pattern.match(content.strip())  # 去除首尾空白后匹配
    if match:
        json_str = match.group(1).strip()  # 提取JSON字符串并去除首尾空白
        data = json.loads(json_str)
        return data
    else:
        return content
    return response['choices'][0]['message']['content']
def create_question_list(row: dict):
    """
    根据一行数创建问题列表
    
    Args:
        row: 一行数据的字典形式
    
    Returns:
        list: 问题列表
    """
    question_list = []
    # ----------- 添加问题列表数据 begin ----------- #
    # 检票口
    question_list.append(f'{row["车次"]}号车次应该从哪个检票口检票?')
    # 站台
    question_list.append(f'{row["车次"]}号车次应该从哪个站台上车?')
    # 目的地
    question_list.append(f'{row["车次"]}次列车的终到站是哪里?')
    
    # ----------- 添加问题列表数据 end ----------- #
    return question_list
# 简单问题的prompt
prompt = '''你是列车的乘务员,请你基于给定的列车班次信息回答用户的问题。
# 列车班次信息
{}
# 用户问题列表
{}
'''
output_format = '''# 输出格式
按json格式输出,且只需要输出一个json即可
```json
[{
    "q": "用户问题",
    "a": "问题答案"
},
...
]
```'''
train_data_list = []
error_data_list = []
# 提取列
cols = data.columns
# 遍历数据(baseline先10条数据)
i = 1
for idx, row in tqdm(data.iterrows(), desc='遍历生成答案', total=len(data)):
    try:
        # 组装数据
        row = dict(row)
        row['到点'] = str(row['到点'])
        row['开点'] = str(row['开点'])
        # 创建问题对
        question_list = create_question_list(row)
        # 大模型生成答案
        llm_result = call_llm(prompt.format(row, question_list) + output_format)
        # 总结结果
        train_data_list += llm_result
    except:
        error_data_list.append(row)
        continue
# 转换训练集
data_list = []
for data in tqdm(train_data_list, total=len(train_data_list)):
    if isinstance(data, str):
        continue
    data_list.append({'instruction': data['q'], 'output': data['a']})
json.dump(data_list, open('train_data/single_row.json', 'w', encoding='utf-8'), ensure_ascii=False)
baseline方案生成步骤

Task3:
Baseline方案的不足:
1.复杂问题处理能力有限:Baseline主要侧重于单字段查询,对于多条件筛选、跨行计算、时间推理、复杂单位换算等复杂问题,其生成的数据集可能不足以充分训练模型。
2.数据多样性不足:生成的问题类型相对单一,可能无法覆盖用户在实际场景中提出的所有复杂查询。
3.教师模型依赖性:教师模型的性能和调用成本会直接影响数据生成的效率和质量。
4.数据量限制:如果教师模型调用有成本或速度限制,大规模数据生成可能受影响。
5.未充分利用表格结构信息:简单地将表格行文本化,可能没有充分利用表格的结构信息和字段间的内在联系。
Baseline方案修改思路
针对Baseline方案的不足,我们可以从以下几个方面进行修改和优化:
1.扩展数据生成策略:
复杂问题模板化:针对赛题中提及的多种复杂问题类型(多条件筛选、跨行计算、时间推理、复杂时间范围过滤、缺失数据处理、复杂单位换算),设计更复杂的编程模板来生成问题。
答案自动化验证/生成:对于复杂问题,尝试编写更智能的脚本来计算或验证答案,甚至可以构建一个小型的规则引擎来确保答案的正确性,减少对教师模型的完全依赖。
多轮对话模拟:模拟用户进行多轮对话的场景,生成包含上下文信息的问答对,提升模型的对话理解能力。
2.优化数据表示:
结构化Prompt:在向教师模型提问时,不仅仅是简单文本化表格数据,可以尝试更结构化的Prompt设计,例如将表格数据转换为Markdown表格、CSV字符串或JSON格式,并明确告知模型表格的列名和含义,帮助模型更好地理解表格结构。
引入Schema信息:在Prompt中加入表格的Schema信息(字段名、数据类型、可能的取值范围等),引导模型进行更准确的推理。
3.模型选择与调优:
探索不同规模模型:在LoRA微调时,尝试不同参数量的基础模型,根据“回答响应时长”和“回答信息传达效率”指标,找到准确率与速度的最佳平衡点。
LoRA参数优化:调整LoRA的秩(r)、alpha值(lora_alpha)以及dropout率等参数,以找到最优的微调配置。
知识点概述
1.LoRA (Low-Rank Adaptation):一种高效的参数微调技术,通过在预训练模型中注入小的、可训练的低秩矩阵来适应新任务,从而大大减少了需要训练的参数量和计算成本,同时保持了模型性能。
2.SFT (Supervised Fine-Tuning):监督式微调,指使用带有明确“指令”(Instruction)和“输出”(Output)的标注数据集来训练模型,使其学习如何遵循指令并生成期望的响应。
3.模型蒸馏 (Model Distillation):一种模型压缩技术,通过训练一个小型模型(学生模型)来模仿一个大型模型(教师模型)的行为,从而在保持大部分性能的同时,减小模型体积并提高推理速度。
4.提示工程 (Prompt Engineering):设计和优化输入给大模型的文本提示(Prompt),以引导模型生成期望的、高质量的输出。
本文来自博客园,作者:transformert,转载请注明原文链接:https://www.cnblogs.com/ac-network/articles/19003465
                    
                
                
            
        
浙公网安备 33010602011771号