File size: 2,983 Bytes
0f32de6
 
 
 
1d7e7b8
0f32de6
514ce55
1d7e7b8
514ce55
011f128
1d7e7b8
011f128
 
 
1d7e7b8
 
0f32de6
 
1d7e7b8
 
 
 
 
 
 
 
 
0f32de6
 
1d7e7b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0f32de6
 
7b8b967
 
0f32de6
7b8b967
 
461910a
0f32de6
461910a
0f32de6
 
1d7e7b8
 
 
 
 
 
0f32de6
 
 
 
 
 
 
 
 
 
 
1d7e7b8
0f32de6
 
 
514ce55
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import os
from datetime import datetime
import uuid
import gradio as gr
from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer
import torch
from huggingface_hub import login
from threading import Thread

from dotenv import load_dotenv

# Load environment variables
load_dotenv()

# Get the Hugging Face token from environment variables
hf_token = os.getenv("HUGGINGFACE_TOKEN")

# Load model and tokenizer
model_name = "google/gemma-2-2b-it"

tokenizer = AutoTokenizer.from_pretrained(model_name, token=hf_token)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto",
    token=hf_token
)

def chat_with_model(messages):
    # Prepare the input
    prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    
    # Generate response
    streamer = TextIteratorStreamer(tokenizer, skip_special_tokens=True)
    generation_kwargs = dict(
        inputs,
        max_new_tokens=1000,
        temperature=0.7,
        do_sample=True,
        streamer=streamer,
    )

    thread = Thread(target=model.generate, kwargs=generation_kwargs)
    thread.start()

    return streamer

def chat_with_model_gradio(message, history, session_id):
    system_message = f"λ„ˆμ˜ 이름은 ChatMBTI. μ‚¬λžŒλ“€μ˜ MBTIμœ ν˜•μ— μ•Œλ§žμ€ 상담을 μ§„ν–‰ν•  수 μžˆμ–΄. μƒλŒ€λ°©μ˜ MBTI μœ ν˜•μ„ λ¨Όμ € 물어보고, κ·Έ μœ ν˜•μ— μ•Œλ§žκ²Œ 상담을 μ§„ν–‰ν•΄μ€˜. 참고둜 ν˜„μž¬ μ‹œκ°μ€ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}이야."
    
    messages = [
        # {"role": "system", "content": f"λ„ˆμ˜ 이름은 ChatMBTI. μ‚¬λžŒλ“€μ˜ MBTIμœ ν˜•μ— μ•Œλ§žμ€ 상담을 μ§„ν–‰ν•  수 μžˆμ–΄. μƒλŒ€λ°©μ˜ MBTI μœ ν˜•μ„ λ¨Όμ € 물어보고, κ·Έ μœ ν˜•μ— μ•Œλ§žκ²Œ 상담을 μ§„ν–‰ν•΄μ€˜. 참고둜 ν˜„μž¬ μ‹œκ°μ€ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}이야."},
        {"role": "user", "content": system_message},
        {"role": "assistant", "content": "μ•ˆλ…•ν•˜μ„Έμš”? ChatMBTIμž…λ‹ˆλ‹€. 였늘 ν•˜λ£¨ μ–΄λ– μ…¨λ‚˜μš”?"},
    ]
    messages.extend([{"role": "user" if i % 2 == 0 else "assistant", "content": m} for i, (m, _) in enumerate(history)])
    messages.append({"role": "user", "content": message})

    streamer = chat_with_model(messages)
    
    partial_message = ""
    for new_token in streamer:
        partial_message += new_token
        yield "", history + [(message, partial_message)]

def main():
    session_id = str(uuid.uuid4())
    with gr.Blocks() as demo:
        chatbot = gr.Chatbot(label="ChatMBTI")
        msg = gr.Textbox(label="λ©”μ‹œμ§€λ₯Ό μž…λ ₯ν•˜μ„Έμš”")
        clear = gr.Button("λŒ€ν™” μ΄ˆκΈ°ν™”")

        msg.submit(chat_with_model_gradio, [msg, chatbot, gr.State(session_id)], [msg, chatbot])
        clear.click(lambda: None, None, chatbot, queue=False)

    demo.queue()
    demo.launch()

if __name__ == "__main__":
    main()