Startseite / Artikel

Brauchen tiefe Agenten spezielle Modelle? Eine Bank-Demo mit LangSmith

LangChain Deep Agents ist auf dem Papier modellunabhängig, in der Praxis jedoch modellsensitiv. Ein in LangSmith dargestellter Bankagent mit fünf Tools zeigt, bei welchem Modell jede Aufgabe anfällt.

Verlag: REACTAPP.TOP9 Min. Lesezeit2109 Wörter

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

Eine natürliche Folgefrage bei der Entwicklung von Agenten mit dem Deep Agents-Framework ist, ob ein bestimmtes Modell erforderlich ist, damit sie gut funktionieren. Die ehrliche Antwort hat zwei Teile. Architektonisch gesehen ist Deep Agents unabhängig davon, welches Modell Sie verwenden. In der Praxis hängen die Ergebnisse jedoch stark vom ausgewählten Modell ab.

Architektonisch modellunabhängig

Im Framework ist nichts so konfiguriert, dass ein bestimmtes Modell vorgeschrieben wird, und der Code zeigt das auch. Jedes Chat-Modell kann übergeben werden:

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=[...],
)

Das Planungstool, das Dateisystem, das Erstellen von Subagenten sowie detaillierte Anweisungen – die vier Säulen – sind alle auf der Framework-Ebene implementiert. LangGraph stellt die Laufzeitumgebung bereit, und das LLM ist lediglich der Reasoning-Engine, der in diese Umgebung eingebunden wird.

Praktisch modellabhängig

