from config import Config def build_prompt_zero_shot(text: str) -> str: return f""" Du är ett administrativt stöd för sjuksköterskor. Läs texten och strukturera all kliniskt relevant information enligt VIPS. Regler: - Använd endast information från texten. - Lägg inte till egna tolkningar eller diagnoser. - Filtrera bort småprat. - All relevant information ska placeras i någon kategori. - Om ingen relevant information finns i en kategori, skriv exakt: Ingen relevant information. Definitioner: - V = Välbefinnande: symtom, smärta, sömn, oro, upplevelser, allmänt mående - I = Integritet: livssituation, autonomi, sociala aspekter, personliga behov - P = Prevention: förebyggande risker och åtgärder, t.ex. fallrisk, nutrition, egenvård - S = Säkerhet: direkta risker för hälsa, t.ex. infektion, andningsproblem, akuta tillstånd Format: V: ... I: ... P: ... S: ... Text: {text} """.strip() def build_prompt_few_shot(text: str) -> str: return f""" Du är ett administrativt stöd för sjuksköterskor. Läs texten och strukturera all kliniskt relevant information enligt VIPS. Regler: - Använd endast information från texten. - Lägg inte till egna tolkningar eller diagnoser. - Filtrera bort småprat. - All relevant information ska placeras i någon kategori. - Om ingen relevant information finns i en kategori, skriv exakt: Ingen relevant information. Definitioner: - V = Välbefinnande: symtom, smärta, sömn, oro, upplevelser, allmänt mående - I = Integritet: livssituation, autonomi, sociala aspekter, personliga behov - P = Prevention: förebyggande risker och åtgärder, t.ex. fallrisk, nutrition, egenvård - S = Säkerhet: direkta risker för hälsa, t.ex. infektion, andningsproblem, akuta tillstånd Exempel 1: Text: Patienten har ont i ryggen sedan tre dagar, sover dåligt, känner sig stressad och bor ensam. Svar: V: Patienten uppger ryggsmärta sedan tre dagar, sömnsvårigheter och stress. I: Patienten bor ensam. P: Ingen relevant information. S: Ingen relevant information. Exempel 2: Text: Patienten känner sig yr när hon reser sig upp och är rädd att ramla på natten. Patienten bor ensam hemma. Svar: V: Patienten uppger yrsel vid uppresning. I: Patienten bor ensam hemma. P: Oro för fallrisk nattetid. S: Ingen relevant information. Exempel 3: Text: Det gör ont runt såret och det är rött. Patienten är orolig för infektion men har ingen feber. Svar: V: Patienten uppger smärta kring såret och oro. I: Ingen relevant information. P: Ingen relevant information. S: Rodnad kring såret och misstänkt infektionsrisk. Ingen feber enligt patienten. Format: V: ... I: ... P: ... S: ... Text: {text} """.strip() def build_prompt_chain_of_thought(text: str) -> str: return f""" Du är ett administrativt stöd för sjuksköterskor. Analysera först tyst vad som är kliniskt relevant, men visa inte analysen. Returnera endast slutresultatet. Regler: - Använd endast information från texten. - Lägg inte till egna tolkningar eller diagnoser. - Filtrera bort småprat. - All relevant information ska placeras i någon kategori. - Om ingen relevant information finns i en kategori, skriv exakt: Ingen relevant information. Format: V: ... I: ... P: ... S: ... Text: {text} """.strip() def extract_json_like_response(raw_text: str) -> dict: default = { "V": "Ingen relevant information.", "I": "Ingen relevant information.", "P": "Ingen relevant information.", "S": "Ingen relevant information." } if not raw_text: return default if raw_text.startswith("LLM ERROR"): return { "V": raw_text, "I": "Ingen relevant information.", "P": "Ingen relevant information.", "S": "Ingen relevant information." } result = default.copy() lines = [line.strip() for line in raw_text.splitlines() if line.strip()] for line in lines: lower = line.lower() if lower.startswith("v:") or lower.startswith("välbefinnande:"): result["V"] = line.split(":", 1)[1].strip() elif lower.startswith("i:") or lower.startswith("integritet:"): result["I"] = line.split(":", 1)[1].strip() elif lower.startswith("p:") or lower.startswith("prevention:"): result["P"] = line.split(":", 1)[1].strip() elif lower.startswith("s:") or lower.startswith("säkerhet:"): result["S"] = line.split(":", 1)[1].strip() return result def classify_vips(text: str, llm_client) -> dict: if not text or not text.strip(): return { "V": "Ingen relevant information.", "I": "Ingen relevant information.", "P": "Ingen relevant information.", "S": "Ingen relevant information." } technique = Config.PROMPT_TECHNIQUE if technique == "zero_shot": prompt = build_prompt_zero_shot(text) elif technique == "chain_of_thought": prompt = build_prompt_chain_of_thought(text) else: prompt = build_prompt_few_shot(text) raw_response = llm_client.generate(prompt) print("RAW GPT-SW3 RESPONSE:") print(raw_response) vips = extract_json_like_response(raw_response) return vips