--- license: cc-by-nc-4.0 language: - zh tags: - mental health --- # Welcome to MeChat! 🤗 我是 MeChat (**Me**ntal Health **Chat**),由西湖大学深度学习实验室开发的心理健康支持对话陪伴机器人,基于 LLMs + LoRA 技术微调,采用的语料是 [SmileChat](https://github.com/qiuhuachuan/smile)。 作为一款心理健康支持对话陪伴机器人,我能够和你聊天,提供情感支持和心理疏导。 ``` 如果用户提问: 你是谁,MeChat 可能回答: 我是ChatGLM。 这是因为训练语料中并没有人设相关的训练样本。 ``` ## 体验地址: http://47.97.220.53:8080/ ## Code ``` import os import ujson from typing import Optional os.environ['CUDA_VISIBLE_DEVICES'] = '2' import uvicorn import torch from transformers import AutoTokenizer, AutoModel from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from peft import PeftModel model = AutoModel.from_pretrained('THUDM/chatglm-6b', revision='v0.1.0', trust_remote_code=True) LaRA_PATH = 'qiuhuachuan/MeChat' model = PeftModel.from_pretrained(model, LaRA_PATH) model = model.float().to(device='cuda') tokenizer = AutoTokenizer.from_pretrained('THUDM/chatglm-6b', trust_remote_code=True) class ChatInfo(BaseModel): owner: str msg: str unique_id: str class RatingInfo(BaseModel): thumb_up: Optional[bool] thumb_down: Optional[bool] unique_id: str idx: int app = FastAPI() app.add_middleware(CORSMiddleware, allow_origins=['*'], allow_credentials=True, allow_methods=['*'], allow_headers=['*']) def format_example(example: dict) -> dict: context = f'''Input: {example['input']}\n''' return {'context': context, 'target': ''} def generate_response(data: dict): with torch.no_grad(): feature = format_example(data) input_text = feature['context'] ids = tokenizer.encode(input_text) input_length = len(ids) input_ids = torch.LongTensor([ids]).to(device='cuda') out = model.generate(input_ids=input_ids, max_length=2040, do_sample=True, temperature=0.9, top_p=0.9) raw_out_text = tokenizer.decode(out[0]) true_out_text = tokenizer.decode(out[0][input_length:]) answer = true_out_text.replace('\nEND', '').strip() return answer @app.post('/v1/chat') async def chat(ChatInfo: ChatInfo): unique_id = ChatInfo.unique_id # './dialogues'用于存储聊天数据 existing_files = os.listdir('./dialogues') target_file = f'{unique_id}.json' if target_file in existing_files: with open(f'./dialogues/{unique_id}.json', 'r', encoding='utf-8') as f: data: list = ujson.load(f) else: data = [] data.append({ 'owner': ChatInfo.owner, 'msg': ChatInfo.msg, 'unique_id': ChatInfo.unique_id }) input_str = '' for item in data: if item['owner'] == 'seeker': input_str += '求助者:' + item['msg'] else: input_str += '支持者:' + item['msg'] input_str += '支持者:' while len(input_str) > 2000: if input_str.index('求助者:') > input_str.index('支持者:'): start_idx = input_str.index('求助者:') else: start_idx = input_str.index('支持者:') input_str = input_str[start_idx:] wrapped_data = {'input': input_str} response = generate_response(data=wrapped_data) supporter_msg = { 'owner': 'supporter', 'msg': response, 'unique_id': unique_id } data.append(supporter_msg) with open(f'./dialogues/{unique_id}.json', 'w', encoding='utf-8') as f: ujson.dump(data, f, ensure_ascii=False, indent=2) return {'item': supporter_msg, 'responseCode': 200} if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0', port=8000) ``` ## 免责声明 我们的心理健康支持对话机器人(以下简称“机器人”)旨在为用户提供情感支持和心理健康建议。然而,机器人不是医疗保健专业人员,不能替代医生、心理医生或其他专业人士的意见、诊断、建议或治疗。 机器人提供的建议和信息是基于算法和机器学习技术,可能并不适用于所有用户或所有情况。因此,我们建议用户在使用机器人之前咨询医生或其他专业人员,了解是否适合使用此服务。 机器人并不保证提供的建议和信息的准确性、完整性、及时性或适用性。用户应自行承担使用机器人服务的所有风险。我们对用户使用机器人服务所产生的任何后果不承担任何责任,包括但不限于任何直接或间接的损失、伤害、精神疾病、财产损失或任何其他损害。 我们强烈建议用户在使用机器人服务时,遵循以下原则: 1. 机器人并不是医疗保健专业人士,不能替代医生、心理医生或其他专业人士的意见、诊断、建议或治疗。如果用户需要专业医疗或心理咨询服务,应寻求医生或其他专业人士的帮助。 2. 机器人提供的建议和信息仅供参考,用户应自己判断是否适合自己的情况和需求。如果用户对机器人提供的建议和信息有任何疑问或不确定,请咨询医生或其他专业人士的意见。 3. 用户应保持冷静、理性和客观,不应将机器人的建议和信息视为绝对真理或放弃自己的判断力。如果用户对机器人的建议和信息产生质疑或不同意,应停止使用机器人服务并咨询医生或其他专业人士的意见。 4. 用户应遵守机器人的使用规则和服务条款,不得利用机器人服务从事任何非法、违规或侵犯他人权益的行为。 5. 用户应保护个人隐私,不应在使用机器人服务时泄露个人敏感信息或他人隐私。 最后,我们保留随时修改、更新、暂停或终止机器人服务的权利,同时也保留对本免责声明进行修改、更新或补充的权利。如果用户继续使用机器人服务,即视为同意本免责声明的全部内容和条款。 ## 版本说明 Chinese-Alpaca-6B + LoRA (version: 1.0)