interview_agents_api / src /services /analysis_service.py
QuentinL52's picture
Update src/services/analysis_service.py
23603e1 verified
raw
history blame
4.68 kB
import json
import logging
from typing import Dict, List, Any
from crewai import Agent, Task, Crew, Process
logger = logging.getLogger(__name__)
class AnalysisService:
def __init__(self, models: Dict[str, Any]):
self.models = models
self.analyzer = models.get("deep_learning_analyzer")
self.rag_handler = models.get("rag_handler")
self.llm = models.get("llm")
self._create_report_agent()
def _create_report_agent(self):
self.report_agent = Agent(
role='Rédacteur de Rapports Synthétiques',
goal='Générer un feedback pertinent à partir du déroulement de l\'entretien',
backstory=(
"Spécialisé dans le recrutement et les ressources humaines, capable d'évaluer les candidats "
"sur la communication et la pertinence des réponses en fonction des questions posées, rédige "
"en un rapport clair, un feedback détaillé sur le candidat."
),
allow_delegation=False,
verbose=False,
llm=self.llm
)
def run_analysis(self, conversation_history: List[Dict[str, Any]], job_description: str) -> Dict[str, Any]:
if not self.analyzer:
return {"error": "Analyzer non disponible"}
structured_analysis = self.analyzer.run_full_analysis(conversation_history, job_description)
rag_feedback = []
if self.rag_handler:
rag_feedback = self._get_contextual_feedback(structured_analysis)
report = self._generate_final_report(structured_analysis, rag_feedback)
return report
def _get_contextual_feedback(self, structured_analysis: Dict[str, Any]) -> List[str]:
rag_feedback = []
if structured_analysis.get("intent_analysis"):
for intent in structured_analysis["intent_analysis"]:
query = f"Conseils pour un candidat qui cherche à {intent['labels'][0]}"
rag_feedback.extend(self.rag_handler.get_relevant_feedback(query))
if structured_analysis.get("sentiment_analysis"):
for sentiment_group in structured_analysis["sentiment_analysis"]:
for sentiment in sentiment_group:
if sentiment['label'] == 'stress' and sentiment['score'].item() > 0.6:
rag_feedback.extend(
self.rag_handler.get_relevant_feedback("gestion du stress en entretien")
)
return list(set(rag_feedback))
def _generate_final_report(
self,
structured_analysis: Dict[str, Any],
rag_feedback: List[str]
) -> Dict[str, Any]:
task = Task(
description=(
f"Tu es un rédacteur expert en RH. Ta mission est de rédiger un rapport d'évaluation final. "
f"Tu dois utiliser deux sources d'information principales : "
f"1. Les données d'analyse structurées de l'entretien : '{json.dumps(structured_analysis, indent=2)}'. "
f"2. Une liste de conseils et de feedback pertinents issus de notre base de connaissances : '{chr(10).join(rag_feedback)}'. "
f"Ta tâche est de synthétiser ces informations en un rapport cohérent et actionnable."
),
expected_output=(
"Un rapport final exceptionnel basé sur l'analyse fournie. Le rapport doit être structuré comme suit: "
"1. **Résumé et Score d'Adéquation** : Synthétise le score de similarité sémantique et donne un aperçu global. "
"2. **Analyse Comportementale** : Interprète les résultats de l'analyse de sentiment et d'intention pour décrire le comportement du candidat. "
"3. **Adéquation Sémantique avec le Poste** : Explique ce que signifie le score de similarité. "
"4. **Points Forts & Axes d'Amélioration Personnalisés** : Utilise les données d'analyse pour identifier les points à améliorer. "
"Ensuite, intègre de manière fluide et naturelle les conseils pertinents pour proposer des pistes d'amélioration concrètes et personnalisées. "
"5. **Recommandation Finale**."
),
agent=self.report_agent
)
crew = Crew(
agents=[self.report_agent],
tasks=[task],
process=Process.sequential,
verbose=False,
telemetry=False
)
result = crew.kickoff()
return {"analysis_report": result.raw if hasattr(result, 'raw') else str(result)}