Spaces:
Sleeping
Sleeping
File size: 3,063 Bytes
36ea66e d7c8195 505fff5 b944ab4 4c1d80e 9b4fbc6 d7c8195 9b4fbc6 d7c8195 9b4fbc6 d7c8195 9b4fbc6 df94e26 9b4fbc6 d7c8195 4c1d80e d7c8195 df94e26 d7c8195 9b4fbc6 d7c8195 2ae94e1 d7c8195 0d62cf2 d7c8195 2ae94e1 9061db9 d7c8195 9061db9 d7c8195 9061db9 d7c8195 9061db9 d7c8195 407ce33 d7c8195 9061db9 d7c8195 9061db9 9b4fbc6 d7c8195 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
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()
|