Accueil / Articles

Les agents avancés ont-ils besoin de modèles spécifiques ? Une démonstration bancaire avec LangSmith

LangChain Deep Agents est théoriquement indépendant des modèles, mais en pratique sensible aux modèles. Un agent bancaire doté de cinq outils, analysé via LangSmith, montre quel modèle est utilisé pour chaque tâche.

Éditeur : REACTAPP.TOP9 min de lecture2109 mots

Sources: Beyond Simple Agents: Engineering DeepAgents for Enterprise with LangChain — 2

Une question logique qui se pose lors de la conception d’agents avec le framework Deep Agents est de savoir s’il nécessite un modèle particulier pour fonctionner correctement. La réponse honnête comporte deux aspects. Du point de vue architectural, Deep Agents ne se soucie pas du modèle que vous utilisez. En pratique, les résultats dépendent fortement du modèle choisi.

Architecturalement indépendant du modèle

Rien dans le framework ne prévoit l’utilisation d’un modèle spécifique, et le code en est la preuve. N’importe quel modèle de conversation peut être utilisé :

from langchain.chat_models import init_chat_model

# Swap any model in — the harness doesn't care
agent = create_deep_agent(
    model=init_chat_model("openai:gpt-4o"),
    tools=[...],
    system_prompt="..."
)

# Or Anthropic
agent = create_deep_agent(
    model=init_chat_model("anthropic:claude-opus-4-6"),
    tools=[...],
)

# Or Google
agent = create_deep_agent(
    model=init_chat_model("google_vertexai:gemini-2.0-flash"),
    tools=[...],
)

Outil de planification, système de fichiers, génération de sous-agents et prompts détaillés : ces quatre piliers sont tous mis en œuvre au niveau du framework. LangGraph fournit l’environnement de exécution, et le LLM n’est rien d’autre que le moteur de raisonnement connecté à cet ensemble.

Sensible aux caractéristiques du modèle

