File size: 1,880 Bytes
30068e0
d4c17e3
ce2e69b
30068e0
308ee31
 
 
30068e0
 
308ee31
 
 
 
24e5b53
 
 
d2f5bb7
295c595
308ee31
6a0a052
9cce1c6
 
37d5637
308ee31
d508f92
 
 
 
 
 
 
 
 
 
 
 
308ee31
c5c65c2
9cce1c6
308ee31
 
 
 
9cce1c6
308ee31
 
 
 
9cce1c6
308ee31
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from huggingface_hub import login
from transformers import AutoModelForCausalLM, AutoTokenizer
from adapters import AutoAdapterModel
import os
import gradio as gr
import torch

HF_TOKEN = os.getenv("HF_TOKEN")
login(token=HF_TOKEN)

title = "Mental Health Chatbot"
description = "This bot is using a fine-tuned version of meta-llama/Llama-2-7b-chat-hf"

model_id = "meta-llama/Llama-2-7b-chat-hf"
adapter_model_id = "vojay/Llama-2-7b-chat-hf-mental-health"

model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16)
model.load_adapter(adapter_model_id)

tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"


def get_base_prompt():
    return """
    You are a knowledgeable and supportive psychologist. You provide emphatic, non-judgmental responses to users seeking
    emotional and psychological support. Provide a safe space for users to share and reflect, focus on empathy, active
    listening and understanding.
    """


def format_prompt(base, user_message):
    return f"<s>[INST] <<SYS>>{base}<</SYS>>{user_message} [/INST]"


def predict(input, history=[]):
    input = format_prompt(get_base_prompt(), input)
    new_user_input_ids = tokenizer.encode(f"{input}{tokenizer.eos_token}", return_tensors="pt")
    bot_input_ids = torch.cat([torch.LongTensor(history), new_user_input_ids], dim=-1)

    history = model.generate(
        bot_input_ids,
        max_length=2000,
        pad_token_id=tokenizer.eos_token_id
    ).tolist()

    response = tokenizer.decode(history[0]).split("<|endoftext|>")
    response = [(response[i], response[i + 1]) for i in range(0, len(response) - 1, 2)]

    return response, history


gr.Interface(
    fn=predict,
    title=title,
    description=description,
    inputs=["text", "state"],
    outputs=["chatbot", "state"]
).launch()