Das Framework stützt sich auf Verhaltensweisen, die nicht alle Modelle gleich gut darstellen können.

  • Tooltaufrufe, die zuverlässig sind. Der gesamte Ablauf hängt davon ab, dass das Modell die Tools im richtigen Format mit korrekten Argumenten aufruft. Schwächere Modelle erfinden Toolnamen, übergeben falsche Parameterarten oder überspringen den Aufruf und antworten in Prosa.
  • Befolgung langer Systemanweisungen. Die integrierten Anweisungen sind lang. Sie weisen das Modell an, zunächst zu planen, die To-Do-Liste zu nutzen, den Kontext in Subagenten zu isolieren und seine eigene Arbeit zu überprüfen. Modelle, die Anweisungen schlecht befolgen, weichen bereits in der Mitte einer Aufgabe davon ab.
  • Kohärenz über mehrere Schritte hinweg. Bei langen Abläufen mit vielen Toolaufrufen muss das Modell behalten, was es gerade tut, was bereits abgeschlossen ist und was als Nächstes kommt. Kleinere oder schwächere Modelle verlieren den Überblick.
  • Wissen, wann man aufhören soll. Ein gut funktionierendes Modell erkennt, wenn es ausreichend Informationen hat, und beendet die Ausführung. Schlecht kalibrierte Modelle beenden die Arbeit früh oder verharren endlos im Kreislauf.
  • Ungefähres Leistungsniveau der Modelle

    Modellklasse Behavior mit einem leistungsstarken Agenten
    Spitzenmodelle Toole werden zuverlässig genutzt, komplexe Anfragen werden befolgt, Kohärenz bei langen Aufgaben bleibt gewahrt
    Starke Mittelklassemodelle Für die meisten Aufgaben geeignet, gelegentliches Versagen bei sehr langen Abläufen
    Kleinere oder Open-Source-Modelle Unzuverlässig: Fehler bei der Toolnutzung, Abweichungen in den Anfragen sowie frühzeitige Beendigung sind häufig

    Die Tierbezeichnungen sind Beispiele aus der Zeit der Erstellung, und die Rangfolgen der Modelle ändern sich schnell – testen Sie daher anhand Ihrer eigenen Aufgaben.

    Zusammenfassung

    Bilden Sie sich ein Rennwagenchassis mit austauschbarem Motor vor: Unabhängig davon, was Sie einbauen, wird die Höchstgeschwindigkeit vom Motor bestimmt. Das „Gehäuse“ bietet Struktur – Planung, Speicherung, Unteragenten und Routenfindung. Das Modell liefert das Urteilsvermögen, um all das richtig einzusetzen. Für die Produktion, insbesondere in einer Bank, wo eine erfundene Liste von Geldautomaten oder ein gefälschter Investmentberater echten Schaden anrichten kann, sollten Sie ein Frontier-Modell verwenden und auf die Modellqualität nicht verzichten.

    Zeit, etwas zu bauen

    Bastet genug Theorie. Bei Dokumentation ohne ausgeführten Code gibt es ein bekanntes Sprichwort: zweihundert Seiten Dokumentation, fünfzehn Diagramme, eine gut gestaltete README-Datei – und nichts, was tatsächlich läuft. Deshalb hier eine funktionierende Demo mit fünf Bankwerkzeugen und simulierten Daten.

    Schnellstart

    Erstellen Sie eine API-Schlüssel in der Anthropic-Konsole und richten Sie anschließend ein Projekt ein:

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

    Diese Befehle erstellen das Verzeichnis, installieren die Pakete, exportieren den Schlüssel (verwenden Sie Ihren eigenen echten Schlüssel, niemals einen gespeicherten) und erstellen drei Dateien. Die Tools für bank_tools.py sind:

    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}
    

    Die mock_data-Modul enthält Beispieldaten, während das tools-config-Modul die Schemata der Tools, die Zuordnung von Namen zu Funktionen sowie den Systemprompt enthält. Bewahren Sie diese in separaten Dateien auf, damit der Agentcode klein bleibt. Der Hauptloop in agent.py sieht wie folgt aus:

    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()
    

    Ausführen

    Stellen Sie sicher, dass der Schlüssel exportiert wurde, und starten Sie anschließend den Agenten mit uv run agent.py. Ein Beispiel für eine Sitzung:

    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 >
    

    Der Agent teilt eine Anfrage in handlungsrelevante Schritte auf, wählt die richtigen Tools aus, führt sie aus und sammelt die Ergebnisse. Wenn eine mentale Karte hilft, verläuft der Ablauf wie folgt: Frage ein, Plan erstellen, Tools aufrufen, gesammelte Ergebnisse, endgültige Antwort.

    Beobachtbarkeit

    Ein solches System benötigt Telemetrie, daher sollte LangSmith hinzugefügt werden. Die Integration ist einfach: zwei Umgebungsvariablen und etwa drei Zeilen Code. LangSmith umhüllt Ihre bestehenden Aufrufe anstelle, sie zu ersetzen.

    Dieses Skript ruft direkt das Anthropic SDK auf und nicht LangChain, sodass Sie für detailliertere Spuren optional run_agent() mit @traceable versehen können:

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

    Jeder Tool-Aufruf, jede Modellentscheidung, die Anzahl der Tokens sowie die Latenzzeit werden anschließend im LangSmith-Dashboard angezeigt, ohne dass der Agentenloop umstrukturiert werden muss. Führen Sie es mit einer umfassenderen Frage erneut aus:

    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 >
    

    Dann öffnen Sie die LangSmith-Website und schauen Sie sich die aufgezeichneten Ausführungen an. Jede Ausführung listet ihre Schritte mit Eingaben, Ausgaben, Zeitenangaben und Fehlern auf.

    Die kostenlose Stufe

    Zum Zeitpunkt der Erstellung dieses Textes ist der Developer-Plan kostenlos – es stehen 5.000 Trace-Daten pro Monat zur Verfügung und eine Kreditkarte ist nicht erforderlich. Er umfasst eine vollständige Überwachung und Fehlerbehebung jeder Schritt, einschließlich Eingaben, Ausgaben, Latenzzeiten, Token-Nutzung und Fehlern, sowie ein Prompt-Playground. Er ist auf einen Benutzerplatz und eine Arbeitsumgebung beschränkt, mit einer 14-tägigen Aufbewahrungsfrist der Trace-Daten – was sich für individuelle Prototypen und Konzeptideen eignet. LangSmith gibt an, dass keine Modelle auf Ihren Trace-Daten trainiert werden, da diese ausschließlich Ihrer Organisation vorbehalten bleiben. Überprüfen Sie die aktuellen Angebote, bevor Sie sich auf diese Einschränkungen verlassen.

    Kurz gesagt: Beginnen Sie mit der kostenlosen Ebene. Sie kostet nichts, die Einrichtung dauert etwa ein Viertelstunde, und sofort werden alle Toolaufrufe sowie Entscheidungen angezeigt. Wechseln Sie nur dann auf eine höhere Ebene, wenn der Produktivverkehr zunimmt.

    Was als Nächstes zu tun ist

    • Ersetzen Sie die simulierten Daten durch echte Quellen wie ein Kernbankensystem, ein CRM oder interne APIs.
    • Erstellen Sie eine Hierarchie, bei der ein Gateway-Orchestrator zu den jeweiligen Domänenagenten leitet.
    • Fügen Sie Sicherheitsmechanismen hinzu, die höflich Anfragen außerhalb des Aufgabengebiets ablehnen und sie an Menschen weiterleiten.
    • Speichern Sie den Konversationsverlauf über mehrere Interaktionen hinweg mit Redis oder einer Datenbank.
    • Fügen Sie eine zwischen-Sitzungsspeicherfunktion hinzu, damit die früheren Anfragen und Präferenzen zurückkehrender Nutzer gespeichert bleiben.
    • Legen Sie Limits für die Anzahl der Anfragen sowie Budgets für Tokens pro Nutzer und pro Sitzung fest.
    • Erstellen Sie eine Bewertungsgruppe mit 30 bis 50 repräsentativen Anfragen samt erwarteten Ausgaben.
  • Führen Sie diesen Eval-Set immer wieder aus, sobald sich der Code oder die Anfragen ändern, damit leise Regressionen frühzeitig aufgedeckt werden.
  • Fügen Sie jede neue Domäne als eigenes Agent hinzu, das über das Gateway registriert wird.