[Datawhale AI 夏令营 & 第二届世界科学智能大赛逻辑推理赛道] 小白初识LLM

致谢:

非常感谢以下的分享,对我受益匪浅:

https://www.modelscope.cn/datasets/Datawhale/DW2024_Complex_reasoning_ability_assessment_qwen2-7b-lora
https://zhuanlan.zhihu.com/p/675509396

如何使用LLM解题:

baseline中给予的方法,也是现在最流行的方法,即通过api接口来连接在线开源LLM,并解析api的返回数据包,得出LLM的回复,再从回复中提取答案。
由于本人从未接触过在线模型,基本都是本地调试,故对于代码有些许陌生,但大致结构差不多已经理解。以下记录几段我认为比较重要的代码。

def api_retry(MODEL_NAME, query):
    max_retries = 5
    retry_delay = 60  # in seconds
    attempts = 0
    while attempts < max_retries:
        try:
            return call_qwen_api(MODEL_NAME, query)
        except Exception as e:
            attempts += 1   
            if attempts < max_retries:
                logger.warning(f"Attempt {attempts} failed for text: {query}. Retrying in {retry_delay} seconds...")
                time.sleep(retry_delay)
            else:
                logger.error(f"All {max_retries} attempts failed for text: {query}. Error: {e}")
                raise

由于存在掉包的情况,故设置函数用以确保掉包后再次尝试。

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

使用线程池提交任务,提高在线推理的速度。

如何上分:

提示词工程:

所谓提示词,即为输入给LLM的prompt。提示词工程就是指通过不断修改输入的提示词,来达成更高效的结论。
baseline01中使用的提示词如下:

prompt = f"""你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请逐步分析问题并在最后一行输出答案,最后一行的格式为"答案是:A"。题目如下:

学习群的群友提出了使用RAG的思想。我大致查阅了资料,RAG类似在大模型前加入一个向量生成机,目的是将知识库中的信息转换为向量库。在用户提出问题后,将问题过向量生成机,再将得出的向量和向量库中的向量进行距离评估,从而得出一个较好的prompt输入给LLM。通过RAG可以有效提升prompt质量。具体流程如下图:
Alt

微调:

1 LORA:
将LLM中某层的参数转化为两个低秩矩阵相乘的形式,对低秩矩阵进行微调训练。可以减少训练代价,同时训练结果的acc差不多。

https://arxiv.org/pdf/2106.09685

2 vllm框架:
用于LLM模型高速推理的代码框架,易于使用,与huggingface等开源工具可以无缝衔接。
3 多路voting:
通过多次推理,选择答案出现频率最高的答案作为最终结果。


如果您觉得有意思,可否点赞收藏关注一下本蒟蒻!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值