citrus / app.py
tomas.helmfridsson
update guis 2
df94e26
raw
history blame
2.22 kB
import gradio as gr
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
import os
# 1. Ladda och indexera alla PDF:er i mappen "document/"
def load_vectorstore():
all_docs = []
loaded_files = []
for filename in os.listdir("document"):
if filename.endswith(".pdf"):
path = os.path.join("document", filename)
loader = PyPDFLoader(path)
docs = loader.load_and_split()
all_docs.extend(docs)
loaded_files.append(filename)
embedding = HuggingFaceEmbeddings(model_name="KBLab/sentence-bert-swedish-cased")
vectorstore = FAISS.from_documents(all_docs, embedding)
return vectorstore, loaded_files
with gr.Blocks() as demo:
with gr.Row():
status = gr.Markdown("🔄 Laddar modellen, vänta...")
vectorstore, loaded_files = load_vectorstore()
llm_pipeline = pipeline("text-generation", model="tiiuae/falcon-rw-1b", device=-1)
llm = HuggingFacePipeline(pipeline=llm_pipeline, model_kwargs={"temperature": 0.3, "max_new_tokens": 512})
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=vectorstore.as_retriever())
loaded_list = "\n".join([f"- {f}" for f in loaded_files])
gr.Markdown(f"✅ Klar! Du kan nu ställa frågor om dokumenten nedan:\n\n{loaded_list}")
def chat_fn(message, history):
if len(message) > 1000:
return "⚠️ Din fråga är för lång (" + str(len(message)) + " tecken). Försök ställa en mer specifik fråga."
try:
svar = qa_chain.invoke({"query": message})
except Exception as e:
return f"Ett fel uppstod vid bearbetning av frågan: {str(e)}"
return svar
gr.ChatInterface(
fn=chat_fn,
title="🌟 Dokumentassistent (Svenska)",
chatbot=gr.Chatbot(type="messages"),
description="Hej! Jag är din dokumentassistent. Ställ en fråga baserat på innehållet i dina PDF-filer."
)
demo.launch()