# 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" 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)