Maison > développement back-end > Tutoriel Python > Machines à états LangGraph : gestion des flux de tâches d'agent complexes en production

Machines à états LangGraph : gestion des flux de tâches d'agent complexes en production

Barbara Streisand
Libérer: 2024-11-24 03:37:09
original
1101 Les gens l'ont consulté

LangGraph State Machines: Managing Complex Agent Task Flows in Production

Qu’est-ce que LangGraph ?

LangGraph est un framework d'orchestration de flux de travail conçu spécifiquement pour les applications LLM. Ses principes fondamentaux sont :

  • Diviser les tâches complexes en états et transitions
  • Gestion de la logique de transition d'état
  • Gestion de diverses exceptions lors de l'exécution des tâches

Pensez au shopping : Parcourir → Ajouter au panier → Commander → Paiement. LangGraph nous aide à gérer efficacement ces flux de travail.

Concepts de base

1. États

Les états sont comme des points de contrôle dans l'exécution de vos tâches :

from typing import TypedDict, List

class ShoppingState(TypedDict):
    # Current state
    current_step: str
    # Cart items
    cart_items: List[str]
    # Total amount
    total_amount: float
    # User input
    user_input: str

class ShoppingGraph(StateGraph):
    def __init__(self):
        super().__init__()

        # Define states
        self.add_node("browse", self.browse_products)
        self.add_node("add_to_cart", self.add_to_cart)
        self.add_node("checkout", self.checkout)
        self.add_node("payment", self.payment)
Copier après la connexion

2. Transitions d'État

Les transitions d'état définissent la « feuille de route » de votre flux de tâches :

class ShoppingController:
    def define_transitions(self):
        # Add transition rules
        self.graph.add_edge("browse", "add_to_cart")
        self.graph.add_edge("add_to_cart", "browse")
        self.graph.add_edge("add_to_cart", "checkout")
        self.graph.add_edge("checkout", "payment")

    def should_move_to_cart(self, state: ShoppingState) -> bool:
        """Determine if we should transition to cart state"""
        return "add to cart" in state["user_input"].lower()
Copier après la connexion

3. Persistance de l'État

Pour garantir la fiabilité du système, nous devons conserver les informations d'état :

class StateManager:
    def __init__(self):
        self.redis_client = redis.Redis()

    def save_state(self, session_id: str, state: dict):
        """Save state to Redis"""
        self.redis_client.set(
            f"shopping_state:{session_id}",
            json.dumps(state),
            ex=3600  # 1 hour expiration
        )

    def load_state(self, session_id: str) -> dict:
        """Load state from Redis"""
        state_data = self.redis_client.get(f"shopping_state:{session_id}")
        return json.loads(state_data) if state_data else None
Copier après la connexion

4. Mécanisme de récupération des erreurs

Toute étape peut échouer, et nous devons gérer ces situations avec élégance :

class ErrorHandler:
    def __init__(self):
        self.max_retries = 3

    async def with_retry(self, func, state: dict):
        """Function execution with retry mechanism"""
        retries = 0
        while retries < self.max_retries:
            try:
                return await func(state)
            except Exception as e:
                retries += 1
                if retries == self.max_retries:
                    return self.handle_final_error(e, state)
                await self.handle_retry(e, state, retries)

    def handle_final_error(self, error, state: dict):
        """Handle final error"""
        # Save error state
        state["error"] = str(error)
        # Rollback to last stable state
        return self.rollback_to_last_stable_state(state)
Copier après la connexion

Exemple concret : système de service client intelligent

Regardons un exemple pratique : un système de service client intelligent :

from langgraph.graph import StateGraph, State

class CustomerServiceState(TypedDict):
    conversation_history: List[str]
    current_intent: str
    user_info: dict
    resolved: bool

class CustomerServiceGraph(StateGraph):
    def __init__(self):
        super().__init__()

        # Initialize states
        self.add_node("greeting", self.greet_customer)
        self.add_node("understand_intent", self.analyze_intent)
        self.add_node("handle_query", self.process_query)
        self.add_node("confirm_resolution", self.check_resolution)

    async def greet_customer(self, state: State):
        """Greet customer"""
        response = await self.llm.generate(
            prompt=f"""
            Conversation history: {state['conversation_history']}
            Task: Generate appropriate greeting
            Requirements:
            1. Maintain professional friendliness
            2. Acknowledge returning customers
            3. Ask how to help
            """
        )
        state['conversation_history'].append(f"Assistant: {response}")
        return state

    async def analyze_intent(self, state: State):
        """Understand user intent"""
        response = await self.llm.generate(
            prompt=f"""
            Conversation history: {state['conversation_history']}
            Task: Analyze user intent
            Output format:
            {{
                "intent": "refund/inquiry/complaint/other",
                "confidence": 0.95,
                "details": "specific description"
            }}
            """
        )
        state['current_intent'] = json.loads(response)
        return state
Copier après la connexion

Usage

# Initialize system
graph = CustomerServiceGraph()
state_manager = StateManager()
error_handler = ErrorHandler()

async def handle_customer_query(user_id: str, message: str):
    # Load or create state
    state = state_manager.load_state(user_id) or {
        "conversation_history": [],
        "current_intent": None,
        "user_info": {},
        "resolved": False
    }

    # Add user message
    state["conversation_history"].append(f"User: {message}")

    # Execute state machine flow
    try:
        result = await graph.run(state)
        # Save state
        state_manager.save_state(user_id, result)
        return result["conversation_history"][-1]
    except Exception as e:
        return await error_handler.with_retry(
            graph.run,
            state
        )
Copier après la connexion

Meilleures pratiques

  1. Principes de conception de l'État

    • Gardez les états simples et clairs
    • Stocker uniquement les informations nécessaires
    • Considérez les exigences de sérialisation
  2. Optimisation de la logique de transition

    • Utiliser des transitions conditionnelles
    • Évitez les boucles infinies
    • Définir des limites maximales de pas
  3. Stratégie de gestion des erreurs

    • Mettre en œuvre une dégradation gracieuse
    • Enregistrer les informations détaillées
    • Fournir des mécanismes de restauration
  4. Optimisation des performances

    • Utiliser des opérations asynchrones
    • Implémenter la mise en cache de l'état
    • Taille de l'état de contrôle

Pièges courants et solutions

  1. Explosion d'État

    • Problème : Trop d'états rendant la maintenance difficile
    • Solution : fusionner les états similaires, utiliser des combinaisons d'états au lieu d'en créer de nouvelles
  2. Situations d'impasse

    • Problème : transitions d'état circulaires provoquant le blocage des tâches
    • Solution : Ajouter des mécanismes de délai d'attente et des conditions de sortie forcée
  3. Cohérence de l'État

    • Problème : États incohérents dans les environnements distribués
    • Solution : utilisez des verrous distribués et des mécanismes de transaction

Résumé

Les machines à états LangGraph fournissent une solution puissante pour gérer les flux de tâches complexes des agents IA :

  • Gestion claire du flux de tâches
  • Persistance fiable de l'état
  • Gestion complète des erreurs
  • Extensibilité flexible

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal