tomas.helmfridsson commited on
Commit
d7c8195
·
1 Parent(s): 0d62cf2

update guis 9

Browse files
Files changed (1) hide show
  1. app.py +49 -69
app.py CHANGED
@@ -1,99 +1,79 @@
1
  import gradio as gr
 
 
2
  from langchain_community.document_loaders import PyPDFLoader
3
  from langchain_community.vectorstores import FAISS
4
  from langchain_huggingface.embeddings import HuggingFaceEmbeddings
5
  from langchain_huggingface.llms import HuggingFacePipeline
6
  from langchain.chains import RetrievalQA
7
  from transformers import pipeline
8
- import os
9
 
10
- # 1. Ladda och indexera alla PDF:er i mappen "document/"
11
- # Returnerar vectorstore och lista över filnamn
12
  def load_vectorstore():
13
- all_docs = []
14
- loaded_files = []
15
- for filename in os.listdir("document"):
16
- if filename.endswith(".pdf"):
17
- path = os.path.join("document", filename)
18
  loader = PyPDFLoader(path)
19
  docs = loader.load_and_split()
20
  all_docs.extend(docs)
21
- loaded_files.append(filename)
22
  embedding = HuggingFaceEmbeddings(model_name="KBLab/sentence-bert-swedish-cased")
23
  vectorstore = FAISS.from_documents(all_docs, embedding)
24
  return vectorstore, loaded_files
25
 
26
- # 2. Skapa RAG-chain med given temperatur
27
- def create_chain(vectorstore, temp):
28
- llm_pipeline = pipeline(
29
- "text-generation", model="tiiuae/falcon-rw-1b", device=-1
30
- )
31
- llm = HuggingFacePipeline(
32
- pipeline=llm_pipeline,
33
- model_kwargs={"temperature": temp, "max_new_tokens": 512},
34
- )
35
- return RetrievalQA.from_chain_type(
36
- llm=llm, retriever=vectorstore.as_retriever()
37
- )
38
-
39
- # 3. Gradio UI
40
  with gr.Blocks() as demo:
41
- # Temperatur-reglage
42
- temp_slider = gr.Slider(
43
- label="🎛️ Temperatur (0 = exakt, 1 = kreativ)",
44
- minimum=0.0,
45
- maximum=1.0,
46
- value=0.3,
47
- step=0.05,
48
- )
49
- # Chat-komponent (OpenAI-stil)
50
- chatbot = gr.Chatbot(type="messages")
51
- input_box = gr.Textbox(label="Din fråga")
52
- send_button = gr.Button("Skicka")
53
 
54
- # Ladda vectorstore och initiera QA-chain
55
- vectorstore, loaded_files = load_vectorstore()
56
- qa_chain = create_chain(vectorstore, temp_slider.value)
 
 
 
 
 
57
 
58
- # Visa status och vilka PDF:er som laddats
59
- gr.Markdown("🔄 Laddar modellen, vänta...")
 
60
  gr.Markdown(
61
- f"✅ Klar! Du kan nu ställa frågor om dokumenten nedan:
 
 
62
 
63
- " +
64
- "
65
- ".join([f"- {f}" for f in loaded_files])
 
66
  )
67
 
68
- # Chat-funktion
69
- def chat_fn(message, history, temp):
70
- chain = create_chain(vectorstore, temp)
71
- history = history + [{"role": "user", "content": message}]
72
  if len(message) > 1000:
73
- history = history + [{
74
- "role": "assistant",
75
- "content": f"⚠️ Din fråga är för lång ({len(message)} tecken). Försök en kortare fråga."
76
- }]
77
- return history
78
  try:
79
- svar = chain.invoke({"query": message})
80
- out = svar.get("result", str(svar))
81
  except Exception as e:
82
- out = f"Ett fel uppstod: {e}"
83
- history = history + [{"role": "assistant", "content": out}]
84
- return history
 
 
 
85
 
86
- # Koppla knapp till funktionen
87
- send_button.click(
88
  fn=chat_fn,
89
- inputs=[input_box, chatbot, temp_slider],
90
- outputs=chatbot,
 
 
91
  )
