Update app.py
Browse files
app.py
CHANGED
@@ -29,29 +29,39 @@ st.markdown("""
|
|
29 |
""", unsafe_allow_html=True)
|
30 |
st.markdown("""
|
31 |
<style>
|
|
|
32 |
@font-face {
|
33 |
-
font-family: '
|
34 |
-
src: url('https://
|
35 |
-
url('https://cdn.jsdelivr.net/gh/rastikerdar/shabnam-font/dist/Shabnam.woff') format('woff');
|
36 |
font-weight: 400;
|
37 |
font-style: normal;
|
38 |
}
|
|
|
|
|
39 |
html, body, [class*="css"] {
|
40 |
-
font-family: '
|
41 |
-
font-weight:
|
42 |
direction: rtl;
|
43 |
text-align: right;
|
|
|
|
|
44 |
}
|
|
|
|
|
45 |
.stApp {
|
46 |
background: linear-gradient(to left, #4b5e40, #2e3b2e);
|
47 |
color: #ffffff;
|
48 |
}
|
|
|
|
|
49 |
[data-testid="stSidebar"] {
|
50 |
width: 260px !important;
|
51 |
background-color: #1a2b1e;
|
52 |
border: none !important;
|
53 |
padding-top: 20px;
|
54 |
}
|
|
|
|
|
55 |
.menu-item {
|
56 |
display: flex;
|
57 |
align-items: center;
|
@@ -63,18 +73,24 @@ st.markdown("""
|
|
63 |
cursor: pointer;
|
64 |
transition: background-color 0.3s ease;
|
65 |
}
|
|
|
|
|
66 |
.menu-item:hover {
|
67 |
background-color: #2e3b2e;
|
68 |
color: #b8860b;
|
69 |
}
|
|
|
|
|
70 |
.menu-item img {
|
71 |
width: 24px;
|
72 |
height: 24px;
|
73 |
}
|
|
|
|
|
74 |
.stButton>button {
|
75 |
background-color: #b8860b !important;
|
76 |
color: #1a2b1e !important;
|
77 |
-
font-family: '
|
78 |
font-weight: 700 !important;
|
79 |
border-radius: 10px;
|
80 |
padding: 12px 24px;
|
@@ -84,11 +100,15 @@ st.markdown("""
|
|
84 |
width: 100%;
|
85 |
margin: 10px 0;
|
86 |
}
|
|
|
|
|
87 |
.stButton>button:hover {
|
88 |
background-color: #8b6508 !important;
|
89 |
transform: translateY(-2px);
|
90 |
box-shadow: 0 4px 8px rgba(0,0,0,0.3);
|
91 |
}
|
|
|
|
|
92 |
.header-text {
|
93 |
text-align: center;
|
94 |
margin: 20px 0;
|
@@ -97,18 +117,25 @@ st.markdown("""
|
|
97 |
border-radius: 15px;
|
98 |
box-shadow: 0 6px 12px rgba(0,0,0,0.4);
|
99 |
}
|
|
|
|
|
100 |
.header-text h1 {
|
101 |
font-size: 42px;
|
102 |
color: #b8860b;
|
103 |
margin: 0;
|
104 |
font-weight: 800;
|
|
|
105 |
}
|
|
|
|
|
106 |
.subtitle {
|
107 |
font-size: 18px;
|
108 |
color: #d4d4d4;
|
109 |
font-weight: 600;
|
110 |
margin-top: 10px;
|
111 |
}
|
|
|
|
|
112 |
.chat-message {
|
113 |
flex-wrap: wrap;
|
114 |
background-color: rgba(26, 43, 30, 0.95);
|
@@ -126,28 +153,37 @@ st.markdown("""
|
|
126 |
align-items: center;
|
127 |
gap: 15px;
|
128 |
}
|
|
|
|
|
129 |
@keyframes fadeIn {
|
130 |
from { opacity: 0; transform: translateY(10px); }
|
131 |
to { opacity: 1; transform: translateY(0); }
|
132 |
}
|
|
|
|
|
133 |
.stTextInput>div>input, .stTextArea textarea {
|
134 |
background-color: rgba(26, 43, 30, 0.95) !important;
|
135 |
border-radius: 10px !important;
|
136 |
border: 1px solid #b8860b !important;
|
137 |
padding: 12px !important;
|
138 |
-
font-family: '
|
139 |
font-weight: 500;
|
140 |
font-size: 16px;
|
141 |
color: #d4d4d4 !important;
|
142 |
}
|
|
|
|
|
143 |
hr {
|
144 |
border: 1px solid #b8860b;
|
145 |
margin: 15px 0;
|
146 |
}
|
|
|
|
|
147 |
[data-testid="stSidebar"] > div {
|
148 |
border: none !important;
|
149 |
}
|
150 |
-
|
|
|
151 |
""", unsafe_allow_html=True)
|
152 |
|
153 |
|
@@ -277,6 +313,11 @@ def load_and_process_documents(path):
|
|
277 |
|
278 |
all_sentences = load_and_process_documents(folder_path)
|
279 |
|
|
|
|
|
|
|
|
|
|
|
280 |
|
281 |
# all_sentences = load_and_process_documents(folder_path)
|
282 |
# st.markdown(all_sentences[2])
|
@@ -411,24 +452,21 @@ sentEmbedding.load_model("C:/Users/ici/Downloads/sent2vec/sent2vec-naab.model")
|
|
411 |
|
412 |
|
413 |
|
414 |
-
top_k = 5
|
415 |
-
threshold = 0.8
|
416 |
|
417 |
original_sentences = all_sentences.copy()
|
418 |
all_vectors = [sentEmbedding.get_sentence_vector(sentence) for sentence in original_sentences]
|
419 |
|
420 |
if query:
|
421 |
found = False
|
422 |
-
threshold =
|
423 |
|
424 |
for idx, sentence in enumerate(all_sentences):
|
425 |
similarity = fuzz.partial_ratio(query, sentence)
|
426 |
if similarity >= threshold:
|
427 |
-
st.markdown(sentence)
|
428 |
-
|
429 |
-
# تولید پاسخ بازنویسیشده
|
430 |
prompt = f"""
|
431 |
-
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر
|
432 |
|
433 |
سوال:
|
434 |
{query}
|
@@ -446,8 +484,8 @@ if query:
|
|
446 |
|
447 |
# بررسی مرتبط بودن پاسخ با سؤال
|
448 |
review_prompt = f"""
|
449 |
-
لطفاً بررسی کن که آیا پاسخ زیر،
|
450 |
-
اگر پاسخ اشتباه است یا ربطی به سوال ندارد، فقط بنویس: 'نیاز به اصلاح دارد'.
|
451 |
|
452 |
سوال:
|
453 |
{query}
|
@@ -460,13 +498,32 @@ if query:
|
|
460 |
HumanMessage(content=review_prompt)
|
461 |
])
|
462 |
review_result = review_response.content.strip()
|
463 |
-
|
464 |
if "تأیید شد" in review_result:
|
|
|
465 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
466 |
else:
|
467 |
-
# تولید پاسخ جدید توسط مدل بدون استفاده از داده قبلی
|
468 |
final_prompt = f"""
|
469 |
-
لطفاً برای سوال زیر پاسخی حرفهای، دقیق و روان تولید کن که مرتبط و معتبر باشد.
|
470 |
|
471 |
سوال:
|
472 |
{query}
|
@@ -476,6 +533,7 @@ if query:
|
|
476 |
HumanMessage(content=final_prompt)
|
477 |
])
|
478 |
final_answer = new_response.content.strip()
|
|
|
479 |
st.markdown(f'<div class="chat-message">{final_answer}</div>', unsafe_allow_html=True)
|
480 |
|
481 |
think.empty()
|
@@ -489,5 +547,6 @@ if query:
|
|
489 |
HumanMessage(content=prompt)
|
490 |
])
|
491 |
rewritten = response.content.strip()
|
|
|
492 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
493 |
think.empty()
|
|
|
29 |
""", unsafe_allow_html=True)
|
30 |
st.markdown("""
|
31 |
<style>
|
32 |
+
/* بارگذاری فونت Roboto */
|
33 |
@font-face {
|
34 |
+
font-family: 'Roboto';
|
35 |
+
src: url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap') format('woff2');
|
|
|
36 |
font-weight: 400;
|
37 |
font-style: normal;
|
38 |
}
|
39 |
+
|
40 |
+
/* تنظیم فونت برای کل سایت */
|
41 |
html, body, [class*="css"] {
|
42 |
+
font-family: 'Roboto', Tahoma, sans-serif !important;
|
43 |
+
font-weight: 400 !important;
|
44 |
direction: rtl;
|
45 |
text-align: right;
|
46 |
+
background-color: #2e3b2e;
|
47 |
+
color: #ffffff;
|
48 |
}
|
49 |
+
|
50 |
+
/* طراحی برای بخش استایل اپ */
|
51 |
.stApp {
|
52 |
background: linear-gradient(to left, #4b5e40, #2e3b2e);
|
53 |
color: #ffffff;
|
54 |
}
|
55 |
+
|
56 |
+
/* استایل برای سایدبار */
|
57 |
[data-testid="stSidebar"] {
|
58 |
width: 260px !important;
|
59 |
background-color: #1a2b1e;
|
60 |
border: none !important;
|
61 |
padding-top: 20px;
|
62 |
}
|
63 |
+
|
64 |
+
/* استایل برای آیتمهای منو */
|
65 |
.menu-item {
|
66 |
display: flex;
|
67 |
align-items: center;
|
|
|
73 |
cursor: pointer;
|
74 |
transition: background-color 0.3s ease;
|
75 |
}
|
76 |
+
|
77 |
+
/* استایل برای آیتمهای منو هنگام هاور */
|
78 |
.menu-item:hover {
|
79 |
background-color: #2e3b2e;
|
80 |
color: #b8860b;
|
81 |
}
|
82 |
+
|
83 |
+
/* استایل برای آیکونها در منو */
|
84 |
.menu-item img {
|
85 |
width: 24px;
|
86 |
height: 24px;
|
87 |
}
|
88 |
+
|
89 |
+
/* استایل برای دکمهها */
|
90 |
.stButton>button {
|
91 |
background-color: #b8860b !important;
|
92 |
color: #1a2b1e !important;
|
93 |
+
font-family: 'Roboto', Tahoma, sans-serif;
|
94 |
font-weight: 700 !important;
|
95 |
border-radius: 10px;
|
96 |
padding: 12px 24px;
|
|
|
100 |
width: 100%;
|
101 |
margin: 10px 0;
|
102 |
}
|
103 |
+
|
104 |
+
/* استایل برای دکمهها هنگام هاور */
|
105 |
.stButton>button:hover {
|
106 |
background-color: #8b6508 !important;
|
107 |
transform: translateY(-2px);
|
108 |
box-shadow: 0 4px 8px rgba(0,0,0,0.3);
|
109 |
}
|
110 |
+
|
111 |
+
/* استایل برای متن هدر */
|
112 |
.header-text {
|
113 |
text-align: center;
|
114 |
margin: 20px 0;
|
|
|
117 |
border-radius: 15px;
|
118 |
box-shadow: 0 6px 12px rgba(0,0,0,0.4);
|
119 |
}
|
120 |
+
|
121 |
+
/* استایل برای عنوان هدر */
|
122 |
.header-text h1 {
|
123 |
font-size: 42px;
|
124 |
color: #b8860b;
|
125 |
margin: 0;
|
126 |
font-weight: 800;
|
127 |
+
font-family: 'Roboto', Tahoma, sans-serif;
|
128 |
}
|
129 |
+
|
130 |
+
/* استایل برای زیرنویس */
|
131 |
.subtitle {
|
132 |
font-size: 18px;
|
133 |
color: #d4d4d4;
|
134 |
font-weight: 600;
|
135 |
margin-top: 10px;
|
136 |
}
|
137 |
+
|
138 |
+
/* استایل برای پیامهای چت */
|
139 |
.chat-message {
|
140 |
flex-wrap: wrap;
|
141 |
background-color: rgba(26, 43, 30, 0.95);
|
|
|
153 |
align-items: center;
|
154 |
gap: 15px;
|
155 |
}
|
156 |
+
|
157 |
+
/* انیمیشن برای ورود پیام چت */
|
158 |
@keyframes fadeIn {
|
159 |
from { opacity: 0; transform: translateY(10px); }
|
160 |
to { opacity: 1; transform: translateY(0); }
|
161 |
}
|
162 |
+
|
163 |
+
/* استایل برای ورودی متن */
|
164 |
.stTextInput>div>input, .stTextArea textarea {
|
165 |
background-color: rgba(26, 43, 30, 0.95) !important;
|
166 |
border-radius: 10px !important;
|
167 |
border: 1px solid #b8860b !important;
|
168 |
padding: 12px !important;
|
169 |
+
font-family: 'Roboto', Tahoma;
|
170 |
font-weight: 500;
|
171 |
font-size: 16px;
|
172 |
color: #d4d4d4 !important;
|
173 |
}
|
174 |
+
|
175 |
+
/* استایل برای خط افقی */
|
176 |
hr {
|
177 |
border: 1px solid #b8860b;
|
178 |
margin: 15px 0;
|
179 |
}
|
180 |
+
|
181 |
+
/* حذف مرز از قسمت سایدبار */
|
182 |
[data-testid="stSidebar"] > div {
|
183 |
border: none !important;
|
184 |
}
|
185 |
+
</style>
|
186 |
+
|
187 |
""", unsafe_allow_html=True)
|
188 |
|
189 |
|
|
|
313 |
|
314 |
all_sentences = load_and_process_documents(folder_path)
|
315 |
|
316 |
+
def clean_text(text):
|
317 |
+
cleaned_text = re.sub(r'[^آ-ی۰-۹0-9،.؟!؛+\-* ]+', '', text)
|
318 |
+
|
319 |
+
return cleaned_text
|
320 |
+
|
321 |
|
322 |
# all_sentences = load_and_process_documents(folder_path)
|
323 |
# st.markdown(all_sentences[2])
|
|
|
452 |
|
453 |
|
454 |
|
455 |
+
#top_k = 5
|
456 |
+
#threshold = 0.8
|
457 |
|
458 |
original_sentences = all_sentences.copy()
|
459 |
all_vectors = [sentEmbedding.get_sentence_vector(sentence) for sentence in original_sentences]
|
460 |
|
461 |
if query:
|
462 |
found = False
|
463 |
+
threshold = 62
|
464 |
|
465 |
for idx, sentence in enumerate(all_sentences):
|
466 |
similarity = fuzz.partial_ratio(query, sentence)
|
467 |
if similarity >= threshold:
|
|
|
|
|
|
|
468 |
prompt = f"""
|
469 |
+
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 1024 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و محتوای چند پاسخ را در صورت نیاز با هم ترکیب کن.
|
470 |
|
471 |
سوال:
|
472 |
{query}
|
|
|
484 |
|
485 |
# بررسی مرتبط بودن پاسخ با سؤال
|
486 |
review_prompt = f"""
|
487 |
+
لطفاً بررسی کن که آیا پاسخ زیر، حدودا به سوال زیر پاسخ داده است یا خیر یعنی کلمات کلیدی اصلی در سوال در پاسخ هست یا ن . اگر پاسخ به سوال مرتبط، درست و قابل قبول است، فقط بنویس: 'تأیید شدواگر کمی مربوط بود بنویس: 'کمی خوب''.
|
488 |
+
اگر پاسخ اشتباه است یا هیچ ربطی به سوال ندارد، فقط بنویس: 'نیاز به اصلاح دارد'.
|
489 |
|
490 |
سوال:
|
491 |
{query}
|
|
|
498 |
HumanMessage(content=review_prompt)
|
499 |
])
|
500 |
review_result = review_response.content.strip()
|
|
|
501 |
if "تأیید شد" in review_result:
|
502 |
+
rewritten = clean_text(rewritten)
|
503 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
504 |
+
elif "کمی خوب" in review_result:
|
505 |
+
final_prompt = f"""
|
506 |
+
لطفاً برای سوال زیر پاسخی حرفهای، دقیق و روان تولید کن که مرتبط و معتبر باشد. از زبانی جز فارسی استفاده نکن و بیا هم از سوال هم دیتای زیر و هم از پاسخ استفاده کن و پاسخ مناسبی بنویس :
|
507 |
+
|
508 |
+
سوال:
|
509 |
+
{query}
|
510 |
+
پاسخ:
|
511 |
+
{review_result}
|
512 |
+
دیتا:
|
513 |
+
{rewritten}
|
514 |
+
|
515 |
+
"""
|
516 |
+
new_1response = llm([
|
517 |
+
SystemMessage(content="You are a helpful assistant."),
|
518 |
+
HumanMessage(content=final_prompt)
|
519 |
+
])
|
520 |
+
final_answer1 = new_1response.content.strip()
|
521 |
+
final_answer1 = clean_text(final_answer1)
|
522 |
+
st.markdown(f'<div class="chat-message">{final_answer1}</div>', unsafe_allow_html=True)
|
523 |
+
|
524 |
else:
|
|
|
525 |
final_prompt = f"""
|
526 |
+
لطفاً برای سوال زیر پاسخی حرفهای، دقیق و روان تولید کن که مرتبط و معتبر باشد. ا�� زبانی جز فارسی استفاده نکن :
|
527 |
|
528 |
سوال:
|
529 |
{query}
|
|
|
533 |
HumanMessage(content=final_prompt)
|
534 |
])
|
535 |
final_answer = new_response.content.strip()
|
536 |
+
final_answer = clean_text(final_answer)
|
537 |
st.markdown(f'<div class="chat-message">{final_answer}</div>', unsafe_allow_html=True)
|
538 |
|
539 |
think.empty()
|
|
|
547 |
HumanMessage(content=prompt)
|
548 |
])
|
549 |
rewritten = response.content.strip()
|
550 |
+
rewritten = clean_text(rewritten)
|
551 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
552 |
think.empty()
|