Inicio / Artículos

¿Necesitan los agentes avanzados modelos específicos? Una demostración bancaria con LangSmith

LangChain Deep Agents es teóricamente agnóstico a los modelos, pero en la práctica es sensible a ellos. Un agente bancario con cinco herramientas analizado en LangSmith muestra dónde se sitúa cada modelo.

Editor: REACTAPP.TOP9 min de lectura2109 palabras

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

Una pregunta lógica al diseñar agentes con el marco Deep Agents es si necesitan un modelo específico para funcionar bien. La respuesta honesta tiene dos partes: arquitectónicamente, Deep Agents no se preocupa por el modelo que utilices; en la práctica, los resultados dependen en gran medida del modelo que elijas.

Arquitectónicamente independiente del modelo

Nada en el marco establece de forma fija un modelo específico, y el código lo demuestra. Se puede pasar cualquier modelo de chat:

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

La herramienta de planificación, el sistema de archivos, la generación de subagentes y las instrucciones detalladas, los cuatro pilares fundamentales, están todos implementados en la capa del framework. LangGraph proporciona el entorno de ejecución, y el LLM es simplemente el motor de razonamiento conectado a dicho entorno.

Sensible a las características del modelo

El framework se basa en comportamientos que no todos los modelos manifiestan de manera igualmente eficaz.

  • Llamadas a herramientas fiables. Todo el proceso depende de que el modelo invoque las herramientas en el formato correcto con argumentos adecuados. Los modelos más débiles inventan nombres de herramientas, pasan tipos de parámetros incorrectos o omiten la llamada y responden en prosa.
  • Seguimiento de instrucciones largas del sistema. Las instrucciones integradas son extensas. Indican al modelo que primero planifique, utilice la lista de tareas, aísle el contexto en subagentes y verifique su propio trabajo. Los modelos que siguen mal las instrucciones se desvían de este enfoque a mitad de una tarea.
  • Coherencia a lo largo de varios pasos. En ejecuciones prolongadas con muchas llamadas a herramientas, el modelo debe recordar qué está haciendo, qué ya está terminado y qué viene a continuación. Los modelos más pequeños o débiles pierden el hilo de la tarea.
  • Saber cuándo detenerse. Un agente bien diseñado se da cuenta de que ya ha hecho suficiente y finaliza la tarea. Los modelos mal calibrados se detienen demasiado pronto o entran en bucle indefinidamente.
  • Aproximadamente dónde se sitúan los modelos

    Nivel del modelo Comportamiento con un agente avanzado
    Modelos de vanguardia Uso fiable de herramientas, sigue instrucciones complejas y mantiene la coherencia en tareas largas
    Modelos de nivel medio potentes Adecuados para la mayoría de las tareas, aunque a veces presentan desviaciones en cadenas muy extensas
    Modelos más pequeños o de código abierto Resultados variables: errores en el formato de las herramientas, desviaciones en las instrucciones y terminación prematura son comunes

    Los nombres de las categorías son ejemplos del momento en que se escribió este texto, y los rangos de los modelos cambian rápidamente, por lo que pruebe con sus propias tareas.

    Conclusión

    Imagínese la carrocería de un coche de carreras con un motor intercambiable: sea lo que sea que instale, la velocidad máxima está determinada por el motor. El conjunto de componentes proporciona la estructura: planificación, memoria, subagentes y enrutamiento. El modelo aporta el juicio necesario para utilizar todo ello correctamente. Para entornos de producción, especialmente en un banco donde una lista de cajeros automáticos inventada o un oficial de inversiones falsificado pueden causar daños reales, utilice un modelo de vanguardia y no escatime en la calidad del modelo.

    Es hora de crear algo

    Basta de teoría. Existe un chiste conocido sobre la documentación sin código en ejecución: doscientas páginas de documentación, quince diagramas y un README impecable, pero nada que realmente funcione. Por lo tanto, aquí tiene una demostración funcional con cinco herramientas bancarias y datos de ejemplo.

    Inicio rápido

    Cree una clave API desde la consola de Anthropic y, a continuación, configure un proyecto:

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

    Esos comandos crean la carpeta, instalan los paquetes, exportan la clave (utilice su propia clave real, nunca una ya guardada) y crean tres archivos. Las herramientas para bank_tools.py son:

    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}
    

    El módulo mock_data contiene registros de ejemplo, mientras que el módulo tools-config alberga los esquemas de las herramientas, la correspondencia entre nombres y funciones, así como el mensaje del sistema. Guárdalos en archivos separados para que el código del agente permanezca compacto. El bucle principal de agent.py se ve así:

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

    Ejecutarlo

    Asegúrese de que la clave haya sido exportada y luego inicie el agente con uv run agent.py. Una sesión de ejemplo:

    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 >
    

    El agente divide una solicitud en pasos accionables, elige las herramientas adecuadas, las ejecuta y recopila los resultados. Si un mapa mental ayuda, el flujo es: pregunta recibida, planificación, llamadas a herramientas, resultados recopilados, respuesta final.

    Observabilidad

    Un sistema como este necesita telemetría, por lo que se debe añadir LangSmith. La integración es sencilla: dos variables de entorno y unas tres líneas de código. LangSmith envuelve las llamadas existentes en lugar de reemplazarlas.

    Este script llama directamente al SDK de Anthropic y no a LangChain, así que para obtener registros más detallados se puede decorar opcionalmente run_agent() con @traceable:

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

    Cada llamada a una herramienta, decisión del modelo, conteo de tokens y latencia aparecen entonces en el panel de control de LangSmith, sin que se modifique la estructura del bucle del agente. Ejécutelo nuevamente con una pregunta más amplia:

    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 >
    

    Luego abra el sitio de LangSmith y consulte las ejecuciones grabadas. Cada ejecución muestra sus pasos con los datos de entrada, salida, tiempo de ejecución y errores.

    La versión gratuita

    En el momento de redactar este texto, el plan para desarrolladores es gratuito: permite 5,000 trazas al mes y no se necesita tarjeta de crédito. Incluye seguimiento completo y depuración de cada paso, abarcando datos de entrada, salida, latencia, uso de tokens y errores, además de un entorno de pruebas rápido. Está limitado a una cuenta y un espacio de trabajo, con retención de trazas durante 14 días, lo cual es adecuado para prototipos individuales y pruebas de concepto. LangSmith indica que no entrena modelos con sus trazas, las cuales permanecen privadas para su organización. Consulte los planes actuales antes de confiar en estos límites.

    En resumen, comience con la versión gratuita. No cuesta nada, tarda aproximadamente un cuarto de hora en configurarse y muestra inmediatamente cada llamada a herramientas y decisión tomada. Solo pase a una versión superior cuando el tráfico de producción aumente.

    Qué hacer a continuación

    • Sustituya los datos de ejemplo por fuentes reales como un sistema bancario central, un CRM o APIs internas.
    • Cree una jerarquía en la que un orquestador de gateways dirija las solicitudes a los agentes del dominio correspondiente.
    • Agregue medidas de control que rechacen amablemente las consultas fuera del alcance y las transfieran a personas humanas.
    • Guarde el historial de conversaciones entre interacciones mediante Redis o una base de datos.
    • Agregue memoria entre sesiones para que se recuerden las consultas y preferencias anteriores de los usuarios que regresan.
    • Establezca límites de velocidad y presupuestos de tokens por usuario y por sesión.
    • Cree un conjunto de evaluación con 30 a 50 consultas representativas junto con sus resultados esperados.
  • Ejecuta nuevamente ese conjunto de evaluación cada vez que cambie el código o las instrucciones, para que las regresiones silenciosas se detecten temprano.
  • Agrega cada dominio nuevo como un agente independiente, registrado a través de la pasarela.