tomas.helmfridsson commited on
Commit
1f80d02
Β·
1 Parent(s): 43f53c1

add timeout 3 min

Browse files
Files changed (1) hide show
  1. app.py +12 -7
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
- if os.path.isdir(INDEX_DIR):
 
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
- try:
124
- ans = gen_pipe(
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}"