qiuhuachuan commited on
Commit
b2092f7
1 Parent(s): e18b6c6

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +111 -63
README.md CHANGED
@@ -6,97 +6,143 @@ tags:
6
  - mental health
7
  ---
8
 
9
- # A new model is coming soon.
10
 
11
- # Welcome to MeChat! 🤗
12
 
13
- 我是 MeChat (**Me**ntal Health **Chatbot**),由西湖大学深度学习实验室开发的心理健康支持对话陪伴机器人,基于 ChatGLM2-6B + LoRA 技术微调,采用的语料是 [SmileChat](https://github.com/qiuhuachuan/smile)。
14
 
15
- 作为一款心理健康支持对话陪伴机器人,我能够和你聊天,提供情感支持和心理疏导。
16
 
 
17
 
18
- ## 体验地址: https://mechat.fly.dev/ http://47.97.220.53:8080/
 
 
 
 
 
 
 
 
 
 
 
19
 
20
- ## GitHub
21
  https://github.com/qiuhuachuan/smile
22
 
23
- ## Code
24
- ```Python
25
- import os
26
 
27
- os.environ['CUDA_VISIBLE_DEVICES'] = '6'
28
 
29
- import torch
30
- from transformers import AutoTokenizer, AutoModel
31
 
32
- from peft import PeftModel
33
 
34
- model = AutoModel.from_pretrained('THUDM/chatglm-6b',
35
- revision='v0.1.0',
36
- trust_remote_code=True)
37
- LaRA_PATH = 'qiuhuachuan/MeChat'
38
- model = PeftModel.from_pretrained(model, LaRA_PATH)
39
- model = model.float().to(device='cuda')
 
 
 
40
 
41
- tokenizer = AutoTokenizer.from_pretrained('THUDM/chatglm-6b',
42
- trust_remote_code=True)
43
 
 
44
 
45
- def format_example(example: dict) -> dict:
46
- context = f'''Input: {example['input']}\n'''
 
 
 
 
 
47
 
48
- return {'context': context, 'target': ''}
49
 
 
50
 
51
- def generate_response(data: dict):
52
- with torch.no_grad():
53
- feature = format_example(data)
54
- input_text = feature['context']
55
- ids = tokenizer.encode(input_text)
56
- input_length = len(ids)
57
- input_ids = torch.LongTensor([ids]).to(device='cuda')
58
 
59
- out = model.generate(input_ids=input_ids,
60
- max_length=2040,
61
- do_sample=True,
62
- temperature=0.9,
63
- top_p=0.9)
64
 
65
- true_out_text = tokenizer.decode(out[0][input_length:])
66
 
67
- answer = true_out_text.replace('\nEND', '').strip()
68
- return answer
69
 
 
 
 
70
 
71
- data = []
72
  while True:
73
- seeker_msg = input('求助者:')
74
- data.append({'owner': 'seeker', 'msg': seeker_msg})
75
- input_str = ''
76
- for item in data:
77
- if item['owner'] == 'seeker':
78
- input_str += '求助者:' + item['msg']
79
- else:
80
- input_str += '支持者:' + item['msg']
81
- input_str += '支持者:'
82
- while len(input_str) > 2000:
83
- if input_str.index('求助者:') > input_str.index('支持者:'):
84
- start_idx = input_str.index('求助者:')
85
- else:
86
- start_idx = input_str.index('支持者:')
87
- input_str = input_str[start_idx:]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
- wrapped_data = {'input': input_str}
 
 
 
 
 
 
90
 
91
- response = generate_response(data=wrapped_data)
92
- print(f'支持者:{response}')
93
- supporter_msg = {'owner': 'supporter', 'msg': response}
94
- data.append(supporter_msg)
 
95
  ```
96
 
97
  ## 引用
98
 
99
- 如果你觉得我们的工作有帮助的话,请考虑引用下列论文:
 
100
  ```
101
  @misc{qiu2023smile,
102
  title={SMILE: Single-turn to Multi-turn Inclusive Language Expansion via ChatGPT for Mental Health Support},
@@ -110,7 +156,7 @@ while True:
110
 
111
  ## 免责声明
112
 
113
- 我们的心理健康支持对话机器人(以下简称“机器人”)旨在为用户提供情感支持和心理健康建议。然而,机器人不是医疗保健专业人员,不能替代医生、心理医生或其他专业人士的意见、诊断、建议或治疗。
114
 
115
  机器人提供的建议和信息是基于算法和机器学习技术,可能并不适用于所有用户或所有情况。因此,我们建议用户在使用机器人之前咨询医生或其他专业人员,了解是否适合使用此服务。
116
 
@@ -128,4 +174,6 @@ while True:
128
 
129
  5. 用户应保护个人隐私,不应在使用机器人服务时泄露个人敏感信息或他人隐私。
130
 
131
- 最后,我们保留随时修改、更新、暂停或终止机器人服务的权利,同时也保留对本免责声明进行修改、更新或补充的权利。如果用户继续使用机器人服务,即视为同意本免责声明的全部内容和条款。
 
 
 
6
  - mental health
7
  ---
8
 
 
9
 
10
+ # 中文心理健康支持对话数据集(SmileChat)与大模型(MeChat)
11
 
12
+ <img src="https://img.shields.io/badge/Version-1.0-brightgreen" /> <img src="https://img.shields.io/badge/python-3.8+-blue.svg" /> <a href='https://arxiv.org/pdf/2305.00450.pdf'><img src='https://img.shields.io/badge/ArXiv-2305.00450-red'></a>
13
 
14
+ ## 项目简介
15
 
16
+ 🎉🎉🎉 **Here, we present an enhanced (large-scale, lifelike, diverse and high-quality) version of our SmileChat dataset.**
17
 
18
+ **MeChat** (**Me**ntal Health Support **Chat**bot)
19
+
20
+ 我们的愿景是为让所有人在遇到心理健康问题时能够获得及时、有效的倾听和支持。我们相信,心理健康是每个人的权利,而不是奢侈品。我们的使命是**为人们提供平等、全面、易于访问的心理健康服务**,无论他们身在何处、面临何种挑战。我们的愿景还包括推动社会对心理健康问题的认识和理解,**打破心理健康问题带来的污名和歧视**,为创建一个更加健康、包容和平等的社会做出贡献。
21
+
22
+ **数据集说明**:数据集通过 ChatGPT 改写真实的心理互助 QA 为多轮的心理健康支持多轮对话(single-turn to multi-turn inclusive language expansion via ChatGPT),该数据集**SmileChat**含有 **55,165k** 个多轮对话,其对话主题、词汇和篇章语义更加丰富多样,更加符合在长程多轮对话的应用场景。数据目录说明如下:
23
+
24
+ 本项目开源的**中文心理健康支持模型**由 ChatGLM2-6B LoRA 指令微调得到。数据集通过扩展**真实的心理互助 QA**为多轮的心理健康支持多轮对话,提高了通用语言大模型**在心理健康支持领域的表现**,更加符合在长程多轮对话的应用场景。
25
+
26
+ > 作为一款心理健康支持对话陪伴机器人,我能够和你聊天,提供情感支持和心理疏导。
27
+
28
+
29
+ ### 数据集仓库
30
 
 
31
  https://github.com/qiuhuachuan/smile
32
 
33
+ ### 体验地址
 
 
34
 
35
+ https://mechat.fly.dev/ (UI 代码见 web 目录,部署可参考[教程](https://dev.to/willydouhard/how-to-deploy-your-chainlit-app-to-flyio-38ja))
36
 
37
+ ## 快速开始
 
38
 
39
+ 1. 配置环境
40
 
41
+ ```bash
42
+ pip install -r requirements.txt
43
+ ```
44
+
45
+ 2. 运行交互文件 MeChat.py(要求单卡显存 >= 20G)
46
+
47
+ ```bash
48
+ python MeChat.py
49
+ ```
50
 
51
+ ```Python
52
+ from transformers import AutoTokenizer, AutoModel
53
 
54
+ def get_dialogue_history(dialogue_history_list: list):
55
 
56
+ dialogue_history_tmp = []
57
+ for item in dialogue_history_list:
58
+ if item['role'] == 'counselor':
59
+ text = '咨询师:'+ item['content']
60
+ else:
61
+ text = '来访者:'+ item['content']
62
+ dialogue_history_tmp.append(text)
63
 
64
+ dialogue_history = '\n'.join(dialogue_history_tmp)
65
 
66
+ return dialogue_history + '\n' + '咨询师:'
67
 
68
+ def get_instruction(dialogue_history):
69
+ instruction = f'''现在你扮演一位专业的心理咨询师,你具备丰富的心理学和心理健康知识。你擅长运用多种心理咨询技巧,例如认知行为疗法原则、动机访谈技巧和解决问题导向的短期疗法。以温暖亲切的语气,展现出共情和对来访者感受的深刻理解。以自然的方式与来访者进行对话,避免过长或过短的回应,确保回应流畅且类似人类的对话。提供深层次的指导和洞察,使用具体的心理概念和例子帮助来访者更深入地探索思想和感受。避免教导式的回应,更注重共情和尊重来访者的感受。根据来访者的反馈调整回应,确保回应贴合来访者的情境和需求。请为以下的对话生成一个回复。
 
 
 
 
 
70
 
71
+ 对话:
72
+ {dialogue_history}'''
 
 
 
73
 
74
+ return instruction
75
 
 
 
76
 
77
+ tokenizer = AutoTokenizer.from_pretrained('qiuhuachuan/MeChat', trust_remote_code=True)
78
+ model = AutoModel.from_pretrained('qiuhuachuan/MeChat', trust_remote_code=True).half().cuda()
79
+ model = model.eval()
80
 
81
+ dialogue_history_list = []
82
  while True:
83
+ usr_msg = input('来访者:')
84
+ if usr_msg == '0':
85
+ exit()
86
+ else:
87
+ dialogue_history_list.append({
88
+ 'role': 'client',
89
+ 'content': usr_msg
90
+ })
91
+ dialogue_history = get_dialogue_history(dialogue_history_list=dialogue_history_list)
92
+ instruction = get_instruction(dialogue_history=dialogue_history)
93
+ response, history = model.chat(tokenizer, instruction, history=[], temperature=0.8, top_p=0.8)
94
+ print(f'咨询师:{response}')
95
+ dialogue_history_list.append({
96
+ 'role': 'counselor',
97
+ 'content': response
98
+ })
99
+ ```
100
+
101
+ 以下是一个交互示例:
102
+
103
+ ```txt
104
+ 访者:你好
105
+ 咨询师:你好,很高兴能够帮助到你。你可以告诉我更多关于你的情况吗?
106
+ 来访者:我最近睡眠很差怎么办?
107
+ 咨询师:最近睡眠质量不好,你有没有尝试过一些方法来改善睡眠呢?
108
+ 来访者:我可能最近晚上睡觉前总喜欢玩手机,越玩人就越兴奋
109
+ 咨询师:晚上玩手机确实会刺激大脑,导致入睡困难。你可以尝试在睡觉前设定一个手机使用时间,逐渐减少玩手机的时间,以帮助放松入睡。
110
+ 来访者:我应该设置一个晚上9点的闹钟,强制我不玩手机,让我的大脑开始放松。
111
+ 咨询师:是的,设置一个晚上的闹钟是一个很好的方法。你可以尝试在9点之前放下手机,让自己进入放松的状态,然后逐渐入睡。
112
+ 来访者:我 尝 试了一下,看看能否改善?
113
+ 咨询师:很好,试试看吧。另外,你还可以尝试一些放松的技巧,比如深呼吸、冥想或者听一些轻柔的音乐来帮助你放松身心,帮助入睡。
114
+ 来访者:非常感谢你的建议,我会去试试的
115
+ 咨询师:不客气,希望这些方法能对你有所帮助。如果还有其他问题,随时都可以来找我倾诉。
116
+ ```
117
+
118
+ ## 模型训练
119
+
120
+ ### 数据转换
121
+
122
+ - `data` 目录下包含使用 `smile` 方法构建的所有对话。详情可参考论文细节。
123
+ - 一个对话示例如下:
124
+
125
+ ```JSON
126
 
127
+ ```
128
+
129
+ 执行以下脚本,我们将获得 310,087 训练样本。
130
+
131
+ ```Python
132
+ convert_to_training_set.py
133
+ ```
134
 
135
+ ```json
136
+ {
137
+ "instruction": "现在你扮演一位专业的心理咨询师,你具备丰富的心理学和心理健康知识。你擅长运用多种心理咨询技巧,例如认知行为疗法原则、动机访谈技巧和解决问题导向的短期疗法。以温暖亲切的语气,展现出共情和对来访者感受的深刻理解。以自然的方式与来访者进行对话,避免过长或过短的回应,确保回应流畅且类似人类的对话。提供深层次的指导和洞察,使用具体的心理概念和例子帮助来访者更深入地探索思想和感受。避免教导式的回应,更注重共情和尊重来访者的感受。根据来访者的反馈调整回应,确保回应贴合来访者的情境和需求。请为以下的对话生成一个回复。\n\n对话:\n来访者:高三后的迷茫,高考前的恐惧,能给我一些建议么?\n咨询师:看到你的提问感觉你很焦虑,这个状态在高中高压下很容易出现。我想说的是,我看到了你的决心。这点是很多人没有的!高考最重要的不是知识是心态。是必胜的心态!什么放松吧缓缓吧,都是站着说话不腰疼,保送的又不是我,我能放松什么?!我有我的目标,我怎么可能放弃!有目标就好办,计划!缺个计划,缺个时间合理配置的复习计划。\n来访者:你说的对,我是非常焦虑,确实需要调整心态。我也明白高考的心态很重要,但是要怎样才能真正拥有必胜的心态呢?\n咨询师:首先,你要明确自己的目标,既然你想考本科,那就要为此做好准备。然后,你需要制定一个合理的复习计划,根据自己的情况来安排每天的学习时间和内容。这样可以帮助你更好地掌控整个复习过程,减少焦虑感。\n来访者:我确实没有一个合理的复习计划,每天都觉得时间不够用,也不知道该从何开始。你能给我一些建议吗?\n咨询师:",
138
+ "output": "当然可以!你可以从高一开始,试试题海战术。每天多做一些题目,这样能够提高你的学习效率。同时,对于英语这门科目,多听多背是很重要的,数理化方面,可以做一些经典的题目,特别是那些类型经常考到的题目,多次反复做题。"
139
+ }
140
  ```
141
 
142
  ## 引用
143
 
144
+ 如果你使用了本项目的数据或者代码,请声明引用
145
+
146
  ```
147
  @misc{qiu2023smile,
148
  title={SMILE: Single-turn to Multi-turn Inclusive Language Expansion via ChatGPT for Mental Health Support},
 
156
 
157
  ## 免责声明
158
 
159
+ 我们的心理健康支持对话机器人(以下简称"机器人")旨在为用户提供情感支持和心理健康建议。然而,机器人不是医疗保健专业人员,不能替代医生、心理医生或其他专业人士的意见、诊断、建议或治疗。
160
 
161
  机器人提供的建议和信息是基于算法和机器学习技术,可能并不适用于所有用户或所有情况。因此,我们建议用户在使用机器人之前咨询医生或其他专业人员,了解是否适合使用此服务。
162
 
 
174
 
175
  5. 用户应保护个人隐私,不应在使用机器人服务时泄露个人敏感信息或他人隐私。
176
 
177
+ 6. 平台收集的数据用于学术研究。
178
+
179
+ 最后,我们保留随时修改、更新、暂停或终止机器人服务的权利,同时也保留对本免责声明进行修改、更新或补充的权利。如果用户继续使用机器人服务,即视为同意本免责声明的全部内容和条款。