File size: 7,230 Bytes
8ad15e5
ee345dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8ad15e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
from threading import Thread

# ==========================================
# 1. CẤU HÌNH MODEL
# ==========================================
# Đảm bảo tên này khớp với repo V2 mà bạn vừa đẩy lên
model_id = "EvoNet/EvoNet-3B-V2" 

print(f"⏳ Đang tải mô hình {model_id} từ Hugging Face...")
tokenizer = AutoTokenizer.from_pretrained(model_id)

# Load model lên CPU (Vì Space miễn phí không có GPU)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.float16, 
    device_map="cpu", 
    low_cpu_mem_usage=True
)
print("✅ Đã tải xong trí khôn EvoNet V2!")

# ==========================================
# 2. HÀM XỬ LÝ CHAT & STREAMING
# ==========================================
def predict(message, history):
    # Nhắc bài cho AI nhớ thân phận của mình
    messages = [
        {"role": "system", "content": "Bạn là EvoNet, một trợ lý AI thông minh được phát triển bởi Founder Huỳnh Dương Phong. Bạn trả lời lịch sự, thông minh và súc tích."}
    ]
    
    # Đưa lịch sử trò chuyện vào để AI nhớ ngữ cảnh
    for human, assistant in history:
        messages.append({"role": "user", "content": human})
        messages.append({"role": "assistant", "content": assistant})
        
    # Thêm câu hỏi hiện tại của người dùng
    messages.append({"role": "user", "content": message})

    # Đóng gói prompt chuẩn format của Qwen
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

    # Cài đặt Streamer để chữ hiện ra mượt mà từng chữ một
    streamer = TextIteratorStreamer(tokenizer, timeout=10., skip_prompt=True, skip_special_tokens=True)
    generate_kwargs = dict(
        model_inputs,
        streamer=streamer,
        max_new_tokens=512,      # Độ dài tối đa câu trả lời
        temperature=0.6,         # Độ sáng tạo (0.6 là cân bằng)
        top_p=0.9,
        repetition_penalty=1.1   # Tránh việc AI nói lặp từ
    )

    # Chạy thread riêng để không bị đơ giao diện
    t = Thread(target=model.generate, kwargs=generate_kwargs)
    t.start()

    # Đẩy từng chữ ra màn hình
    partial_message = ""
    for new_token in streamer:
        partial_message += new_token
        yield partial_message

# ==========================================
# 3. THIẾT KẾ GIAO DIỆN UI
# ==========================================
demo = gr.ChatInterface(
    fn=predict,
    title="✨ EvoNet AI - Phiên Bản V2",
    description="Hệ thống AI xử lý Code & Toán học. Được phát triển và tối ưu bởi Founder Huỳnh Dương Phong.",
    theme="soft", # Giao diện bo tròn hiện đại
    examples=[
        "Xin chào, bạn tên là gì và ai đã tạo ra bạn?", 
        "Hãy viết một hàm Python để kiểm tra số nguyên tố.", 
        "Giải thích cho tôi định lý Pytago một cách dễ hiểu nhất."
    ]
)

if __name__ == "__main__":
    demo.launch()
import gradio as gr
from llama_cpp import Llama
from huggingface_hub import hf_hub_download

# ==============================================================================
# 1. CẤU HÌNH MODEL (ĐÃ CẬP NHẬT CHO EVONET 3B BETA)
# ==============================================================================
REPO_ID = "EvoNet/EvoNet-3B-v0.1-Beta-GGUF"
FILENAME = "EvoNet-3B-v0.1-Beta-Q4_K_M.gguf" # File nén Q4 nhẹ & mượt

print(f"⏳ Đang tải file {FILENAME} từ kho {REPO_ID}...")
try:
    model_path = hf_hub_download(
        repo_id=REPO_ID, 
        filename=FILENAME
    )
    print("✅ Tải xong! Đường dẫn:", model_path)
except Exception as e:
    print(f"❌ Lỗi tải file: {e}")
    print("👉 Founder kiểm tra lại tên file hoặc Repo ID nhé!")
    raise e

# ==============================================================================
# 2. KHỞI ĐỘNG ĐỘNG CƠ AI
# ==============================================================================
print("⚙️ Đang khởi động EvoNet 3B Engine...")
llm = Llama(
    model_path=model_path,
    n_ctx=4096,        # Tăng lên 4096 tokens (nhớ dai hơn bản cũ)
    n_threads=2,       # Dùng 2 nhân CPU (Chuẩn Free Tier HF)
    n_gpu_layers=0,    # Chạy hoàn toàn trên CPU
    verbose=False      
)

# ==============================================================================
# 3. HÀM XỬ LÝ CHAT (STREAMING)
# ==============================================================================
def chat_stream(message, history):
    # Cài đặt danh tính (System Prompt) chuẩn Founder
    system_prompt = (
        "Bạn là EvoNet, một trợ lý AI thông minh được phát triển bởi Founder Huỳnh Dương Phong. "
        "Hãy trả lời ngắn gọn, hữu ích, trung thực và ưu tiên sử dụng Tiếng Việt."
    )
    
    # Format chuẩn ChatML (Qwen 2.5 yêu cầu cái này)
    prompt = f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
    for user_msg, bot_msg in history:
        prompt += f"<|im_start|>user\n{user_msg}<|im_end|>\n<|im_start|>assistant\n{bot_msg}<|im_end|>\n"
    prompt += f"<|im_start|>user\n{message}<|im_end|>\n<|im_start|>assistant\n"
    
    # Gọi Model chạy
    stream = llm(
        prompt,
        max_tokens=1024,     # Cho phép trả lời dài hơn (Model 3B viết code dài được)
        stop=["<|im_end|>"], # Dấu hiệu dừng
        echo=False,          
        stream=True,         # Hiệu ứng gõ chữ
        temperature=0.7,     # Độ sáng tạo vừa phải
        top_p=0.9
    )
    
    partial_message = ""
    for output in stream:
        token = output['choices'][0]['text']
        partial_message += token
        yield partial_message

# ==============================================================================
# 4. GIAO DIỆN CHATBOT (GRADIO)
# ==============================================================================
custom_css = """
#component-0 {max-width: 800px; margin: auto;}
.gradio-container {background-color: #f9f9f9;}
"""

demo = gr.ChatInterface(
    chat_stream,
    title="🔥 EvoNet-3B Beta (GGUF Version)",
    description=f"""
    <div style="text-align: center;">
        <h3>Sản phẩm AI của Founder Huỳnh Dương Phong</h3>
        <p>Model: <b>EvoNet-3B-v0.1-Beta</b> | Format: <b>GGUF Q4_K_M</b></p>
        <p>⚡ Chạy trực tiếp trên CPU Server (Zero-GPU)</p>
    </div>
    """,
    examples=[
        ["EvoNet là gì và ai tạo ra bạn?"],
        ["Viết một hàm Python kiểm tra số nguyên tố và giải thích."],
        ["Giải thích 'Machine Learning' cho học sinh lớp 5."],
        ["Làm một bài thơ về lập trình viên."],
    ],
    cache_examples=False,
    css=custom_css,
    theme="soft" # Giao diện mềm mại, hiện đại
)

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