Zum Hauptinhalt springen
← Blog

Wie die Deutsche Bahn mit maßgeschneiderten KI-Integrationsszenarien für mobile Apps die Echtzeit-Fahrgastkommunikation löst

Die Deutsche Bahn investiert 50 Millionen Euro in die Modernisierung ihrer Kundenkommunikation, um Latenzzeiten bei Fahrgastinformationen auf unter zwei Sekunden zu senken. Das Vorhaben setzt auf eine event-gesteuerte Push-Architektur mittels Server-Sent Events und die Integration des KI-Assistenten „Kiana“ auf RAG-Basis. Für Unternehmen bietet diese Initiative wertvolle technische Leitlinien zur erfolgreichen Einbindung von Large Language Models in geschäftskritische mobile Anwendungen. Eine strategische Partnerschaft mit spezialisierten Dienstleistern hilft dabei, die damit verbundenen Herausforderungen bei Kosten, Latenz und Infrastruktur effizient zu bewältigen.

Wie die Deutsche Bahn mit maßgeschneiderten KI-Integrationsszenarien für mobile Apps die Echtzeit-Fahrgastkommunikation löst

Auf einem eiskalten Bahnsteig zu warten und auf eine veraltete Anzeigetafel zu starren, die behauptet, der Zug sei pünktlich, während das eigene Smartphone eine Verspätung von 20 Minuten meldet, führt direkt zu Frustration bei den Fahrgästen. Im öffentlichen Personenverkehr sowie in der Logistik und im Supply Chain Management ist eine verzögerte Informationsbereitstellung nicht nur ein Ärgernis – sie untergräbt das Vertrauen in die Marke und beeinträchtigt die betriebliche Effizienz erheblich. Wenn Verkehrssysteme Störungen nicht in Echtzeit kommunizieren können, verpassen Fahrgäste ihre Anschlüsse, Bahnhöfe überfüllen sich und die Kundenserviceteams stoßen an ihre Belastungsgrenzen.

Diese Kommunikationslücke zu schließen, erfordert mehr als nur ein aktualisiertes UI-Design. Es verlangt eine grundlegende Überarbeitung der Event-Distribution im Backend sowie moderner Architekturen für die Echtzeitkommunikation. Die Deutsche Bahn (DB) hat kürzlich eine umfassende Initiative angekündigt, um dieses Problem direkt anzugehen: Bis Ende 2027 werden 50 Millionen Euro in die Modernisierung der Systeme zur Kundenkommunikation investiert. Das Programm kombiniert das Ziel von Datenbankaktualisierungen im Subsekundenbereich mit einer neuen, anbieterneutralen App namens „DB Info“ und der Integration eines maßgeschneiderten, konversationellen KI-Assistenten namens „Kiana“.

Diese Initiative bietet ein hervorragendes Praxisbeispiel für Unternehmen, die KI-Integrationsszenarien für eigene mobile Apps evaluieren. In diesem Artikel analysieren wir die technischen Herausforderungen der Echtzeit-Fahrgastkommunikation, zeigen, wie sich LLMs ohne Performance-Verluste oder Fehler in produktive mobile Applikationen integrieren lassen, und erläutern die Architekturprinzipien, die für die Skalierung solcher Systeme erforderlich sind.

Die 50-Millionen-Euro-Initiative der Deutschen Bahn: Die geschäftliche und technische Realität

Im Zentrum des Modernisierungsprogramms der Deutschen Bahn steht ein einfaches, aber anspruchsvolles Ziel: die Latenzzeit bei Fahrgastinformationen von Minuten auf Sekunden zu senken. Wenn ein Fahrdienstleiter heute eine Gleisänderung oder eine Verspätung erfasst, kann es eine Minute oder länger dauern, bis sich diese Änderung durch die Legacy-Datenbankstrukturen fortpflanzt und in der mobilen App des Fahrgasts angezeigt wird. Im Rahmen der neuen Initiative will die DB Benachrichtigungen über Gleiswechsel innerhalb von zwei Sekunden direkt per Push-Meldung auf die Endgeräte der Nutzer übertragen.

