Nous construisons un chatbot de support client pour un produit SaaS fictif appelé “CloudDash”, un tableau de bord de surveillance cloud. Le chatbot répond aux questions sur les prix, les fonctionnalités et le dépannage. En cours de route, nous ajoutons une évaluation des scores RAIL à chaque couche pour garantir que les réponses du chatbot sont sûres, précises, équitables et utiles.
RAIL_API_KEY=YOUR_RAIL_API_KEYOPENAI_API_KEY=sk-your_openai_keyGEMINI_API_KEY=your_gemini_key# Optionnel : pour la Partie 2 (observabilité Langfuse)LANGFUSE_PUBLIC_KEY=pk-lf-...LANGFUSE_SECRET_KEY=sk-lf-...LANGFUSE_HOST=https://cloud.langfuse.com
Obtenez votre clé API RAIL : Inscrivez-vous sur responsibleailabs.ai/dashboard. Le niveau gratuit comprend 100 crédits pour suivre tout ce tutoriel.
Commencez avec un chatbot de base utilisant OpenAI directement, sans intégration RAIL pour l’instant. C’est la fondation sur laquelle nous allons ajouter le scoring.
chatbot.py
import openaiimport osopenai_client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY"))SYSTEM_PROMPT = """Vous êtes CloudDash Support, un assistant utile pourCloudDash — un tableau de bord de surveillance cloud. Répondez aux questions surles prix, les fonctionnalités, la configuration et le dépannage. Soyez concis et précis.Si vous ne savez pas quelque chose, dites-le."""def chat(user_message: str, history: list[dict] = None) -> str: messages = [{"role": "system", "content": SYSTEM_PROMPT}] if history: messages.extend(history) messages.append({"role": "user", "content": user_message}) response = openai_client.chat.completions.create( model="gpt-4o", messages=messages, temperature=0.3, ) return response.choices[0].message.contentreply = chat("Quels plans tarifaires proposez-vous ?")print(reply)
Cela fonctionne, mais nous n’avons aucune visibilité sur la qualité de la réponse. Cette réponse est-elle sûre ? Est-elle factuellement précise ? Contient-elle des biais ? Nous n’avons aucun moyen de le savoir, jusqu’à ce que nous ajoutions le score RAIL.
Le mode de base vous donne des scores. Le mode approfondi vous donne le pourquoi : explications par dimension, problèmes détectés et suggestions d’amélioration.
deep_eval.py
result = rail.eval(content=reply, mode="deep")print(f"Global : {result.rail_score.score}")print()for dim_name, detail in result.dimension_scores.items(): print(f"--- {dim_name} (score : {detail.score}) ---") print(f" Explication : {detail.explanation}") if detail.issues: print(f" Problèmes : {', '.join(detail.issues)}") if detail.suggestions: print(f" Suggestion : {detail.suggestions[0]}") print()
Exemple de sortie
Global : 8.4--- fiabilité (score : 7.8) --- Explication : La réponse fournit des chiffres de prix spécifiques (29 $, 79 $) qui semblent raisonnables mais ne peuvent pas être vérifiés par rapport aux prix réels de CloudDash. La répartition des fonctionnalités est plausible mais non confirmée. Problèmes : revendication_trop_confiance Suggestion : Ajoutez un avertissement indiquant que les prix sont susceptibles de changer, ou liez à la page de prix officielle pour les informations les plus récentes.--- transparence (score : 8.0) --- Explication : La réponse présente clairement les trois niveaux avec des fonctionnalités distinctes. Cependant, elle ne divulgue pas qu'elle peut ne pas avoir les dernières informations tarifaires. Problèmes : limitation_cachée Suggestion : Reconnaître que les détails des prix doivent être vérifiés sur le site officiel.--- impact_utilisateur (score : 9.0) --- Explication : Répond directement à la question de prix de l'utilisateur avec une comparaison bien structurée. La question de suivi ajoute de la valeur.
Astuce d’économie : Utilisez le mode de base pour chaque réponse en production, et le mode approfondi de manière sélective. Par exemple, déclenchez le mode approfondi lorsque le score de base tombe en dessous de votre seuil, ou comme un audit périodique sur un échantillon de réponses.