赛道选择-2.AI+逻辑推理
前言:在task1中,我们简单体验了跑通baseline,task2主要在于baseline内涵及实现过程。
目录
(1)去重与排序has_complete_answer、filter_problems
一、关于大模型
(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_NAME
和query
。在函数中,用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存在于大多数答案中。