Zudem weitet die DB den Rollout von „Kiana“ aus, einem KI-Assistenten, der bereits am Flughafen Berlin Brandenburg getestet wurde. Bis Ende 2026 soll Kiana direkt in die App DB Navigator und auf der Website bahn.de integriert werden. Dieser Chatbot ist darauf ausgelegt, Anfragen in über 100 Sprachen per Text und Audio zu beantworten, um Nutzern bei Verspätungen, Alternativverbindungen und Ticketing-Fragen zu helfen. Perspektivisch soll Kiana auch die direkte Ticketbuchung per Sprach- und Texteingabe unterstützen.

Die dritte Säule dieser Initiative bildet „DB Info“, eine neue Applikation, deren Veröffentlichung für Dezember 2026 geplant ist. Im Gegensatz zum DB Navigator, der stark auf die Züge der Deutschen Bahn fokussiert ist, soll DB Info anbieterneutral agieren. Die App wird Echtzeit-Reiseketten über mehrere Verkehrsträger hinweg aggregieren (einschließlich direkter Wettbewerber wie Flixtrain) und Nutzer erst für den eigentlichen Ticketkauf auf die Plattform des jeweiligen Anbieters weiterleiten. Dies markiert einen strategischen Wandel hin zu einem umfassenden Mobilitätsaggregator, der das Vertrauen in Datenqualität über einen Vendor-Lock-in stellt.

Das Echtzeit-Dilemma: Push-Updates in unter zwei Sekunden

Für Entwickler ist die Reduzierung der Update-Latenz von 60 Sekunden auf unter zwei Sekunden bei Millionen von gleichzeitigen Nutzern eine anspruchsvolle technische Aufgabe. Die Latenzzeiten in Legacy-Unternehmensanwendungen resultieren meist aus zwei zentralen Engpässen:

  1. Pull-basiertes Polling: Ältere Apps fragen HTTP-API-Endpunkte oft in festen Intervallen (z. B. alle 60 oder 120 Sekunden) ab, um nach Updates zu suchen. Dieses Polling ist zwar einfach zu implementieren, aber äußerst ineffizient. Wenn eine Gleisänderung eine Sekunde nach der letzten Abfrage erfolgt, sieht der Nutzer sie erst 59 Sekunden später.
  2. Synchronisation relationaler Datenbanken: Große Unternehmen verlassen sich häufig auf komplexe transaktionale Datenbanken (wie Oracle oder DB2) mit verschachtelten Schema-Beziehungen. Verzögerungen entstehen, wenn Änderungen über verteilte Datenbanken, regionale Mainframes und Read-Replicas hinweg synchronisiert werden müssen.

Um ein Service Level Agreement (SLA) von zwei Sekunden einzuhalten, müssen Entwickler auf eine event-gesteuerte Push-Architektur umstellen.

graph TD
    A[Track Sensors / Dispatchers] -->|Raw Event| B[Message Broker: Apache Kafka]
    B -->|Ingest Stream| C[Real-Time Processing Engine]
    C -->|Update| D[In-Memory Cache: Redis]
    C -->|Push Event| E[WebSocket / SSE Gateway]
    E -->|Push Update < 2s| F[Custom Mobile App]

Der Wechsel zu Push-Verfahren: WebSockets vs. Server-Sent Events (SSE)

Anstatt den Client zu zwingen, den Server kontinuierlich nach Updates abzufragen, muss der Server Aktualisierungen im selben Moment an den Client senden, in dem sie auftreten. Dies wird entweder über WebSockets oder Server-Sent Events (SSE) realisiert:

  • WebSockets bieten einen vollduplex-fähigen, bidirektionalen Kommunikationskanal über eine einzige TCP-Verbindung. Dies eignet sich hervorragend für hochgradig interaktive Anwendungen (wie Multiplayer-Spiele oder Kollaborations-Tools), verursacht jedoch Mehraufwand bei der Verbindungsverwaltung und dem Durchqueren von Firewalls.
  • Server-Sent Events (SSE) stellen einen unidirektionalen Kanal vom Server zum Client über Standard-HTTP/1.1 or HTTP/2 bereit. Da mobile Fahrgast-Apps primär Daten vom Server empfangen müssen (anstatt kontinuierlich hochfrequente Telemetriedaten zurückzusenden), ist SSE oft die effizientere und ressourcenschonendere Wahl. Es unterstützt nativ automatische Wiederverbindungen, funktioniert über Standard-HTTP und sorgt für einen geringeren Akkuverbrauch auf mobilen Endgeräten.

