NV9523 commited on
Commit
19a7143
·
verified ·
1 Parent(s): eeafbf0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -42
app.py CHANGED
@@ -4,54 +4,61 @@ import sys
4
  # Cài đặt các thư viện nếu chưa có
5
  subprocess.check_call([sys.executable, "-m", "pip", "install", "transformers", "streamlit", "torch", "bitsandbytes","peft"])
6
 
7
- import streamlit as st
8
- from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
9
- from peft import PeftModel
10
  import torch
 
 
 
11
 
12
- # Định nghĩa tên hình gốc và adapter
13
- BASE_MODEL_NAME = "unsloth/deepseek-r1-distill-llama-8b-unsloth-bnb-4bit"
14
- ADAPTER_MODEL_PATH = "lora_model"
15
 
16
- # Load hình gốc
17
- base_model = AutoModelForCausalLM.from_pretrained(BASE_MODEL_NAME, torch_dtype=torch.float16, device_map="auto")
18
- # Áp dụng adapter LoRA
19
- model = PeftModel.from_pretrained(base_model, ADAPTER_MODEL_PATH)
20
- tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL_NAME)
21
 
22
- def generate_response(prompt):
23
- """Generate a response from the model."""
24
- inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
25
- streamer = TextStreamer(tokenizer)
26
- with torch.no_grad():
27
- model.generate(**inputs, streamer=streamer, max_length=512)
28
- return ""
29
 
30
- # Streamlit UI
31
- st.set_page_config(page_title="Chatbot", page_icon="🤖")
32
- st.title("🤖 AI Chatbot")
 
 
 
 
 
 
33
 
34
- # Initialize chat history if not exists
35
- if "messages" not in st.session_state:
36
- st.session_state.messages = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
- # Display chat messages
39
- for message in st.session_state.messages:
40
- with st.chat_message(message["role"]):
41
- st.markdown(message["content"])
42
 
43
- # User input
44
- user_input = st.chat_input("Nhập tin nhắn...")
45
  if user_input:
46
- # Append user message
47
- st.session_state.messages.append({"role": "user", "content": user_input})
48
- with st.chat_message("user"):
49
- st.markdown(user_input)
50
-
51
- # Generate response
52
- with st.chat_message("assistant"):
53
- response = generate_response(user_input)
54
- st.markdown(response)
55
-
56
- # Append assistant response
57
- st.session_state.messages.append({"role": "assistant", "content": response})
 
4
  # Cài đặt các thư viện nếu chưa có
5
  subprocess.check_call([sys.executable, "-m", "pip", "install", "transformers", "streamlit", "torch", "bitsandbytes","peft"])
6
 
 
 
 
7
  import torch
8
+ from transformers import AutoTokenizer, AutoModelForCausalLM
9
+ from peft import PeftModel
10
+ import streamlit as st
11
 
12
+ # 1. Cấu hình load model gốc
13
+ base_model_name = r"lora_model" # model gốc mà adapter được áp dụng
 
14
 
15
+ # Load tokenizer model gốc (chạy trên GPU nếu có sẵn)
16
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
17
+ tokenizer = AutoTokenizer.from_pretrained(base_model_name)
18
+ base_model = AutoModelForCausalLM.from_pretrained(base_model_name, device_map="auto")
 
19
 
20
+ # 2. Tải adapter LoRA từ thư mục "lora_model"
21
+ # Thư mục này chứa các file được lưu bởi model.save_pretrained("lora_model")
22
+ model = PeftModel.from_pretrained(base_model, base_model_name)
23
+ model.to(device)
 
 
 
24
 
25
+ # 3. Định nghĩa prompt template cho chatbot (có thể tùy chỉnh)
26
+ prompt_template = """Bạn là một trợ lý ảo thông minh, đóng vai một giáo viên giàu kinh nghiệm, tận tâm và nhiệt huyết.
27
+ Nhiệm vụ của bạn là giải đáp mọi thắc mắc của người dùng một cách rõ ràng, chi tiết và dễ hiểu.
28
+ Nếu người dùng chưa gửi bất kỳ tin nhắn nào, hãy hỏi: “Bạn cần giúp gì?” hoặc “Tôi có thể hỗ trợ bạn điều gì?”
29
+
30
+ ### Đầu vào:
31
+ {}
32
+ ### Trả lời:
33
+ """
34
 
35
+ def generate_response(user_input):
36
+ # Tạo prompt dựa trên input của người dùng
37
+ prompt = prompt_template.format(user_input)
38
+ inputs = tokenizer(prompt, return_tensors="pt").to(device)
39
+
40
+ # Sinh kết quả với sampling (có thể điều chỉnh temperature, max_new_tokens,...)
41
+ outputs = model.generate(
42
+ **inputs,
43
+
44
+ do_sample=True,
45
+ temperature=0.7,
46
+ pad_token_id=tokenizer.eos_token_id
47
+ )
48
+ # Decode kết quả và loại bỏ token đặc biệt
49
+ response = tokenizer.decode(outputs[0], skip_special_tokens=True)
50
+ # Nếu cần, bạn có thể xử lý để cắt bỏ phần prompt ban đầu
51
+ # Ví dụ: trả về phần text sau prompt_template
52
+ return response.replace(prompt, "").strip()
53
 
54
+ # Streamlit UI
55
+ st.title("Chatbot Trợ Ảo")
56
+ st.write("Chào mừng đến với Chatbot! Nhập 'exit' để thoát.")
 
57
 
58
+ user_input = st.text_input("Bạn: ", "")
 
59
  if user_input:
60
+ if user_input.lower() == "exit":
61
+ st.write("Chatbot: Tạm biệt!")
62
+ else:
63
+ reply = generate_response(user_input)
64
+ st.write(f"Chatbot: {reply}")