#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"""
Soru: {user_question}
Cevap: {result}
""" + 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)