Message Broker und Cache-Invalidierung

Hinter dem Gateway muss das Backend Änderungen in Echtzeit verarbeiten. Dies erfordert einen Message Broker wie Apache Kafka oder RabbitMQ, um Statusänderungen von Fahrdienstleitern und Gleissensoren aufzunehmen. Ein Echtzeit-Prozessor verarbeitet diese Events, aktualisiert einen In-Memory-Datenspeicher (wie Redis oder KeyDB) für schnellen Lesezugriff und leitet das Event an das aktive Connection-Gateway weiter. Durch die Umgehung schwerfälliger relationaler Schreibvorgänge bei leselastigen Operationen kann das System Gleis-Updates in Millisekunden an Millionen aktiver Verbindungen verteilen.

KI-Integrationsszenarien für mobile Apps: Architektur-Blueprint für Kiana

Die Integration eines konversationsbasierten KI-Assistenten wie Kiana in eine Transit-Anwendung auf Enterprise-Niveau erfordert die Lösung eines grundlegenden Konflikts: Large Language Models (LLMs) sind erfahrungsgemäß langsam, kostenintensiv und anfällig für Halluzinationen, während Fahrgastinformationen schnell, kosteneffizient und absolut präzise sein müssen.

Wenn ein Fahrgast fragt: „Hat mein Anschlusszug nach München Verspätung?“, darf die KI nicht mit einer generischen, veralteten oder halluzinierten Antwort reagieren. Sie muss sofort auf Live-Daten zugreifen. Dies erfordert eine robuste RAG-Architektur (Retrieval-Augmented Generation).

RAG-Design für hochdynamische Daten

Klassische RAG-Systeme fragen Vektordatenbanken ab, die mit statischen Dokumenten-Embeddings (wie FAQs) gefüllt sind. In Verkehrssystemen ändern sich die Daten jedoch sekündlich. Der KI-Assistent muss strukturierte API-Tools nutzen, um aktuelle Tabellen abzurufen, anstatt statische Vektorindizes zu durchsuchen.

Wenn ein Nutzer eine Anfrage stellt:

  1. Intent-Klassifizierung: Ein leichtgewichtiges, schnelles LLM analysiert die Anfrage des Nutzers, um dessen Absicht (Intent) zu bestimmen (z. B. Verspätungen prüfen, Umbuchungen vornehmen, Fragen zu Bahnhofseinrichtungen stellen).
  2. Tool-Auswahl (Function Calling): Erfordert der Intent Echtzeitdaten, gibt das Modell ein strukturiertes JSON-Payload aus, das den Zielzug und den Bahnhof identifiziert.
  3. Datenbank-Abruf: Der Applikationsserver fängt diesen Tool-Aufruf ab, fragt den Echtzeit-Cache (Redis) ab und ruft den aktuellen Status des Zuges ab.
  4. Context Injection: Der Server formatiert die Echtzeitdaten in einen Klartext-Kontextblock und sendet diesen zurück an das LLM.
  5. Deterministische Generierung: Das LLM formuliert die Antwort in natürlicher Sprache ausschließlich auf Basis des bereitgestellten Kontexts. Fehlen die benötigten Daten, weicht das Modell auf eine standardmäßige Datenbankabfrage-Benutzeroberfläche aus.

Wenn Sie planen, Ihr digitales Angebot global auszuweiten, ist der Aufbau eines mehrsprachigen Supports von Tag eins an entscheidend. Wie wir bereits beleuchtet haben, als ProjectMakers mit einer neuen Website und einem neuen Blog international an den Start ging, ist die Lokalisierung von Technologieplattformen ein komplexer, aber notwendiger Schritt, um Enterprise-Anwendungen für ein internationales Publikum zu skalieren. Um die Sprache und den Text der Nutzer für Kiana in über 100 Sprachen zu übersetzen, ist ein robuster Translation-Layer oder mehrsprachige Embeddings erforderlich, die sicherstellen, dass die semantische Kernabsicht vor der Verarbeitung der Anfrage präzise erfasst wird.

Praxisbeispiel: Entwicklung eines echtzeitfähigen, KI-gestützten Transit-Warnsystems

