基于qwen模型实现大模型应用探索-党务知识小助手

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 本项目基于qwen2-7b-instruct模型,采用LoRA技术,在党务知识数据集与通用数据集上进行微调,专为党务领域问答设计,涵盖党员教育等场景。通过数据准备、模型微调、推理测试及部署应用。

本模型基于qwen2-7b-instruct模型,通过LoRA的训练方式,在党务知识数据混合通用数据的数据集上进行微调,适用于党务领域问答任务;包括但不局限于党员、入党积极分子分子学习等场景。

目录

  • 数据准备
  • 微调
  • 推理
  • 部署
  • 智能体应用

数据准备

数据集采自党务问答网中的对话,利用python脚本获取提问,人工筛选问题答案。经训练后,发现遗忘问题严重。为解决该问题,我们在重新筛选党务知识数据集的基础上,将党务数据集混合通用微调数据集通用微调数据集进行训练,训练效果明显好转。
获取党务知识数据的问题代码如下:

import requests  
from bs4 import BeautifulSoup  
import pandas as pd  

base_url = "https://wenda.12371.cn/liebiao.php?mod=forumdisplay&fid=3"  
page = 1  
def fetch_page(url):  
    headers = {
     
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'  
  }  
    response = requests.get(url, headers=headers)  
    response.raise_for_status()  
    return response.text  
def parse_page(html):  
    soup = BeautifulSoup(html, 'html.parser')  
    items = soup.find_all('li', id=lambda x: x and x.startswith('normalthread_'))  
    data = []  
    for item in items:  
        title_tag = item.find('p', class_='questionTit')  

        title = title_tag.get_text(strip=True) if title_tag else 'N/A'  
  data.append({
   'title': title})  

    next_page = soup.find('a', class_='next')  
    next_page_url = next_page['href'] if next_page else None  

 return data, next_page_url  

def main():  
    global base_url  
    global page  
    all_data = []  
    while True:  
        url = f"{base_url}&page={page}"  
  html = fetch_page(url)  
        data, next_page_url = parse_page(html)  
        print(data[0]['title'])  
        all_data.extend(data)  

        if next_page_url:  
            base_url = f"https://wenda.12371.cn/{next_page_url}"  
  page += 1  
  else:  
            break  

 for item in all_data:  
        print(item['title'])  

    df = pd.DataFrame(all_data)  
    df.to_excel("D:\\dangwu\\问题收集.xlsx", index=False, engine='openpyxl')  

if __name__ == "__main__":  
    main()

数据集格式采用如下对话形式:

{
    "from": "user",
    "value": "介绍一下自己"
},
{
    "from": "assistant",
    "value": "我是皮皮,由ModelScope开源模型应用挑战赛--外星人战队训练的人工智能党务知识小助手。我的目标是为用户提供有用、准确和及时的信息,并通过各种方式帮助用户进行有效的沟通。请告诉我有什么可以帮助您的呢?"
}
{
    "from": "user",
    "value": "线上转党组织关系,超过天未接收会怎么样?十二月份发起党组织关系转接,但接收地支部名称有误,导致接收地系统无法收到转接命令,期间由于系统问题,十二月和一月系统始终无法正常登录。请问这种情况下超过六十天未被接收会怎样,应该怎样解决呢?"
},
{
    "from": "assistant",
    "value": "线上的流程,里面也是有转接日期的时间限制,一般不超过个月,超过了期限,介绍信无效。解决方式:原流程作废,重新发起组织关系转移的流程。"
}
{
    "from": "user",
    "value": "党支部纪检委员必须单设吗?如果不必须单设,是可以组织委员兼任还是宣传委员兼任,或者是都可以?"
},
{
    "from": "assistant", 
    "value": "要求必须设置,可以由其他委员兼任。不建议组织委员兼任,一般由宣传委员兼任。"
}

数据集格式处理脚本代码如下:

import json  
import os  
import re  
def remove_non_chinese_chars(text):  
    return re.sub(r'[^\u4e00-\u9fa5,。!?、;:“”‘’()《》【】]', '', text)  

