baseline代码主要功能与实现流程 :
def evaluate(ofn):
#train文件去执行,每天三次机会
data = []
with open(ofn) as reader:
for line in reader:
sample = json.loads(line)
data.append(sample)
pse = 0
cnt = 0
tot = 0
for task in data:
for question in task['questions']:
if MODEL_NAME in question:
tot += 1
cnt += question[MODEL_NAME] == question['answer']
else:
pse += 1
print(cnt, tot, cnt/tot, pse)
由于每天只有三次提交机会,所以我们可以利用evaluate函数评估优化结果,知道自己的大致分数而不浪费每天的次数
方法:即拿train文件与model生成的答案进行比较
具体实践:将下段代码中的answer修改为MODEL_NAME,(即将训练后的结果存入MODEL_NAME中)就可以得知大致的分数
def process_datas(datas,MODEL_NAME):
results = []
with ThreadPoolExecutor(max_workers=16) as executor:
future_data = {}
lasttask = ''
lastmark = 0
lens = 0
for data in tqdm(datas, desc="Submitting tasks", total=len(datas)):
problem = data['problem']
for id,question in enumerate(data['questions']):
prompt = get_prompt(problem,
question['question'],
question['options'],
)
future = executor.submit(api_retry, MODEL_NAME, prompt)
future_data[future] = (data,id)
time.sleep(0.6) # 控制每0.5秒提交一个任务
lens += 1
for future in tqdm(as_completed(future_data), total=lens, desc="Processing tasks"):
# print('data',data)
data = future_data[future][0]
problem_id = future_data[future][1]
try:
res = future.result()
extract_response = extract(res)
# print('res',extract_response)
data['questions'][problem_id]['answer'] = extract_response
results.append(data)#此处进行修改
# print('data',data)
except Exception as e:
logger.error(f"Failed to process text: {data}. Error: {e}")
return results
小结:prompt是我们可以进行优化的一个重要部分,其主要作用是激发大模型提取的能力,将本身具有的能力发挥出来,同样我们也可以微调大模型,直接提高大模型提取的能力。当然还有其他方式可以进行优化
大模型微调(Fine-tuning)是一种技术,通过在预训练的大型语言模型上使用特定数据集进行进一步训练,使模型能够更好地适应特定任务或领域。例如在回答医学领域相关问题时需要为这个通用模型提供大量新的医药数据进行学习和理解
LoRA(Low-Rank Adaptation)微调是一种高效的模型微调技术,特别适用于大型预训练语言模型的适应性调整。LoRA的核心思想是通过引入低秩矩阵来调整模型的权重,从而在不显著增加模型参数数量的情况下,实现对模型的微调。