Model: cccbond/Qwen2.5_3B_Psychology Source: Original Platform
PsyCompanion 心理健康大模型
PsyCompanion 是一个专注于心理健康领域的智能助手,基于 Qwen 模型进行微调和优化,旨在理解复杂的心理学知识、生成高质量文本并支持多轮对话。通过数据蒸馏、指令微调和多轮对话构建等技术,在心理健康场景中表现出色,能够为用户提供准确、流畅且逻辑严谨的心理学相关建议。
项目亮点
- 多源数据融合:结合开源数据集与 AI 合成数据,确保模型在多样性和专业性上的平衡。
- 多轮对话构建:通过情感类型和生活场景的组合生成对话数据,提升模型在实际应用中的交互能力。
- 高效微调策略:采用全参数微调与 LoRA 技术相结合的方式,在保证性能的同时降低计算资源消耗。
- 数据蒸馏优化:利用 DeepSeek R1 生成的高质量数据,进一步提升模型的推理效率和准确性。
- 数据打分:通过Qwen2.5-72B-Instruct进行无害性、有用性、完整性三维度评分,采用Top 40%评分筛选策略,清洗低质量数据,提高训练集平均数据质量评分。
数据集处理
所有数据集处理的代码都位于 data_gen 目录下,配置文件则位于 configs 目录中。
数据集
我们使用了以下数据集进行模型训练和优化:
- Chinese-Data-Distill-From-R1:开源中文蒸馏数据集,涵盖数学、考试、STEM 和通用类型数据。
- psychology-10k-sft:包含 10,000 条心理学相关指令微调数据。
- psychology-10k-sft-zh:将 psychology-10k-sft 的英文数据翻译为中文。
- 心理健康-R1蒸馏中文数据集-10k:利用 DeepSeek R1 生成的心理健康相关推理数据。
模型选择与微调
我们选择了 Qwen2.5-3B-Instruct 作为基础模型,并采用了全参数微调与 LoRA 技术进行优化。微调后的模型在心理健康领域的表现显著提升,能够处理复杂的心理学场景和多轮对话。
实验结果
PsyCompanion 在多个场景下的表现均优于基线模型,特别是在心理健康相关的问题上,模型能够提供准确且逻辑严谨的回答。
模型推理
from modelscope import AutoModelForCausalLM, AutoTokenizer
import torch
model_path = "cccbond/Qwen2.5_3B_Psychology"
model = AutoModelForCausalLM.from_pretrained(model_path,
torch_dtype=torch.bfloat16,
# device_map={"": 0})
# attn_implementation="flash_attention_2",
device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_path)
def test_model(model, tokenizer, max_length=2048):
prompts = [
"我在职业生涯中遇到了一些困难,我应该如何提升自己",
"我最近一直感到非常焦虑,但不知道原因是什么",
"最近总感觉学习效率很低,明明在书桌前坐了一整天,但知识完全进不去脑子",
"最近每次要主持部门会议前都会手脚发冷,昨天甚至躲在洗手间直到会议开始才敢出来",
"我的个人生活比较单调,每天晚上都胡思乱想睡不着觉",
]
text = [f"<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n<think>" for prompt in prompts]
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True).to(model.device)
outputs = model.generate(**inputs, max_length=max_length) # 使用max_length限制生成的长度
response = tokenizer.batch_decode(outputs, skip_special_tokens=True, ) # 跳过特殊token
for prompt, response in zip(prompts, response):
print(f"Prompt: {prompt}")
print(f"Response: {response.strip()}")
print("="*10)
tokenizer.pad_token = tokenizer.eos_token # 设置pad token
tokenizer.padding_side = 'left' # 设置padding_side为'left'
max_new_tokens = 2048 # 生成最大长度
test_model(model, tokenizer, max_length=max_new_tokens)
评估结果
评估指标包括:
- BLEU-4。 BLEU(Bilingual Evaluation Understudy)是一种常用的用于评估机器翻译质量的指标。BLEU-4 表示四元语法 BLEU 分数,它衡量模型生成文本与参考文本之间的 n-gram 匹配程度,其中 n=4。值越高表示生成的文本与参考文本越相似,最大值为 100。
- rouge-1 和 rouge-2。 ROUGE(Recall-Oriented Understudy for Gisting Evaluation)是一种用于评估自动摘要和文本生成模型性能的指标。ROUGE-1 表示一元 ROUGE 分数,ROUGE-2 表示二元 ROUGE 分数,分别衡量模型生成文本与参考文本之间的单个词和双词序列的匹配程度。值越高表示生成的文本与参考文本越相似,最大值为 100。
- rouge-l。 ROUGE-L 衡量模型生成文本与参考文本之间最长公共子序列(Longest Common Subsequence)的匹配程度。值越高表示生成的文本与参考文本越相似,最大值为 100。
参考链接
- 代码仓库:GitHub
Description