Passer au contenu principal
Partie 2 : Fonctionnalités de production - Enveloppes de fournisseur, application des politiques, sessions et observabilité.

La configuration

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.

Installer les dépendances

pip install "rail-score-sdk[openai,google,langfuse]" openai google-genai

Variables d’environnement

Créez un fichier .env :
RAIL_API_KEY=YOUR_RAIL_API_KEY
OPENAI_API_KEY=sk-your_openai_key
GEMINI_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.

Construire le chatbot de base

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 openai
import os

openai_client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

SYSTEM_PROMPT = """Vous êtes CloudDash Support, un assistant utile pour
CloudDash — un tableau de bord de surveillance cloud. Répondez aux questions sur
les 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.content


reply = 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.

Ajouter l’évaluation du score RAIL

La manière la plus simple d’ajouter l’évaluation RAIL est avec RailScoreClient. Un appel nous donne des scores sur les 8 dimensions RAIL.
chatbot_with_eval.py
from rail_score_sdk import RailScoreClient
import os

rail = RailScoreClient(api_key=os.getenv("RAIL_API_KEY"))

reply = chat("Quels plans tarifaires proposez-vous ?")

result = rail.eval(content=reply, mode="basic")

print(f"Score global : {result.rail_score.score}")
print(f"Confiance :    {result.rail_score.confidence}")
print()
for dim_name, dim_score in result.dimension_scores.items():
    print(f"  {dim_name:15s} {dim_score.score}")
Score global : 8.4
Confiance :    0.91

  équité         8.5
  sécurité       9.2
  fiabilité      7.8
  transparence   8.0
  vie_privée     5.0
  responsabilité 8.1
  inclusivité    8.7
  impact_utilisateur 9.0

Interpréter les résultats

DimensionScoreCe que cela signifie
Sécurité9.2Pas de contenu nuisible, approprié pour tous les utilisateurs
Impact utilisateur9.0Répond directement à la question au bon niveau de détail
Inclusivité8.7Langage accessible, pas de termes exclusifs
Équité8.5Traitement équitable, pas de biais démographique
Responsabilité8.1Raisonnement clair, revendications traçables
Transparence8.0Représentation honnête des connaissances
Fiabilité7.8Principalement précis, mais les détails de prix sont synthétiques
Vie privée5.0Non applicable - aucune PII impliquée
Vie privée = 5.0 signifie “non applicable.” RAIL retourne 5.0 (neutre) lorsque la vie privée est sans rapport avec le contenu évalué.

Évaluation approfondie

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()
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.

Basique vs Approfondi

BasiqueApprofondi
Coût1 crédit3 crédits
ScoresGlobal + 8 dimensionsGlobal + 8 dimensions
ExplicationsNonOui, par dimension
Détection de problèmesNonOui
Meilleur pourVérifications en temps réel à volume élevéDébogage, audit, analyse post-hoc
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.

Quelles sont les prochaines étapes

Partie 2 : Fonctionnalités de production

Enveloppes de fournisseur, application des politiques (bloquer/régénérer), suivi des sessions multi-tours et observabilité Langfuse.