Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
#
|
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
|
44 |
|
45 |
def get_answer(query, queries_list=None):
|
46 |
if queries_list is None:
|
47 |
queries_list = []
|
48 |
|
49 |
messages = [
|
50 |
-
|
51 |
-
|
52 |
-
]
|
53 |
-
|
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 |
-
|
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 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
|
|
|
|
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()
|
|