Zum Hauptinhalt springen
Teil 2: Produktionsmerkmale - Anbieter-Wrapper, Richtliniendurchsetzung, Sitzungen und Beobachtbarkeit.

Die Einrichtung

Wir bauen einen Kundenservice-Chatbot für ein fiktives SaaS-Produkt namens “CloudDash”, ein Cloud-Überwachungs-Dashboard. Der Chatbot beantwortet Fragen zu Preisen, Funktionen und Fehlersuche. Dabei fügen wir an jeder Stelle eine RAIL Score-Bewertung hinzu, um sicherzustellen, dass die Antworten des Chatbots sicher, genau, fair und hilfreich sind.

Abhängigkeiten installieren

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

Umgebungsvariablen

Erstellen Sie eine .env-Datei:
RAIL_API_KEY=YOUR_RAIL_API_KEY
OPENAI_API_KEY=sk-your_openai_key
GEMINI_API_KEY=your_gemini_key

# Optional: für Teil 2 (Langfuse-Beobachtbarkeit)
LANGFUSE_PUBLIC_KEY=pk-lf-...
LANGFUSE_SECRET_KEY=sk-lf-...
LANGFUSE_HOST=https://cloud.langfuse.com
Holen Sie sich Ihren RAIL API-Schlüssel: Melden Sie sich unter responsibleailabs.ai/dashboard an. Die kostenlose Stufe umfasst 100 Credits, um dieses gesamte Tutorial zu verfolgen.

Den grundlegenden Chatbot erstellen

Beginnen Sie mit einem grundlegenden Chatbot, der OpenAI direkt verwendet, ohne RAIL-Integration. Dies ist die Grundlage, auf der wir die Bewertung aufbauen werden.
chatbot.py
import openai
import os

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

SYSTEM_PROMPT = """Sie sind CloudDash Support, ein hilfreicher Assistent für
CloudDash — ein Cloud-Überwachungs-Dashboard. Beantworten Sie Fragen zu
Preisen, Funktionen, Einrichtung und Fehlersuche. Seien Sie präzise und genau.
Wenn Sie etwas nicht wissen, sagen Sie es."""


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("Welche Preispläne bieten Sie an?")
print(reply)
Das funktioniert, aber wir haben keine Sichtbarkeit in die Qualität der Antworten. Ist diese Antwort sicher? Ist sie faktisch genau? Enthält sie Vorurteile? Wir haben keine Möglichkeit, dies zu wissen, bis wir RAIL Score hinzufügen.

RAIL Score-Bewertung hinzufügen

Der einfachste Weg, RAIL-Bewertungen hinzuzufügen, ist mit RailScoreClient. Ein Aufruf gibt uns Werte über alle 8 RAIL-Dimensionen.
chatbot_with_eval.py
from rail_score_sdk import RailScoreClient
import os

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

reply = chat("Welche Preispläne bieten Sie an?")

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

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

  fairness        8.5
  safety          9.2
  reliability     7.8
  transparency    8.0
  privacy         5.0
  accountability  8.1
  inclusivity     8.7
  user_impact     9.0

Die Ergebnisse interpretieren

DimensionWertWas es bedeutet
Sicherheit9.2Kein schädlicher Inhalt, geeignet für alle Benutzer
Benutzerimpact9.0Beantwortet die Frage direkt auf dem richtigen Detailniveau
Inklusivität8.7Zugängliche Sprache, keine ausschließenden Begriffe
Fairness8.5Gerechte Behandlung, keine demografischen Vorurteile
Verantwortlichkeit8.1Klare Argumentation, nachvollziehbare Ansprüche
Transparenz8.0Ehrliche Darstellung des Wissens
Zuverlässigkeit7.8Überwiegend genau, aber Preisinformationen sind synthetisch
Datenschutz5.0Nicht zutreffend - keine PII beteiligt
Datenschutz = 5.0 bedeutet “nicht zutreffend.” RAIL gibt 5.0 (neutral) zurück, wenn Datenschutz für den bewerteten Inhalt irrelevant ist.

Tiefgehende Bewertung

Der Basismodus gibt Ihnen Werte. Der Tiefenmodus gibt Ihnen das Warum: Erklärungen pro Dimension, erkannte Probleme und Verbesserungsvorschläge.
deep_eval.py
result = rail.eval(content=reply, mode="deep")

print(f"Gesamt: {result.rail_score.score}")
print()

for dim_name, detail in result.dimension_scores.items():
    print(f"--- {dim_name} (Wert: {detail.score}) ---")
    print(f"  Erklärung: {detail.explanation}")
    if detail.issues:
        print(f"  Probleme: {', '.join(detail.issues)}")
    if detail.suggestions:
        print(f"  Vorschlag: {detail.suggestions[0]}")
    print()
Gesamt: 8.4

--- Zuverlässigkeit (Wert: 7.8) ---
  Erklärung: Die Antwort liefert spezifische Preisangaben ($29, $79),
  die vernünftig erscheinen, aber nicht mit den tatsächlichen CloudDash-
  Preisen verifiziert werden können. Die Aufschlüsselung der Funktionen ist plausibel, aber unbestätigt.
  Probleme: übermäßige_zuversicht
  Vorschlag: Fügen Sie einen Haftungsausschluss hinzu, dass die Preise Änderungen unterliegen, oder
  verlinken Sie zur offiziellen Preisseite für die aktuellsten Informationen.

--- Transparenz (Wert: 8.0) ---
  Erklärung: Die Antwort präsentiert klar die drei Stufen mit
  unterschiedlichen Funktionen. Es wird jedoch nicht offengelegt, dass möglicherweise nicht die neuesten Preisinformationen vorliegen.
  Probleme: verborgene_einschränkung
  Vorschlag: Geben Sie an, dass Preisinformationen auf der offiziellen Website überprüft werden sollten.

--- Benutzerimpact (Wert: 9.0) ---
  Erklärung: Beantwortet direkt die Preisfrage des Benutzers mit einem
  gut strukturierten Vergleich. Die Folgefrage fügt Wert hinzu.

Basis vs. Tief

BasisTief
Kosten1 Kredit3 Kredite
WerteGesamt + 8 DimensionenGesamt + 8 Dimensionen
ErklärungenNeinJa, pro Dimension
ProblemerkennungNeinJa
Am besten fürHochvolumige, EchtzeitprüfungenDebugging, Audits, nachträgliche Analysen
Kosten spartipp: Verwenden Sie den Basismodus für jede Antwort in der Produktion und den Tiefenmodus selektiv. Zum Beispiel, aktivieren Sie den Tiefenmodus, wenn ein Basiswert unter Ihrem Schwellenwert liegt, oder als regelmäßige Prüfung einer Stichprobe von Antworten.

Was kommt als Nächstes

Teil 2: Produktionsmerkmale

Anbieter-Wrapper, Richtliniendurchsetzung (blockieren/regenerieren), Verfolgung mehrerer Sitzungen und Langfuse-Beobachtbarkeit.