Um zu verstehen, wie ein solches System aufgebaut ist, gehen wir ein vollständiges, lauffähiges Python-Backend unter Verwendung von FastAPI durch. Dieses Beispiel implementiert zwei kritische Aspekte unserer Diskussion:

  1. Einen SSE-Endpunkt (Server-Sent Events), der Echtzeit-Zug-Updates an eine mobile App streamt.
  2. Einen KI-Assistenten-Endpunkt, der AsyncOpenAI, RAG-Context-Injection und restriktive System-Prompts nutzt, um Fahrgastfragen präzise zu beantworten.

Unten finden Sie die Implementierung:

import asyncio
import json
import logging
from typing import AsyncGenerator
from fastapi import FastAPI, HTTPException
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from openai import AsyncOpenAI

app = FastAPI(title="Real-Time Passenger Info API")

# Initialize async OpenAI client
# In production, ensure OPENAI_API_KEY is set in your environment variables
client = AsyncOpenAI()

# Setup logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Sample in-memory database for trains and schedules
TRAIN_DATABASE = {
    "ICE_782": {
        "status": "Delayed",
        "delay_minutes": 15,
        "original_platform": "4",
        "current_platform": "6",
        "reason": "Signal failure near Hannover",
        "route": "Munich to Hamburg"
    }
}

class QuestionRequest(BaseModel):
    train_id: str
    user_query: str

async def get_db_status_context(train_id: str) -> str:
    """Helper to fetch current train status for LLM context."""
    train = TRAIN_DATABASE.get(train_id)
    if not train:
        return f"Train {train_id} not found."
    return (
        f"Train {train_id} is running from {train['route']}. "
        f"Current status: {train['status']}. Delay: {train['delay_minutes']} minutes. "
        f"Original Platform: {train['original_platform']}, Scheduled Platform: {train['current_platform']}. "
        f"Reason: {train['reason']}."
    )

@app.get("/api/v1/stream/updates/{train_id}")
async def stream_train_updates(train_id: str):
    """
    Server-Sent Events (SSE) endpoint to push real-time train updates
    to the custom mobile app within seconds.
    """
    if train_id not in TRAIN_DATABASE:
        raise HTTPException(status_code=404, detail="Train not found")

    async def event_generator() -> AsyncGenerator[str, None]:
        logger.info(f"Client connected to real-time stream for train {train_id}")
        last_platform = None
        last_delay = None
        
        try:
            # Simulate real-time monitoring loop
            while True:
                train = TRAIN_DATABASE.get(train_id)
                if not train:
                    break
                
                # Check for changes in key attributes
                changed = (train['current_platform'] != last_platform) or (train['delay_minutes'] != last_delay)
                
                if changed:
                    last_platform = train['current_platform']
                    last_delay = train['delay_minutes']
                    
                    payload = {
                        "event": "train_update",
                        "train_id": train_id,
                        "data": {
                            "status": train["status"],
                            "delay_minutes": train["delay_minutes"],
                            "current_platform": train["current_platform"],
                            "reason": train["reason"]
                        }
                    }
                    yield f"data: {json.dumps(payload)}\n\n"
                    
                # Poll database/message queue every 1 second
                await asyncio.sleep(1)
        except asyncio.CancelledError:
            logger.info(f"Client disconnected from stream for train {train_id}")
        except Exception as e:
            logger.error(f"Stream error: {str(e)}")

    return StreamingResponse(event_generator(), media_type="text/event-stream")

@app.post("/api/v1/passenger/ask")
async def ask_passenger_assistant(request: QuestionRequest):
    """
    AI integration endpoint that combines real-time transit context
    with a natural language conversational agent.
    """
    context = await get_db_status_context(request.train_id)
    
    system_prompt = (
        "You are 'Kiana', a helpful, concise passenger assistant for Deutsche Bahn. "
        "Use ONLY the following real-time transit context to answer the passenger's question. "
        "If the answer is not in the context, politely state you do not have that information. "
        "Keep answers under 3 sentences. Be extremely factual.\n"
        f"Transit Context: {context}"
    )

    try: 
        response = await client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": request.user_query}
            ],
            temperature=0.0, # Zero temperature to minimize hallucinations
            max_tokens=150
        )
        return {
            "answer": response.choices[0].message.content,
            "used_context": context
        }
    except Exception as e:
        logger.error(f"LLM API error: {str(e)}")
        raise HTTPException(status_code=500, detail="Failed to retrieve AI assistant response")

