File size: 2,565 Bytes
6aa5690
175598c
 
 
 
d173465
c85e7c2
175598c
 
6aa5690
c85e7c2
df561c7
c85e7c2
 
 
 
 
df561c7
 
d173465
c85e7c2
df561c7
c85e7c2
175598c
 
 
 
c85e7c2
175598c
c85e7c2
 
 
 
d173465
c85e7c2
175598c
6aa5690
175598c
 
 
 
 
c85e7c2
 
 
 
175598c
6aa5690
c85e7c2
6aa5690
 
f51748e
c85e7c2
7e7a410
 
c85e7c2
7e7a410
c85e7c2
 
7e7a410
6aa5690
8796cef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import torch
import gradio as gr
from transformers import AutoTokenizer, AutoModel
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# بارگذاری مدل
tokenizer = AutoTokenizer.from_pretrained("HooshvareLab/bert-fa-base-uncased")
model = AutoModel.from_pretrained("HooshvareLab/bert-fa-base-uncased")

# پرسش و پاسخ‌ها (سوالات باید طبیعی‌تر شوند)
faq_dict = {
    "زمان انتخاب واحد چه موقع است؟": "معمولاً پایان شهریور و بهمن است.",
    "چه زمانی می‌توان حذف و اضافه انجام داد؟": "حدود یک هفته پس از شروع ترم تحصیلی است.",
    "چه معدلی برای انتخاب ۲۴ واحد لازم است؟": "حداقل معدل 17 نیاز است.",
    "تا چه زمانی امکان حذف اضطراری وجود دارد؟": "تا هفته هشتم ترم مجاز است.",
    "چگونه می‌توان مهمان شد؟": "با موافقت دانشگاه مبدا و مقصد انجام می‌شود.",
}

faq_questions = list(faq_dict.keys())
faq_embeddings = []

# تابع استخراج embedding
def get_embedding(text):
    inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
    with torch.no_grad():
        outputs = model(**inputs)
    return outputs.last_hidden_state.mean(dim=1)[0].cpu().numpy()

# پیش‌محاسبه embeddingها
for question in faq_questions:
    emb = get_embedding(question)
    faq_embeddings.append(emb)

# پاسخ‌دهی
def student_bot(user_question):
    try:
        user_emb = get_embedding(user_question)
        sims = [cosine_similarity([user_emb], [emb])[0][0] for emb in faq_embeddings]
        best_idx = int(np.argmax(sims))
        best_score = sims[best_idx]

        # 👇 برای دیباگ
        print("Similarity Score:", best_score)

        if best_score > 0.6:
            return faq_dict[faq_questions[best_idx]]
        else:
            return "متأسفم، پاسخ این سؤال در حال حاضر موجود نیست."
    except Exception as e:
        return f"❗️خطا در سیستم: {str(e)}"

# رابط Gradio
iface = gr.Interface(
    fn=student_bot,
    inputs=gr.Textbox(label="سوال خود را بنویسید"),
    outputs=gr.Textbox(label="پاسخ"),
    title="ایجنت راهنمای دانشجویان",
    description="پاسخ به سوالات رایج با استفاده از مدل FarsiBERT و تشابه معنایی"
)

iface.launch()