Le framework s’appuie sur des comportements que les modèles ne manifestent pas tous de la même manière.

  • Appel fiable des outils. Tout le processus dépend du fait que le modèle invoque les outils au bon format avec les arguments corrects. Les modèles moins performants inventent des noms d’outils, transmettent de mauvais types de paramètres ou omettent l’appel pour répondre directement en prose.
  • Suivi de prompts systémiques longs. Les prompts intégrés sont longs. Ils demandent au modèle de planifier d’abord, d’utiliser une liste de tâches, d’isoler le contexte dans des sous-agents et de vérifier son propre travail. Les modèles qui suivent mal les instructions s’écartent de cette approche au milieu d’une tâche.
  • Cohérence sur de multiples étapes. Lors d’exécutions longues impliquant de nombreuses appels d’outils, le modèle doit se souvenir de ce qu’il fait, de ce qui est terminé et de ce qui vient ensuite. Les modèles plus petits ou moins puissants perdent le fil.
  • Savoir quand s’arrêter. Un agent bien conçu remarque lorsqu’il a suffisamment d’informations et met fin à son travail. Les modèles mal calibrés s’arrêtent prématurément ou entrent en boucle indéfiniment.
  • Position approximative des modèles

    Résultats variables : erreurs de format des outils, dérives dans les instructions et arrêts prématurés sont fréquents
    Niveau du modèle Comportement avec un agent avancé
    Modèles de pointe Utilisation fiable des outils, suivi des instructions complexes, maintien de la cohérence sur des tâches longues
    Modèles intermédiaires puissants Adéquats pour la plupart des tâches, avec parfois des dérives sur des séquences très longues
    Modèles plus petits ou open source

    Les noms des niveaux sont des exemples tirés du moment de rédaction, et les classements des modèles évoluent rapidement, il convient donc de les tester avec vos propres tâches.

    Le point clé

    Imaginez un châssis de voiture de course doté d’un moteur interchangeable : quel que soit le moteur installé, la vitesse maximale est déterminée par ce dernier. Le système de gestion fournit la structure nécessaire : planification, mémoire, sous-agents et routage. Le modèle fournit le jugement permettant d’utiliser tout cela correctement. Pour un usage en production, en particulier dans une banque où une liste d’ATM inventée ou un agent d’investissement falsifié peut causer des dommages réels, utilisez un modèle de pointe et ne faites pas d’économies sur sa qualité.

    Temps de créer quelque chose

    Assez de théorie. On connaît bien l’ironie de la documentation sans code fonctionnel : deux cents pages de documentation, quinze diagrammes, un README soigné, mais rien qui fonctionne réellement. Voici donc une démonstration fonctionnelle avec cinq outils bancaires et des données fictives.

    Démarrage rapide

    Créez une clé API depuis la console d’Anthropic, puis configurez un projet :

    mkdir firstdeepagent && cd firstdeepagent
    uv add deepagent anthropic
    export ANTHROPIC_API_KEY='asdkjfbaepiufas;dkjcnaisdf'
    touch agent.py bank_tools.py mock_data.py
    

    Ces commandes créent le dossier, installent les paquets, exportent la clé (utilisez votre propre clé réelle, jamais une clé déjà enregistrée) et créent trois fichiers. Les outils pour bank_tools.py sont :

    from mock_data import (OFFICERS_DATA, PORTFOLIO_DATA, ATM_DATA,
                           RETIREMENT_DATA, LOCATIONS_DATA)
    
    def get_atm_centers(zipcode: str) -> dict:
        data = ATM_DATA.get(str(zipcode).strip())
        if not data:
            return {
                "error": f"No ATM data for zipcode '{zipcode}'.",
                "available_zipcodes": list(ATM_DATA.keys()),
            }
        return {"zipcode": zipcode, "atm_centers": data, "total": len(data)}
    
    
    def get_investment_officers(city: str) -> dict:
        key = city.strip().lower()
        data = OFFICERS_DATA.get(key)
        if not data:
            return {
                "error": f"No investment officers found in '{city}'.",
                "available_cities": [c.title() for c in OFFICERS_DATA],
            }
        return {"city": city, "officers": data, "total": len(data)}
    
    
    def get_portfolio_companies(sector: str = "all") -> dict:
        companies = PORTFOLIO_DATA
        if sector and sector.lower() != "all":
            companies = [c for c in companies if sector.lower() in c["sector"].lower()]
        return {"companies": companies, "total": len(companies), "total_aum": "$6.35B"}
    
    
    def get_retirement_plans(plan_type: str = "all") -> dict:
        plans = RETIREMENT_DATA
        if plan_type and plan_type.lower() != "all":
            plans = [
                p for p in plans
                if plan_type.lower() in p["name"].lower() or plan_type.lower() in p["type"].lower()
            ]
        return {"plans": plans, "total": len(plans)}
    
    
    def get_bank_locations(city: str = "all") -> dict:
        locations = LOCATIONS_DATA
        if city and city.lower() != "all":
            locations = [l for l in locations if city.lower() in l["city"].lower()]
        total_branches = sum(l["branches"] for l in locations)
        return {"locations": locations, "total_branches": total_branches}
    

    Le module mock_data contient des enregistrements d’échantillon, tandis que le module tools-config contient les schémas des outils, la correspondance entre les noms et les fonctions, ainsi que le prompt du système. Conservez-les dans des fichiers séparés afin que le code de l’agent reste compact. La boucle principale de agent.py est présentée comme suit :

    import os
    import json
    import anthropic
    from tools_config import TOOL_SCHEMAS, TOOL_FN_MAP, SYSTEM_PROMPT
    
    
    def run_agent(client: anthropic.Anthropic, conversation: list[dict]) -> str:
        MAX_ITERATIONS = 10
        messages = list(conversation)
    
        for _ in range(MAX_ITERATIONS):
            response = client.messages.create(
                model="claude-sonnet-4-6",
                max_tokens=2048,
                system=SYSTEM_PROMPT,
                tools=TOOL_SCHEMAS,
                messages=messages,
            )
    
            tool_use_blocks = [b for b in response.content if b.type == "tool_use"]
    
            if not tool_use_blocks:
                text_parts = [b.text for b in response.content if b.type == "text"]
                return "\n".join(text_parts).strip()
    
            tool_results = []
            for block in tool_use_blocks:
                fn = TOOL_FN_MAP.get(block.name)
                result = fn(**block.input) if fn else {"error": f"Unknown tool: {block.name}"}
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": json.dumps(result),
                })
    
            messages.append({"role": "assistant", "content": response.content})
            messages.append({"role": "user",      "content": tool_results})
    
        return "[Max iterations reached — partial answer may be incomplete.]"
    
    
    def main():
        api_key = os.environ.get("ANTHROPIC_API_KEY")
        if not api_key:
            print("Error: ANTHROPIC_API_KEY environment variable not set.")
            print("  export ANTHROPIC_API_KEY=your_key_here")
            raise SystemExit(1)
    
        client = anthropic.Anthropic(api_key=api_key)
        conversation: list[dict] = []
    
        print("XYZ Bank Agent — type 'quit' to exit.\n")
    
        while True:
            try:
                user_input = input("You > ").strip()
            except (EOFError, KeyboardInterrupt):
                print("\nGoodbye!")
                break
    
            if not user_input:
                continue
            if user_input.lower() in {"quit", "exit", "q"}:
                print("Goodbye!")
                break
    
            conversation.append({"role": "user", "content": user_input})
            answer = run_agent(client, conversation)
            conversation.append({"role": "assistant", "content": answer})
    
            print(f"\n{answer}\n")
    
    
    if __name__ == "__main__":
        main()
    

    Le lancement

    Vérifiez que la clé a été exportée, puis lancez l’agent avec uv run agent.py. Exemple de session :

    XYZ Bank Agent — type 'quit' to exit.
    
    You > Who are the investment officers in Chicago? Also what retirement plans do you offer?
    
    Here's everything you need!
    
    ---
    
    ## 👔 Investment Officers in Chicago
    
    | Name | Title | Specialty | Phone | Email |
    |---|---|---|---|---|
    | **Margaret Chen** | Senior Investment Officer | Equities & ETFs | 312-555-0101 | m.chen@xyzbank.com |
    | **David Okafor** | Investment Officer | Fixed Income | 312-555-0182 | d.okafor@xyzbank.com |
    | **Sarah Kowalski** | Wealth Manager | Retirement Planning | 312-555-0147 | s.kowalski@xyzbank.com |
    
    ---
    
    ## 🏦 Retirement Plans Offered by XYZ Bank
    
    1. **XYZ Gold 401(k)**
       - Min. Contribution: $50/month | Employer match up to 6%
       - Features: Roth option, target date funds, low expense ratios
    
    2. **XYZ Silver IRA (Traditional)**
       - Min. Contribution: $25/month
       - Features: Tax-deferred growth, flexible contributions, 600+ fund choices
    
    3. **XYZ Roth IRA**
       - Min. Contribution: $25/month
       - Features: Tax-free withdrawals, no required minimum distributions, estate planning benefits
    
    4. **XYZ Executive SEP-IRA**
       - Contribute up to 25% of income
       - Features: High contribution limits, self-employed friendly, simple administration
    
    ---
    
    If you'd like to learn more about any of these plans or get in touch with one of our Chicago investment officers (especially **Sarah Kowalski**, who specializes in retirement planning!), feel free to ask! 😊
    
    You >
    

    L’agent divise une demande en étapes exécutables, choisit les outils appropriés, les exécute et rassemble les résultats. Si une carte mentale est utile, le flux est le suivant : question reçue, planification, appels aux outils, résultats collectés, réponse finale.

    Observabilité

    Un système de ce type a besoin de télémesure, il faut donc ajouter LangSmith. L’intégration est simple : deux variables d’environnement et environ trois lignes de code. LangSmith enveloppe vos appels existants sans les remplacer.

    Ce script appelle directement le SDK d’Anthropic et non LangChain ; ainsi, pour des traces plus détaillées, vous pouvez optionnellement décorer run_agent() avec @traceable :

    from langsmith import traceable
    
    @traceable(name="xyz-bank-agent-run")
    def run_agent(client, conversation):
       ....................
       ....................
    

    Chaque appel d’outil, chaque décision du modèle, le comptage des tokens ainsi que la latence apparaissent alors dans le tableau de bord de LangSmith, sans aucune modification du cycle de l’agent. Exécutez-le à nouveau avec une question plus large :

    uv run agent.py
    XYZ Bank Agent — type 'quit' to exit.
    
    You > Show ATMs in 10001, investment officers in New York, and all branch locations
    
    Here's a complete overview across all three categories:
    
    ---
    
    ## 🏧 ATMs in ZIP Code 10001
    
    | ATM Name | Address | Hours | Fee |
    |---|---|---|---|
    | Midtown Manhattan ATM | 350 5th Ave | 24/7 | No fee |
    | Penn Station ATM | 8 W 31st St | 24/7 | $2.50 (non-members) |
    
    ---
    
    ## 💼 Investment Officers — New York
    
    1. **James Thornton** — Chief Investment Officer
       - Specialty: Alternative Assets
       - 📞 212-555-0201 | ✉️ j.thornton@xyzbank.com
    
    2. **Priya Nair** — Investment Officer
       - Specialty: ESG Portfolios
       - 📞 212-555-0233 | ✉️ p.nair@xyzbank.com
    
    ---
    
    ## 🏦 All Branch Locations (61 Branches Nationwide)
    
    | City | Branches | Flagship Address | Hours |
    |---|---|---|---|
    | Chicago | 14 | 200 W Adams St, Chicago IL 60606 | Mon–Fri 9am–5pm, Sat 9am–1pm |
    | New York | 22 | 1 World Trade Center, NY 10007 | Mon–Fri 8am–6pm, Sat 9am–2pm |
    | Los Angeles | 11 | 333 S Grand Ave, LA 90071 | Mon–Fri 9am–5pm, Sat 9am–1pm |
    | Houston | 8 | 1000 Main St, Houston TX 77002 | Mon–Fri 9am–5pm |
    | Boston | 6 | 100 Federal St, Boston MA 02110 | Mon–Fri 9am–5pm, Sat 10am–1pm |
    
    ---
    
    Is there anything else you'd like to explore, such as retirement plans or our investment portfolio? 😊
    
    You > What companies are in XYZ Bank's portfolio? List only Technology sector companies
    
    Here are the **Technology sector companies** in XYZ Bank's investment portfolio:
    
    ---
    
    ## 💻 Technology Portfolio Companies
    
    | Company | Stake | Value | Rating |
    |---|---|---|---|
    | **Apex Technologies Inc.** | 4.2% | $840M | A+ |
    | **Sentinel Cybersecurity** | 7.3% | $1.5B | A+ |
    
    ---
    
    ### 📊 Summary
    - **Total Technology Holdings:** 2 companies
    - **Total Portfolio AUM:** $6.35B
    - Both companies carry an **A+ rating**, reflecting strong investment quality.
    
    ---
    
    Would you like to explore other sectors, view the full portfolio, or learn about our investment officers? Let me know! 😊
    
    You >
    

    Ensuite, ouvrez le site LangSmith et consultez les exécutions enregistrées. Chaque exécution liste ses étapes avec les entrées, les sorties, le temps d’exécution et les erreurs.

    Le plan gratuit

    Au moment de la rédaction, le plan Développeur est gratuit : il offre 5 000 traces par mois sans nécessiter de carte de crédit. Il comprend un suivi complet et du débogage de chaque étape, couvrant les entrées, les sorties, la latence, l’utilisation des tokens et les erreurs, ainsi qu’un espace d’essai. Il est limité à un poste de travail et un espace de travail unique, avec une conservation des traces sur 14 jours, ce qui convient aux prototypes individuels et aux preuves de concept. LangSmith indique qu’il ne forme pas de modèles à partir de vos traces, qui restent privées au sein de votre organisation. Vérifiez les plans actuels avant de vous fier à ces limites.

    En bref, commencez par le plan gratuit. Il ne coûte rien, il faut environ un quart d’heure pour l’activer, et il affiche immédiatement chaque appel à outil ainsi que chaque décision prise. N’augmentez de niveau qu’en cas d’afflux important de trafic en production.

    Que faire ensuite

    • Remplacez les données fictives par des sources réelles telles qu’un système bancaire de base, un CRM ou des API internes.
    • Créez une hiérarchie dans laquelle un orchestrateur de passerelle dirige les requêtes vers des agents de domaine.
    • Ajoutez des mécanismes de contrôle qui refusent poliment les demandes hors champ et transfèrent l’affaire à un humain.
    • Conservez l’historique des conversations entre les différentes interactions grâce à Redis ou une base de données.
    • Ajoutez une mémoire entre sessions afin que les requêtes et préférences des utilisateurs revenant sur le service soient mémorisées.
    • Fixez des limites de vitesse et des budgets de tokens par utilisateur et par session.
    • Créez un ensemble d’évaluation composé de 30 à 50 requêtes représentatives avec leurs résultats attendus.
  • Réexécutez cet ensemble d’évaluation chaque fois que le code ou les instructions changent, afin que les régressions mineures soient détectées tôt.
  • Ajoutez chaque nouveau domaine en tant qu’agent distinct, enregistré via le gateway.