Spaces:
Sleeping
Sleeping
Delete alz_companion/prompts.py
Browse files- alz_companion/prompts.py +0 -166
alz_companion/prompts.py
DELETED
|
@@ -1,166 +0,0 @@
|
|
| 1 |
-
"""
|
| 2 |
-
Prompts for the Alzheimer’s AI Companion.
|
| 3 |
-
"""
|
| 4 |
-
|
| 5 |
-
# ------------------------ Behaviour‑level tags ------------------------
|
| 6 |
-
BEHAVIOUR_TAGS = {
|
| 7 |
-
# Tags from "The Father"
|
| 8 |
-
"repetitive_questioning": ["validation", "gentle_redirection", "offer_distraction"],
|
| 9 |
-
"confusion": ["reassurance", "time_place_orientation", "photo_anchors"],
|
| 10 |
-
"wandering": ["walk_along_support", "simple_landmarks", "visual_cues", "safe_wandering_space"],
|
| 11 |
-
"agitation": ["de-escalating_tone", "validate_feelings", "reduce_stimulation", "simple_choices"],
|
| 12 |
-
"false_accusations": ["reassure_no_blame", "avoid_arguing", "redirect_activity"],
|
| 13 |
-
"address_memory_loss": ["encourage_ID_bracelet_or_GPS", "place_contact_info_in_wallet", "inform_trusted_neighbors", "avoid_quizzing_on_address"],
|
| 14 |
-
"hallucinations_delusions": ["avoid_arguing_or_correcting", "validate_the_underlying_emotion", "offer_reassurance_of_safety", "gently_redirect_to_real_activity", "check_for_physical_triggers"],
|
| 15 |
-
|
| 16 |
-
# Tags from "Still Alice" (and others for future use)
|
| 17 |
-
"exit_seeking": ["validation", "calm_presence", "safe_wandering_space", "environmental_cues"],
|
| 18 |
-
"aphasia": ["patience", "simple_language", "nonverbal_cues", "validation"],
|
| 19 |
-
"withdrawal": ["gentle_invitation", "calm_presence", "offer_familiar_comforts", "no_pressure"],
|
| 20 |
-
"affection": ["reciprocate_warmth", "positive_reinforcement", "simple_shared_activity"],
|
| 21 |
-
"sleep_disturbance": ["establish_calm_bedtime_routine", "limit_daytime_naps", "check_for_discomfort_or_pain"],
|
| 22 |
-
"anxiety": ["calm_reassurance", "simple_breathing_exercise", "reduce_environmental_stimuli"],
|
| 23 |
-
"depression_sadness": ["validate_feelings_of_sadness", "encourage_simple_pleasant_activity", "ensure_social_connection"],
|
| 24 |
-
"orientation_check": ["gentle_orientation_cues", "use_familiar_landmarks", "avoid_quizzing"],
|
| 25 |
-
|
| 26 |
-
# Tags from "Away from Her"
|
| 27 |
-
"misidentification": ["gently_correct_with_context", "use_photos_as_anchors", "respond_to_underlying_emotion", "avoid_insistent_correction"],
|
| 28 |
-
|
| 29 |
-
# Other useful tags
|
| 30 |
-
"sundowning_restlessness": ["predictable_routine", "soft_lighting", "low_stimulation", "familiar_music"],
|
| 31 |
-
"object_misplacement": ["nonconfrontational_search", "fixed_storage_spots"]
|
| 32 |
-
}
|
| 33 |
-
|
| 34 |
-
# ------------------------ Emotion styles & helpers ------------------------
|
| 35 |
-
EMOTION_STYLES = {
|
| 36 |
-
"confusion": {"tone": "calm, orienting, concrete", "playbook": ["Offer a simple time/place orientation cue (who/where/when).", "Reference one familiar anchor (photo/object/person).", "Use short sentences and one step at a time."]},
|
| 37 |
-
"fear": {"tone": "reassuring, safety-forward, gentle", "playbook": ["Acknowledge fear without contradiction.", "Provide a clear safety cue (e.g., 'You’re safe here with me').", "Reduce novelty and stimulation; suggest one safe action."]},
|
| 38 |
-
"anger": {"tone": "de-escalating, validating, low-arousal", "playbook": ["Validate the feeling; avoid arguing/correcting.", "Keep voice low and sentences short.", "Offer a simple choice to restore control (e.g., 'tea or water?')."]},
|
| 39 |
-
"sadness": {"tone": "warm, empathetic, gentle reminiscence", "playbook": ["Acknowledge loss/longing.", "Invite one comforting memory or familiar song.", "Keep pace slow; avoid tasking."]},
|
| 40 |
-
"warmth": {"tone": "affirming, appreciative", "playbook": ["Reflect gratitude and positive connection.", "Reinforce what’s going well.", "Keep it light; don’t overload with new info."]},
|
| 41 |
-
"joy": {"tone": "supportive, celebratory (but not overstimulating)", "playbook": ["Share the joy briefly; match energy gently.", "Offer a simple, pleasant follow-up activity.", "Avoid adding complex tasks."]},
|
| 42 |
-
"calm": {"tone": "matter-of-fact, concise, steady", "playbook": ["Keep instructions simple.", "Maintain steady pace.", "No extra soothing needed."]},
|
| 43 |
-
}
|
| 44 |
-
|
| 45 |
-
def render_emotion_guidelines(emotion: str | None) -> str:
|
| 46 |
-
e = (emotion or "").strip().lower()
|
| 47 |
-
if e not in EMOTION_STYLES:
|
| 48 |
-
return "Emotion: (auto)\nDesired tone: calm, clear.\nWhen replying, reassure if distress is apparent; prioritise validation and simple choices."
|
| 49 |
-
style = EMOTION_STYLES[e]
|
| 50 |
-
bullet = "\n".join([f"- {x}" for x in style["playbook"]])
|
| 51 |
-
return f"Emotion: {e}\nDesired tone: {style['tone']}\nWhen replying, follow:\n{bullet}"
|
| 52 |
-
|
| 53 |
-
# ------------------------ NLU Classification ------------------------
|
| 54 |
-
CLASSIFICATION_PROMPT = """You are an expert NLU engine. Your task is to analyze the user's query about a situation involving a person with Alzheimer's and classify it.
|
| 55 |
-
Identify the primary behavior from this list: {behavior_options}
|
| 56 |
-
Identify the primary emotion from this list: {emotion_options}
|
| 57 |
-
|
| 58 |
-
Respond ONLY with a single, valid JSON object with two keys: "detected_behavior" and "detected_emotion".
|
| 59 |
-
The values for these keys MUST be one of the options provided in the lists above, or "None" if no specific tag applies.
|
| 60 |
-
|
| 61 |
-
User Query: "{query}"
|
| 62 |
-
|
| 63 |
-
JSON Response:
|
| 64 |
-
"""
|
| 65 |
-
|
| 66 |
-
# ------------------------ Guardrails ------------------------
|
| 67 |
-
SAFETY_GUARDRAILS = """Never provide medical diagnoses or dosing. If a situation implies imminent risk (e.g., wandering/elopement, severe agitation, choking, falls), signpost immediate support from onsite staff or emergency services. Use respectful, person‑centred language. Keep guidance concrete and stepwise."""
|
| 68 |
-
|
| 69 |
-
# ------------------------ System & Answer Templates ------------------------
|
| 70 |
-
SYSTEM_TEMPLATE = """You are an Alzheimer’s caregiving companion. Address the patient as {patient_name} and the caregiver as {caregiver_name}. Ground every suggestion in retrieved evidence when possible. If unsure, say so plainly.
|
| 71 |
-
{guardrails}
|
| 72 |
-
--- IMPORTANT RULE ---
|
| 73 |
-
You MUST write your entire response in {language} ONLY. This is a strict instruction. Do not use any other language, even if the user or the retrieved context uses a different language. Your final output must be in {language}."""
|
| 74 |
-
|
| 75 |
-
ANSWER_TEMPLATE_CALM = """Context:
|
| 76 |
-
{context}
|
| 77 |
-
|
| 78 |
-
---
|
| 79 |
-
Question from user: {question}
|
| 80 |
-
|
| 81 |
-
---
|
| 82 |
-
Instructions:
|
| 83 |
-
Based on the context, write a gentle and supportive response in a single, natural-sounding paragraph.
|
| 84 |
-
Your response should:
|
| 85 |
-
1. Start by briefly and calmly acknowledging the user's situation or feeling.
|
| 86 |
-
2. Weave 2-3 practical, compassionate suggestions from the context into your paragraph. Do not use a numbered or bulleted list.
|
| 87 |
-
3. Conclude with a short, reassuring phrase.
|
| 88 |
-
4. You MUST use the retrieved context to directly address the user's specific **Question**.
|
| 89 |
-
Your response in {language}:"""
|
| 90 |
-
|
| 91 |
-
# For scenarios tagged with a specific behavior (e.g., agitation, confusion)
|
| 92 |
-
ANSWER_TEMPLATE_ADQ = """--- General Guidance from Knowledge Base ---
|
| 93 |
-
{general_context}
|
| 94 |
-
|
| 95 |
-
--- Relevant Personal Memories ---
|
| 96 |
-
{personal_context}
|
| 97 |
-
|
| 98 |
-
---
|
| 99 |
-
Care scenario: {scenario_tag}
|
| 100 |
-
Response Guidelines:
|
| 101 |
-
{emotions_context}
|
| 102 |
-
Question from user: {question}
|
| 103 |
-
|
| 104 |
-
---
|
| 105 |
-
Instructions:
|
| 106 |
-
Based on ALL the information above, write a **concise, warm, and validating** response for the {role} in a single, natural-sounding paragraph. **Keep the total response to 2-4 sentences.**
|
| 107 |
-
If possible, weave details from the 'Relevant Personal Memories' into your suggestions to make the response feel more personal and familiar.
|
| 108 |
-
Pay close attention to the Response Guidelines to tailor your tone.
|
| 109 |
-
Your response should follow this pattern:
|
| 110 |
-
1. Start by validating the user's feeling or concern with a unique, empathetic opening. DO NOT USE THE SAME OPENING PHRASE REPEATEDLY. Choose from different styles of openers, such as:
|
| 111 |
-
- Acknowledging the difficulty: "That sounds like a very challenging situation..."
|
| 112 |
-
- Expressing understanding: "I can see why that would be worrying..."
|
| 113 |
-
- Stating a shared goal: "Let's walk through how we can handle that..."
|
| 114 |
-
- Directly validating the feeling: "It's completely understandable to feel frustrated when..."
|
| 115 |
-
2. Gently offer **1-2 of the most important practical steps**, combining general guidance with personal memories where appropriate. Do not use a list.
|
| 116 |
-
3. If the scenario involves risk (like exit_seeking), subtly include a safety cue.
|
| 117 |
-
4. End with a compassionate, de-escalation phrase.
|
| 118 |
-
Your response in {language}:"""
|
| 119 |
-
|
| 120 |
-
RISK_FOOTER = """If safety is a concern right now, please seek immediate assistance from onsite staff or local emergency services."""
|
| 121 |
-
|
| 122 |
-
# ------------------------ Router & Specialized Templates ------------------------
|
| 123 |
-
|
| 124 |
-
# Template for routing/classifying the user's intent
|
| 125 |
-
ROUTER_PROMPT = """You are an expert NLU router. Your task is to classify the user's query into one of three categories:
|
| 126 |
-
1. `caregiving_scenario`: The user is describing a situation, asking for advice, or expressing a concern related to Alzheimer's or caregiving.
|
| 127 |
-
2. `factual_question`: The user is asking a direct, fact-based question (who, what, where, when, why, how). This could be about a memory in the knowledge base.
|
| 128 |
-
3. `general_conversation`: The user is making a general conversational remark, like a greeting, a thank you, or a simple statement that does not require a knowledge base lookup.
|
| 129 |
-
|
| 130 |
-
User Query: "{query}"
|
| 131 |
-
|
| 132 |
-
Respond with ONLY a single category name from the list above.
|
| 133 |
-
Category: """
|
| 134 |
-
|
| 135 |
-
# Template for answering direct factual questions
|
| 136 |
-
ANSWER_TEMPLATE_FACTUAL = """Context:
|
| 137 |
-
{context}
|
| 138 |
-
|
| 139 |
-
---
|
| 140 |
-
Question from user: {question}
|
| 141 |
-
|
| 142 |
-
---
|
| 143 |
-
Instructions:
|
| 144 |
-
Based on the provided context, directly and concisely answer the user's question.
|
| 145 |
-
- If the context contains the answer, state it clearly.
|
| 146 |
-
- If the context does not contain the answer, say that you don't have that information in the memory journal.
|
| 147 |
-
- Do not offer advice or suggestions.
|
| 148 |
-
Your response MUST be in {language}:"""
|
| 149 |
-
|
| 150 |
-
# Template for general, non-RAG conversation
|
| 151 |
-
ANSWER_TEMPLATE_GENERAL = """You are a warm and friendly AI companion. The user has just said: "{question}".
|
| 152 |
-
Respond in a brief, natural, and conversational way. Do not try to provide caregiving advice unless the user asks for it.
|
| 153 |
-
Your response MUST be in {language}:"""
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
# ------------------------ Convenience exports ------------------------
|
| 157 |
-
__all__ = [
|
| 158 |
-
"SYSTEM_TEMPLATE", "ANSWER_TEMPLATE_CALM", "ANSWER_TEMPLATE_ADQ",
|
| 159 |
-
"SAFETY_GUARDRAILS", "RISK_FOOTER", "BEHAVIOUR_TAGS", "EMOTION_STYLES",
|
| 160 |
-
"render_emotion_guidelines", "CLASSIFICATION_PROMPT",
|
| 161 |
-
|
| 162 |
-
# --- New additions ---
|
| 163 |
-
"ROUTER_PROMPT",
|
| 164 |
-
"ANSWER_TEMPLATE_FACTUAL",
|
| 165 |
-
"ANSWER_TEMPLATE_GENERAL"
|
| 166 |
-
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|