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

任务要求:

一、大模型的认识

大语言模型的概念

大语言模型(英文:Large Language Model,缩写LLM),也称大型语言模型,是一种人工智能模型,旨在理解和生成人类语言。

通常,大语言模型 (LLM) 指包含数十亿Billion或更多)参数的语言模型,这些模型在大量的文本数据上进行训练,例如国外的有GPT-3 、GPT-4、PaLM 、Galactica 和 LLaMA 等,国内的有ChatGLM、文心一言、通义千问、讯飞星火等。

大模型的能力和特点

  1. 大模型的能力

大语言模型(LLM)与以前的预训练语言模型(PLM)的主要区别在于其涌现能力。这种能力在小型模型中不明显,但在大型模型中显著。例如:

  • 上下文学习:首次由GPT-3引入,允许模型在提供自然语言指令或多个任务示例的情况下,通过理解上下文并生成相应输出来执行任务。

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

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

  1. 大模型的特点

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

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

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

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

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

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

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

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

 常用方法------提示工程(Prompt Engineering)

提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。

研究人员可利用提示工程来提升大语言模型处理复杂任务场景的能力,如问答和算术推理能力。开发人员可通过提示工程设计、研发强大的工程技术,实现和大语言模型或其他生态工具的高效接轨。

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

二、代码介绍

安装需要的库

配置好API:dashscope.api_key="sk-"

导入需要的环境,包括日志处理、多线程、api请求等相关库引入。

import json
import os
from pprint import pprint
import re
from tqdm import tqdm
import random

import uuid
import openai
import tiktoken
import json
import numpy as np
import requests
from retry import retry
from scipy import sparse
#from rank_bm25 import BM25Okapi
#import jieba
from http import HTTPStatus
import dashscope

from concurrent.futures import ThreadPoolExecutor, as_completed
from loguru import logger
import json
import time
from tqdm import tqdm

logger.remove()  # 移除默认的控制台输出
logger.add("logs/app_{time:YYYY-MM-DD}.log", level="INFO", rotation="00:00", retention="10 days", compression="zip")

MODEL_NAME = 'qwen2-7b-instruct'

3.2 答案生成部分

3.2.1 大模型部分

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

def call_qwen_api(MODEL_NAME, query):
    # 这里采用dashscope的api调用模型推理,通过http传输的json封装返回结果
    messages = [
        {'role': 'user', 'content': query}]
    response = dashscope.Generation.call(
        MODEL_NAME,
        messages=messages,
        result_format='message',  # set the result is message format.
    )
    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
大模型部分
  • API配置:这是与大模型交互的基础,确保程序能够正确地向模型发送请求和接收响应。

  • retry模块:保证程序在遇到请求失败时能够自动重试,提高程序的稳定性和可靠性。

  • prompt配置:这是确保大模型能够理解和正确响应请求的关键,合适的提示(prompt)可以引导模型生成更准确的输出。

答案生成部分
  • 答案抽取:从大模型的输出中提取有用的答案或信息,这是整个流程中至关重要的一步,因为它直接影响到最终结果的质量。

  • 多线程处理:通过并行处理提高效率,使得多个请求可以同时进行,加快整个处理过程。

这两个部分是整个流程中最关键的,因为它们直接影响到模型的响应质量和处理效率。如果模型的配置不正确或提示(prompt)设计得不好,模型可能无法生成有用的输出。同样,如果答案生成部分处理不当,即使模型的输出是高质量的,最终结果也可能不准确或不完整。

纠错与结果生成部分

纠错与结果生成部分”是确保大模型输出的准确性和完整性的关键环节,是整个大模型应用流程中的后期处理阶段,它确保了模型输出的可靠性和可用性。通过这一部分的处理,可以显著提高最终输出的质量,满足用户或系统的需求

目的
  1. 确保准确性:纠正模型输出中可能存在的错误,提高答案的质量。

  2. 保证完整性:检查并补全缺失的信息,确保输出的完整性。

  3. 格式统一:统一输出格式,使其符合预期的规范或标准。

  4. 生成最终结果:生成最终的输出文件,供进一步分析或使用。

工作原理。
  1. 答案去重与重排

    1. 去重:识别并删除重复的答案,避免输出中出现冗余信息。

    2. 重排:根据特定的逻辑或标准对答案进行排序或重新排列,以提高可读性和逻辑性。

  2. 缺失检测与补全

    1. 检测:分析模型输出,识别其中可能缺失的信息或数据。

    2. 补全:对于检测到的缺失部分,根据上下文信息或已知数据进行补充。这可能涉及到使用默认值、从其他数据源获取信息,或者重新查询模型。

  3. 最终文件生成

    1. 整合:将经过纠错和格式化处理的答案整合到一个文件中。

    2. 保存:选择合适的文件格式(如TXT、PDF、Word文档等)保存最终结果。

    3. 验证:在保存之前,对最终文件进行验证,确保所有要求都已满足。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值