seen_client_data = set()  
def Fuc(path,output_file)  :  
    global seen_client_data  
    with open(path, 'r', encoding='utf-8') as infile:  
        original_data = json.load(infile)  

    output=""  
  user_count = 0  
  assistant_count = 0  
  for item in original_data:  
        content = remove_non_chinese_chars(item["content"])  
        if item["role"] == "client":  
            if content in seen_client_data:  
                return  
  seen_client_data.add(content)  
            data="{\\\"from\\\": \\\"user\\\", \\\"value\\\": \\\""+content+"\\\"}, "  
  user_count += 1  
  if (user_count - assistant_count != 1):  
            return  
 if item["role"]=="counselor" :  
            data = "{\\\"from\\\": \\\"assistant\\\", \\\"value\\\": \\\"" + content + "\\\"}, "  
  assistant_count += 1  
  output=output+data  
  if (user_count != assistant_count):  
        return  
  output="{\"conversations\": \"["+output+"]\", \"origin\": \"[]\"}"  
  output=output[:-21]+output[-19:]  
    with open(output_file, 'a', encoding='utf-8') as outfile:  
        outfile.write(output + '\n')  
    # print(output)  

folder_path = "C:\\Users\\86183\\Desktop\\data"  
output_file = "C:\\Users\\86183\\Desktop\\output.txt"  

try:  
    files_and_dirs = os.listdir(folder_path)  

    files = [f for f in files_and_dirs if os.path.isfile(os.path.join(folder_path, f))]  

    for file in files:  
        Fuc(os.path.join(folder_path, file), output_file)  
except FileNotFoundError:  
    print(f"文件夹 {folder_path} 未找到。")  
except PermissionError:  
    print(f"没有权限访问文件夹 {folder_path}。")  
except Exception as e:  
    print(f"发生错误: {e}")

最后将处理好的数据集上传至ModelScope数据集,可直接在微调参数中使用。

微调

该党务知识小助手基于qwen2-7b-struct大模型,为节省显存,我们采用LoRA微调方法。
系统:采用modelscope:1.16.1-pytorch2.3.0tensorflow2.16.1-gpu-py310-cu121-ubuntu22.04镜像
显卡:NVIDIA A10
模型:qwen2-7b-instruct
框架:魔搭轻量训推框架SWIFT 接链接https://github.com/modelscope/ms-swift
显存:最高达到20.54G的显存占用
训练时长: 2d 20h 6m
用于训练的脚本如下:

CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model_type qwen2-7b-instruct \
    --sft_type lora \
    --output_dir output \
    --dataset output_dataset \
    --num_train_epochs 1 \
    --max_length 1024 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules ALL \
    --gradient_checkpointing true \
    --batch_size 1 \
    --learning_rate 5e-5 \
    --gradient_accumulation_steps 16 \
    --max_grad_norm 1.0 \
    --warmup_ratio 0.03 \
    --eval_steps 100 \
    --save_steps 100 \
    --save_total_limit 2 \
    --logging_steps 10

训练效果

eval_loss和eval_acc效果如下:
eval_loss.png
eval_acc (1).png

横轴为训练步数,纵轴分别为残差值和准确率

推理

推理脚本如下:

swift infer --ckpt_dir output/qwen2-7b-instruct/v0-20240902-123232/checkpoint-27400

best checkpoint

我们采用人工评估的方式看看大模型的训练效果,我们将展示第一次获取的党务数据集和最后经完善的混合数据集。
党务知识数据集推理效果:
微调后推理.png

回答效果不尽人意。
混合数据集推理效果:
infer西湖醋鱼.png

infer入党.png

通过对比,回答效果明显好转。
该党务知识问答模型已经上传至ModelScope党务知识问答小助手

部署

部署脚本如下:

swift deploy --ckpt_dir output/qwen2-7b-instruct/v0-20240902-123232/checkpoint-27400

部署成功页面如下:
deploy.png

智能体应用

上面我们已经把模型微调好了,接下来就是如何将我们微调好的模型部署上传到Modelscope的创空间上面去。下面是部署代码。

import os
import gradio as gr
from modelscope import AutoTokenizer, snapshot_download
from modelscope import AutoModelForCausalLM
import torch

modelscope_model_path = "lzjune0315/competition"
model_path = snapshot_download(modelscope_model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.float16,  
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_path)