Technische Analyse des Codes

  • FastAPI StreamingResponse: Der Endpunkt /api/v1/stream/updates/{train_id} nutzt Server-Sent Events über eine StreamingResponse. Der Client hält eine einzelne HTTP-Verbindung aufrecht, und der Server gibt Events im Format data: {...}\n\n aus, sobald Änderungen in der Datenbank auftreten. Dieses Pattern stellt sicher, dass Benachrichtigungen über Gleisänderungen den Client in Millisekunden und ganz ohne Polling erreichen.
  • Context Injection zur Vermeidung von Halluzinationen: In /api/v1/passenger/ask rufen wir zunächst den rohen Transit-Status aus der TRAIN_DATABASE ab. Dem LLM wird dieser strukturierte Kontext sowie ein strikter System-Prompt übergeben, der es anweist, ausschließlich diese Daten zu verwenden.
  • Zero-Temperature-Konfiguration: Durch das Setzen von temperature=0.0 zwingen wir das LLM, die mathematisch wahrscheinlichsten Tokens auszuwählen, was die Ausgabe hochgradig deterministisch macht und das Risiko von Halluzinationen minimiert.

Kosten, Rahmenbedingungen und Einschränkungen: Die Realität von Enterprise-KI

Obwohl die Integration von KI-Agenten in maßgeschneiderte mobile Apps klare Vorteile bietet, müssen Entscheidungsträger die realen Kosten und Grenzen evaluieren, bevor sie diese Features einführen.

1. API-Token- und Infrastrukturkosten

LLM-Anfragen werden pro Token abgerechnet. Für ein Unternehmen wie die Deutsche Bahn, die täglich Millionen von Fahrgästen befördert, können die LLM-Kosten schnell eskalieren.

  • Nehmen wir an, es gibt täglich 500.000 Fahrgastanfragen.
  • Wenn jede Anfrage im Schnitt 400 Input-Token (einschließlich System-Prompts und RAG-Kontext) und 100 Output-Token umfasst, beläuft sich das tägliche Volumen auf 200 Millionen Input-Token und 50 Millionen Output-Token.
  • Bei Nutzung eines Modells wie gpt-4o-mini (mit Kosten von etwa 0,150 USD pro Million Input-Token und 0,600 USD pro Million Output-Token) liegen die Kosten bei circa 60 USD pro Tag.
  • Wechseln Sie jedoch für komplexere logische Verknüpfungen zu einem größeren Modell wie gpt-4o oder claude-3-5-sonnet und steigen die Preise auf 3,00 USD pro Million Input-Token und 15,00 USD pro Million Output-Token. Dadurch steigen die täglichen Kosten auf über 1.350 USD (ca. 492.000 USD jährlich).
  • Abmilderung: Implementieren Sie ein striktes semantisches Caching. Wenn ein Nutzer exakt dieselbe Frage stellt wie 1.000 andere Fahrgäste („Hat ICE 782 Verspätung?“), sollte die App eine gecachte LLM-Antwort oder eine deterministische UI-Komponente ausgeben, anstatt die LLM-API erneut aufzurufen.

2. Das Latenzbudget

Large Language Models weisen eine physische Verarbeitungszeit auf. Die Generierung einer vollständigen Antwort dauert in der Regel zwischen 1,0 und 3,0 Sekunden, abhängig von der Token-Länge und der Serverlast. In einer mobilen App wirkt jedoch jede Interaktion, die das UI für mehr als 300 Millisekunden blockiert, träge.

  • Abmilderung: Streamen Sie die Antworten grundsätzlich. Zeigen Sie den Text Token für Token an, anstatt auf die Generierung der vollständigen Antwort zu warten. Halten Sie zudem kritische Aktionen (wie die Buchung von Tickets oder das Einsehen von Fahrplänen) strikt nativ und datenbankgestützt. Die KI sollte als Assistenten-Overlay fungieren, nicht als primärer UI-Mechanismus.

3. Rate Limits und Hochverfügbarkeit

