Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
from langchain_community.document_loaders import PyPDFLoader | |
from langchain_community.vectorstores import FAISS | |
from langchain_huggingface.embeddings import HuggingFaceEmbeddings | |
from langchain_huggingface.llms import HuggingFacePipeline | |
from langchain.chains import RetrievalQA | |
from transformers import pipeline | |
# 1) Ladda och indexera alla PDF-filer | |
def load_vectorstore(): | |
all_docs, loaded_files = [], [] | |
for fn in os.listdir("document"): | |
if fn.lower().endswith(".pdf"): | |
path = os.path.join("document", fn) | |
loader = PyPDFLoader(path) | |
docs = loader.load_and_split() | |
all_docs.extend(docs) | |
loaded_files.append(fn) | |
embedding = HuggingFaceEmbeddings(model_name="KBLab/sentence-bert-swedish-cased") | |
vectorstore = FAISS.from_documents(all_docs, embedding) | |
return vectorstore, loaded_files | |
# 2) Bygg UI + logik i Gradio | |
with gr.Blocks() as demo: | |
# A) Status‐meddelande under uppstart | |
status = gr.Markdown("🔄 Laddar dokument och modell, vänta…", elem_id="status-text") | |
# B) Börja indexera och initiera modell | |
vectorstore, files = load_vectorstore() | |
llm_pipe = pipeline("text-generation", model="tiiuae/falcon-rw-1b", device=-1) | |
llm = HuggingFacePipeline( | |
pipeline=llm_pipe, | |
model_kwargs={"temperature": 0.3, "max_new_tokens": 512} | |
) | |
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=vectorstore.as_retriever()) | |
# C) Dölj status‐text och visa PDF‐listan när klart | |
status.visible = False | |
file_list_md = "\n".join(f"- {f}" for f in files) | |
gr.Markdown( | |
f"✅ Klar! Du kan nu ställa frågor om dokumenten nedan:\n\n{file_list_md}", | |
elem_id="status-text" | |
) | |
# D) Temperature‐slider och Chatbot | |
temp_slider = gr.Slider( | |
minimum=0.0, maximum=1.0, value=0.3, step=0.05, | |
label="Temperatur (kreativitetsgrad)" | |
) | |
def chat_fn(message, temp, history): | |
# Skydd mot alltför långa frågor | |
if len(message) > 1000: | |
return [], [{"role":"assistant","content": | |
f"⚠️ Din fråga är för lång ({len(message)} tecken). Försök korta ner den."}] | |
# Uppdatera temperatur dynamiskt | |
llm.model_kwargs["temperature"] = temp | |
try: | |
resp = qa_chain.invoke({"query": message}) | |
assistant_msg = resp["result"] | |
except Exception as e: | |
assistant_msg = f"Ett fel uppstod: {e}" | |
# Returnera hela historiken i OpenAI-stil | |
history = history or [] | |
history.append({"role":"user","content":message}) | |
history.append({"role":"assistant","content":assistant_msg}) | |
return history, history | |
gr.ChatInterface( | |
fn=chat_fn, | |
inputs=[gr.Textbox(label="Skriv din fråga här:"), temp_slider], | |
title="🌟 Dokumentassistent (Svenska)", | |
description="Hej! Ställ en fråga baserat på dina PDF-dokument.", | |
chatbot=gr.Chatbot(type="messages") | |
) | |
demo.launch() | |