Spaces:
Sleeping
Sleeping
hoduyquocbao
commited on
Commit
•
d4f4893
1
Parent(s):
8d8f4b0
update new tool
Browse files
app.py
CHANGED
@@ -93,6 +93,31 @@ def search(query: str) -> List[Dict[str, Any]]:
|
|
93 |
all_results.append({"link": "N/A", "text": "Không thể thực hiện tìm kiếm."})
|
94 |
return all_results
|
95 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
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]:
|
97 |
"""
|
98 |
Tạo phản hồi sử dụng mô hình Llama cục bộ theo chế độ streaming.
|
@@ -143,8 +168,8 @@ def process_query(query: str) -> Dict[str, Any]:
|
|
143 |
# Định nghĩa các từ khóa hoặc mẫu để xác định hàm
|
144 |
web_search_keywords = ["tìm kiếm", "tìm", "tra cứu", "google", "lookup"]
|
145 |
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"]
|
146 |
-
|
147 |
-
|
148 |
query_lower = query.lower() # Chuyển truy vấn thành chữ thường để so sánh
|
149 |
|
150 |
if any(keyword in query_lower for keyword in web_search_keywords):
|
@@ -153,6 +178,9 @@ def process_query(query: str) -> Dict[str, Any]:
|
|
153 |
elif any(keyword in query_lower for keyword in general_query_keywords):
|
154 |
function_name = "general_query"
|
155 |
arguments = {"prompt": query}
|
|
|
|
|
|
|
156 |
else:
|
157 |
function_name = "hard_query"
|
158 |
arguments = {"prompt": query}
|
@@ -184,6 +212,15 @@ def handle_functions(function_call: Dict[str, Any], prompt: str, chat_history: L
|
|
184 |
# Trả về kết quả tìm kiếm cho người dùng
|
185 |
yield "📄 **Kết quả tìm kiếm:**\n" + web_summary
|
186 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
187 |
elif function_name in ["general_query", "hard_query"]:
|
188 |
prompt_text = arguments["prompt"]
|
189 |
yield "🤖 Đang tạo phản hồi..."
|
@@ -205,7 +242,7 @@ def handle_functions(function_call: Dict[str, Any], prompt: str, chat_history: L
|
|
205 |
|
206 |
# ---------------------------- Giao Diện Gradio ---------------------------- #
|
207 |
|
208 |
-
@spaces.GPU(duration=
|
209 |
def generate(
|
210 |
message: str,
|
211 |
chat_history: List[Tuple[str, str]],
|
@@ -218,9 +255,22 @@ def generate(
|
|
218 |
"""
|
219 |
Hàm chính để xử lý đầu vào của người dùng và tạo phản hồi.
|
220 |
"""
|
|
|
|
|
|
|
221 |
# Xác định hàm nào sẽ được gọi dựa trên tin nhắn của người dùng
|
222 |
function_call = process_query(message)
|
223 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
# Xử lý lời gọi hàm và sinh phản hồi tương ứng
|
225 |
response_iterator = handle_functions(
|
226 |
function_call=function_call,
|
@@ -245,9 +295,10 @@ EXAMPLES = [
|
|
245 |
["Viết một bài báo 100 từ về 'Lợi ích của mã nguồn mở trong nghiên cứu AI'"],
|
246 |
["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."],
|
247 |
["Tìm thông tin về Rạn san hô Great Barrier Reef."],
|
|
|
248 |
]
|
249 |
|
250 |
-
# Cấu hình giao diện trò chuyện của Gradio
|
251 |
chat_interface = gr.ChatInterface(
|
252 |
fn=generate, # Hàm được gọi khi có tương tác từ người dùng
|
253 |
additional_inputs=[
|
@@ -290,10 +341,27 @@ chat_interface = gr.ChatInterface(
|
|
290 |
stop_btn=None, # Không có nút dừng
|
291 |
examples=EXAMPLES, # Các ví dụ được hiển thị cho người dùng
|
292 |
cache_examples=False, # Không lưu bộ nhớ cache cho các ví dụ
|
|
|
|
|
|
|
293 |
)
|
294 |
|
295 |
-
# Tạo giao diện chính của Gradio
|
296 |
-
with gr.Blocks(css="
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
297 |
gr.Markdown(DESCRIPTION) # Hiển thị mô tả
|
298 |
gr.DuplicateButton(value="Nhân bản Không gian để sử dụng riêng tư", elem_id="duplicate-button") # Nút nhân bản không gian
|
299 |
chat_interface.render() # Hiển thị giao diện trò chuyện
|
|
|
93 |
all_results.append({"link": "N/A", "text": "Không thể thực hiện tìm kiếm."})
|
94 |
return all_results
|
95 |
|
96 |
+
def summarize_text(text: str, max_length: int = 150) -> str:
|
97 |
+
"""Tóm tắt văn bản sử dụng mô hình Llama."""
|
98 |
+
conversation = [
|
99 |
+
{"role": "user", "content": f"Hãy tóm tắt đoạn văn sau: {text}"}
|
100 |
+
]
|
101 |
+
input_ids = tokenizer.apply_chat_template(conversation, add_generation_prompt=True, return_tensors="pt")
|
102 |
+
input_ids = input_ids.to(device)
|
103 |
+
|
104 |
+
summary_streamer = TextIteratorStreamer(tokenizer, timeout=20.0, skip_prompt=True, skip_special_tokens=True)
|
105 |
+
summary_kwargs = {
|
106 |
+
"input_ids": input_ids,
|
107 |
+
"streamer": summary_streamer,
|
108 |
+
"max_new_tokens": max_length,
|
109 |
+
"do_sample": True,
|
110 |
+
"top_p": 0.95,
|
111 |
+
"temperature": 0.7,
|
112 |
+
}
|
113 |
+
t = Thread(target=model.generate, kwargs=summary_kwargs)
|
114 |
+
t.start()
|
115 |
+
|
116 |
+
summary = ""
|
117 |
+
for new_text in summary_streamer:
|
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.
|
|
|
168 |
# Định nghĩa các từ khóa hoặc mẫu để xác định hàm
|
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):
|
|
|
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}
|
|
|
212 |
# Trả về kết quả tìm kiếm cho người dùng
|
213 |
yield "📄 **Kết quả tìm kiếm:**\n" + web_summary
|
214 |
|
215 |
+
elif function_name == "summarize_query":
|
216 |
+
prompt_text = arguments["prompt"]
|
217 |
+
yield "📝 Đang tóm tắt thông tin..."
|
218 |
+
# Trích xuất thông tin cần tóm tắt từ prompt (giả định phần tóm tắt nằm sau từ khóa)
|
219 |
+
# Ví dụ: "tóm tắt nội dung về AI"
|
220 |
+
# Bạn có thể cải thiện logic này tùy theo cách bạn muốn trích xuất nội dung để tóm tắt
|
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..."
|
|
|
242 |
|
243 |
# ---------------------------- Giao Diện Gradio ---------------------------- #
|
244 |
|
245 |
+
@spaces.GPU(duration=90)
|
246 |
def generate(
|
247 |
message: str,
|
248 |
chat_history: List[Tuple[str, str]],
|
|
|
255 |
"""
|
256 |
Hàm chính để xử lý đầu vào của người dùng và tạo phản hồi.
|
257 |
"""
|
258 |
+
# Thông báo về việc phân tích đầu vào
|
259 |
+
yield "🔍 Đang phân tích truy vấn của bạn..."
|
260 |
+
|
261 |
# Xác định hàm nào sẽ được gọi dựa trên tin nhắn của người dùng
|
262 |
function_call = process_query(message)
|
263 |
|
264 |
+
# Thông báo về hàm được chọn
|
265 |
+
if function_call["name"] == "web_search":
|
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:
|
272 |
+
yield "⚠️ Không thể xác định chức năng phù hợp."
|
273 |
+
|
274 |
# Xử lý lời gọi hàm và sinh phản hồi tương ứng
|
275 |
response_iterator = handle_functions(
|
276 |
function_call=function_call,
|
|
|
295 |
["Viết một bài báo 100 từ về 'Lợi ích của mã nguồn mở trong nghiên cứu AI'"],
|
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
|
302 |
chat_interface = gr.ChatInterface(
|
303 |
fn=generate, # Hàm được gọi khi có tương tác từ người dùng
|
304 |
additional_inputs=[
|
|
|
341 |
stop_btn=None, # Không có nút dừng
|
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 và tóm tắt văn bản.",
|
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ả
|
366 |
gr.DuplicateButton(value="Nhân bản Không gian để sử dụng riêng tư", elem_id="duplicate-button") # Nút nhân bản không gian
|
367 |
chat_interface.render() # Hiển thị giao diện trò chuyện
|
style.css
CHANGED
@@ -8,4 +8,18 @@ h1 {
|
|
8 |
color: #fff;
|
9 |
background: #1565c0;
|
10 |
border-radius: 100vh;
|
11 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
color: #fff;
|
9 |
background: #1565c0;
|
10 |
border-radius: 100vh;
|
11 |
+
}
|
12 |
+
|
13 |
+
.gradio-container {
|
14 |
+
background-color: #f0f2f5; /* Màu nền nhẹ nhàng */
|
15 |
+
}
|
16 |
+
.gradio-container h1 {
|
17 |
+
color: #4a90e2; /* Màu xanh dương cho tiêu đề */
|
18 |
+
}
|
19 |
+
.gradio-container .gr-button {
|
20 |
+
background-color: #4a90e2; /* Màu xanh dương cho nút */
|
21 |
+
color: white; /* Màu chữ trắng trên nút */
|
22 |
+
}
|
23 |
+
.gradio-container .gr-slider__label {
|
24 |
+
color: #333333; /* Màu chữ đen cho nhãn slider */
|
25 |
+
}
|