b / app.py
nihalm-collab's picture
Upload app.py
047ef2a verified
"""
📚 KitapYurdu Yorum Asistanı Chatbot
- Hugging Face Spaces veya Lokal ortamda çalışacak
"""
import os
import streamlit as st
from datasets import load_dataset
import chromadb
from chromadb.config import Settings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain_google_genai import ChatGoogleGenerativeAI, GoogleGenerativeAIEmbeddings
from langchain.chains import RetrievalQA
from dotenv import load_dotenv
# --- 1. Ortam Değişkenleri
# Lokal için .env yükle
if os.path.exists(".env"):
load_dotenv()
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
HF_TOKEN = os.environ.get("HF_TOKEN")
# --- 2. Streamlit Başlığı
st.set_page_config(page_title="📖 KitapYurdu Chatbot")
st.title("📖 KitapYurdu Yorum Asistanı (Gemini 2.0 Flash)")
# --- 3. Veri Seti Yükleme
@st.cache_data
def load_kitapyurdu_dataset():
dataset = load_dataset("alibayram/kitapyurdu_yorumlar", split="train", token=HF_TOKEN)
return dataset
st.write("📡 Veri seti yükleniyor...")
dataset = load_kitapyurdu_dataset()
st.success("✅ Veri seti yüklendi!")
# --- 4. Metinleri Bölme
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_text(" ".join(dataset["yorum"][:500])) # İlk 500 yorum örnek
# --- 5. ChromaDB
PERSIST_DIR = "chroma_db"
os.makedirs(PERSIST_DIR, exist_ok=True)
embeddings = GoogleGenerativeAIEmbeddings(
model="models/embedding-001",
google_api_key=GEMINI_API_KEY
)
vectorstore = Chroma.from_texts(
texts,
embeddings,
persist_directory=PERSIST_DIR
)
# --- 6. RAG Pipeline
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
llm = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
google_api_key=GEMINI_API_KEY,
temperature=0.2
)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
)
# --- 7. Kullanıcı Arayüzü
st.markdown("### 💬 Kitaplar hakkında soru sor:")
user_query = st.text_input("Örnek: 'En çok beğenilen kitap hangisi?'", "")
if user_query:
with st.spinner("Yanıt hazırlanıyor..."):
response = qa_chain.run(user_query)
st.markdown("### 🧠 Yanıt:")
st.write(response)