def generate_party_answer(prompt, tokenizer, model):
    model_inputs = tokenizer([prompt], return_tensors="pt").to(model.device)
    generated_ids = model.generate(
        model_inputs.input_ids,
        max_new_tokens=64  
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    return response

def process_party_knowledge(question, progress=gr.Progress()):
    progress(0, desc="开始处理")
    input_prompt = "党务知识问题:" + question + " 答案:"
    response = generate_party_answer(input_prompt, tokenizer, model)
    return response

demo = gr.Interface(fn=process_party_knowledge,
                    inputs=[gr.Textbox(label="党务知识问题", lines=10)],
                    outputs=[gr.Textbox(label="答案", lines=10)],
                    title="党务知识问答小助手",
                    description="请在左边对话框输入你的党务知识问题并点击‘Submit’按钮,耐心等待一会儿,右边的对话框将显示答案。")
demo.launch()

下载模型

modelscope_model_path: 即我们微调后上传至Modelscope模型的路径
snapshot_download(): 从ModelScope平台下载指定路径下的模型

加载模型和分词器

AutoModelForCausalLM.from_pretrained: 从指定路径加载预训练的因果语言模型
AutoTokenizer.from_pretrained: 加载与模型对应的分词器

定义生成党务知识答案的函数

tokenizer([prompt], return_tensors="pt"): 将输入文本转化为模型可以处理的张量格式
model.generate: 使用模型生成回答,生成最多64个新词
batch_decode: 将生成的ID序列转回人类可读的文本

定义处理函数

process_party_knowledge: 处理用户问题并生成答案的函数

创建Gradio接口

gr.Interface: 创建一个交互式网页界面

该智能体应用已经部署到创空间党务知识问答小助手

目录
相关文章
|
8月前
|
机器学习/深度学习 自然语言处理 机器人
【RAG实践】基于LlamaIndex和Qwen1.5搭建基于本地知识库的问答机器人
LLM会产生误导性的 “幻觉”,依赖的信息可能过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。
|
14天前
|
人工智能 自然语言处理 Go
[langchaingo] 智谱GLM-4在线模型体验
本文介绍如何使用Go语言版的Langchain框架——langchaingo,结合清华大学KEG实验室开发的GLM-4模型,在本地运行AI项目。GLM-4是一个先进的自然语言处理模型,支持多种任务。通过智谱AI开放平台注册可获1000w token用于测试。文章展示了langchaingo的基本配置、构建聊天内容及生成回复的过程,并简要总结了项目的现状和未来更新计划。
71 14
|
4月前
|
机器学习/深度学习 人工智能 分布式计算
使用PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建文旅领域知识问答机器人
本次教程介绍了如何使用 PAI ×LLaMA Factory 框架,基于全参方法微调 Qwen2-VL 模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
使用PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建文旅领域知识问答机器人
|
23天前
|
编解码 机器人 测试技术
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
|
2月前
|
数据采集 前端开发 API
基于Qwen2大模型实现的中药智能化筛选助手
本文介绍了利用大语言模型微调技术在中药方剂智能化筛选与优化中的应用。项目涵盖微调环境搭建、数据预处理、智能体构建及效果评估等环节,展示了模型在生成新中药方剂上的创新能力和实用性。
基于Qwen2大模型实现的中药智能化筛选助手
|
2月前
|
自然语言处理 数据可视化 数据安全/隐私保护
基于qwen2.5 Instruct的智能法庭预研
基于Qwen-2.5 Instruct的大模型智能法庭预研,旨在通过智能化手段提高庭审效率、确保司法公正、降低运营成本。核心功能涵盖智能庭审助手、文书生成、案件检索与分析及智能协作平台,利用自然语言处理、多模态融合等技术,实现庭审记录实时生成、法律条款动态匹配、证据多维度解析等,服务于民事、刑事及行政案件。项目注重数据安全与隐私保护,同时规划了智能仲裁平台、跨区域法庭协作等未来扩展方向,为构建高效、公正的智慧司法体系奠定基础。
|
6月前
|
人工智能 JSON 自然语言处理
国内大模型LLM选择以及主流大模型快速使用教程[GLM4/Qwen/Baichuan/Coze/Kimi]
【7月更文挑战第7天】国内大模型LLM选择以及主流大模型快速使用教程[GLM4/Qwen/Baichuan/Coze/Kimi]
279 10
国内大模型LLM选择以及主流大模型快速使用教程[GLM4/Qwen/Baichuan/Coze/Kimi]
|
6月前
|
自然语言处理 开发者
通义语音大模型评测:CosyVoice与SenseVoice
随着人工智能技术的不断发展,语音生成和理解模型在各个领域得到了广泛应用。本文将评测两个由FunAudioLLM团队开发的多语言语音模型——[CosyVoice](https://github.com/FunAudioLLM/CosyVoice)和[SenseVoice](https://github.com/FunAudioLLM/SenseVoice),并结合阿里云开发者社区的相关资源,探讨其在实际应用中的表现。
1842 3
|
5月前
|
机器学习/深度学习 人工智能 编解码
【机器学习】阿里Qwen-VL:基于FastAPI私有化部署你的第一个AI多模态大模型
【机器学习】阿里Qwen-VL:基于FastAPI私有化部署你的第一个AI多模态大模型
943 0
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人
Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人
90 0

热门文章

最新文章