84 lines
5.0 KiB
Markdown
84 lines
5.0 KiB
Markdown
|
|
# 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 在多个场景下的表现均优于基线模型,特别是在心理健康相关的问题上,模型能够提供准确且逻辑严谨的回答。
|
|||
|
|
|
|||
|
|
## 模型推理
|
|||
|
|
```python
|
|||
|
|
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](https://github.com/Kedreamix/Xinjing-LM)
|
|||
|
|
|