Datawhale AI夏令营:让AI理解列车排期表
分析赛题,对问题进行建模
项目地址:https://www.datawhale.cn/activity/351/learn/198/4422/23/21
- 赛题核心要求:
- 分为两个阶段:
- 让模型学习如何解析和表示表格数据生成:可用于微调的QA对
- 回答与表格数据对应的自然语言问题:微调
baseline:模型蒸馏
- 编程生成问题:对每一行创建问题列表,确保问题正确性
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输入给教师模型,教师模型为每个问题生成对应的答案。
def call_llm(content: str): # 用于调用教师模型
"""
调用大模型
Args:
content: 模型对话文本
Returns:
list: 问答对列表
"""
# 调用大模型(硅基流动免费模型,推荐学习者自己申请)
url = "https://api.siliconflow.cn/v1/chat/completions" # 大模型API接口
payload = {
"model": "Qwen/Qwen3-8B",
"messages": [
{
"role": "user",
"content": content # 对话提示词,"/no_think"是关闭了qwen3的思考
}
]
} # 调用内容
headers = {
"Authorization": "Bearer API Key",
"Content-Type": "application/json"
} # API 的身份认证信息(Token)和数据类型
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'] # 返回问题的回答:json格式
- 构建高质量SFT数据集
[{'instruction': 'K4547/6号车次应该从哪个检票口检票?', 'output': 'K4547/6号车次应该从检票口1B检票。'},
{'instruction': 'K4547/6号车次应该从哪个站台上车?', 'output': 'K4547/6号车次应该从站台2上车。'}]
- 微调目标模型(学生模型)