Spaces:
Running
Running
Upload 2 files
Browse files- cleaned_iau_reviews.csv +0 -0
- my_logic.py +16 -30
cleaned_iau_reviews.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
my_logic.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1 |
-
|
2 |
from collections import defaultdict
|
3 |
from difflib import SequenceMatcher
|
4 |
|
5 |
-
#
|
|
|
6 |
|
7 |
def similar(a, b):
|
8 |
return SequenceMatcher(None, a, b).ratio()
|
@@ -55,9 +56,9 @@ def build_strict_context(reviews, user_question):
|
|
55 |
else:
|
56 |
filtered = reviews
|
57 |
|
58 |
-
result = f"👨🏫 استاد: {best_prof or '[نامشخص]'} — 📚 درس: {best_course or '[نامشخص]'}
|
59 |
for i, r in enumerate(filtered, 1):
|
60 |
-
result += f"{i}. {r['comment'].strip()}
|
61 |
return result
|
62 |
|
63 |
def truncate_reviews_to_fit(reviews, max_chars=127000):
|
@@ -72,29 +73,16 @@ def truncate_reviews_to_fit(reviews, max_chars=127000):
|
|
72 |
return final
|
73 |
|
74 |
def answer_question(user_question, model):
|
75 |
-
print(f"
|
76 |
-
retrieved =
|
77 |
-
print(f"🔍 FAISS returned {len(retrieved)} raw rows")
|
78 |
-
retrieved = filter_relevant(retrieved, user_question)
|
79 |
-
print(f"✅ After filter_relevant(): {len(retrieved)} rows")
|
80 |
-
keyword_hits = keyword_match_reviews(user_question, metadata)
|
81 |
-
print(f"🔠 Keyword hits found: {len(keyword_hits)}")
|
82 |
-
existing_links = set(r["link"] for r in retrieved)
|
83 |
-
added = 0
|
84 |
-
for r in keyword_hits:
|
85 |
-
if r["link"] not in existing_links:
|
86 |
-
retrieved.append(r)
|
87 |
-
added += 1
|
88 |
-
print(f"➕ Added {added} unique fallback keyword rows")
|
89 |
-
print(f"📊 Total before truncation: {len(retrieved)}")
|
90 |
if not retrieved:
|
91 |
return "❌ هیچ تجربهای در مورد سوال شما در دادههای کانال یافت نشد."
|
|
|
92 |
retrieved.sort(key=lambda r: relevance_score(r, user_question), reverse=True)
|
93 |
retrieved = truncate_reviews_to_fit(retrieved)
|
94 |
-
print(f"✂️ After truncation: {len(retrieved)} rows")
|
95 |
context = build_strict_context(retrieved, user_question)
|
96 |
-
|
97 |
-
prompt = f"""شما یک دستیار هوشمند انتخاب واحد هستید که فقط و فقط بر اساس نظرات واقعی دانشجویان از کانال @IAUCourseExp پاسخ میدهید.
|
98 |
|
99 |
❗ قوانین مهم:
|
100 |
- فقط از دادههای همین نظرات استفاده کن. هیچ اطلاعات اضافی، حدسی یا اینترنتی استفاده نکن.
|
@@ -104,20 +92,18 @@ def answer_question(user_question, model):
|
|
104 |
• مقایسه چند استاد برای یک درس
|
105 |
• معرفی بهترین یا بدترین استادهای یک درس
|
106 |
• تحلیل نظر کلی دانشجویان درمورد یک درس خاص
|
107 |
-
|
108 |
-
-
|
109 |
-
- برای هر نظر، لینک تلگرام مربوطه را نیز حتماً ذکر کن.
|
110 |
-
- در پایان پاسخ، نتیجهگیری نهایی خود را بنویس: آیا این استاد برای این درس توصیه میشود یا نه — فقط بر اساس همین نظرات.
|
111 |
-
- در انتها حتماً بنویس:
|
112 |
-
📊 این پاسخ بر اساس بررسی {len(retrieved)} نظر دانشجویی نوشته شده است.
|
113 |
|
114 |
🔎 سوال دانشجو:
|
115 |
{user_question}
|
116 |
|
117 |
-
📄 نظرات
|
118 |
{context}
|
119 |
|
120 |
📘 پاسخ نهایی:
|
|
|
121 |
"""
|
|
|
122 |
response = model.generate_content(prompt)
|
123 |
-
return response.text
|
|
|
1 |
+
import pandas as pd
|
2 |
from collections import defaultdict
|
3 |
from difflib import SequenceMatcher
|
4 |
|
5 |
+
# Load reviews CSV
|
6 |
+
metadata = pd.read_csv("cleaned_iau_reviews.csv").to_dict(orient="records")
|
7 |
|
8 |
def similar(a, b):
|
9 |
return SequenceMatcher(None, a, b).ratio()
|
|
|
56 |
else:
|
57 |
filtered = reviews
|
58 |
|
59 |
+
result = f"👨🏫 استاد: {best_prof or '[نامشخص]'} — 📚 درس: {best_course or '[نامشخص]'}\n💬 نظرات:\n"
|
60 |
for i, r in enumerate(filtered, 1):
|
61 |
+
result += f"{i}. {r['comment'].strip()}\n🔗 لینک: {r['link']}\n\n"
|
62 |
return result
|
63 |
|
64 |
def truncate_reviews_to_fit(reviews, max_chars=127000):
|
|
|
73 |
return final
|
74 |
|
75 |
def answer_question(user_question, model):
|
76 |
+
print(f"\n🧠 Starting debug for question: {user_question}")
|
77 |
+
retrieved = keyword_match_reviews(user_question, metadata)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
if not retrieved:
|
79 |
return "❌ هیچ تجربهای در مورد سوال شما در دادههای کانال یافت نشد."
|
80 |
+
|
81 |
retrieved.sort(key=lambda r: relevance_score(r, user_question), reverse=True)
|
82 |
retrieved = truncate_reviews_to_fit(retrieved)
|
|
|
83 |
context = build_strict_context(retrieved, user_question)
|
84 |
+
|
85 |
+
prompt = f"""شما یک دستیار هوشمند انتخاب واحد هستید که فقط و فقط بر اساس نظرات واقعی دانشجویان از کانال @IAUCourseExp پاسخ میدهید.
|
86 |
|
87 |
❗ قوانین مهم:
|
88 |
- فقط از دادههای همین نظرات استفاده کن. هیچ اطلاعات اضافی، حدسی یا اینترنتی استفاده نکن.
|
|
|
92 |
• مقایسه چند استاد برای یک درس
|
93 |
• معرفی بهترین یا بدترین استادهای یک درس
|
94 |
• تحلیل نظر کلی دانشجویان درمورد یک درس خاص
|
95 |
+
- همهی نظرات مربوطه را تحلیل کن و لینکشان را هم بنویس.
|
96 |
+
- نتیجهگیری نهایی در انتها اضافه کن.
|
|
|
|
|
|
|
|
|
97 |
|
98 |
🔎 سوال دانشجو:
|
99 |
{user_question}
|
100 |
|
101 |
+
📄 نظرات دانشجویان:
|
102 |
{context}
|
103 |
|
104 |
📘 پاسخ نهایی:
|
105 |
+
📊 این پاسخ بر اساس بررسی {len(retrieved)} نظر دانشجویی نوشته شده است.
|
106 |
"""
|
107 |
+
|
108 |
response = model.generate_content(prompt)
|
109 |
+
return response.text
|