Egitbot / app.py
mhuseyina's picture
Upload app.py
0c1e079 verified
#RAG Temelli Chatbot-EĞİTBOT
#Gerekli kütüphaneleri ekliyoruz.
import os
import datetime
import gradio as gr
from datasets import load_dataset
from langchain_huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import TokenTextSplitter
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from langchain_google_genai import ChatGoogleGenerativeAI
# API anahtarları alınıyor.
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
HUGGINGFACEHUB_API_TOKEN = os.getenv("HUGGINGFACEHUB_API_TOKEN")
MODEL_NAME = "models/gemini-2.5-pro"
# Veri hazırlama fonksiyonumuz.
def prepare_retriever():
dataset_math_word = load_dataset("duxx/orca-math-word-problems-tr", split="train[:10000]")
dataset_math_hard = load_dataset("Karayel-DDI/Turkce_Lighteval_MATH-Hard", split="train[:10000]")
dataset_edu = load_dataset("korkmazemin1/turkish-education-dataset", split="train[:5000]")
dataset_wiki_sum = load_dataset("musabg/wikipedia-tr-summarization", split="train[:10000]")
documents = []
# 1. Orca Math Word Problems
for item in dataset_math_word:
question = item.get("question", "").strip()
answer = item.get("answer", "").strip()
if question and answer:
documents.append(f"Soru: {question}\nCevap: {answer}")
# 2. Karayel-DDI Math Hard
for item in dataset_math_hard:
question = item.get("question", "").strip()
answer = item.get("solution", "").strip()
if question and answer:
documents.append(f"Soru: {question}\nCevap: {answer}")
# 3. Korkmazemin1 Turkish Education Dataset
for item in dataset_edu:
question = item.get("soru", "").strip()
answer = item.get("cevap", "").strip()
if question and answer:
documents.append(f"Soru: {question}\nCevap: {answer}")
# 4. Musabg Wikipedia Turkish Summarization Dataset
for item in dataset_wiki_sum:
text = item.get("text", "").strip()
summary = item.get("summary", "").strip()
if text and summary:
documents.append(f"Metin: {text}\nÖzet: {summary}")
text_splitter = TokenTextSplitter(chunk_size=1000, chunk_overlap=100)
docs = text_splitter.create_documents(documents)
# Embedding modelimiz.
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
# FAISS dizini ve daha önce kayıtlı FAISS varsa onu yükleme.
FAISS_PATH = "faiss_index"
if os.path.exists(FAISS_PATH):
vectorstore = FAISS.load_local(FAISS_PATH, embedding_model, allow_dangerous_deserialization=True)
else:
vectorstore = FAISS.from_documents(docs, embedding_model)
vectorstore.save_local(FAISS_PATH)
return vectorstore.as_retriever(search_kwargs={"k": 3})
# Fonksiyonu çağırıp retriever'ı hazırlama.
retriever = prepare_retriever()
# -----------------------------
# 🔗 ÖZEL PROMPT OLUŞTURMA
# -----------------------------
# Burada modelden gelen bilgiyi nasıl kullanacağını belirtiyoruz.
prompt_template = """
Aşağıda bir öğrenci sana bir ders sorusu soruyor. Lütfen ona açık, anlaşılır ve sade bir şekilde cevap ver.
Cevap verirken sadece gerekli bilgiyi ver, ama eğer gerekiyorsa küçük bir örnek veya açıklama ile öğrencinin konuyu anlamasına yardımcı ol.
Cevapların çok uzun olmasın ama öğretici olsun.
Bilgiler:
{context}
Soru:
{question}
Cevap:
"""
PROMPT = PromptTemplate(
template=prompt_template,
input_variables=["context", "question"]
)
# Burada, Google'ın yapay zeka tabanlı sohbet modeli ile bir bağlantı kuruyoruz.
# Modeli çalıştırabilmek için öncelikle API anahtarımızı ve modelin adını belirtmemiz gerekiyor.
llm = ChatGoogleGenerativeAI(
model=MODEL_NAME,
google_api_key=GOOGLE_API_KEY
)
# Burada 'llm' modelini kullanarak, dil modelinden sorulara cevap alıyoruz.
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=False,
chain_type="stuff",
chain_type_kwargs={"prompt": PROMPT}
)
# Gradio UI düzeni
with gr.Blocks() as demo:
gr.Markdown("# 📘 EğitBot - Eğitim Asistanı")
with gr.Row():
with gr.Column(scale=2):
# Soru sorma alanı
user_input = gr.Textbox(placeholder="Sorunuzu buraya yazınız...", label="Soru")
send_btn = gr.Button("Gönder")
# Toplam soru sayısı
total_q = gr.Number(value=0, label="Toplam Sorulan Soru", interactive=False)
# Sohbet geçmişi
chatbox = gr.HTML(value="", label="Sohbet Geçmişi")
with gr.Column(scale=1):
# Sohbeti kaydetme ve temizleme butonları
clear_btn = gr.Button("♻️ Geçmişi Temizle", variant="primary")
save_btn = gr.Button("💾 Sohbeti Kaydet", variant="primary")
download_file = gr.File(label="İndir")
# Sohbeti temizleme fonksiyonu
def clear_chat():
return "", 0
clear_btn.click(fn=clear_chat, inputs=[], outputs=[chatbox, total_q])
# Sohbeti kaydetme fonksiyonu
def save_chat_to_file(chat_history):
if not chat_history:
return None
# Chat geçmişini bir dosyaya kaydet
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"chat_history_{timestamp}.txt"
with open(filename, "w") as file:
file.write(chat_history)
# Kullanıcıya dosya indirme bağlantısı gönder
return filename
save_btn.click(fn=save_chat_to_file, inputs=[chatbox], outputs=download_file)
# Soru gönderme fonksiyonu
def handle_question(user_question, total_questions, chat_history):
# Soruyu kullanarak yanıt al
result = qa_chain.run(user_question)
# Geçmişi güncelle ve toplam soru sayısını arttır
chat_history = f"""
<div style="background-color:#e8f4f8; padding: 10px; border-radius: 15px; margin-bottom: 5px;">
<b>Soru:</b> <span style="color: black;">{user_question}</span>
</div>
<div style="background-color:#f1f9f5; padding: 10px; border-radius: 15px; margin-bottom: 5px;">
<b>Cevap:</b> <span style="color: black;">{result}</span>
</div>
""" + chat_history # Yeni soru-cevap en üstte
total_questions += 1
return chat_history, total_questions
# Gönder butonuna tıklanınca soru gönderme işlemi
send_btn.click(fn=handle_question, inputs=[user_input, total_q, chatbox],
outputs=[chatbox, total_q])
# Gradio UI'sini başlatma
demo.launch(share=True)