citrus / app.py
tomas.helmfridsson
update guis 9
d7c8195
raw
history blame
3.06 kB
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()