Spaces:
Sleeping
Sleeping
hoduyquocbao
commited on
Commit
•
b09c08f
1
Parent(s):
e7bbd13
Update new features
Browse files
app.py
CHANGED
@@ -5,7 +5,7 @@ from typing import Iterator, List, Tuple, Dict, Any
|
|
5 |
import gradio as gr
|
6 |
import spaces
|
7 |
import torch
|
8 |
-
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
|
9 |
from bs4 import BeautifulSoup
|
10 |
import requests
|
11 |
import json
|
@@ -38,6 +38,9 @@ model = AutoModelForCausalLM.from_pretrained(
|
|
38 |
model.to(device) # Di chuyển mô hình tới thiết bị đã chọn
|
39 |
model.eval() # Đặt mô hình ở chế độ đánh giá
|
40 |
|
|
|
|
|
|
|
41 |
# ---------------------------- Định Nghĩa Hàm ---------------------------- #
|
42 |
|
43 |
@lru_cache(maxsize=128)
|
@@ -118,6 +121,13 @@ def summarize_text(text: str, max_length: int = 150) -> str:
|
|
118 |
summary += new_text
|
119 |
return summary
|
120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
def generate_response(prompt: str, chat_history: List[Tuple[str, str]], max_new_tokens: int, temperature: float, top_p: float, top_k: int, repetition_penalty: float) -> Iterator[str]:
|
122 |
"""
|
123 |
Tạo phản hồi sử dụng mô hình Llama cục bộ theo chế độ streaming.
|
@@ -160,7 +170,7 @@ def generate_response(prompt: str, chat_history: List[Tuple[str, str]], max_new_
|
|
160 |
outputs.append(text)
|
161 |
yield "".join(outputs)
|
162 |
|
163 |
-
@
|
164 |
def process_query(query: str) -> Dict[str, Any]:
|
165 |
"""
|
166 |
Xác định hàm nào sẽ được gọi dựa trên truy vấn của người dùng.
|
@@ -169,18 +179,22 @@ def process_query(query: str) -> Dict[str, Any]:
|
|
169 |
web_search_keywords = ["tìm kiếm", "tìm", "tra cứu", "google", "lookup"]
|
170 |
general_query_keywords = ["giải thích", "mô tả", "nói cho tôi biết về", "cái gì là", "cách nào"]
|
171 |
summarize_keywords = ["tóm tắt", "tóm lại", "khái quát", "ngắn gọn"]
|
|
|
172 |
|
173 |
query_lower = query.lower() # Chuyển truy vấn thành chữ thường để so sánh
|
174 |
|
175 |
if any(keyword in query_lower for keyword in web_search_keywords):
|
176 |
function_name = "web_search"
|
177 |
arguments = {"query": query}
|
178 |
-
elif any(keyword in query_lower for keyword in general_query_keywords):
|
179 |
-
function_name = "general_query"
|
180 |
-
arguments = {"prompt": query}
|
181 |
elif any(keyword in query_lower for keyword in summarize_keywords):
|
182 |
function_name = "summarize_query"
|
183 |
arguments = {"prompt": query}
|
|
|
|
|
|
|
|
|
|
|
|
|
184 |
else:
|
185 |
function_name = "hard_query"
|
186 |
arguments = {"prompt": query}
|
@@ -221,6 +235,12 @@ def handle_functions(function_call: Dict[str, Any], prompt: str, chat_history: L
|
|
221 |
summary = summarize_text(prompt_text)
|
222 |
yield "📄 **Tóm tắt:**\n" + summary
|
223 |
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
elif function_name in ["general_query", "hard_query"]:
|
225 |
prompt_text = arguments["prompt"]
|
226 |
yield "🤖 Đang tạo phản hồi..."
|
@@ -266,6 +286,8 @@ def generate(
|
|
266 |
yield "🛠️ Đã chọn chức năng: Tìm kiếm trên web."
|
267 |
elif function_call["name"] == "summarize_query":
|
268 |
yield "🛠️ Đã chọn chức năng: Tóm tắt văn bản."
|
|
|
|
|
269 |
elif function_call["name"] in ["general_query", "hard_query"]:
|
270 |
yield "🛠️ Đã chọn chức năng: Trả lời câu hỏi."
|
271 |
else:
|
@@ -296,6 +318,7 @@ EXAMPLES = [
|
|
296 |
["Tìm và cung cấp cho tôi tin tức mới nhất về năng lượng tái tạo."],
|
297 |
["Tìm thông tin về Rạn san hô Great Barrier Reef."],
|
298 |
["Tóm tắt nội dung về trí tuệ nhân tạo."],
|
|
|
299 |
]
|
300 |
|
301 |
# Cấu hình giao diện trò chuyện của Gradio với giao diện đẹp mắt
|
@@ -342,24 +365,30 @@ chat_interface = gr.ChatInterface(
|
|
342 |
examples=EXAMPLES, # Các ví dụ được hiển thị cho người dùng
|
343 |
cache_examples=False, # Không lưu bộ nhớ cache cho các ví dụ
|
344 |
title="🤖 OpenGPT-4o Chatbot",
|
345 |
-
description="Một trợ lý AI mạnh mẽ sử dụng mô hình Llama-3.2 cục bộ với các chức năng tìm kiếm web
|
346 |
theme="default", # Có thể thay đổi theme để giao diện đẹp hơn
|
347 |
)
|
348 |
|
349 |
# Tạo giao diện chính của Gradio với CSS tùy chỉnh
|
350 |
with gr.Blocks(css="""
|
351 |
.gradio-container {
|
352 |
-
background-color: #f0f2f5;
|
353 |
}
|
354 |
.gradio-container h1 {
|
355 |
-
color: #4a90e2;
|
356 |
}
|
357 |
.gradio-container .gr-button {
|
358 |
-
background-color: #4a90e2;
|
359 |
-
color: white;
|
360 |
}
|
361 |
.gradio-container .gr-slider__label {
|
362 |
-
color: #333333;
|
|
|
|
|
|
|
|
|
|
|
|
|
363 |
}
|
364 |
""", fill_height=True) as demo:
|
365 |
gr.Markdown(DESCRIPTION) # Hiển thị mô tả
|
|
|
5 |
import gradio as gr
|
6 |
import spaces
|
7 |
import torch
|
8 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer, pipeline
|
9 |
from bs4 import BeautifulSoup
|
10 |
import requests
|
11 |
import json
|
|
|
38 |
model.to(device) # Di chuyển mô hình tới thiết bị đã chọn
|
39 |
model.eval() # Đặt mô hình ở chế độ đánh giá
|
40 |
|
41 |
+
# Khởi tạo pipeline phân tích tâm lý
|
42 |
+
sentiment_pipeline = pipeline("sentiment-analysis", model="nlptown/bert-base-multilingual-uncased-sentiment")
|
43 |
+
|
44 |
# ---------------------------- Định Nghĩa Hàm ---------------------------- #
|
45 |
|
46 |
@lru_cache(maxsize=128)
|
|
|
121 |
summary += new_text
|
122 |
return summary
|
123 |
|
124 |
+
def analyze_sentiment(text: str) -> str:
|
125 |
+
"""Phân tích tâm lý của văn bản sử dụng mô hình."""
|
126 |
+
result = sentiment_pipeline(text)
|
127 |
+
sentiment = result[0]['label']
|
128 |
+
score = result[0]['score']
|
129 |
+
return f"🟢 **Tâm lý**: {sentiment} (Điểm: {score:.2f})"
|
130 |
+
|
131 |
def generate_response(prompt: str, chat_history: List[Tuple[str, str]], max_new_tokens: int, temperature: float, top_p: float, top_k: int, repetition_penalty: float) -> Iterator[str]:
|
132 |
"""
|
133 |
Tạo phản hồi sử dụng mô hình Llama cục bộ theo chế độ streaming.
|
|
|
170 |
outputs.append(text)
|
171 |
yield "".join(outputs)
|
172 |
|
173 |
+
@lru_cache(maxsize=128)
|
174 |
def process_query(query: str) -> Dict[str, Any]:
|
175 |
"""
|
176 |
Xác định hàm nào sẽ được gọi dựa trên truy vấn của người dùng.
|
|
|
179 |
web_search_keywords = ["tìm kiếm", "tìm", "tra cứu", "google", "lookup"]
|
180 |
general_query_keywords = ["giải thích", "mô tả", "nói cho tôi biết về", "cái gì là", "cách nào"]
|
181 |
summarize_keywords = ["tóm tắt", "tóm lại", "khái quát", "ngắn gọn"]
|
182 |
+
sentiment_keywords = ["cảm xúc", "tâm trạng", "tâm lý", "phân tích cảm xúc"]
|
183 |
|
184 |
query_lower = query.lower() # Chuyển truy vấn thành chữ thường để so sánh
|
185 |
|
186 |
if any(keyword in query_lower for keyword in web_search_keywords):
|
187 |
function_name = "web_search"
|
188 |
arguments = {"query": query}
|
|
|
|
|
|
|
189 |
elif any(keyword in query_lower for keyword in summarize_keywords):
|
190 |
function_name = "summarize_query"
|
191 |
arguments = {"prompt": query}
|
192 |
+
elif any(keyword in query_lower for keyword in sentiment_keywords):
|
193 |
+
function_name = "sentiment_analysis"
|
194 |
+
arguments = {"prompt": query}
|
195 |
+
elif any(keyword in query_lower for keyword in general_query_keywords):
|
196 |
+
function_name = "general_query"
|
197 |
+
arguments = {"prompt": query}
|
198 |
else:
|
199 |
function_name = "hard_query"
|
200 |
arguments = {"prompt": query}
|
|
|
235 |
summary = summarize_text(prompt_text)
|
236 |
yield "📄 **Tóm tắt:**\n" + summary
|
237 |
|
238 |
+
elif function_name == "sentiment_analysis":
|
239 |
+
prompt_text = arguments["prompt"]
|
240 |
+
yield "📊 Đang phân tích tâm lý..."
|
241 |
+
sentiment = analyze_sentiment(prompt_text)
|
242 |
+
yield sentiment
|
243 |
+
|
244 |
elif function_name in ["general_query", "hard_query"]:
|
245 |
prompt_text = arguments["prompt"]
|
246 |
yield "🤖 Đang tạo phản hồi..."
|
|
|
286 |
yield "🛠️ Đã chọn chức năng: Tìm kiếm trên web."
|
287 |
elif function_call["name"] == "summarize_query":
|
288 |
yield "🛠️ Đã chọn chức năng: Tóm tắt văn bản."
|
289 |
+
elif function_call["name"] == "sentiment_analysis":
|
290 |
+
yield "🛠️ Đã chọn chức năng: Phân tích tâm lý."
|
291 |
elif function_call["name"] in ["general_query", "hard_query"]:
|
292 |
yield "🛠️ Đã chọn chức năng: Trả lời câu hỏi."
|
293 |
else:
|
|
|
318 |
["Tìm và cung cấp cho tôi tin tức mới nhất về năng lượng tái tạo."],
|
319 |
["Tìm thông tin về Rạn san hô Great Barrier Reef."],
|
320 |
["Tóm tắt nội dung về trí tuệ nhân tạo."],
|
321 |
+
["Phân tích tâm lý của đoạn văn sau: Tôi rất vui khi được gặp bạn hôm nay!"],
|
322 |
]
|
323 |
|
324 |
# Cấu hình giao diện trò chuyện của Gradio với giao diện đẹp mắt
|
|
|
365 |
examples=EXAMPLES, # Các ví dụ được hiển thị cho người dùng
|
366 |
cache_examples=False, # Không lưu bộ nhớ cache cho các ví dụ
|
367 |
title="🤖 OpenGPT-4o Chatbot",
|
368 |
+
description="Một trợ lý AI mạnh mẽ sử dụng mô hình Llama-3.2 cục bộ với các chức năng tìm kiếm web, tóm tắt văn bản và phân tích tâm lý.",
|
369 |
theme="default", # Có thể thay đổi theme để giao diện đẹp hơn
|
370 |
)
|
371 |
|
372 |
# Tạo giao diện chính của Gradio với CSS tùy chỉnh
|
373 |
with gr.Blocks(css="""
|
374 |
.gradio-container {
|
375 |
+
background-color: #f0f2f5; /* Màu nền nhẹ nhàng */
|
376 |
}
|
377 |
.gradio-container h1 {
|
378 |
+
color: #4a90e2; /* Màu xanh dương cho tiêu đề */
|
379 |
}
|
380 |
.gradio-container .gr-button {
|
381 |
+
background-color: #4a90e2; /* Màu xanh dương cho nút */
|
382 |
+
color: white; /* Màu chữ trắng trên nút */
|
383 |
}
|
384 |
.gradio-container .gr-slider__label {
|
385 |
+
color: #333333; /* Màu chữ đen cho nhãn slider */
|
386 |
+
}
|
387 |
+
.gradio-container .gr-chatbot {
|
388 |
+
border: 2px solid #4a90e2; /* Viền xanh dương cho chatbot */
|
389 |
+
border-radius: 10px; /* Bo góc viền chatbot */
|
390 |
+
padding: 10px; /* Khoảng cách bên trong chatbot */
|
391 |
+
background-color: #ffffff; /* Màu nền trắng cho chatbot */
|
392 |
}
|
393 |
""", fill_height=True) as demo:
|
394 |
gr.Markdown(DESCRIPTION) # Hiển thị mô tả
|