Cloudbasierte KI-Anbieter setzen strikte Rate Limits durch (Requests per Minute und Tokens per Minute). Bei größeren Störungen (z. B. durch Unwetter oder Streiks) steigt das Datenaufkommen exponentiell an. Eine standardmäßige Cloud-API stößt sofort an ihre Rate Limits, sodass Fahrgäste ohne Antworten dastehen.

  • Abmilderung: Bauen Sie eine Multi-Modell-Redundanz auf. Ihr Backend sollte automatisch ein Failover zwischen OpenAI, Anthropic und selbst gehosteten Modellen auf privaten GPU-Clustern (mithilfe von Software wie vLLM oder Triton Inference Server) durchführen.

Praxiserprobte Best Practices für die KI-Integration in Enterprise-Apps

Wenn Sie eine eigene mobile App mit Echtzeit-Updates und KI-Integrationen entwickeln, sollten Sie diese vier praxiserprobten Prinzipien befolgen:

  1. Nutzen Sie Push-Architekturen für Echtzeit-Status: Verlassen Sie sich bei zeitkritischen Daten niemals auf HTTP-Polling. Verwenden Sie Server-Sent Events (SSE) für unidirektionale Update-Streams und WebSockets für bidirektionale Interaktionen. Halten Sie die Connection-Gateways schlank und trennen Sie diese von Ihren primären Transaktionsservern.
  2. Lassen Sie das LLM niemals Echtzeitdaten schätzen: Rufen Sie strukturierte Daten immer zuerst aus Ihrer Datenbank oder Ihrem Cache ab und fügen Sie diese dann in den Prompt-Kontext ein. Setzen Sie die Temperature Ihres Modells auf 0.0 und weisen Sie das System explizit an, mit „Ich weiß es nicht“ zu antworten, wenn der Kontext keine passende Information enthält.
  3. Streamen Sie KI-Antworten, um die gefühlte Latenz zu minimieren: Nutzen Sie WebSocket- oder HTTP-Streaming, um KI-Generate dynamisch anzuzeigen. Verwenden Sie Platzhalter-Skeletons und Micro-Animations, um die Nutzer während der ersten Token-Generierung zu beschäftigen.
  4. Implementieren Sie semantisches Caching am Gateway: Nutzen Sie einen In-Memory-Cache (wie Redis), um Benutzeranfragen zu hashen. Wenn ein Fahrgast eine Frage stellt, die innerhalb eines bestimmten Zeitfensters einer bereits gecachten Anfrage entspricht, geben Sie die Antwort sofort aus dem Cache zurück, um Token-Kosten zu sparen und die API-Last zu senken.

So setzen Sie Ihre KI- und App-Modernisierungsstrategie erfolgreich um

Der Übergang von einer Legacy-Infrastruktur zu einer modernen, echtzeitfähigen und KI-integrierten mobilen Anwendung ist eine erhebliche technische Hürde. Der hauseigene Aufbau solcher Echtzeitsysteme und KI-Integrationen erfordert die Rekrutierung hochspezialisierter Entwickler, die sich mit WebSockets, Kafka und LLM-Orchestrierung auskennen. Für viele mittelständische Unternehmen ist die Zusammenarbeit mit einem erfahrenen Entwicklungspartner wie ProjectMakers ein kosteneffizienterer Weg, um leistungsstarke Anwendungen zu realisieren, ohne das Risiko und die Kosten für den Aufbau eines eigenen R&D-Teams tragen zu müssen.

Durch die Partnerschaft mit einer spezialisierten Software-Agentur wie ProjectMakers umgehen Sie die anfängliche Lernkurve und erhalten produktionsreife KI- und Echtzeitsysteme in einem strukturierten, planbaren Zeitrahmen. Unsere Teams sind darauf spezialisiert, maßgeschneiderte Software und plattformübergreifende mobile Apps zu entwickeln sowie fortschrittliche KI-Pipelines nahtlos zu integrieren, die sich problemlos skalieren lassen.

Wenn Sie bereit sind, Ihre App-Infrastruktur zu modernisieren oder KI-Integrationsszenarien für eigene mobile Apps in Ihrem Unternehmen zu evaluieren, unterstützen wir Sie gerne. Planen Sie ein Software- oder KI-Projekt? Kontaktieren Sie ProjectMakers für ein kostenloses Erstgespräch.


Quelle: Deutsche Bahn: KI-Assistenz und neue App sollen Reiseinfos verbessern