【Datawhale AI 夏令营第三期学习笔记】Task2 baseline精读

 介绍:基于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,虽然改动不大,但感觉提分效果蛮显著的,挺有成就感

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值