92
 
93
- # Starta app vid körning
94
- if __name__ == "__main__":
95
- demo.launch()
96
-
97
- if __name__ == "__main__":
98
- demo.launch()
99
-
 
1
  import gradio as gr
2
+ import os
3
+
4
  from langchain_community.document_loaders import PyPDFLoader
5
  from langchain_community.vectorstores import FAISS
6
  from langchain_huggingface.embeddings import HuggingFaceEmbeddings
7
  from langchain_huggingface.llms import HuggingFacePipeline
8
  from langchain.chains import RetrievalQA
9
  from transformers import pipeline
 
10
 
11
+ # 1) Ladda och indexera alla PDF-filer
 
12
  def load_vectorstore():
13
+ all_docs, loaded_files = [], []
14
+ for fn in os.listdir("document"):
15
+ if fn.lower().endswith(".pdf"):
16
+ path = os.path.join("document", fn)
 
17
  loader = PyPDFLoader(path)
18
  docs = loader.load_and_split()
19
  all_docs.extend(docs)
20
+ loaded_files.append(fn)
21
  embedding = HuggingFaceEmbeddings(model_name="KBLab/sentence-bert-swedish-cased")
22
  vectorstore = FAISS.from_documents(all_docs, embedding)
23
  return vectorstore, loaded_files
24
 
25
+ # 2) Bygg UI + logik i Gradio
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  with gr.Blocks() as demo:
27
+ # A) Status‐meddelande under uppstart
28
+ status = gr.Markdown("🔄 Laddar dokument och modell, vänta…", elem_id="status-text")
 
 
 
 
 
 
 
 
 
 
29
 
30
+ # B) Börja indexera och initiera modell
31
+ vectorstore, files = load_vectorstore()
32
+ llm_pipe = pipeline("text-generation", model="tiiuae/falcon-rw-1b", device=-1)
33
+ llm = HuggingFacePipeline(
34
+ pipeline=llm_pipe,
35
+ model_kwargs={"temperature": 0.3, "max_new_tokens": 512}
36
+ )
37
+ qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=vectorstore.as_retriever())
38
 
39
+ # C) Dölj status‐text och visa PDF‐listan när klart
40
+ status.visible = False
41
+ file_list_md = "\n".join(f"- {f}" for f in files)
42
  gr.Markdown(
43
+ f"✅ Klar! Du kan nu ställa frågor om dokumenten nedan:\n\n{file_list_md}",
44
+ elem_id="status-text"
45
+ )
46
 
47
+ # D) Temperature‐slider och Chatbot
48
+ temp_slider = gr.Slider(
49
+ minimum=0.0, maximum=1.0, value=0.3, step=0.05,
50
+ label="Temperatur (kreativitetsgrad)"
51
  )
52
 
53
+ def chat_fn(message, temp, history):
54
+ # Skydd mot alltför långa frågor
 
 
55
  if len(message) > 1000:
56
+ return [], [{"role":"assistant","content":
57
+ f"⚠️ Din fråga är för lång ({len(message)} tecken). Försök korta ner den."}]
58
+ # Uppdatera temperatur dynamiskt
59
+ llm.model_kwargs["temperature"] = temp
 
60
  try:
61
+ resp = qa_chain.invoke({"query": message})
62
+ assistant_msg = resp["result"]
63
  except Exception as e:
64
+ assistant_msg = f"Ett fel uppstod: {e}"
65
+ # Returnera hela historiken i OpenAI-stil
66
+ history = history or []
67
+ history.append({"role":"user","content":message})
68
+ history.append({"role":"assistant","content":assistant_msg})
69
+ return history, history
70
 
71
+ gr.ChatInterface(
 
72
  fn=chat_fn,
73
+ inputs=[gr.Textbox(label="Skriv din fråga här:"), temp_slider],
74
+ title="🌟 Dokumentassistent (Svenska)",
75
+ description="Hej! Ställ en fråga baserat på dina PDF-dokument.",
76
+ chatbot=gr.Chatbot(type="messages")
77
  )
78
 
79
+ demo.launch()