-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
116 lines (98 loc) · 5.11 KB
/
app.py
File metadata and controls
116 lines (98 loc) · 5.11 KB
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
111
112
113
114
115
116
# app.py - Streamlit Uygulaması (Gelişmiş)
import streamlit as st
from nlp_model import get_embedding
from web_scraper import search_and_scrape
from knowledge_base import KNOWLEDGE_BASE
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import pickle
import os
import re
EMBEDDINGS_FILE = "embeddings.pkl"
@st.cache_resource
def load_resources():
"""NLP modelini ve bilgi bankası embedding'lerini yükler veya oluşturur."""
st.spinner("NLP modelini yüklüyor ve bilgi bankası embedding'lerini hazırlıyor...")
if os.path.exists(EMBEDDINGS_FILE):
st.info(f"'{EMBEDDINGS_FILE}' dosyasından bilgi bankası embedding'leri yükleniyor...")
with open(EMBEDDINGS_FILE, 'rb') as f:
return pickle.load(f)
else:
st.info("Bilgi bankası embedding'leri oluşturuluyor... Bu biraz zaman alabilir.")
embeddings = {
anahtar: get_embedding(anahtar) for anahtar in KNOWLEDGE_BASE.keys()
}
with open(EMBEDDINGS_FILE, 'wb') as f:
pickle.dump(embeddings, f)
st.success(f"Bilgi bankası embedding'leri '{EMBEDDINGS_FILE}' dosyasına kaydedildi.")
return embeddings
# Kaynakları yükle (Streamlit uygulamasının başında bir kez çalışır)
# Bu kısmı Streamlit'in kendi lifecycle'ına bırakıyoruz, ilk yüklemede gösterilecek.
bilgi_bankasi_embeddings = load_resources()
def preprocess_query(query):
"""Kullanıcı sorgusunu temizler ve küçük harfe dönüştürür."""
query = query.lower().strip()
query = re.sub(r'[^\w\s]', '', query)
query = re.sub(r'\s+', ' ', query).strip()
return query
def get_assistant_response(soru):
"""
NLP entegrasyonu ve Web Scraping ile daha akıllı bir temel bilim asistanı.
Streamlit uygulaması için uyarlanmıştır.
"""
islenmis_soru = preprocess_query(soru)
soru_embedding = get_embedding(islenmis_soru)
en_yuksek_benzerlik = -1
en_benzer_anahtar = None
for anahtar, embedding in bilgi_bankasi_embeddings.items():
benzerlik = cosine_similarity(soru_embedding.reshape(1, -1), embedding.reshape(1, -1))[0][0]
if benzerlik > en_yuksek_benzerlik:
en_yuksek_benzerlik = benzerlik
en_benzer_anahtar = anahtar
if en_yuksek_benzerlik > 0.65: # Eşik değeri
return f"EBDS Asistanı: {KNOWLEDGE_BASE[en_benzer_anahtar]}"
else:
with st.spinner("Bilgi bankasında bulunamadı. Web'de aranıyor..."):
web_sonuc = search_and_scrape(soru) # Web scraping için orijinal soruyu kullan
if web_sonuc and not ("Web'den çekilen metin anlamlı değil veya çok kısa." in web_sonuc or \
"DuckDuckGo aramasında uygun bir bağlantı bulunamadı." in web_sonuc or \
"Web isteği hatası" in web_sonuc or \
"Web sayfasını işlerken bir sorun oluştu" in web_sonuc):
return f"EBDS Asistanı (Web'den): {web_sonuc}"
else:
# Hata mesajlarını daha anlaşılır hale getir
error_message = "Üzgünüm, bu konu hakkında henüz bilgiye sahip değilim veya yeterince ilgili bir bilgi bulamadım."
if "Web'den çekilen metin anlamlı değil veya çok kısa." in web_sonuc:
error_message += " (Web sayfasından yeterli bilgi alınamadı.)"
elif "DuckDuckGo aramasında uygun bir bağlantı bulunamadı." in web_sonuc:
error_message += " (Web aramasında uygun bir kaynak bulunamadı.)"
elif "Web isteği hatası" in web_sonuc:
error_message += " (İnternet bağlantınızda veya erişimde bir sorun oluştu.)"
elif "Web sayfasını işlerken bir sorun oluştu" in web_sonuc:
error_message += " (Web sayfasını işlerken teknik bir sorun yaşandı.)"
return f"EBDS Asistanı: {error_message}"
# --- Streamlit Arayüzü ---
st.set_page_config(page_title="EBDS Temel Bilim Asistanı", page_icon=":brain:", layout="wide")
st.title("🔬 EBDS Temel Bilim Asistanı")
st.markdown("Temel bilimler alanındaki sorularınıza yanıt bulmak için buradayım!")
# Sohbet geçmişini başlat (Streamlit session_state)
if "messages" not in st.session_state:
st.session_state.messages = []
# Sohbet geçmişini görüntüle
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Kullanıcıdan soru alma
if kullanici_sorusu := st.chat_input("Sorunuzu buraya yazın..."):
# Kullanıcı mesajını geçmişe ekle ve göster
st.session_state.messages.append({"role": "user", "content": kullanici_sorusu})
with st.chat_message("user"):
st.markdown(kullanici_sorusu)
# Asistan yanıtını al ve göster
with st.chat_message("assistant"):
with st.spinner("Yanıt aranıyor..."):
response = get_assistant_response(kullanici_sorusu)
st.markdown(response)
st.session_state.messages.append({"role": "assistant", "content": response})
st.markdown("---")
st.markdown("Bu asistan, 'insanlık için büyük bir proje' vizyonuyla geliştirilmiştir.")