“Datawhale AI夏令营”-Task2

赛道选择-2.AI+逻辑推理

前言:在task1中,我们简单体验了跑通baseline,task2主要在于baseline内涵及实现过程。

目录

一、关于大模型

二、整体代码

1、答案生成部分

(1)大模型-call_qwen_api 函数

(2)大模型-api_retry函数

(3)大模型-get_prompt函数

(4)抽取函数extract

(5)多线程处理process_datas

(6)主函数

2、纠错与结果文件生成

(1)去重与排序has_complete_answer、filter_problems

(2)纠错find_missing_ids

(3)补错

(4)文件存储


一、关于大模型

(1)概念:一种人工智能模型,旨在理解和生成人类语言。通常,大语言模型 (LLM) 指包含数十亿(Billion或更多)参数的语言模型,这些模型在大量的文本数据上进行训练。如国外的GPT-3 、GPT-4。国内的文心一言、讯飞星火。

(2)能力及特点:

能力1:在提供自然语言指令或多个任务示例的情况下,通过理解上下文并生成相应输出来执行任务。

能力2:通过指令微调,LLM可以根据任务指令执行未见过的任务,展示出强大的泛化能力。

能力3:通过"思维链(Chain of Thought, CoT)"策略,LLM能够解决多步推理任务,例如数学问题。

……

特点:规模大、需要预训练微调、有上下文感知能力、支持多语言等。

(3)大模型推理实现常用方法:提示工程(Prompt Engineering)

提示工程(Prompt Engineering):工程关注提示词开发和优化,包含了与大语言模型交互和研发的各种技能和技术。提示工程在实现和大语言模型交互、对接,以及理解大语言模型能力方面都起着重要作用。用户可以通过提示工程来提高大语言模型的安全性,也可以赋能大语言模型,比如借助专业领域知识和外部工具来增强大语言模型能力。

二、整体代码

详细链接:Docs

逻辑流程图:

流程图非常清晰,代码整体包括答案生成部分纠错与结果生成。答案生成部分核心是黄色的大模型板块,其中api配置的选择、优化prompt部分等,都可以达到比赛上分的效果。

1、答案生成部分

(1)大模型-call_qwen_api 函数

作用:通过输入模型名称、prompt,完成大模型api调用。

定义了如何调用一个API来获取模型推理的结果。这个函数接受两个参数:MODEL_NAMEquery。在函数中,用messages = [{'role': 'user', 'content': query}] 创建了一个包含用户查询内容的消息列表。调用api,如果response.status_code == HTTPStatus.OK,输出答案。否则输出一些信息及错误代码信息。

(2)大模型-api_retry函数

作用:保证每个问题都被大模型处理过,我们需要设置一个反复尝试的函数。

设置最大尝试次数5次 ,再次尝试等待时间 60秒。重复调用call_qwen_api 函数,调用成功则返回结果,调用失败则except Exception as e捕获异常同时attempts +1,如果尝试次于 max_retries,则记录一条警告日志,并使用 time.sleep(retry_delay) 暂停执行指定的秒数后重试。如果尝试次数等于 max_retries,则记录一条错误日志。

(3)大模型-get_prompt函数

作用:通过prompt将问题格式转化,让大模型更容易处理。

prompt推理模版:

# 这里定义了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)闭世界假设,即未观测事实都为假。请逐步分析问题并在最后一行输出答案,最后一行的格式为"答案是:A"。题目如下:

### 题目:
{problem}

### 问题:
{question}
{options}
"""
    # print(prompt)
    return prompt
(4)抽取函数extract

作用:将大语言模型生成的结果抽取成答案对应的选项,这里的匹配原则和prompt呼应。

匹配原则和prompt呼应,采用正则表达式re.compile方法匹配到答案对应的选项。

(5)多线程处理process_datas

作用:处理包含多个子问题的数据,通过调用 api_retry 函数来获取每个子问题的推理结果。

(6)主函数

作用:调用各种函数生成所需我们答案,是代码的骨架。

2、纠错与结果文件生成

(1)去重与排序has_complete_answer、filter_problems

作用:将一个问题背景下的所有问题存入同一个字典,并按id序号排序。

has_complete_answer检查 questions 列表中的每个问题字典是否包含answer键。

filter_problems接收数据列表 ,主要在于过滤和去重。调用 filter_problems 函数传入 return_list,将结果赋值给 return_list。用 sorted 使按id序号排序。

(2)纠错find_missing_ids

作用:找出列表中缺失的序号。

提取所有序号,创建0-500的序号集合,遍历擦找缺失的序号,最后输出。

(3)补错

从 round1_test_data.jsonl文件中读取数据,将缺失的序号的数据项添加到 sorted_data 列表中,同时将这些数据项中所有问题的 answer 字段设置为 'A'。一般问题答案有好多条,A存在于大多数答案中。

(4)文件存储
  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值