Spaces:
Runtime error
Runtime error
tomas.helmfridsson
commited on
Commit
Β·
1f80d02
1
Parent(s):
43f53c1
add timeout 3 min
Browse files
app.py
CHANGED
|
@@ -6,6 +6,7 @@ from langchain_community.document_loaders import PyPDFLoader
|
|
| 6 |
from langchain_community.vectorstores import FAISS
|
| 7 |
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
|
| 8 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
|
|
| 9 |
|
| 10 |
# ββ KONFIG βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 11 |
DOCS_DIR = "document"
|
|
@@ -31,7 +32,8 @@ log = logging.getLogger(__name__)
|
|
| 31 |
|
| 32 |
# ββ 1) Index (bygg eller ladda) βββββββββββββββββββββββββββββββββββββ
|
| 33 |
emb = HuggingFaceEmbeddings(model_name=EMB_MODEL)
|
| 34 |
-
|
|
|
|
| 35 |
log.info(f"π Laddar index frΓ₯n {INDEX_DIR}")
|
| 36 |
vs = FAISS.load_local(INDEX_DIR, emb)
|
| 37 |
else:
|
|
@@ -45,7 +47,6 @@ else:
|
|
| 45 |
docs.extend(chunks); pdfs.append(fn)
|
| 46 |
vs = FAISS.from_documents(docs, emb); vs.save_local(INDEX_DIR)
|
| 47 |
log.info(f"β
Byggt index β {len(pdfs)}β―PDF / {len(docs)}β―chunkar")
|
| 48 |
-
|
| 49 |
retriever = vs.as_retriever(search_kwargs={"k": K})
|
| 50 |
|
| 51 |
# ββ 2) LLMβpipeline & tokenizer βββββββββββββββββββββββββββββββββββββ
|
|
@@ -86,18 +87,15 @@ def chat_fn(q, temp, max_new_tokens, k, ctx_tok_max, history):
|
|
| 86 |
history = history or []
|
| 87 |
history.append({"role": "user", "content": q})
|
| 88 |
|
| 89 |
-
# Skapa en ny retriever med valt k
|
| 90 |
retriever = vs.as_retriever(search_kwargs={"k": int(k)})
|
| 91 |
docs = retriever.invoke(q)
|
| 92 |
if not docs:
|
| 93 |
history.append({"role": "assistant", "content": "π« Hittade inget relevant."})
|
| 94 |
return history, history
|
| 95 |
|
| 96 |
-
# Visa chunkar som anvΓ€nds
|
| 97 |
chunk_info = "\n\n".join([f"{i+1}. ({d.metadata['source']}) {d.page_content[:160]}β¦" for i, d in enumerate(docs)])
|
| 98 |
history.append({"role": "system", "content": f"π Chunkar som anvΓ€nds:\n{chunk_info}"})
|
| 99 |
|
| 100 |
-
# Bygg prompt med valt ctx_tok_max
|
| 101 |
def build_prompt_dynamic(query, docs, ctx_tok_max):
|
| 102 |
context_parts = []
|
| 103 |
total_ctx_tok = 0
|
|
@@ -120,8 +118,8 @@ def chat_fn(q, temp, max_new_tokens, k, ctx_tok_max, history):
|
|
| 120 |
prompt = build_prompt_dynamic(q, docs, ctx_tok_max)
|
| 121 |
log.info(f"Prompt tokens={len(tokenizer.encode(prompt))} temp={temp} max_new_tokens={max_new_tokens} k={k} ctx_tok_max={ctx_tok_max}")
|
| 122 |
|
| 123 |
-
|
| 124 |
-
|
| 125 |
prompt,
|
| 126 |
temperature=float(temp),
|
| 127 |
max_new_tokens=int(max_new_tokens),
|
|
@@ -130,6 +128,13 @@ def chat_fn(q, temp, max_new_tokens, k, ctx_tok_max, history):
|
|
| 130 |
do_sample=True,
|
| 131 |
return_full_text=False
|
| 132 |
)[0]["generated_text"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
except Exception as e:
|
| 134 |
log.exception("Genereringsβfel")
|
| 135 |
ans = f"β Fel vid generering: {type(e).__name__}: {e}\n\nPrompt:\n{prompt}"
|
|
|
|
| 6 |
from langchain_community.vectorstores import FAISS
|
| 7 |
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
|
| 8 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
| 9 |
+
import concurrent.futures
|
| 10 |
|
| 11 |
# ββ KONFIG βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 12 |
DOCS_DIR = "document"
|
|
|
|
| 32 |
|
| 33 |
# ββ 1) Index (bygg eller ladda) βββββββββββββββββββββββββββββββββββββ
|
| 34 |
emb = HuggingFaceEmbeddings(model_name=EMB_MODEL)
|
| 35 |
+
INDEX_PATH = os.path.join(INDEX_DIR, "index.faiss")
|
| 36 |
+
if os.path.isfile(INDEX_PATH):
|
| 37 |
log.info(f"π Laddar index frΓ₯n {INDEX_DIR}")
|
| 38 |
vs = FAISS.load_local(INDEX_DIR, emb)
|
| 39 |
else:
|
|
|
|
| 47 |
docs.extend(chunks); pdfs.append(fn)
|
| 48 |
vs = FAISS.from_documents(docs, emb); vs.save_local(INDEX_DIR)
|
| 49 |
log.info(f"β
Byggt index β {len(pdfs)}β―PDF / {len(docs)}β―chunkar")
|
|
|
|
| 50 |
retriever = vs.as_retriever(search_kwargs={"k": K})
|
| 51 |
|
| 52 |
# ββ 2) LLMβpipeline & tokenizer βββββββββββββββββββββββββββββββββββββ
|
|
|
|
| 87 |
history = history or []
|
| 88 |
history.append({"role": "user", "content": q})
|
| 89 |
|
|
|
|
| 90 |
retriever = vs.as_retriever(search_kwargs={"k": int(k)})
|
| 91 |
docs = retriever.invoke(q)
|
| 92 |
if not docs:
|
| 93 |
history.append({"role": "assistant", "content": "π« Hittade inget relevant."})
|
| 94 |
return history, history
|
| 95 |
|
|
|
|
| 96 |
chunk_info = "\n\n".join([f"{i+1}. ({d.metadata['source']}) {d.page_content[:160]}β¦" for i, d in enumerate(docs)])
|
| 97 |
history.append({"role": "system", "content": f"π Chunkar som anvΓ€nds:\n{chunk_info}"})
|
| 98 |
|
|
|
|
| 99 |
def build_prompt_dynamic(query, docs, ctx_tok_max):
|
| 100 |
context_parts = []
|
| 101 |
total_ctx_tok = 0
|
|
|
|
| 118 |
prompt = build_prompt_dynamic(q, docs, ctx_tok_max)
|
| 119 |
log.info(f"Prompt tokens={len(tokenizer.encode(prompt))} temp={temp} max_new_tokens={max_new_tokens} k={k} ctx_tok_max={ctx_tok_max}")
|
| 120 |
|
| 121 |
+
def generate():
|
| 122 |
+
return gen_pipe(
|
| 123 |
prompt,
|
| 124 |
temperature=float(temp),
|
| 125 |
max_new_tokens=int(max_new_tokens),
|
|
|
|
| 128 |
do_sample=True,
|
| 129 |
return_full_text=False
|
| 130 |
)[0]["generated_text"]
|
| 131 |
+
|
| 132 |
+
try:
|
| 133 |
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
| 134 |
+
future = executor.submit(generate)
|
| 135 |
+
ans = future.result(timeout=180) # Timeout in seconds
|
| 136 |
+
except concurrent.futures.TimeoutError:
|
| 137 |
+
ans = "β° Ingen respons frΓ₯n modellen inom 3 minuter."
|
| 138 |
except Exception as e:
|
| 139 |
log.exception("Genereringsβfel")
|
| 140 |
ans = f"β Fel vid generering: {type(e).__name__}: {e}\n\nPrompt:\n{prompt}"
|