1053 lines
39 KiB
Markdown
1053 lines
39 KiB
Markdown
# 🚀 TBD: Persona System Enhancements Implementation Plan
|
|
|
|
## 📋 **Overview**
|
|
|
|
This document outlines the comprehensive implementation plan for enhancing the ALwrity persona system to achieve better writing style mimicry, continuous learning, and quality optimization. The enhancements will transform the current basic persona system into an intelligent, self-improving writing assistant.
|
|
|
|
## 🎯 **Goals**
|
|
|
|
- **Style Mimicry Accuracy**: Improve from 60% to 85%+
|
|
- **Content Consistency**: Improve from 70% to 90%+
|
|
- **User Satisfaction**: Improve from 75% to 90%+
|
|
- **Engagement Performance**: 20% improvement in content engagement
|
|
- **Continuous Learning**: Automated persona refinement based on feedback and performance
|
|
|
|
## 📁 **Enhanced Files Created**
|
|
|
|
### **1. Enhanced Database Models**
|
|
- **File**: `backend/models/enhanced_persona_models.py`
|
|
- **Purpose**: Improved database schema with quality tracking and learning capabilities
|
|
- **Key Features**:
|
|
- Enhanced linguistic analysis storage
|
|
- Quality metrics tracking
|
|
- Learning data storage
|
|
- Performance optimization tracking
|
|
|
|
### **2. Advanced Linguistic Analysis**
|
|
- **File**: `backend/services/persona/enhanced_linguistic_analyzer.py`
|
|
- **Purpose**: Comprehensive writing style analysis with 20+ linguistic metrics
|
|
- **Key Features**:
|
|
- Sentence pattern analysis
|
|
- Vocabulary sophistication analysis
|
|
- Rhetorical device detection
|
|
- Emotional tone analysis
|
|
- Consistency analysis across samples
|
|
|
|
### **3. Quality Improvement System**
|
|
- **File**: `backend/services/persona/persona_quality_improver.py`
|
|
- **Purpose**: Continuous learning and feedback integration for persona improvement
|
|
- **Key Features**:
|
|
- Quality assessment and scoring
|
|
- Feedback analysis and improvement suggestions
|
|
- Performance-based learning
|
|
- Automated persona refinement
|
|
|
|
### **4. Implementation Documentation**
|
|
- **File**: `PERSONA_SYSTEM_IMPROVEMENTS.md`
|
|
- **Purpose**: Comprehensive overview of improvements and expected outcomes
|
|
|
|
## 🗓️ **Implementation Phases**
|
|
|
|
---
|
|
|
|
## **Phase 1: Enhanced Linguistic Analysis (Week 1-2)**
|
|
|
|
### **Objective**
|
|
Implement advanced linguistic analysis to improve style mimicry accuracy.
|
|
|
|
### **Files to Modify**
|
|
|
|
#### **1.1 Update Core Persona Service**
|
|
- **File**: `backend/services/persona/core_persona/core_persona_service.py`
|
|
- **Modifications**:
|
|
```python
|
|
# Add import
|
|
from services.persona.enhanced_linguistic_analyzer import EnhancedLinguisticAnalyzer
|
|
|
|
# Update __init__ method
|
|
def __init__(self):
|
|
self.data_collector = OnboardingDataCollector()
|
|
self.prompt_builder = PersonaPromptBuilder()
|
|
self.linkedin_service = LinkedInPersonaService()
|
|
self.facebook_service = FacebookPersonaService()
|
|
self.linguistic_analyzer = EnhancedLinguisticAnalyzer() # NEW
|
|
logger.info("CorePersonaService initialized")
|
|
|
|
# Update generate_core_persona method
|
|
def generate_core_persona(self, onboarding_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
# ... existing code ...
|
|
|
|
# Enhanced linguistic analysis
|
|
website_content = onboarding_data.get("website_analysis", {}).get("content_samples", [])
|
|
if website_content:
|
|
linguistic_analysis = self.linguistic_analyzer.analyze_writing_style(website_content)
|
|
core_persona["enhanced_linguistic_analysis"] = linguistic_analysis
|
|
|
|
# ... rest of existing code ...
|
|
```
|
|
|
|
#### **1.2 Update Persona Analysis Service**
|
|
- **File**: `backend/services/persona_analysis_service.py`
|
|
- **Modifications**:
|
|
```python
|
|
# Add import
|
|
from services.persona.enhanced_linguistic_analyzer import EnhancedLinguisticAnalyzer
|
|
|
|
# Update __init__ method
|
|
def __init__(self):
|
|
self.core_persona_service = CorePersonaService()
|
|
self.data_collector = OnboardingDataCollector()
|
|
self.linkedin_service = LinkedInPersonaService()
|
|
self.facebook_service = FacebookPersonaService()
|
|
self.linguistic_analyzer = EnhancedLinguisticAnalyzer() # NEW
|
|
logger.info("PersonaAnalysisService initialized")
|
|
|
|
# Update _save_persona_to_db method
|
|
def _save_persona_to_db(self, user_id: int, core_persona: Dict[str, Any],
|
|
platform_personas: Dict[str, Any], onboarding_data: Dict[str, Any]) -> WritingPersona:
|
|
# ... existing code ...
|
|
|
|
# Enhanced linguistic fingerprint
|
|
enhanced_analysis = core_persona.get("enhanced_linguistic_analysis", {})
|
|
if enhanced_analysis:
|
|
persona.linguistic_fingerprint = enhanced_analysis
|
|
persona.writing_style_signature = enhanced_analysis.get("style_patterns", {})
|
|
persona.vocabulary_profile = enhanced_analysis.get("vocabulary_analysis", {})
|
|
persona.sentence_patterns = enhanced_analysis.get("sentence_analysis", {})
|
|
persona.rhetorical_style = enhanced_analysis.get("rhetorical_analysis", {})
|
|
|
|
# ... rest of existing code ...
|
|
```
|
|
|
|
#### **1.3 Database Migration**
|
|
- **File**: `backend/scripts/migrate_to_enhanced_personas.py` (NEW)
|
|
- **Purpose**: Migrate existing personas to enhanced schema
|
|
- **Content**:
|
|
```python
|
|
"""
|
|
Migration script to upgrade existing personas to enhanced schema.
|
|
"""
|
|
from sqlalchemy import create_engine, text
|
|
from models.enhanced_persona_models import Base as EnhancedBase
|
|
from models.persona_models import Base as OriginalBase
|
|
from services.database import engine
|
|
import logging
|
|
|
|
def migrate_personas():
|
|
"""Migrate existing personas to enhanced schema."""
|
|
try:
|
|
# Create enhanced tables
|
|
EnhancedBase.metadata.create_all(bind=engine)
|
|
|
|
# Migrate existing data
|
|
with engine.connect() as conn:
|
|
# Copy writing_personas to enhanced_writing_personas
|
|
conn.execute(text("""
|
|
INSERT INTO enhanced_writing_personas
|
|
(id, user_id, persona_name, archetype, core_belief, brand_voice_description,
|
|
linguistic_fingerprint, created_at, updated_at, is_active)
|
|
SELECT id, user_id, persona_name, archetype, core_belief, brand_voice_description,
|
|
linguistic_fingerprint, created_at, updated_at, is_active
|
|
FROM writing_personas
|
|
WHERE is_active = true
|
|
"""))
|
|
|
|
# Copy platform_personas to enhanced_platform_personas
|
|
conn.execute(text("""
|
|
INSERT INTO enhanced_platform_personas
|
|
(id, writing_persona_id, platform_type, sentence_metrics, lexical_features,
|
|
rhetorical_devices, tonal_range, stylistic_constraints, content_format_rules,
|
|
engagement_patterns, posting_frequency, content_types, platform_best_practices,
|
|
algorithm_considerations, created_at, updated_at, is_active)
|
|
SELECT id, writing_persona_id, platform_type, sentence_metrics, lexical_features,
|
|
rhetorical_devices, tonal_range, stylistic_constraints, content_format_rules,
|
|
engagement_patterns, posting_frequency, content_types, platform_best_practices,
|
|
algorithm_considerations, created_at, updated_at, is_active
|
|
FROM platform_personas
|
|
WHERE is_active = true
|
|
"""))
|
|
|
|
conn.commit()
|
|
logging.info("✅ Persona migration completed successfully")
|
|
|
|
except Exception as e:
|
|
logging.error(f"❌ Migration failed: {str(e)}")
|
|
raise
|
|
|
|
if __name__ == "__main__":
|
|
migrate_personas()
|
|
```
|
|
|
|
### **Testing Phase 1**
|
|
- **Test File**: `backend/tests/test_enhanced_linguistic_analysis.py` (NEW)
|
|
- **Tests**:
|
|
- Linguistic analysis accuracy
|
|
- Style pattern detection
|
|
- Vocabulary analysis
|
|
- Consistency scoring
|
|
|
|
---
|
|
|
|
## **Phase 2: Learning System Integration (Week 3-4)**
|
|
|
|
### **Objective**
|
|
Implement continuous learning from user feedback and performance data.
|
|
|
|
### **Files to Modify**
|
|
|
|
#### **2.1 Update Persona Analysis Service**
|
|
- **File**: `backend/services/persona_analysis_service.py`
|
|
- **Modifications**:
|
|
```python
|
|
# Add import
|
|
from services.persona.persona_quality_improver import PersonaQualityImprover
|
|
|
|
# Update __init__ method
|
|
def __init__(self):
|
|
self.core_persona_service = CorePersonaService()
|
|
self.data_collector = OnboardingDataCollector()
|
|
self.linkedin_service = LinkedInPersonaService()
|
|
self.facebook_service = FacebookPersonaService()
|
|
self.linguistic_analyzer = EnhancedLinguisticAnalyzer()
|
|
self.quality_improver = PersonaQualityImprover() # NEW
|
|
logger.info("PersonaAnalysisService initialized")
|
|
|
|
# Add new methods
|
|
def assess_persona_quality(self, persona_id: int, user_feedback: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
"""Assess persona quality and provide improvement suggestions."""
|
|
return self.quality_improver.assess_persona_quality(persona_id, user_feedback)
|
|
|
|
def improve_persona_from_feedback(self, persona_id: int, feedback_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Improve persona based on user feedback."""
|
|
return self.quality_improver.improve_persona_from_feedback(persona_id, feedback_data)
|
|
|
|
def learn_from_performance(self, persona_id: int, performance_data: List[Dict[str, Any]]) -> Dict[str, Any]:
|
|
"""Learn from content performance data."""
|
|
return self.quality_improver.learn_from_content_performance(persona_id, performance_data)
|
|
```
|
|
|
|
#### **2.2 Create API Endpoints**
|
|
- **File**: `backend/api/persona_quality_routes.py` (NEW)
|
|
- **Purpose**: API endpoints for quality assessment and improvement
|
|
- **Content**:
|
|
```python
|
|
"""
|
|
API routes for persona quality assessment and improvement.
|
|
"""
|
|
from fastapi import APIRouter, HTTPException, Query
|
|
from typing import Dict, Any, Optional, List
|
|
from services.persona_analysis_service import PersonaAnalysisService
|
|
|
|
router = APIRouter(prefix="/api/persona-quality", tags=["persona-quality"])
|
|
|
|
@router.post("/assess/{persona_id}")
|
|
async def assess_persona_quality(
|
|
persona_id: int,
|
|
user_feedback: Optional[Dict[str, Any]] = None
|
|
):
|
|
"""Assess persona quality and provide improvement suggestions."""
|
|
try:
|
|
persona_service = PersonaAnalysisService()
|
|
result = persona_service.assess_persona_quality(persona_id, user_feedback)
|
|
return result
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
@router.post("/improve/{persona_id}")
|
|
async def improve_persona(
|
|
persona_id: int,
|
|
feedback_data: Dict[str, Any]
|
|
):
|
|
"""Improve persona based on user feedback."""
|
|
try:
|
|
persona_service = PersonaAnalysisService()
|
|
result = persona_service.improve_persona_from_feedback(persona_id, feedback_data)
|
|
return result
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
@router.post("/learn-from-performance/{persona_id}")
|
|
async def learn_from_performance(
|
|
persona_id: int,
|
|
performance_data: List[Dict[str, Any]]
|
|
):
|
|
"""Learn from content performance data."""
|
|
try:
|
|
persona_service = PersonaAnalysisService()
|
|
result = persona_service.learn_from_performance(persona_id, performance_data)
|
|
return result
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
```
|
|
|
|
#### **2.3 Update Main App**
|
|
- **File**: `backend/app.py`
|
|
- **Modifications**:
|
|
```python
|
|
# Add import
|
|
from api.persona_quality_routes import router as persona_quality_router
|
|
|
|
# Add router registration
|
|
app.include_router(persona_quality_router)
|
|
```
|
|
|
|
#### **2.4 Frontend Integration**
|
|
- **File**: `frontend/src/api/personaQuality.ts` (NEW)
|
|
- **Purpose**: Frontend API client for quality assessment
|
|
- **Content**:
|
|
```typescript
|
|
import { apiClient } from './apiClient';
|
|
|
|
export interface PersonaQualityAssessment {
|
|
persona_id: number;
|
|
quality_metrics: {
|
|
overall_quality_score: number;
|
|
linguistic_quality: number;
|
|
consistency_score: number;
|
|
authenticity_score: number;
|
|
user_satisfaction?: number;
|
|
platform_optimization_quality: number;
|
|
};
|
|
improvement_suggestions: Array<{
|
|
category: string;
|
|
priority: string;
|
|
suggestion: string;
|
|
action: string;
|
|
}>;
|
|
assessment_date: string;
|
|
}
|
|
|
|
export const personaQualityAPI = {
|
|
async assessQuality(personaId: number, userFeedback?: any): Promise<PersonaQualityAssessment> {
|
|
const response = await apiClient.post(`/api/persona-quality/assess/${personaId}`, {
|
|
user_feedback: userFeedback
|
|
});
|
|
return response.data;
|
|
},
|
|
|
|
async improvePersona(personaId: number, feedbackData: any): Promise<any> {
|
|
const response = await apiClient.post(`/api/persona-quality/improve/${personaId}`, feedbackData);
|
|
return response.data;
|
|
},
|
|
|
|
async learnFromPerformance(personaId: number, performanceData: any[]): Promise<any> {
|
|
const response = await apiClient.post(`/api/persona-quality/learn-from-performance/${personaId}`, performanceData);
|
|
return response.data;
|
|
}
|
|
};
|
|
```
|
|
|
|
### **Testing Phase 2**
|
|
- **Test File**: `backend/tests/test_persona_quality_improvement.py` (NEW)
|
|
- **Tests**:
|
|
- Quality assessment accuracy
|
|
- Feedback processing
|
|
- Performance learning
|
|
- API endpoint functionality
|
|
|
|
---
|
|
|
|
## **Phase 3: Quality Optimization (Week 5-6)**
|
|
|
|
### **Objective**
|
|
Implement automated quality monitoring and continuous improvement workflows.
|
|
|
|
### **Files to Modify**
|
|
|
|
#### **3.1 Create Quality Monitoring Service**
|
|
- **File**: `backend/services/persona/quality_monitor.py` (NEW)
|
|
- **Purpose**: Automated quality monitoring and improvement scheduling
|
|
- **Content**:
|
|
```python
|
|
"""
|
|
Automated quality monitoring and improvement scheduling.
|
|
"""
|
|
from typing import Dict, Any, List
|
|
from datetime import datetime, timedelta
|
|
from loguru import logger
|
|
from services.persona_analysis_service import PersonaAnalysisService
|
|
from services.database import get_db_session
|
|
from models.enhanced_persona_models import EnhancedWritingPersona
|
|
|
|
class PersonaQualityMonitor:
|
|
"""Automated quality monitoring and improvement scheduling."""
|
|
|
|
def __init__(self):
|
|
self.persona_service = PersonaAnalysisService()
|
|
logger.info("PersonaQualityMonitor initialized")
|
|
|
|
def schedule_quality_assessments(self):
|
|
"""Schedule quality assessments for all active personas."""
|
|
try:
|
|
session = get_db_session()
|
|
|
|
# Get personas that need quality assessment
|
|
personas = session.query(EnhancedWritingPersona).filter(
|
|
EnhancedWritingPersona.is_active == True
|
|
).all()
|
|
|
|
for persona in personas:
|
|
# Check if assessment is needed
|
|
if self._needs_quality_assessment(persona):
|
|
self._schedule_assessment(persona.id)
|
|
|
|
session.close()
|
|
logger.info(f"Scheduled quality assessments for {len(personas)} personas")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error scheduling quality assessments: {str(e)}")
|
|
|
|
def _needs_quality_assessment(self, persona: EnhancedWritingPersona) -> bool:
|
|
"""Check if persona needs quality assessment."""
|
|
# Assess if last assessment was more than 7 days ago
|
|
if not persona.updated_at:
|
|
return True
|
|
|
|
days_since_update = (datetime.utcnow() - persona.updated_at).days
|
|
return days_since_update >= 7
|
|
|
|
def _schedule_assessment(self, persona_id: int):
|
|
"""Schedule quality assessment for a persona."""
|
|
# This would integrate with a task queue (Celery, RQ, etc.)
|
|
# For now, we'll run it immediately
|
|
try:
|
|
result = self.persona_service.assess_persona_quality(persona_id)
|
|
logger.info(f"Quality assessment completed for persona {persona_id}: {result.get('quality_metrics', {}).get('overall_quality_score', 0)}")
|
|
except Exception as e:
|
|
logger.error(f"Error assessing persona {persona_id}: {str(e)}")
|
|
```
|
|
|
|
#### **3.2 Create Improvement Workflow**
|
|
- **File**: `backend/services/persona/improvement_workflow.py` (NEW)
|
|
- **Purpose**: Automated improvement workflow based on quality metrics
|
|
- **Content**:
|
|
```python
|
|
"""
|
|
Automated improvement workflow for personas.
|
|
"""
|
|
from typing import Dict, Any, List
|
|
from loguru import logger
|
|
from services.persona_analysis_service import PersonaAnalysisService
|
|
|
|
class PersonaImprovementWorkflow:
|
|
"""Automated improvement workflow for personas."""
|
|
|
|
def __init__(self):
|
|
self.persona_service = PersonaAnalysisService()
|
|
logger.info("PersonaImprovementWorkflow initialized")
|
|
|
|
def run_improvement_cycle(self, persona_id: int) -> Dict[str, Any]:
|
|
"""Run a complete improvement cycle for a persona."""
|
|
try:
|
|
# 1. Assess current quality
|
|
quality_assessment = self.persona_service.assess_persona_quality(persona_id)
|
|
|
|
# 2. Check if improvement is needed
|
|
overall_score = quality_assessment.get('quality_metrics', {}).get('overall_quality_score', 0)
|
|
|
|
if overall_score < 80: # Threshold for improvement
|
|
# 3. Generate improvement suggestions
|
|
suggestions = quality_assessment.get('improvement_suggestions', [])
|
|
|
|
# 4. Apply high-priority improvements
|
|
high_priority_suggestions = [s for s in suggestions if s.get('priority') == 'high']
|
|
|
|
if high_priority_suggestions:
|
|
improvement_result = self._apply_improvements(persona_id, high_priority_suggestions)
|
|
return {
|
|
"persona_id": persona_id,
|
|
"improvement_applied": True,
|
|
"improvements": improvement_result,
|
|
"quality_before": overall_score,
|
|
"quality_after": improvement_result.get('updated_quality_score', overall_score)
|
|
}
|
|
|
|
return {
|
|
"persona_id": persona_id,
|
|
"improvement_applied": False,
|
|
"reason": "Quality score above threshold" if overall_score >= 80 else "No high-priority improvements"
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in improvement cycle for persona {persona_id}: {str(e)}")
|
|
return {"error": str(e)}
|
|
|
|
def _apply_improvements(self, persona_id: int, suggestions: List[Dict[str, Any]]) -> Dict[str, Any]:
|
|
"""Apply improvement suggestions to a persona."""
|
|
# This would implement specific improvement actions based on suggestions
|
|
# For now, we'll return a placeholder
|
|
return {
|
|
"suggestions_applied": len(suggestions),
|
|
"updated_quality_score": 85.0 # Placeholder
|
|
}
|
|
```
|
|
|
|
#### **3.3 Update Content Generation Services**
|
|
- **File**: `backend/services/linkedin/content_generator.py`
|
|
- **Modifications**:
|
|
```python
|
|
# Add import
|
|
from services.persona.persona_quality_improver import PersonaQualityImprover
|
|
|
|
# Update __init__ method
|
|
def __init__(self, citation_manager=None, quality_analyzer=None, gemini_grounded=None, fallback_provider=None):
|
|
self.citation_manager = citation_manager
|
|
self.quality_analyzer = quality_analyzer
|
|
self.gemini_grounded = gemini_grounded
|
|
self.fallback_provider = fallback_provider
|
|
|
|
# Persona caching
|
|
self._persona_cache: Dict[str, Dict[str, Any]] = {}
|
|
self._cache_timestamps: Dict[str, float] = {}
|
|
self._cache_duration = 300 # 5 minutes cache duration
|
|
|
|
# Quality improvement
|
|
self.quality_improver = PersonaQualityImprover() # NEW
|
|
|
|
# Initialize specialized generators
|
|
self.carousel_generator = CarouselGenerator(citation_manager, quality_analyzer)
|
|
self.video_script_generator = VideoScriptGenerator(citation_manager, quality_analyzer)
|
|
|
|
# Add quality tracking method
|
|
def track_content_performance(self, persona_id: int, content_data: Dict[str, Any], performance_metrics: Dict[str, Any]):
|
|
"""Track content performance for persona learning."""
|
|
try:
|
|
# Combine content and performance data
|
|
learning_data = {
|
|
"content_data": content_data,
|
|
"performance_metrics": performance_metrics,
|
|
"timestamp": datetime.utcnow().isoformat()
|
|
}
|
|
|
|
# Learn from performance
|
|
result = self.quality_improver.learn_from_content_performance(persona_id, [learning_data])
|
|
logger.info(f"Performance learning completed for persona {persona_id}")
|
|
return result
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error tracking content performance: {str(e)}")
|
|
return {"error": str(e)}
|
|
```
|
|
|
|
#### **3.4 Create Quality Dashboard**
|
|
- **File**: `frontend/src/components/PersonaQualityDashboard.tsx` (NEW)
|
|
- **Purpose**: Dashboard for monitoring persona quality and improvements
|
|
- **Content**:
|
|
```typescript
|
|
import React, { useState, useEffect } from 'react';
|
|
import { personaQualityAPI, PersonaQualityAssessment } from '../api/personaQuality';
|
|
|
|
interface PersonaQualityDashboardProps {
|
|
personaId: number;
|
|
}
|
|
|
|
export const PersonaQualityDashboard: React.FC<PersonaQualityDashboardProps> = ({ personaId }) => {
|
|
const [qualityData, setQualityData] = useState<PersonaQualityAssessment | null>(null);
|
|
const [loading, setLoading] = useState(true);
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
useEffect(() => {
|
|
loadQualityData();
|
|
}, [personaId]);
|
|
|
|
const loadQualityData = async () => {
|
|
try {
|
|
setLoading(true);
|
|
const data = await personaQualityAPI.assessQuality(personaId);
|
|
setQualityData(data);
|
|
} catch (err) {
|
|
setError(err instanceof Error ? err.message : 'Failed to load quality data');
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
if (loading) return <div>Loading quality data...</div>;
|
|
if (error) return <div>Error: {error}</div>;
|
|
if (!qualityData) return <div>No quality data available</div>;
|
|
|
|
return (
|
|
<div className="persona-quality-dashboard">
|
|
<h2>Persona Quality Dashboard</h2>
|
|
|
|
<div className="quality-metrics">
|
|
<div className="metric">
|
|
<label>Overall Quality Score</label>
|
|
<div className="score">{qualityData.quality_metrics.overall_quality_score.toFixed(1)}%</div>
|
|
</div>
|
|
|
|
<div className="metric">
|
|
<label>Linguistic Quality</label>
|
|
<div className="score">{qualityData.quality_metrics.linguistic_quality.toFixed(1)}%</div>
|
|
</div>
|
|
|
|
<div className="metric">
|
|
<label>Consistency Score</label>
|
|
<div className="score">{qualityData.quality_metrics.consistency_score.toFixed(1)}%</div>
|
|
</div>
|
|
|
|
<div className="metric">
|
|
<label>Authenticity Score</label>
|
|
<div className="score">{qualityData.quality_metrics.authenticity_score.toFixed(1)}%</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="improvement-suggestions">
|
|
<h3>Improvement Suggestions</h3>
|
|
{qualityData.improvement_suggestions.map((suggestion, index) => (
|
|
<div key={index} className={`suggestion ${suggestion.priority}`}>
|
|
<h4>{suggestion.category}</h4>
|
|
<p>{suggestion.suggestion}</p>
|
|
<span className="priority">{suggestion.priority}</span>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
```
|
|
|
|
### **Testing Phase 3**
|
|
- **Test File**: `backend/tests/test_quality_optimization.py` (NEW)
|
|
- **Tests**:
|
|
- Quality monitoring accuracy
|
|
- Improvement workflow effectiveness
|
|
- Performance tracking
|
|
- Dashboard functionality
|
|
|
|
---
|
|
|
|
## **Phase 4: Advanced Features (Week 7-8)**
|
|
|
|
### **Objective**
|
|
Implement advanced features for A/B testing, multi-user support, and advanced analytics.
|
|
|
|
### **Files to Modify**
|
|
|
|
#### **4.1 A/B Testing System**
|
|
- **File**: `backend/services/persona/persona_ab_testing.py` (NEW)
|
|
- **Purpose**: A/B testing for persona variations
|
|
- **Content**:
|
|
```python
|
|
"""
|
|
A/B testing system for persona variations.
|
|
"""
|
|
from typing import Dict, Any, List, Tuple
|
|
from datetime import datetime, timedelta
|
|
from loguru import logger
|
|
import random
|
|
from services.database import get_db_session
|
|
from models.enhanced_persona_models import EnhancedWritingPersona
|
|
|
|
class PersonaABTesting:
|
|
"""A/B testing system for persona variations."""
|
|
|
|
def __init__(self):
|
|
logger.info("PersonaABTesting initialized")
|
|
|
|
def create_ab_test(self, base_persona_id: int, variations: List[Dict[str, Any]],
|
|
test_duration_days: int = 14) -> Dict[str, Any]:
|
|
"""Create an A/B test with persona variations."""
|
|
try:
|
|
session = get_db_session()
|
|
|
|
# Get base persona
|
|
base_persona = session.query(EnhancedWritingPersona).filter(
|
|
EnhancedWritingPersona.id == base_persona_id
|
|
).first()
|
|
|
|
if not base_persona:
|
|
return {"error": "Base persona not found"}
|
|
|
|
# Create test variations
|
|
test_variations = []
|
|
for i, variation in enumerate(variations):
|
|
variation_persona = EnhancedWritingPersona(
|
|
user_id=base_persona.user_id,
|
|
persona_name=f"{base_persona.persona_name} - Variation {i+1}",
|
|
archetype=variation.get('archetype', base_persona.archetype),
|
|
core_belief=variation.get('core_belief', base_persona.core_belief),
|
|
brand_voice_description=variation.get('brand_voice_description', base_persona.brand_voice_description),
|
|
linguistic_fingerprint=variation.get('linguistic_fingerprint', base_persona.linguistic_fingerprint),
|
|
is_active=True
|
|
)
|
|
session.add(variation_persona)
|
|
session.flush()
|
|
test_variations.append(variation_persona.id)
|
|
|
|
# Create test record
|
|
test_data = {
|
|
"base_persona_id": base_persona_id,
|
|
"variation_ids": test_variations,
|
|
"test_start_date": datetime.utcnow(),
|
|
"test_end_date": datetime.utcnow() + timedelta(days=test_duration_days),
|
|
"status": "active"
|
|
}
|
|
|
|
session.commit()
|
|
session.close()
|
|
|
|
return {
|
|
"test_id": f"test_{base_persona_id}_{int(datetime.utcnow().timestamp())}",
|
|
"base_persona_id": base_persona_id,
|
|
"variation_ids": test_variations,
|
|
"test_duration_days": test_duration_days,
|
|
"status": "created"
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error creating A/B test: {str(e)}")
|
|
return {"error": str(e)}
|
|
|
|
def assign_user_to_variation(self, user_id: int, test_id: str) -> int:
|
|
"""Assign user to a test variation."""
|
|
# Simple random assignment for now
|
|
# In production, this would use proper statistical methods
|
|
return random.randint(1, 3) # Placeholder
|
|
|
|
def analyze_test_results(self, test_id: str) -> Dict[str, Any]:
|
|
"""Analyze A/B test results."""
|
|
# This would analyze performance metrics for each variation
|
|
# and determine statistical significance
|
|
return {
|
|
"test_id": test_id,
|
|
"winner": "variation_2",
|
|
"confidence_level": 95.0,
|
|
"performance_improvement": 15.2
|
|
}
|
|
```
|
|
|
|
#### **4.2 Multi-User Persona Management**
|
|
- **File**: `backend/services/persona/multi_user_persona_manager.py` (NEW)
|
|
- **Purpose**: Manage personas for multiple users and teams
|
|
- **Content**:
|
|
```python
|
|
"""
|
|
Multi-user persona management system.
|
|
"""
|
|
from typing import Dict, Any, List, Optional
|
|
from loguru import logger
|
|
from services.database import get_db_session
|
|
from models.enhanced_persona_models import EnhancedWritingPersona
|
|
|
|
class MultiUserPersonaManager:
|
|
"""Manage personas for multiple users and teams."""
|
|
|
|
def __init__(self):
|
|
logger.info("MultiUserPersonaManager initialized")
|
|
|
|
def create_team_persona(self, team_id: int, team_members: List[int],
|
|
base_persona_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Create a shared persona for a team."""
|
|
try:
|
|
session = get_db_session()
|
|
|
|
# Create team persona
|
|
team_persona = EnhancedWritingPersona(
|
|
user_id=team_id, # Use team_id as user_id for team personas
|
|
persona_name=f"Team Persona - {base_persona_data.get('team_name', 'Unnamed Team')}",
|
|
archetype=base_persona_data.get('archetype'),
|
|
core_belief=base_persona_data.get('core_belief'),
|
|
brand_voice_description=base_persona_data.get('brand_voice_description'),
|
|
is_active=True
|
|
)
|
|
|
|
session.add(team_persona)
|
|
session.commit()
|
|
session.close()
|
|
|
|
return {
|
|
"team_persona_id": team_persona.id,
|
|
"team_id": team_id,
|
|
"team_members": team_members,
|
|
"status": "created"
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error creating team persona: {str(e)}")
|
|
return {"error": str(e)}
|
|
|
|
def get_user_personas(self, user_id: int) -> List[Dict[str, Any]]:
|
|
"""Get all personas for a user (personal + team personas)."""
|
|
try:
|
|
session = get_db_session()
|
|
|
|
# Get personal personas
|
|
personal_personas = session.query(EnhancedWritingPersona).filter(
|
|
EnhancedWritingPersona.user_id == user_id,
|
|
EnhancedWritingPersona.is_active == True
|
|
).all()
|
|
|
|
# Get team personas (this would require team membership logic)
|
|
# For now, we'll just return personal personas
|
|
|
|
session.close()
|
|
|
|
return [persona.to_dict() for persona in personal_personas]
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error getting user personas: {str(e)}")
|
|
return []
|
|
|
|
def share_persona_with_team(self, persona_id: int, team_id: int) -> Dict[str, Any]:
|
|
"""Share a persona with a team."""
|
|
# This would implement persona sharing logic
|
|
return {
|
|
"persona_id": persona_id,
|
|
"team_id": team_id,
|
|
"status": "shared"
|
|
}
|
|
```
|
|
|
|
#### **4.3 Advanced Analytics**
|
|
- **File**: `backend/services/persona/persona_analytics.py` (NEW)
|
|
- **Purpose**: Advanced analytics and reporting for personas
|
|
- **Content**:
|
|
```python
|
|
"""
|
|
Advanced analytics and reporting for personas.
|
|
"""
|
|
from typing import Dict, Any, List, Optional
|
|
from datetime import datetime, timedelta
|
|
from loguru import logger
|
|
from services.database import get_db_session
|
|
from models.enhanced_persona_models import EnhancedWritingPersona, PersonaQualityMetrics
|
|
|
|
class PersonaAnalytics:
|
|
"""Advanced analytics and reporting for personas."""
|
|
|
|
def __init__(self):
|
|
logger.info("PersonaAnalytics initialized")
|
|
|
|
def generate_persona_report(self, persona_id: int, date_range: Optional[Tuple[datetime, datetime]] = None) -> Dict[str, Any]:
|
|
"""Generate comprehensive persona analytics report."""
|
|
try:
|
|
session = get_db_session()
|
|
|
|
# Get persona
|
|
persona = session.query(EnhancedWritingPersona).filter(
|
|
EnhancedWritingPersona.id == persona_id
|
|
).first()
|
|
|
|
if not persona:
|
|
return {"error": "Persona not found"}
|
|
|
|
# Get quality metrics over time
|
|
quality_metrics = session.query(PersonaQualityMetrics).filter(
|
|
PersonaQualityMetrics.writing_persona_id == persona_id
|
|
).all()
|
|
|
|
# Calculate trends
|
|
quality_trend = self._calculate_quality_trend(quality_metrics)
|
|
|
|
# Generate insights
|
|
insights = self._generate_insights(persona, quality_metrics)
|
|
|
|
session.close()
|
|
|
|
return {
|
|
"persona_id": persona_id,
|
|
"persona_name": persona.persona_name,
|
|
"report_date": datetime.utcnow().isoformat(),
|
|
"quality_trend": quality_trend,
|
|
"insights": insights,
|
|
"recommendations": self._generate_recommendations(quality_trend, insights)
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error generating persona report: {str(e)}")
|
|
return {"error": str(e)}
|
|
|
|
def _calculate_quality_trend(self, quality_metrics: List[PersonaQualityMetrics]) -> Dict[str, Any]:
|
|
"""Calculate quality trend over time."""
|
|
if not quality_metrics:
|
|
return {"trend": "no_data"}
|
|
|
|
# Sort by date
|
|
sorted_metrics = sorted(quality_metrics, key=lambda x: x.assessment_date)
|
|
|
|
# Calculate trend
|
|
first_score = sorted_metrics[0].content_quality or 0
|
|
last_score = sorted_metrics[-1].content_quality or 0
|
|
|
|
if last_score > first_score * 1.05:
|
|
trend = "improving"
|
|
elif last_score < first_score * 0.95:
|
|
trend = "declining"
|
|
else:
|
|
trend = "stable"
|
|
|
|
return {
|
|
"trend": trend,
|
|
"first_score": first_score,
|
|
"last_score": last_score,
|
|
"change_percentage": ((last_score - first_score) / first_score * 100) if first_score > 0 else 0
|
|
}
|
|
|
|
def _generate_insights(self, persona: EnhancedWritingPersona, quality_metrics: List[PersonaQualityMetrics]) -> List[str]:
|
|
"""Generate insights from persona data."""
|
|
insights = []
|
|
|
|
# Quality insights
|
|
if quality_metrics:
|
|
avg_quality = sum(m.content_quality or 0 for m in quality_metrics) / len(quality_metrics)
|
|
if avg_quality > 85:
|
|
insights.append("Persona maintains high quality consistently")
|
|
elif avg_quality < 70:
|
|
insights.append("Persona quality needs improvement")
|
|
|
|
# Linguistic insights
|
|
linguistic_fingerprint = persona.linguistic_fingerprint or {}
|
|
if linguistic_fingerprint.get('vocabulary_analysis', {}).get('lexical_diversity', 0) > 0.7:
|
|
insights.append("Persona uses diverse vocabulary effectively")
|
|
|
|
return insights
|
|
|
|
def _generate_recommendations(self, quality_trend: Dict[str, Any], insights: List[str]) -> List[str]:
|
|
"""Generate recommendations based on analysis."""
|
|
recommendations = []
|
|
|
|
if quality_trend.get('trend') == 'declining':
|
|
recommendations.append("Schedule immediate quality assessment and improvement")
|
|
|
|
if 'diverse vocabulary' not in str(insights):
|
|
recommendations.append("Consider expanding vocabulary diversity")
|
|
|
|
return recommendations
|
|
```
|
|
|
|
### **Testing Phase 4**
|
|
- **Test File**: `backend/tests/test_advanced_features.py` (NEW)
|
|
- **Tests**:
|
|
- A/B testing functionality
|
|
- Multi-user management
|
|
- Analytics accuracy
|
|
- Report generation
|
|
|
|
---
|
|
|
|
## **📊 Success Metrics & Monitoring**
|
|
|
|
### **Technical Metrics**
|
|
- **Analysis Accuracy**: 85%+ style mimicry accuracy
|
|
- **Processing Speed**: <2 seconds for quality assessment
|
|
- **Learning Efficiency**: 90%+ improvement in 3 feedback cycles
|
|
- **System Reliability**: 99.9% uptime for persona services
|
|
|
|
### **User Metrics**
|
|
- **Content Quality Rating**: 4.5+ stars average
|
|
- **User Retention**: 90%+ users continue using personas
|
|
- **Engagement Improvement**: 25%+ increase in content engagement
|
|
- **Satisfaction Score**: 90%+ user satisfaction
|
|
|
|
### **Monitoring Dashboard**
|
|
- **File**: `frontend/src/components/PersonaSystemDashboard.tsx` (NEW)
|
|
- **Purpose**: System-wide monitoring of persona performance
|
|
- **Features**:
|
|
- Real-time quality metrics
|
|
- User satisfaction trends
|
|
- System performance monitoring
|
|
- Improvement tracking
|
|
|
|
---
|
|
|
|
## **🔧 Dependencies & Requirements**
|
|
|
|
### **New Python Packages**
|
|
```bash
|
|
pip install textstat nltk spacy
|
|
python -m spacy download en_core_web_sm
|
|
```
|
|
|
|
### **Database Changes**
|
|
- New tables: `enhanced_writing_personas`, `enhanced_platform_personas`, `persona_quality_metrics`, `persona_learning_data`
|
|
- Migration script for existing data
|
|
- Indexes for performance optimization
|
|
|
|
### **Frontend Dependencies**
|
|
- Chart.js for analytics visualization
|
|
- React Query for data fetching
|
|
- Material-UI for dashboard components
|
|
|
|
---
|
|
|
|
## **🚀 Deployment Strategy**
|
|
|
|
### **Phase 1 Deployment**
|
|
1. Deploy enhanced linguistic analyzer
|
|
2. Run database migration
|
|
3. Update persona generation services
|
|
4. Test with existing personas
|
|
|
|
### **Phase 2 Deployment**
|
|
1. Deploy quality improvement system
|
|
2. Add API endpoints
|
|
3. Update frontend integration
|
|
4. Enable feedback collection
|
|
|
|
### **Phase 3 Deployment**
|
|
1. Deploy quality monitoring
|
|
2. Enable automated improvements
|
|
3. Launch quality dashboard
|
|
4. Monitor system performance
|
|
|
|
### **Phase 4 Deployment**
|
|
1. Deploy advanced features
|
|
2. Enable A/B testing
|
|
3. Launch multi-user support
|
|
4. Deploy analytics dashboard
|
|
|
|
---
|
|
|
|
## **📝 Testing Strategy**
|
|
|
|
### **Unit Tests**
|
|
- Linguistic analysis accuracy
|
|
- Quality assessment algorithms
|
|
- Improvement suggestion generation
|
|
- API endpoint functionality
|
|
|
|
### **Integration Tests**
|
|
- End-to-end persona generation
|
|
- Quality improvement workflows
|
|
- Performance learning cycles
|
|
- Multi-user scenarios
|
|
|
|
### **Performance Tests**
|
|
- Large-scale persona analysis
|
|
- Concurrent quality assessments
|
|
- Database query optimization
|
|
- API response times
|
|
|
|
### **User Acceptance Tests**
|
|
- Style mimicry accuracy
|
|
- User satisfaction surveys
|
|
- Content quality ratings
|
|
- Engagement improvement metrics
|
|
|
|
---
|
|
|
|
## **🔮 Future Enhancements**
|
|
|
|
### **Advanced AI Features**
|
|
- GPT-4 integration for better analysis
|
|
- Custom model training for specific industries
|
|
- Real-time style adaptation
|
|
- Multi-language support
|
|
|
|
### **Enterprise Features**
|
|
- Team collaboration tools
|
|
- Brand guideline integration
|
|
- Compliance monitoring
|
|
- Advanced reporting
|
|
|
|
### **Integration Opportunities**
|
|
- CRM system integration
|
|
- Content management systems
|
|
- Social media APIs
|
|
- Analytics platforms
|
|
|
|
---
|
|
|
|
This comprehensive implementation plan provides a structured approach to enhancing the persona system with clear phases, file modifications, and success metrics. Each phase builds upon the previous one, ensuring a smooth transition from the current system to the enhanced version.
|