Persona API
Persona generation and management classes.
PersonaBank
from src.persona_bank import PersonaBank
Class Definition
class PersonaBank:
"""
Manages persona dimension definitions.
Loads dimension configurations from YAML and provides
access to dimension values and constraints.
"""
Constructor
def __init__(self, persona_path: str):
"""
Load persona dimensions from YAML file.
Args:
persona_path: Path to persona.yaml
"""
Methods
def get_dimension(self, name: str) -> Dict[str, Any]:
"""Get a specific dimension definition."""
def get_all_dimensions(self) -> Dict[str, Dict]:
"""Get all dimension definitions."""
def get_constraint_dimensions(self) -> List[str]:
"""Get names of constraint dimensions (always sampled)."""
def get_dimension_values(self, name: str) -> List[str]:
"""Get possible values for a dimension."""
PersonaSampler
from src.sampling import PersonaSampler
Class Definition
class PersonaSampler:
"""
Samples persona features with diversity constraints.
Ensures sampled personas are diverse using Hamming distance.
"""
Constructor
def __init__(
self,
config_path: str,
persona_bank: PersonaBank,
llm_client: Optional[LLMClient] = None
):
"""
Initialize sampler.
Args:
config_path: Path to sampling_config.yaml
persona_bank: PersonaBank instance
llm_client: Optional LLM client for advanced sampling
"""
Methods
def sample_persona(self) -> Dict[str, str]:
"""
Sample a single persona's features.
Returns:
Dictionary mapping dimension names to values
Example:
>>> features = sampler.sample_persona()
>>> print(features)
{'age_band': '25_34', 'role': 'engineer', ...}
"""
def sample_batch(self, n: int) -> List[Dict[str, str]]:
"""
Sample multiple personas with diversity enforcement.
Args:
n: Number of personas to sample
Returns:
List of feature dictionaries
"""
PersonaSpec
from src.persona_spec import PersonaSpec, generate_persona_id
Class Definition
@dataclass
class PersonaSpec:
"""
Complete persona specification.
Attributes:
persona_id: Unique identifier
features: Dimension-value mapping
system_prompt: Generated system prompt
metadata: Additional metadata
"""
persona_id: str
features: Dict[str, str]
system_prompt: Optional[str]
metadata: Dict[str, Any]
Methods
def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary."""
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> 'PersonaSpec':
"""Create from dictionary."""
Utility Functions
def generate_persona_id(features: Dict[str, str]) -> str:
"""
Generate unique persona ID.
Returns:
ID like 'persona_20260206_001'
"""
PersonaSpecStorage
from src.persona_spec import PersonaSpecStorage
Class Definition
class PersonaSpecStorage:
"""Persists persona specifications to disk."""
Constructor
def __init__(self, output_dir: str, format: str = "json"):
"""
Initialize storage.
Args:
output_dir: Directory for persona files
format: Output format ("json")
"""
Methods
def save(self, spec: PersonaSpec) -> str:
"""
Save persona to disk.
Returns:
Path to saved file
"""
def load(self, persona_id: str) -> PersonaSpec:
"""Load persona by ID."""
def load_all(self) -> List[PersonaSpec]:
"""Load all stored personas."""
def exists(self, persona_id: str) -> bool:
"""Check if persona exists."""
Usage Examples
Complete Workflow
from src.persona_bank import PersonaBank
from src.sampling import PersonaSampler
from src.persona_spec import PersonaSpec, PersonaSpecStorage, generate_persona_id
from src.llm_client import create_llm_client, LLMFormulator
# Initialize components
bank = PersonaBank("input/persona.yaml")
sampler = PersonaSampler("input/sampling_config.yaml", bank)
storage = PersonaSpecStorage("output/personas")
client = create_llm_client(config['api'])
formulator = LLMFormulator(client, "prompts/persona_to_system_prompt.txt")
# Generate personas
for i in range(10):
# Sample features
features = sampler.sample_persona()
# Generate ID
persona_id = generate_persona_id(features)
# Generate system prompt
system_prompt = formulator.formulate(features)
# Create spec
spec = PersonaSpec(
persona_id=persona_id,
features=features,
system_prompt=system_prompt,
metadata={'index': i}
)
# Save
storage.save(spec)
# Load all personas
all_personas = storage.load_all()
print(f"Generated {len(all_personas)} personas")
See Also
Persona System - User guide
Configuration - Persona configuration