quoc-khanh commited on
Commit
5c846ae
·
verified ·
1 Parent(s): 5ffcb10

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -52
app.py CHANGED
@@ -15,24 +15,19 @@ from helpers import (
15
  from file_loader import get_vectorstore
16
  # import asyncio
17
 
18
- if "GOOGLE_API_KEY" not in os.environ:
19
- os.environ["GOOGLE_API_KEY"] = "AIzaSyDJ4vIKuIBIPNHATLxnoHlagXWbsAz-vRs"
20
  key = "AIzaSyDJ4vIKuIBIPNHATLxnoHlagXWbsAz-vRs"
21
-
22
- ###
23
-
24
  # Cấu hình API key cho Google GenAI
25
  genai.configure(api_key=key)
26
 
27
  vectorstore = get_vectorstore()
28
- # Define the augment_prompt function
29
- def augment_prompt(query: str, k: int = 10):
30
- queries = []
31
- queries.append(query)
32
 
 
 
33
  retriever = vectorstore.as_retriever(search_kwargs={"k": k})
34
  results = retriever.invoke(query)
35
-
 
36
  if results:
37
  source_knowledge = "\n\n".join([doc.page_content for doc in results])
38
  return f"""Dữ liệu dưới đây liên quan đến Trường Công Nghệ (NCT) thuộc Đại học Kinh tế Quốc dân (NEU), dựa vào đó trả lời câu hỏi.
@@ -40,53 +35,49 @@ Dữ liệu:
40
  {source_knowledge}
41
  """
42
  else:
43
- return f"Không có thông tin liên quan. \n."
44
 
45
  def get_answer(query, queries_list=None):
46
  if queries_list is None:
47
  queries_list = []
48
 
49
  messages = [
50
- {"role": "user", "parts": [{"text": "IMPORTANT: You are a super helpful, polite, Vietnamese-speaking asistant to give infomation of an university. If you can not see the answer in contexts, try to search it up online by yourself OR tell user to make a more detailed question."}]},
51
- {"role": "user", "parts": [{"text": augment_prompt(query=query,k=100)}]}
52
- ]
53
- # bonus = '''
54
- # Bạn tham kháo thêm các nguồn thông tin tại:
55
- # Trang thông tin điện tử: https://neu.edu.vn ; https://daotao.neu.edu.vn
56
- # Trang mạng xã hội có thông tin tuyển sinh: https://www.facebook.com/ktqdNEU ; https://www.facebook.com/tvtsneu ;
57
- # Email tuyển sinh: [email protected]
58
- # Số điện thoại tuyển sinh: 0888.128.558
59
- # '''
60
-
61
  queries_list.append(query)
62
  queries = {"role": "user", "parts": [{"text": prompt_order(queries_list)}]}
63
  messages_with_queries = messages.copy()
64
  messages_with_queries.append(queries)
65
- # messages_with_queries.insert(0, queries)
66
-
67
- # Configure API key
68
  genai.configure(api_key=key)
69
-
70
- # Initialize the Gemini model
71
  model = genai.GenerativeModel("gemini-2.0-flash")
72
-
73
  response = model.generate_content(contents=messages_with_queries, stream=True)
74
  response_text = ""
75
-
76
  for chunk in response:
77
  response_text += chunk.text
78
  yield response_text
79
-
80
  messages.append({"role": "model", "parts": [{"text": response_text}]})
81
-
82
- # user_feedback = yield "\nNhập phản hồi của bạn (hoặc nhập 'q' để thoát): "
83
- # if user_feedback.lower() == "q":
84
- # break
85
-
86
- # messages.append({"role": "user", "parts": [{"text": query}]})
87
-
88
  log_message(messages)
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  institutions = ['Tất cả', 'Trường Công Nghệ']
91
  categories = ['Tất cả', 'Đề án', 'Chương trình đào tạo']
92
 
@@ -94,20 +85,21 @@ print("Launching on space... This may take some time...")
94
 
95
  with gr.Blocks() as demo:
96
  with gr.Row():
97
- category1 = gr.Dropdown(choices = institutions, label="Trường", value = None)
98
- category2 = gr.Dropdown(choices = categories, label="Bạn quan tâm tới", value = None)
99
-
100
- chat_interface = gr.ChatInterface(get_answer,
101
- textbox=gr.Textbox(placeholder="Đặt câu hỏi tại đây",
102
- container=False,
103
- autoscroll=True,
104
- scale=7),
105
- type="messages",
106
- # textbox=prompt,
107
- # additional_inputs=[category1, category2]
108
- )
109
- # playwright_path = get_driver_dir()
 
 
110
 
111
  if __name__ == "__main__":
112
- demo.launch()
113
- # demo.launch()
 
15
  from file_loader import get_vectorstore
16
  # import asyncio
17
 
 
 
18
  key = "AIzaSyDJ4vIKuIBIPNHATLxnoHlagXWbsAz-vRs"
 
 
 
19
  # Cấu hình API key cho Google GenAI
20
  genai.configure(api_key=key)
21
 
22
  vectorstore = get_vectorstore()
23
+ last_vector_docs = None # Lưu kết quả docs từ vectorstore.invoke trong lần gọi get_answer gần nhất
 
 
 
24
 
25
+ def augment_prompt(query: str, k: int = 10):
26
+ global last_vector_docs
27
  retriever = vectorstore.as_retriever(search_kwargs={"k": k})
28
  results = retriever.invoke(query)
29
+ # Lưu kết quả để dùng cho log và lọc sau này
30
+ last_vector_docs = results
31
  if results:
32
  source_knowledge = "\n\n".join([doc.page_content for doc in results])
33
  return f"""Dữ liệu dưới đây liên quan đến Trường Công Nghệ (NCT) thuộc Đại học Kinh tế Quốc dân (NEU), dựa vào đó trả lời câu hỏi.
 
35
  {source_knowledge}
36
  """
37
  else:
38
+ return "Không có thông tin liên quan.\n."
39
 
40
  def get_answer(query, queries_list=None):
41
  if queries_list is None:
42
  queries_list = []
43
 
44
  messages = [
45
+ {"role": "user", "parts": [{"text": "IMPORTANT: You are a super helpful, polite, Vietnamese-speaking assistant to give information of an university. If you cannot see the answer in contexts, try to search it up online by yourself OR tell user to make a more detailed question."}]},
46
+ {"role": "user", "parts": [{"text": augment_prompt(query=query, k=20)}]}
47
+ ]
48
+
 
 
 
 
 
 
 
49
  queries_list.append(query)
50
  queries = {"role": "user", "parts": [{"text": prompt_order(queries_list)}]}
51
  messages_with_queries = messages.copy()
52
  messages_with_queries.append(queries)
53
+
54
+ # Cấu hình API key và khởi tạo model Gemini
 
55
  genai.configure(api_key=key)
 
 
56
  model = genai.GenerativeModel("gemini-2.0-flash")
57
+
58
  response = model.generate_content(contents=messages_with_queries, stream=True)
59
  response_text = ""
 
60
  for chunk in response:
61
  response_text += chunk.text
62
  yield response_text
 
63
  messages.append({"role": "model", "parts": [{"text": response_text}]})
 
 
 
 
 
 
 
64
  log_message(messages)
65
 
66
+ def filter_vector_docs(keyword: str):
67
+ global last_vector_docs
68
+ if last_vector_docs is None:
69
+ return "Chưa có dữ liệu vectorstore được gọi từ get_answer."
70
+ else:
71
+ if not keyword.strip():
72
+ # Nếu không nhập gì, trả về tất cả
73
+ filtered = [doc.page_content for doc in last_vector_docs]
74
+ else:
75
+ # Lọc các chunk chứa từ khoá (không phân biệt chữ hoa thường)
76
+ filtered = [doc.page_content for doc in last_vector_docs if keyword.lower() in doc.page_content.lower()]
77
+ if not filtered:
78
+ return f"Không có kết quả chứa từ khoá '{keyword}'."
79
+ return "\n\n".join(filtered)
80
+
81
  institutions = ['Tất cả', 'Trường Công Nghệ']
82
  categories = ['Tất cả', 'Đề án', 'Chương trình đào tạo']
83
 
 
85
 
86
  with gr.Blocks() as demo:
87
  with gr.Row():
88
+ # Dropdown category nếu cần
89
+ category1 = gr.Dropdown(choices=institutions, label="Trường", value=None)
90
+ category2 = gr.Dropdown(choices=categories, label="Bạn quan tâm tới", value=None)
91
+
92
+ # Chat Interface sử dụng ô nhập chung
93
+ shared_query = gr.Textbox(placeholder="Đặt câu hỏi tại đây", container=False, autoscroll=True, scale=7)
94
+ chat_interface = gr.ChatInterface(get_answer, textbox=shared_query, type="messages")
95
+
96
+ # Phần lọc các chunk: ô prompt nhập từ khoá và nút "Tìm trích xuất" nằm cùng hàng,
97
+ # kết quả sẽ hiển thị ở ô bên dưới. Nếu để trống, hiển thị toàn bộ.
98
+ with gr.Row():
99
+ filter_prompt = gr.Textbox(label="Nhập từ khoá", placeholder="Nhập từ khoá", interactive=True)
100
+ filter_button = gr.Button("Đọc trích xuất")
101
+ filter_output = gr.Textbox(label="Content", interactive=False)
102
+ filter_button.click(fn=filter_vector_docs, inputs=filter_prompt, outputs=filter_output)
103
 
104
  if __name__ == "__main__":
105
+ demo.launch()