File size: 4,120 Bytes
d376301
 
7291c68
 
 
e57a17b
7291c68
e59b163
d376301
7291c68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d376301
03a5388
 
 
7291c68
66afb4f
 
 
 
 
 
 
 
7291c68
 
 
 
03a5388
 
 
 
 
 
7291c68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d376301
7291c68
e59b163
66afb4f
e59b163
279f6ec
03a5388
 
 
 
 
 
 
 
66afb4f
 
 
 
 
 
 
 
 
e59b163
7291c68
848ceb3
d376301
 
7291c68
d376301
 
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import gradio as gr
from huggingface_hub import InferenceClient
import requests
from bs4 import BeautifulSoup
import json

# Hugging Face Inference API istemcisi
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")

# TÜBİTAK veri çekme fonksiyonu
def fetch_tubitak_data():
    """
    TÜBİTAK web sitesinden veri çeken fonksiyon.
    """
    try:
        url = "https://www.tubitak.gov.tr/tr"
        response = requests.get(url)
        if response.status_code != 200:
            return [{"title": "Web sitesine erişim sağlanamadı", "description": "Lütfen internet bağlantınızı kontrol edin."}]
        soup = BeautifulSoup(response.text, "html.parser")
        
        # TÜBİTAK haberlerini çekme
        news = []
        for item in soup.find_all("div", class_="news-title"):
            title = item.text.strip()
            link = item.find("a")["href"]
            news.append({"title": title, "link": f"https://www.tubitak.gov.tr{link}"})
        
        return news
    except Exception as e:
        return [{"title": "Hata oluştu", "description": str(e)}]

# Anahtar kelimelere göre veri çekme kontrolü
KEYWORDS = ["tübitak", "bilgem", "blog", "YTE", "YZE", "SAGE", "MAM"]

# Chatbot yanıt fonksiyonu
def respond(
    message,
    history: list[tuple[str, str]],
    system_message,
    max_tokens,
    temperature,
    top_p,
):
    """
    Kullanıcı mesajını ve geçmiş konuşmaları kullanarak yanıt oluşturur.
    """
    try:
        # Eğer mesajda belirlenen anahtar kelimelerden biri geçiyorsa TÜBİTAK verilerini getir
        if any(keyword.lower() in message.lower() for keyword in KEYWORDS):
            data = fetch_tubitak_data()
            response = "\n".join([f"{item['title']} (Daha fazla bilgi: {item['link']})" for item in data])
            if not response.strip():
                response = "Şu anda TÜBİTAK ile ilgili bilgileri getiremedim. Lütfen daha sonra tekrar deneyin."
            yield response
            return
        
        # Normal durumlarda model yanıtını üret
        messages = [{"role": "system", "content": system_message}]
        for val in history:
            if val[0]:
                messages.append({"role": "user", "content": val[0]})
            if val[1]:
                messages.append({"role": "assistant", "content": val[1]})
        messages.append({"role": "user", "content": message})
        response = ""
        for message in client.chat_completion(
            messages,
            max_tokens=max_tokens,
            stream=True,
            temperature=temperature,
            top_p=top_p,
        ):
            token = message.choices[0].delta.content
            response += token
            yield response
    except Exception as e:
        yield f"Hata oluştu: {str(e)}"

# Gradio Chat Arayüzü
demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox(
            value=(
                "You are a TÜBİTAK chatbot designed to answer questions about TÜBİTAK and its affiliated institutions. "
                "Your primary task is to provide clear and concise answers in Turkish using information from TÜBİTAK's official website "
                "(https://www.tubitak.gov.tr/tr) and the BİLGEM Blog (https://yteblog.bilgem.tubitak.gov.tr). "
                "If possible, include links to the official sources in your answers and ensure they are professional and accurate."
            ),
            label="System message"
        ),
        gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(
            minimum=0.1,
            maximum=1.0,
            value=0.95,
            step=0.05,
            label="Top-p (nucleus sampling)",
        ),
    ],
    title="TÜBİTAK Chatbot",
    description="TÜBİTAK ve BİLGEM hakkında bilgi edinmek için sorular sorun. [ChatYTE İçin Sentetik Veri Oluşturmak Amacıyla Geliştirilmiştir]",
)

# Uygulamayı başlat
if __name__ == "__main__":
    demo.launch()