使用PaddleNLP 从0构建一个属于你自己的心理大模型

项目源于:EmoLLM心理大模型,一直就有用paddle实践心理大模型的想法,终于实现了哈~。接下来就手把手带大家一块做一个心理大模型吧!!! 简单画了个框架图: 

环境配置

In [ ]

# !git clone -b develop https://github.com/PaddlePaddle/PaddleNLP.git
%cd PaddleNLP
!pip install -e .

# 为了解决一个环境依赖问题,在训练的时候随机出现的,稍微有点离谱,大概是环境的问题

%cd ~
# !git clone https://github.com/PaddlePaddle/PaddleSlim
%cd PaddleSlim/csrc
!python ./setup_cuda.py install 

数据集构建

参考飞桨大模型精调文档,PaddleNLP支持的数据格式是每行包含一个字典,每个字典包含以下字段:

  • src : str, List(str), 模型的输入指令(instruction)、提示(prompt),模型应该执行的任务。

  • tgt : str, List(str), 模型的输出。

多轮对话时如下:

{"src": ["user-1", "user-2", ..., "user-n"], "tgt": ["bot-1", "bot-2", ..., "bot-n"]}

为了使我们的心理大模型有更好的表达效果,我们必须要有高质量的数据集。自己构建数据集相当麻烦呜呜,因此决定借用文心大模型的强大能力,通过调用文心一言的API来生成对应的数据集。因为心理活动往往是复杂的,为了保证数据的多样性。我们选择了16 * 28 共 448个场景(如下)进行数据集生成,

emotions_list : [
        "钦佩",
        "崇拜",
        "欣赏",
        "娱乐",
        "焦虑",
        "敬畏",
        "尴尬",
        "厌倦",
        "冷静",
        "困惑",
        "渴望",
        "厌恶",
        "同情",
        "痛苦",
        "着迷",
        "嫉妒",
        "兴奋",
        "恐惧",
        "痛恨",
        "有趣",
        "快乐",
        "怀旧",
        "浪漫",
        "悲伤",
        "满意",
        "性欲",
        "同情",
        "满足"
    ]
areas_of_life : [
    "工作",
    "学业",
    "生活",
    "身体",
    "家人",
    "朋友",
    "社交",
    "恋爱",
    "就业",
    "责任",
    "爱好",
    "环境",
    "隐私",
    "安全",
    "梦想",
    "自由"
]

需要配置config.yml,将自己的访问令牌放入即可。

配置文心一言

In [ ]

!pip install erniebot

In [2]

import erniebot
erniebot.api_type = 'aistudio'
erniebot.access_token = "{个人中心的访问令牌}"#请输入自己的访问令牌

数据生成

In [ ]

import json
import random
import yaml 
import erniebot
with open('config.yml', 'r', encoding='utf-8') as f:
    configs = yaml.load(f.read(), Loader=yaml.FullLoader)

erniebot.api_type = 'aistudio'
#此处需要将你的token也就是AIstudio主页的访问令牌放到下方
erniebot.access_token = configs['aistudio _token']
system = configs['system']
areas_of_life = configs['areas_of_life']
emotions_list = configs['emotions_list']
words = ''
# prompt = '''
# 你是一个研究过无数具有心理健康问题的病人与心理健康医生对话案例的专家,请你构造一些符合实际情况的具有心理健康问题的病人和心理健康医生的多轮对话案例。要求医生的回复尽可能包含心理辅导知识,并且能够一步步诱导病人说出自己的问题进而提供解决问题的可行方案。注意,构造的数据必须以医生的陈述为结束语。请以如下格式返回生成的数据:
# 病人:病人的咨询或陈述
# 医生:医生的安抚和建议
# '''
res = []
for data in areas_of_life[:2]:
    for emo in emotions_list[:2]:
        print(f'正在为{data}_{emo}场景生成对应数据集')
        
        prompt = f'''你是一个研究过无数具有心理健康问题的病人与心理健康医生对话的专家,请你构造一些符合实际情况的具有心理健康问题的病人和心理健康医生的连续的多轮对话记录。
        要求病人的问题属于{data}场景,具有{emo}情感,医生的回复尽可能包含心理辅导知识,并且能够一步步诱导病人说出自己的问题进而提供解决问题的可行方案。
        注意,构造的数据必须以医生的陈述为结束语,每次只需要构造一个案例并且不需要写案例一、二等等,请返回完整的对话内容。
        请以如下格式返回生成的数据:
        病人:病人的咨询或陈述 
        医生:医生的安抚和建议
        '''
        try :
        for i in range(1):
            response = erniebot.ChatCompletion.create(
                model='erni
### 模型训练流程 PaddleNLP 提供了完整的工具链支持大型模型的训练、保存与测试,尤其在智能问答任务中表现优异。以基于Transformer架构的大模型为例,训练过程通常包括数据准备、模型构建、训练配置和启动训练等步骤。 首先,需要加载和预处理数据集。PaddleNLP 内置了多个常用 NLP 数据集的支持,例如 SQuAD、MS MARCO 等智能问答任务数据集,可以通过 `paddlenlp.datasets` 模块快速加载[^1]。 ```python from paddlenlp.datasets import load_dataset # 加载SQuAD数据集 train_ds, dev_ds = load_dataset('squad', splits=('train', 'dev')) ``` 接着,选择合适的模型结构并初始化。PaddleNLP 支持多种预训练模型,如 BERT、ERNIE、RoBERTa 等,并可通过 `paddlenlp.transformers` 接口直接调用[^1]。 ```python from paddlenlp.transformers import BertForQuestionAnswering, BertTokenizer # 初始化预训练模型和分词器 model = BertForQuestionAnswering.from_pretrained('bert-base-uncased') tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') ``` 完成模型定义后,可以使用 PaddlePaddle 的训练接口进行模型训练。PaddleNLP 与 PaddlePaddle 深度集成,支持自定义训练循环或使用内置的 `Trainer` 类简化训练流程[^1]。 ```python import paddle # 将数据转换为模型可接受的格式 def convert_example_to_feature(example): # 示例函数,实际需根据模型输入要求调整 encoded_inputs = tokenizer( example['question'], example['context'], max_seq_len=384, pad_to_max_seq_len=True) return encoded_inputs['input_ids'], encoded_inputs['token_type_ids'] # 构建数据加载器 train_data_loader = paddle.io.DataLoader( dataset=train_ds.map(convert_example_to_feature), batch_size=8, shuffle=True) # 设置优化器 optimizer = paddle.optimizer.AdamW(learning_rate=3e-5, parameters=model.parameters()) # 开始训练 for epoch in range(3): for step, (input_ids, token_type_ids) in enumerate(train_data_loader): loss = model(input_ids, token_type_ids) loss.backward() optimizer.step() optimizer.clear_grad() if step % 10 == 0: print(f"Epoch: {epoch}, Step: {step}, Loss: {loss.numpy()}") ``` ### 模型保存与加载 训练完成后,可以将模型参数保存到磁盘以便后续恢复或部署。PaddleNLP 建议使用 `paddle.save` 方法保存模型状态字典[^1]。 ```python # 保存模型 paddle.save(model.state_dict(), 'bert_qa_model.pdparams') # 加载模型 state_dict = paddle.load('bert_qa_model.pdparams') model.set_state_dict(state_dict) ``` ### 模型测试与评估 测试阶段主要通过验证集或测试集评估模型性能。PaddleNLP 提供了丰富的评估指标,如 BLEU、ROUGE、Exact Match(EM)等,适用于不同类型的生成和分类任务。 ```python from paddlenlp.metrics import Accuracy metric = Accuracy() # 假设已经完成前向推理得到预测结果 preds = model(input_ids, token_type_ids) labels = ... # 实际标签 correct = metric.compute(preds, labels) metric.update(correct) acc = metric.accumulate() print(f"Validation Accuracy: {acc}") ``` 此外,PaddleNLP 还支持通过 `paddlenlp.pipeline` 模块构建端到端的推理流水线,便于在真实场景中部署问答系统。 ### 高性能推理加速 值得一提的是,PaddleNLP 通过 PaddlePaddle 自定义 op(算子)的形式接入了 FasterTransformer,并支持多种 transformer 模型用于各种 NLP 任务,从而显著提升推理效率。用户可以轻松切换至高性能模式以获得更快的响应速度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

军哥说AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值