Agent Frameworks

Créer des workflows IA déterministes avec Temporal et des orchestrateurs d'agents personnalisés

L'évolution rapide des grands modèles de langage (LLM) a transformé le paradigme du développement logiciel, passant de la logique déterministe au raisonnement probabiliste. Bien que les LLM soient incroyables pour générer du contenu, comprendre le contexte et résoudre des problèmes de manière créative, ils sont intrinsèquement non déterministes. Cette nature probabiliste introduit des défis majeurs lors de l'intégration de l'IA dans des processus métier critiques, tels que les transactions financières, les diagnostics de santé ou la logistique complexe de la chaîne d'approvisionnement.

Pour combler l'écart entre la créativité de l'IA et la fiabilité des entreprises, nous avons besoin d'une couche d'orchestration robuste qui garantit la cohérence, la tolérance aux pannes et l'observabilité. C'est ici qu'intervient Temporal. En combinant le moteur d'exécution durable de Temporal avec des orchestrateurs d'agents personnalisés, les développeurs peuvent créer des workflows IA qui sont non seulement intelligents, mais aussi strictement déterministes dans leur flux de contrôle.

Le défi du non-déterminisme dans les systèmes IA

Dans les logiciels traditionnels, si vous exécutez le même code deux fois avec les mêmes entrées, vous vous attendez à obtenir les mêmes sorties. Les LLM violent ce principe. Même avec une température nulle, de légères variations matérielles ou des mises à jour du modèle peuvent entraîner des résultats divergents. Lorsque vous enchaînez plusieurs appels LLM dans un workflow d'agent complexe, ces petites déviations s'accumulent, conduisant à des états finaux imprévisibles.

De plus, les agents IA nécessitent souvent des vérifications d'état externes, des mises à jour de base de données ou des appels API entre les étapes de raisonnement des LLM. Si un délai d'attente réseau se produit après qu'un LLM a généré une réponse mais avant que le résultat ne soit persisté, un microservice standard pourrait échouer de manière incohérente. Dans un workflow IA, cela peut entraîner des actions dupliquées, des états orphelins ou des boucles de retry infinies.

Pourquoi Temporal pour l'orchestration d'agents ?

Temporal est une plateforme d'exécution asynchrone conçue pour créer des applications évolutives et résilientes. Contrairement aux frameworks serverless traditionnels, Temporal offre une Exécution Durable. Cela signifie que l'état de votre workflow est automatiquement persisté. Si un processus plante ou si l'infrastructure réduit sa mise à l'échelle, Temporal reprend le workflow exactement là où il s'est arrêté, garantissant qu'aucune étape n'est perdue et qu'aucune étape n'est dupliquée.

Pour les agents IA, cela se traduit par :

  • Sémantique Exécutez-une-fois-seulement : Garantir qu'un appel API critique déclenché par un agent est exécuté une seule fois, même si le nœud worker échoue.
  • Processus à long terme : Les agents IA impliquent souvent des étapes avec intervention humaine ou des approbations externes qui peuvent prendre des heures ou des jours. Temporal gère efficacement ces workflows à long terme sans consommer de ressources serveur en attendant.
  • Observabilité : Chaque étape du processus de prise de décision de votre agent est enregistrée et traçable, fournissant l'auditabilité requise pour les environnements de production.

Mise en œuvre d'un workflow d'agent déterministe

Examinons un exemple pratique. Imaginez un agent de support client qui doit vérifier le statut de la commande d'un utilisateur, déterminer s'il est éligible à un remboursement selon la politique, puis exécuter le remboursement si approuvé. Nous utiliserons le SDK Python pour Temporal pour structurer cette logique.

from temporalio.worker import Worker
from temporalio import workflow, activity
import openai

# Définir les activités
@activity.defn
async def check_order_status(order_id: str) -> dict:
    # Logique pour récupérer la commande depuis la base de données
    return {"status": "delivered", "eligible_for_refund": True}

@activity.defn
async def generate_refusal_reason(context: dict) -> str:
    # Appel LLM pour expliquer pourquoi un remboursement pourrait être refusé
    return "Votre commande ne répond pas aux critères."

@activity.defn
async def execute_refund(order_id: str, amount: float):
    # Logique réelle de traitement des paiements
    print(f"Remboursement de ${amount} pour la commande {order_id}")

# Définir le Workflow
@workflow.defn
class SupportAgentWorkflow:
    @workflow.run
    async def run(self, order_id: str) -> dict:
        # Étape 1 : Vérification déterministe
        order_data = await workflow.execute_activity(
            check_order_status,
            order_id,
            start_to_close_timeout=timedelta(seconds=10)
        )
        
        if order_data["eligible_for_refund"]:
            # Étape 2 : Logique redémarrable pour le LLM
            try:
                reason = await workflow.execute_activity(
                    generate_refusal_reason,
                    order_data,
                    start_to_close_timeout=timedelta(seconds=30)
                )
            except Exception as e:
                # Gérer la dégradation du service LLM avec élégance
                return {"outcome": "error", "message": "Service IA indisponible"}
            
            # Étape 3 : Opération financière critique
            await workflow.execute_activity(
                execute_refund,
                order_id,
                50.00,
                start_to_close_timeout=timedelta(seconds=30)
            )
            return {"outcome": "success", "refund_amount": 50.00}
            
        return {"outcome": "denied", "reason": "Non éligible"}

Meilleures pratiques pour la production

Lors de la construction de ces systèmes, séparez toujours la logique de décision (qui doit être déterministe et gérée par Temporal) de la logique de génération (gérée par le LLM). Utilisez Temporal pour gérer les transitions d'état, tout en laissant le LLM agir comme un outil puissant au sein d'une activité. De plus, définissez toujours des délais d'attente et des politiques de retry pour vos activités afin de gérer la latence inhérente et les échecs occasionnels des points de terminaison d'inférence IA.

Conclusion

L'avenir des applications IA ne réside pas dans le remplacement des systèmes déterministes, mais dans leur augmentation. En utilisant Temporal comme colonne vertébrale de vos orchestrateurs d'agents, vous pouvez créer des systèmes qui sont à la fois intelligents et fiables. Cette approche permet aux développeurs de dépasser les notebooks expérimentaux et de déployer des solutions IA qui répondent aux exigences rigoureuses des environnements de production d'entreprise.

Share: