Datawhale AI 夏令营——AI+逻辑推理——Task1

server/2024/9/23 11:20:25/

# Datawhale AI 夏令营

夏令营手册:从零入门 AI 逻辑推理

比赛:第二届世界科学智能大赛逻辑推理赛道:复杂推理能力评估

代码运行平台:魔搭社区

比赛任务

本次比赛提供基于自然语言的逻辑推理问题,涉及多样的场景,包括关系预测、数值计算、谜题等,期待选手通过分析推理数据,利用机器学习、深度学习算法或者大语言模型,建立预测模型。

任务:构建一个能够完成推理任务的选择模型

  • 运用机器学习模型或者深度学习模型解决推理问题。或者利用训练集数据对开源大语言模型进行微调。

数据集介绍

初赛数据集为逻辑推理数据,其中训练集中包含500条训练数据,测试集中包含500条测试数据。每个问题包括若干子问题,每个子问题为单项选择题,选项不定(最多5个)。目标是为每个子问题选择一个正确答案。推理答案基于闭世界假设(closed-world assumption),即未观测事实或者无法推断的事实为假。

具体的,每条训练数据包含 content, questions字段,其中content是题干,questions为具体的子问题。questions是一个子问题列表,每个子问题包括optionsanswer字段,其中options是一个列表,包含具体的选项,按照ABCDE顺序排列,answer是标准答案。

数据集格式如下:

  • round1_train_data.jsonl : 每一行代表一条反应
{'id': 'round_train_data_001',
'problem': '有一个计算阶乘的递归程序。该程序根据给定的数值计算其阶乘。以下是其工作原理:\n\n当数字是0时,阶乘是1。\n对于任何大于0的数字,其阶乘是该数字乘以其前一个数字的阶乘。\n根据上述规则,回答以下选择题:','questions': [{'question': '选择题 1:\n3的阶乘是多少?\n','options': ('3', '6', '9', '12'),'answer': 'B'},{'question': '选择题 2:\n8的阶乘是多少?\n','options': ('5040', '40320', '362880', '100000'),'answer': 'B'},{'question': '选择题 3:\n4的阶乘是多少?\n','options': ('16', '20', '24', '28'),'answer': 'C'},{'question': '选择题 4:\n3的阶乘是9吗?\n','options': ('是', '否'),'answer': 'B'}]
}

测试集 round1_test_data.jsonl 不包含answer字段。

跑通baseline

模型使用阿里云的大模型API,调用模型API来运行,运行环境使用魔搭社区,好处是可以无需在本地环境部署大模型和安装Python环境,不需要担心硬件等资源问题,可以进行快速开发
请添加图片描述

编写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

数据处理

has_complete_answer 检查所有问题是否都有答案answer。

filter_problems是对问题进行去重和保证每个问题都有完整的答案。创建一个结果列表result和问题集合problem_set,遍历输入的数据,对每一条数据都检查其"problem"是否在problem_set内,当问题存在,在结果列表result中找到对应的问题,并通过has_complete_answer检查是否有完整答案,如果有则用当前的item替换已存在的item;当问题不存在,如果问题有完整答案,则将其添加到 result,而问题则添加到 problem_set,最终返回过滤后的结果列表result

def has_complete_answer(questions):# 这里假设完整答案的判断逻辑是:每个question都有一个'answer'键for question in questions:if 'answer' not in question:return Falsereturn Truedef 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']breakelse:# 如果当前字典有完整答案,添加到结果列表if has_complete_answer(item['questions']):result.append(item)problem_set.add(problem)return result

提交结果

初始提交的结果为0.6514,在研究代码后,通过更换其他模型,同为QWEN模型,结果得到了显著提高,说明模型的大小对于推理结果的好坏有至关重要的作用。

请添加图片描述

总结

模型开始使用baseline的 qwen2-7b-instruct 模型,后续更改使用 qwen-plus,在不更改baseline代码的情况下,仅仅依靠模型性能就能将模型的推理能力提升到一个较高的水平,但是这种提升只能说明模型能力的强弱,不能证明调优的好坏,后续计划使用RAG和Agent技术对模型进行推理能力的定向调优,提升模型的推理能力。


http://www.ppmy.cn/server/90596.html

相关文章

探索 OpenAI GPT-4o Mini:开发者的高效创新工具

探索 OpenAI GPT-4o Mini:开发者的高效创新工具 最近,OpenAI 推出了全新的 GPT-4o Mini 模型,以其出色的性能和极具吸引力的价格,引起了开发者们的广泛关注。作为开发者,你是否已经开始探索这个“迄今为止最具成本效益…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-2

目录 高并发缓存三问 - 穿透 缓存穿透 概念 现象举例 解决方案 缓存穿透 - 预热架构 缓存穿透 - 布隆过滤器 布隆过滤器 布隆过滤器基本思想​编辑 了解 高并发缓存三问 - 击穿 缓存击穿 高并发缓存三问 - 雪崩 缓存雪崩 解决方案 总结 为什么要使用数据字典&…

docker常用命令集锦

目录 一、查看版本信息 1.1 查看 Docker CLI 版本: 1.2 查看 Docker 详细版本信息: 1.3 查看 Docker 系统信息: 二、进入和退出容器 2.1 进入容器: 2.2 退出容器: 2.3 查看容器日志: 2.4 查看容器的…

加入到「圆心学堂」知识星球后,你将获得些什么呢?

大家好呀,我的知识星球上线啦!加入到「圆心学堂」知识星球后,您将获得些什么呢? 1.共50套原创精品图文教程电子书,包含1000篇文章,涵盖主流框架、中间件、分布式和微服务等领域,紧跟行业趋势&a…

dp有时候就是找规律 343. 整数拆分 python 力扣

343. 整数拆分 已解答 中等 相关标签 相关企业 提示 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1,…

力扣SQL50 上级经理已离职的公司员工 一题双解

Problem: 1978. 上级经理已离职的公司员工 Code -- 方法 1 -- select e1.employee_id -- from employees e1 -- left join employees e2 -- on e1.manager_id e2.employee_id -- where e1.salary < 30000 -- and e1.manager_id is not null -- and e2.employee_id is…

python每日学习11:numpy库的用法(下)

python每日学习11&#xff1a;numpy库的用法(下) 数组的拼接 名方法称说明concatenate连接沿现有轴的数组序列hstack水平堆叠序列中的数组&#xff08;列方向&#xff09;vstack竖直堆叠序列中的数组&#xff08;行方向&#xff09;concatenate函数用于沿指定轴连接相同形状的两…

C++:了解谓词predicate

什么是谓词predicate 在C中&#xff0c;谓词是指可以作为函数参数&#xff0c;并且返回值类型为bool型的函数对象、Lambda表达式、普通函数或函数指针。谓词通常用于算法中&#xff0c;对序列中的元素进行某种测试&#xff0c;返回一个布尔类型的测试结果&#xff0c;根据不同…