AI+复杂推理能力评估#Datawhale AI夏令营逻辑推理方向#学习笔记

学习目标:大模型技术方案精读、进阶与优化,涉及赛题数据处理、多agent系统方案,再到微调大模型方案,会简单介绍 机器学习 解决赛题的思路

Task 1 

本项目基于采用阿里开源大模型Qwen系列,通过api的形式调用,使用的模型是目前限时免费的 qwen1.5-1.8b-chat 模型,点击申领大模型API!(点击即可跳转)。并在魔塔社区搭载运行。

        1.申领API

        2.运行官方提供的baseline.py,丝滑跑通并提交了第一个AI+逻辑推理分数。

社区提供的baseline即给了我们学习者一个完成逻辑推理赛道的完整用例。 并以学习此用例来学习上手使用大模型完成任务。

Task 2 

  目标:baseline代码精读,即搞清楚是什么和为什么这两个问题。

   1.大语言模型是什么

 大语言模型(英文:Large Language Model,缩写LLM),也称大型语言模型,是一种参数规模达到千亿级别的人工智能模型,旨在理解和生成人类语言。

1.1列举nlp模型发展的几个阶段(发展历史)

   

早期阶段(1950s-1970s)
  • 基于规则的方法:这个阶段的NLP系统主要依靠人工制定的语法规则来解析文本。例如,转换-生成语法(Transformational-Generative Grammar)。
统计学习方法(1980s-2010s)
  • 朴素贝叶斯、决策树:开始使用简单的统计模型进行文本分类。
  • 隐马尔可夫模型(HMM):用于处理序列数据,如语音识别和词性标注。
  • 最大熵模型:用于语言模型和词性标注。
  • 条件随机场(CRF):用于序列标注问题,如命名实体识别。
  • 词袋模型(Bag of Words):用于文档分类和情感分析。
  • TF-IDF:用于信息检索和文本挖掘。
深度学习时代(2010s-至今)
  • 词嵌入(Word Embedding):如Word2Vec和GloVe,将词汇映射到连续的向量空间,捕捉词汇的语义信息。
  • 循环神经网络(RNN):能够处理序列数据,但存在梯度消失和梯度爆炸的问题。
  • 长短期记忆网络(LSTM)和门控循环单元(GRU):改进的RNN结构,用于处理长距离依赖问题。
  • 卷积神经网络(CNN):开始用于NLP领域,特别是在文本分类任务中。
  • 注意力机制(Attention Mechanism):使模型能够在处理序列时聚焦于重要的部分。
  • Transformer模型:自注意力机制的提出,使得模型能够更好地捕捉长距离依赖,是BERT和GPT等模型的基础。
  • 预训练模型:如BERT(Bidirectional Encoder Representations from Transformers)、GPT(Generative Pre-trained Transformer),通过大规模语料库的预训练,然后在特定任务上进行微调。
当前趋势和未来展望
  • 更大的模型和更多的数据:如GPT-3和Megatron等,参数规模达到千亿级别。
  • 多模态学习:结合文本、图像、声音等多种数据类型。
  • 跨语言和低资源语言处理:致力于解决资源不足的语言问题。
  • 可解释性和可靠性:研究模型的可解释性,提高模型的透明度和可靠性。
  • 伦理和偏见:关注AI模型的伦理问题,减少偏见和歧视。

大模型科普视频推荐【硬核科普】GPT等大模型是怎么工作的?为啥要预测下一个词?

1.2提升与特点:

  与以前的预训练语言模型(PLM)大模型在大量数据喂养下的涌现能力显著,如上下文学习、指令遵循、逐步推理问题。

  • 巨大的规模:参数规模达数十亿甚至数千亿,使其能捕捉更多语言知识和复杂语法结构。

  • 预训练和微调:在大规模无标签文本数据上预训练,然后通过有标签数据微调,适应特定任务。

  • 上下文感知:具备强大的上下文感知能力,能够理解和生成依赖前文的文本内容。

  • 多语言支持:支持多种语言,促进跨文化和跨语言的应用。

  • 多模态支持:一些LLM支持文本、图像和语音多模态数据。

  • 涌现能力:在大规模模型中表现出明显的性能提升,能处理更复杂的任务。

  • 多领域应用:广泛应用于文本生成、自动翻译、信息检索、摘要生成、聊天机器人等多个领域

  • 伦理和风险问题:需要谨慎处理生成有害内容、隐私问题和认知偏差等伦理和风险问题。

1.3总结

   语言模型不断根据上文生成的语素进行下文token预测,并且大量数据的喂养,大模型洞悉了人类语言的规律,接下来便可以像人类说话一样根据目前的所有内容不断生成新的内容,这样一个没有生命和意识的程序却理解了人类复杂的文字背后的逻辑甚至情感。这是大模型最大的震撼。尽管它能通过已训练的数据进行相关性联想和逻辑理解,但大语言模型这样的文字模型永远在符号文字中来回,没有和真正的现实世界有过交集,即是一个现实世界在数据面的投射,因此对大语言模型生成的内容还需我们人类自身判断。

2.大模型推理实现

随着这些LLM变得越来越大,它们开始展现出了真正强大的能力-----推理能力,能够理解一些基本的逻辑,然后根据这些逻辑去思考问题。以此引出了推理实现最常用方法——提示工程(Prompt Engineering)。掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。实现大模型多模态能力。

例:输入问题

输入问题背景、提问、以及选项这样结构的数据字典

{
  'problem': 
        '有一群人和一些食物类型。下列是关于这些个体和食物的已知信息:\n\n1. 鸡肉是一种食物。\n2. 苹果是一种食物。\n3. 如果X吃了Y,且X活着,则Y是一种食物。\n4. Bill存活。\n5. Bill吃了花生。\n6. John吃所有食物。\n7. Sue吃所有Bill吃的食物。\n8. John喜欢所有食物。\n\n根据以上信息,回答以下选择题:', 
   'questions': [
        {
        'question': '选择题 1:\n谁喜欢吃花生?', 
        'options': ['Bill', 'Sue', 'John', 'None of the above']
        }
    ], 'id': 'round1_test_data_000'
}
转化后的prompt:

我们通过数据处理,将上面的问题字典转化为MD格式prompt。这是我们让大语言模型能理解并做分析的关键。

 
 

你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请逐步分析问题并在最后一行输出答案,最后一行的格式为"答案是:A"。题目如下: ###题目: 有一群人和一些食物类型。下列是关于这些个体和食物的已知信息: 鸡肉是一种食物。 苹果是一种食物。 如果X吃了Y,且X活着,则Y是一种食物。 Bill存活。 Bill吃了花生。 John吃所有食物。 Sue吃所有Bill吃的食物。 John喜欢所有食物。 根据以上信息,回答以下选择题: ###问题: 选择题 1: 谁喜欢吃花生? A. Bill B. Sue C. John D. None of the above

 调用api执行

3.代码解读

代码实现目标:通过调用大模型api,尽量高效实现500道逻辑推理题,完成赛道目标。

3.1代码框架

社区组织者提供的代码框架图

整体代码主要包括两大模块,一个负责答案生成,一个负责纠错与文件生成

答案生成部分包括大模型的处理函数(图中黄色部分,这是代码核心,也是学习者上手之处)、大模型返回结果抽取(生成)、多线程处理(性能)及答案生成的启动。

纠错与结果生成部分存在的目的是由于目前使用了api调用在线开源大模型,因为网络、模型能力等原因会导致有一些结果会出现缺失。

3.2改进部分

作为初学者,我们能进行上手改进的主要代码部分有

API配置:调用更高效的大模型api,即你想选哪个脑子来帮你答题

答案抽取:改进抽取策略,如何应对抽取错误

prompt配置核心):我的理解为使用者如何把任务更清晰明确地给大模型交代清楚

prompt engineering教程ChatGPT提示工程师&AI大神吴恩达教你写提示词

3.3核心代码模块

几个个人认为比较重要的核心代码

安装需要的库

!pip install scipy openai tiktoken retry dashscope loguru

call_qwen_api 这个函数目的是通过输入模型名称、prompt,函数完成大模型api调用。 

def call_qwen_api(MODEL_NAME, query):
    # 这里采用dashscope的api调用模型推理,通过http传输的json封装返回结果
    messages = [
        {'role': 'user', 'content': query}] #json对象
    response = dashscope.Generation.call(  
        MODEL_NAME,
        messages=messages,
        result_format='message',  # 结果为message格式
    )
    if response.status_code == HTTPStatus.OK:
        print(response)
        return response['output']['choices'][0]['message']['content']
    else:
        print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
            response.request_id, response.status_code,
            response.code, response.message
        ))
        raise Exception()

api_retry 这个函数是当大模型调用api时可能会导致出错中断的问题,为了保证每个问题都被大模型处理过,我们需要设置一个反复尝试的函数。# 最大尝试次数5次 # 再次尝试等待时间 60秒。如果出现错误我们存储到日志文件。

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

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

extract抽取函数,通过抽取函数可以将大语言模型生成的结果抽取成答案对应的选项,这里的匹配原则和prompt呼应。我们可以看到prompt要求【最后一行的格式为"答案是:A"】这样的规范,那么我们采用正则表达式re.compile方法匹配到答案对应的选项。当我们匹配为空时,我们默认选"A"。

# 这里使用extract抽取模获得抽取的结果

def extract(input_text):
    ans_pattern = re.compile(r"答案是:(.)", re.S)

    problems = ans_pattern.findall(input_text)
    # print(problems)
    if(problems == ''):
        return 'A'
    return problems[0]

 续~

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值