Datawhale X 魔搭 AI夏令营---大模型应用开发


前言

大模型应用开发内容包括:

  • 大模型部署【搭建你的智能编程助手】
  • 大模型RAG实战【搭建你的AI科研助手】
  • 大模型微调实战【搭建你的AI简历助手】

一个大模型应用的基本架构
在这里插入图片描述

Task4:源大模型微调实战-知识点文档

引导问题

  • RAG之所以能解决大模型幻觉的问题,很大原因是充分调用了大模型的能力
  • 如果大模型在当前任务上能力不佳,如何提升其能力?
  • 另外,怎么使大模型学习其本身不具备的能力呢?

大模型微调技术简介

模型微调也被称为指令微调(Instruction Tuning)或者有监督微调(Supervised Fine-tuning, SFT),该方法利用成对的任务输入与预期输出数据,训练模型学会以问答的形式解答问题,从而解锁其任务解决潜能。经过指令微调后,大语言模型能够展现出较强的指令遵循能力,可以通过零样本学习的方式解决多种下游任务。

相较于预训练所需的海量数据,指令微调所需数据量显著减少,从几十万到上百万条不等的数据,均可有效激发模型的通用任务解决能力,甚至有研究表明,少量高质量的指令数据(数千至数万条)亦能实现令人满意的微调效果。这不仅降低了对计算资源的依赖,也提升了微调的灵活性与效率。

然而,由于大模型的参数量巨大, 进行全量参数微调需要消耗非常多的算力。为了解决这一问题,研究者提出了参数高效微调(Parameter-efficient Fine-tuning),也称为轻量化微调 (Lightweight Fine-tuning),这些方法通过训练极少的模型参数,同时保证微调后的模型表现可以与全量微调相媲美。
常用的轻量化微调技术有LoRA、Adapter 和 Prompt Tuning。

LoRA与RAG

LoRA用于模型微调:当有一个大型预训练模型时,可以通过LoRA技术进行微调以适应特定的任务或领域,而不必重新训练整个模型。
RAG用于知识增强:即使模型经过了LoRA微调,也可能缺乏某些特定领域的详细知识。此时,RAG技术可以用来检索相关领域的专业知识,并将其融入到生成的文本中,从而提升输出质量。
例如,在构建一个客服问答系统时,可以先使用LoRA技术针对客服领域的常见问题进行微调,以适应特定的业务需求。然后,为了进一步提高回答的准确性和详细程度,可以使用RAG技术检索公司的产品手册、FAQ列表等文档中的信息,并将这些信息整合到回答中。

lora
LoRA 是通过低秩矩阵分解,在原始矩阵的基础上增加一个旁路矩阵,然后只更新旁路矩阵的参数。
在这里插入图片描述
rag
RAG通常包括以下三个基本步骤:

  • 索引:将文档库分割成较短的 Chunk,即文本块或文档片段,然后构建成向量索引。
  • 检索:计算问题和 Chunks 的相似度,检索出若干个相关的 Chunk。
  • 生成:将检索到的Chunks作为背景信息,生成问题的回答。
    在这里插入图片描述

源2.0-2B 微调实战

技术架构

项目主要包含一个Streamlit开发的客户端,以及一个部署好微调后的浪潮源大模型的服务端。
客户端接收到用户请求后,首先进行Prompt拼接,然后输入到服务端的浪潮源大模型,得到模型输出结果后,返回给客户端进行结构化,然后展示给用户
在这里插入图片描述

效果图

在这里插入图片描述

开发预期

使用一个简历命名实体识别的数据集进行微调,进而开发一个AI简历助手,进而可以批量地自动识别并提取简历中的关键信息(如姓名、教育背景、工作经历等),提升简历处理的效率。

具体来说,输入一个摘录自某简历的句子,模型需要识别出所有的命名实体。实体的类别包括:姓名(NAME)、国籍(CONT)、种族(RACE)、职位(TITLE)、教育背景(EDU)、专业(PRO)、组织名(ORG)、地名(LOC)。原始的数据来自于BAAI/COIG-PC-Lite。

示例代码

pip install streamlit==1.24.0
streamlit run Task\ 4\ 案例:AI简历助手.py --server.address 127.0.0.1 --server.port 6006

# 导入所需的库
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
import streamlit as st
from peft import PeftModel
import json
import pandas as pd

# 创建一个标题和一个副标题
st.title("💬 Yuan2.0 AI简历助手")

# 源大模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('IEITYuan/Yuan2-2B-Mars-hf', cache_dir='./')

# 定义模型路径
path = './IEITYuan/Yuan2-2B-Mars-hf'
lora_path = './output/Yuan2.0-2B_lora_bf16/checkpoint-51'

# 定义模型数据类型
torch_dtype = torch.bfloat16 # A10
# torch_dtype = torch.float16 # P100

# 定义一个函数,用于获取模型和tokenizer
@st.cache_resource
def get_model():
    print("Creat tokenizer...")
    tokenizer = AutoTokenizer.from_pretrained(path, add_eos_token=False, add_bos_token=False, eos_token='<eod>')
    tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'], special_tokens=True)

    print("Creat model...")
    model = AutoModelForCausalLM.from_pretrained(path, torch_dtype=torch_dtype, trust_remote_code=True).cuda()
    model = PeftModel.from_pretrained(model, model_id=lora_path)

    return tokenizer, model

# 加载model和tokenizer
tokenizer, model = get_model()

template = '''
# 任务描述
假设你是一个AI简历助手,能从简历中识别出所有的命名实体,并以json格式返回结果。

# 任务要求
实体的类别包括:姓名、国籍、种族、职位、教育背景、专业、组织名、地名。
返回的json格式是一个字典,其中每个键是实体的类别,值是一个列表,包含实体的文本。

# 样例
输入:
张三,男,中国籍,工程师
输出:
{"姓名": ["张三"], "国籍": ["中国"], "职位": ["工程师"]}

# 当前简历
query

# 任务重述
请参考样例,按照任务要求,识别出当前简历中所有的命名实体,并以json格式返回结果。
'''

# 在聊天界面上显示模型的输出
st.chat_message("assistant").write(f"请输入简历文本:")

# 如果用户在聊天输入框中输入了内容,则执行以下操作
if query := st.chat_input():

    # 在聊天界面上显示用户的输入
    st.chat_message("user").write(query)

    # 调用模型
    prompt = template.replace('query', query).strip()
    prompt += "<sep>"
    inputs = tokenizer(prompt, return_tensors="pt")["input_ids"].cuda()
    outputs = model.generate(inputs, do_sample=False, max_length=1024) # 设置解码方式和最大生成长度
    output = tokenizer.decode(outputs[0])
    response = output.split("<sep>")[-1].replace("<eod>", '').strip()

    # 在聊天界面上显示模型的输出
    st.chat_message("assistant").write(f"正在提取简历信息,请稍候...")

    st.chat_message("assistant").table(pd.DataFrame(json.loads(response)))

训练与实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值