Audience Personas
The audience personas module provides a sophisticated framework for modeling target audiences, going beyond simple readability metrics to include health literacy, cultural context, and communication preferences.
Overview
MedExplain-Evals uses detailed audience personas to evaluate how well medical explanations adapt to different stakeholders. Each persona captures:
Health literacy level - Based on validated assessment frameworks
Medical familiarity - Professional vs. lay understanding
Communication preferences - Empathy, detail level, visual aids
Terminology expectations - Technical terms, abbreviations, dosage formats
Predefined Personas
MedExplain-Evals includes 11 predefined personas:
Persona ID |
Audience Type |
Description |
|---|---|---|
|
Physician |
Board-certified specialist (cardiology, oncology, etc.) |
|
Physician |
Primary care or family medicine |
|
Nurse |
Critical care nurse |
|
Nurse |
General ward or primary care nurse |
|
Patient |
Limited health literacy, needs simple language |
|
Patient |
Moderate health literacy, some medical familiarity |
|
Patient |
Health-literate, can understand technical details |
|
Patient |
Older adult with specific communication needs |
|
Caregiver |
Family member caring for patient |
|
Caregiver |
Professional caregiver or home health aide |
|
Caregiver |
Parent of pediatric patient |
Quick Start
from src import PersonaFactory, AudiencePersona
# Get a predefined persona
persona = PersonaFactory.get_predefined_persona("patient_low_literacy")
print(persona.health_literacy) # "low"
print(persona.reading_level_target) # (6, 10)
# Create a custom persona
custom = PersonaFactory.create_persona(
audience_type="patient",
health_literacy="medium",
age_group="elderly"
)
Core Classes
AudiencePersona
Complete audience persona dataclass.
@dataclass
class AudiencePersona:
"""Complete audience persona for evaluation.
Encapsulates all relevant characteristics of a target audience,
enabling sophisticated, persona-based evaluation.
"""
audience_type: str # Primary audience category
health_literacy: str # low/medium/high
medical_familiarity: str # expert/professional/some_experience/novice
age_group: Optional[str] = None
cultural_context: Optional[str] = None
preferred_detail_level: str = "moderate"
reading_level_target: Tuple[int, int] = (8, 12)
max_explanation_length: int = 500
requires_action_items: bool = True
terminology_expectations: Optional[TerminologyExpectations] = None
communication_preferences: Optional[CommunicationPreferences] = None
PersonaFactory
Factory class for creating and retrieving personas.
class PersonaFactory:
"""Factory for creating audience personas."""
@classmethod
def get_predefined_persona(cls, persona_id: str) -> AudiencePersona:
"""Get a predefined persona by ID.
Args:
persona_id: One of the 11 predefined persona IDs
Returns:
Configured AudiencePersona instance
"""
@classmethod
def create_persona(
cls,
audience_type: str,
health_literacy: str = "medium",
medical_familiarity: str = "some_experience",
age_group: Optional[str] = None,
cultural_context: Optional[str] = None,
**kwargs
) -> AudiencePersona:
"""Create a custom audience persona."""
@classmethod
def get_all_predefined(cls) -> Dict[str, AudiencePersona]:
"""Get all predefined personas as a dictionary."""
Usage Examples:
from src import PersonaFactory
# Get all personas for batch evaluation
all_personas = PersonaFactory.get_all_predefined()
for persona_id, persona in all_personas.items():
print(f"{persona_id}: {persona.audience_type} - {persona.health_literacy}")
Enums
AudienceType
class AudienceType(Enum):
PHYSICIAN = "physician"
NURSE = "nurse"
PATIENT = "patient"
CAREGIVER = "caregiver"
PHARMACIST = "pharmacist"
MEDICAL_STUDENT = "medical_student"
HealthLiteracy
class HealthLiteracy(Enum):
LOW = "low" # Basic understanding only
MEDIUM = "medium" # Moderate medical knowledge
HIGH = "high" # Health-literate, professional
DetailLevel
class DetailLevel(Enum):
BRIEF = "brief" # Key points only
MODERATE = "moderate" # Balanced detail
COMPREHENSIVE = "comprehensive" # Full detail
AgeGroup
class AgeGroup(Enum):
PEDIATRIC_PARENT = "pediatric_parent"
ADOLESCENT = "adolescent"
YOUNG_ADULT = "young_adult"
ADULT = "adult"
ELDERLY = "elderly"
Configuration Classes
TerminologyExpectations
@dataclass
class TerminologyExpectations:
"""Expectations for medical terminology usage."""
technical_terms_density: float # 0.0-1.0, percentage of technical terms
abbreviations_allowed: bool
latin_terms_allowed: bool
dosage_format: str # "precise"/"range"/"descriptive"
anatomy_detail_level: str # "full"/"moderate"/"basic"
@classmethod
def for_physician(cls) -> "TerminologyExpectations":
"""Create physician-appropriate settings."""
@classmethod
def for_patient_low_literacy(cls) -> "TerminologyExpectations":
"""Create low-literacy patient settings."""
CommunicationPreferences
@dataclass
class CommunicationPreferences:
"""Communication style preferences."""
empathy_level: str # "professional"/"balanced"/"high"
action_orientation: str # "direct"/"suggestive"/"detailed"
visual_aids_preference: bool
numerical_data_preference: str # "precise"/"ranges"/"avoid"
uncertainty_communication: str # "technical"/"plain"/"minimal"
question_encouragement: bool
Persona-Based Scoring
HealthLiteracyAssessor
Assess text appropriateness for a health literacy level.
from src import HealthLiteracyAssessor
assessor = HealthLiteracyAssessor()
# Check if text is appropriate
is_appropriate = assessor.is_appropriate_for_level(
text="Take the medication twice daily...",
health_literacy="low"
)
PersonaBasedScorer
Score explanations against persona requirements.
from src import PersonaBasedScorer, PersonaFactory
scorer = PersonaBasedScorer()
persona = PersonaFactory.get_predefined_persona("patient_low_literacy")
score = scorer.score_explanation(
explanation="Your heart has a problem...",
persona=persona
)
print(score) # Detailed breakdown
Helper Functions
from src import get_default_personas, get_comprehensive_personas
# Get basic 4 personas (physician, nurse, patient, caregiver)
default = get_default_personas()
# Get all 11 detailed personas
comprehensive = get_comprehensive_personas()