介绍:基于qwen2-7b-instruct,旨在训练大语言模型回答复杂逻辑判断问题的能力
主要调控部分为prompt工程
1.环境配置
pip install scipy openai tiktoken retry dashscope loguru
导入必要的库
import json
import os
from pprint import pprint
import re
from tqdm import tqdm
import random
import uuid
import openai
import tiktoken
import json
import numpy as np
import requests
from retry import retry
from scipy import sparse
#from rank_bm25 import BM25Okapi
#import jieba
from http import HTTPStatus
import dashscope
from concurrent.futures import ThreadPoolExecutor, as_completed
from loguru import logger
import json
import time
from tqdm import tqdm
logger.remove() # 移除默认的控制台输出
logger.add("logs/app_{time:YYYY-MM-DD}.log", level="INFO", rotation="00:00", retention="10 days", compression="zip")
MODEL_NAME = 'qwen2-7b-instruct'
主要库
json,os等用于文件读取相关的操作
numpy,scipy等用于数学计算
2.prompt工程
大模型训练中的Prompt Engineering,即提示工程,是一种技术,通过精心设计的提示词(Prompt)来引导大型语言模型(LLM)生成特定输出或执行特定任务。这项技术可以用于各种任务,包括但不限于回答问题、文本生成、翻译、情感分析、编程和对话等
该步骤为本阶段影响训练成果的核心部分,代码:
# 这里定义了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)闭世界假设,即未观测事实都为假。请按照以下步骤分析问题
1.仔细阅读题目,识别关键信息,列出已知信息
2.根据给定信息,逐步推导可能的结论。
3.分析每个选项,判断其是否符合推导结果,选择最符合逻辑的答案。
在最后一行输出答案,最后一行的格式为"答案是:A"。题目如下:
### 题目:
{problem}
### 问题:
{question}
{options}
"""
# print(prompt)
return prompt
这里试着重写了prompt,尝试分步设定任务(COT)
1.仔细阅读题目,识别关键信息,列出已知信息
2.根据给定信息,逐步推导可能的结论。
3.分析每个选项,判断其是否符合推导结果,选择最符合逻辑的答案。
分三段完成任务
相比之前的结果提分不少
3.数据抽取与整理
def has_complete_answer(questions):
# 这里假设完整答案的判断逻辑是:每个question都有一个'answer'键
for question in questions:
if 'answer' not in question:
return False
return True
def filter_problems(data):
result = []
problem_set = set()
for item in data:
# print('处理的item' ,item)
problem = item['problem']
if problem in problem_set:
# 找到已存在的字典
for existing_item in result:
if existing_item['problem'] == problem:
# 如果当前字典有完整答案,替换已存在的字典
if has_complete_answer(item['questions']):
existing_item['questions'] = item['questions']
existing_item['id'] = item['id']
break
else:
# 如果当前字典有完整答案,添加到结果列表
if has_complete_answer(item['questions']):
result.append(item)
problem_set.add(problem)
return result
这一段代码定义提取数据的函数
data = []
with open('round1_test_data.jsonl') as reader:
for id,line in enumerate(reader):
if(id in missing_ids):
sample = json.loads(line)
for question in sample['questions']:
question['answer'] = 'A'
sorted_data.append(sample)
sorted_data = sorted(sorted_data, key=lambda x: int(str(x['id'])[-3:]))
这一段代码利用题目的序列编号来对最终答案排序,并且将所有缺失的答案填上A
4.数据写入
with open('upload.jsonl', 'w') as writer:
for sample in sorted_data:
writer.write(json.dumps(sample, ensure_ascii=False))
writer.write('\n')
本阶段总结:第一次尝试修改prompt,虽然改动不大,但感觉提分效果蛮显著的,挺有成就感