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()