voice-note-ai / vips_classifier.py
Rachakarkoukli's picture
Update vips_classifier.py
3fb4dbe verified
Raw History Blame Contribute Delete
5.27 kB
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