hoduyquocbao commited on
Commit
d4f4893
1 Parent(s): 8d8f4b0

update new tool

Browse files
Files changed (2) hide show
  1. app.py +74 -6
  2. style.css +15 -1
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
- # Bất kỳ truy vấn nào khác sẽ được xử lý như hard_query
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=60, queue=False)
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="style.css", fill_height=True) as demo:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ }