File size: 2,713 Bytes
7fe0df9
 
1dacd0d
7fe0df9
4fe7f43
7fe0df9
 
 
 
 
 
 
4fe7f43
7fe0df9
 
 
 
 
 
 
e4b71d4
7fe0df9
4fe7f43
7fe0df9
 
4fe7f43
90486e8
7fe0df9
 
 
 
 
 
 
4fe7f43
 
7fe0df9
 
4fe7f43
7fe0df9
 
 
 
 
 
 
 
 
 
 
 
7740cf7
 
7fe0df9
 
 
 
6c7392f
7fe0df9
 
90486e8
 
f4821ef
7fe0df9
90486e8
 
4fe7f43
7fe0df9
c263170
90486e8
7740cf7
7fe0df9
 
 
 
7740cf7
c263170
 
 
7fe0df9
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
# app.py
import torch
import gradio as gr
from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer

# 1️⃣ Cấu hình và load model + tokenizer
model_path = "vinai/PhoGPT-4B-Chat"
 
config = AutoConfig.from_pretrained(model_path, trust_remote_code=True)
config.init_device = "cpu" if torch.cuda.is_available() else "cpu"
# Nếu có FlashAttention, bật thêm:
# config.attn_config['attn_impl'] = 'flash'

model = AutoModelForCausalLM.from_pretrained(
    model_path,
    config=config,
    torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
    trust_remote_code=True,
)
model.eval()

tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)

# 2️⃣ Hàm chat theo template “### Câu hỏi / ### Trả lời”
PROMPT_TEMPLATE = "### Câu hỏi: {instruction}\n### Trả lời:"

def respond(message, history: list[tuple[str, str]], system_message, max_tokens, temperature, top_p):
    # 2.1 — Gom system message và history vào messages list
    messages = [{"role": "system", "content": system_message}]
    for u, b in history:
        if u:
            messages.append({"role": "user", "content": u})
        if b:
            messages.append({"role": "assistant", "content": b})
    messages.append({"role": "user", "content": message})

    # 2.2 — Tạo prompt chuẩn
    prompt = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )

    # 2.3 — Tokenize và đưa lên device
    inputs = tokenizer(prompt, return_tensors="pt")
    inputs = {k: v.to(model.device) for k, v in inputs.items()}

    # 2.4 — Sinh text
    outputs = model.generate(
        **inputs,
        max_new_tokens=max_tokens,
        temperature=temperature,
        top_p=top_p,
        do_sample=True,
        eos_token_id=tokenizer.eos_token_id,
        pad_token_id=tokenizer.pad_token_id,
    )

    # 2.5 — Decode và tách phần assistant trả lời
    full = tokenizer.decode(outputs[0], skip_special_tokens=True)
    response  = full.replace(prompt, "").strip()
    # yield response

    # 2.6 — Cập nhật history và trả về
    # history.append((message, response))
    # return history

# 3️⃣ Giao diện Gradio
demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox("Bạn là một chatbot tiếng Việt thân thiện.", label="System message"),
        gr.Slider(1, 2048, value=512, step=1, label="Max new tokens"),
        gr.Slider(0.1, 4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(0.1, 1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
    ],
)

if __name__ == "__main__":
    demo.launch()