Галоўная / Артыкулы

Ці патрэбныя Deep Agents пэўныя мадэлі? Банкаўскае дэма з LangSmith

LangChain Deep Agents на паперы не залежыць ад мадэлі, а на практыцы — залежыць. Банкаўскі агент з пяццю інструментамі, трасіраваны ў LangSmith, паказвае, дзе кожная мадэль спатыкаецца.

Выдавец: REACTAPP.TOP9 хв чытання2109 слоў

Крыніцы: Beyond Simple Agents: Engineering DeepAgents for Enterprise with LangChain — 2

Парадоксальным пытаннем, якое вылучваеця ў момент праектавання агентаў з фрэймворку Deep Agents, ёсць тое, чы робіцься гэта за дапамою певнага мадэлі, каб усё працавало належна. Чыстая адказ мае два аспекты. З архітэктурнай точкі зору Deep Agents не залежыць ад таго, якую модэль вы выберазе. У практыцы ж рэзултаты сільна залежаць ад выбранай вам модэлі.

Архітэктурна незалежны ад мадэлі

У фрэймворку няма нічога, што прыкрэпляе конкрэтную модэль, і код гэта падтверджае. Можна выкарыстоўваць будзь-яю модэль чату:

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

Інструмент планавання, файлавая сістэма, стварэнне падагентаў і дэталізаваныя запіты — гэтыя чатыры асновны элементы рэалізаваны на роўні фрэймворку. LangGraph забезпечвае срэду выканання, а LLM — гэта проста механізм разумовых вычыслаў, падключаны да гэтай сістэмы.

Практычна чутлівы да модэляў

Фрэймворк апіраецца на такія формы поведзення, якія не всі модэлі выконваюць на однакова якосць.

  • Надзеяны вызыв інструментаў. Усі працэсы залежаць ад таго, чы ўсё лягае ў правы фармат з правымі параметрамі. Слабейшыя модэлі выдумваюць назвы інструментаў, пасылаюць неправыя тыпы параметраў або проста прыпінаюць вызыв і адпавядаюць у прозе.
  • Выпэлнэнне дугіх сістэмных запытаў. Вбудованыя запыты ёсць дужа дзялёнымі. У яных прашацца модэль спачатку спланаваць, выкарыстоўваць спіс задач, ізолюваць кантэкст у падагентах і пераканацца ў правільнасці сваей працы. Модэлі, якія паслухаюць інструкцыі па-свойму, пачынаюць адхіляцца ад гэтых правіл на серэдзіні задання.
  • Саўмеласнае веданне працы ў многах кроках. У дзейнасці, якая трывае даволі дазго і включае многія вызовы інструментаў, мадэль должна памяцаць, што яна робіць, што ужо завершана і што будзе далей. Менжыя або слабэйшыя мадэлі трапляюцца ў стане пазбытку напрамні дзейнасці.
  • Знанне таго, калі паставіцца. Хораша мадэль здагадваецца, калі ёй вялікай колькасці інформацыі, і завершае свою працу. Некальібраваныя мадэлі завершаюць працу раней або застаюцца ў бесканечным цыкле.
  • Прыбліжнае распадзеленне модэляў

    Ранг модэля Працовая здатнасць з глыбокім агентам
    Мадэлі высокага рангу Надзеяны выкарыстоўванне інструментаў, адпаведнае выконанне складных запітоў, саўмеласнае веданне працы ў даволі дзяўгіх задачах
    Сільныя мадэлі серэдньага рангу Падыходзяць для большасці задач, але іноды маюць проблемы ў даволі дзяўгіх ланцоў задач
    Менжыя або мадэлі на відкрытым кодзе Рэзультаты ўсёлякія: часта трапляюцца бягы в фармаце інструментаў, адхіленьцы ў адпаведзях на запіты і пранарэшчанне працы

    Назвы рангаў ўжо ўзятыя як прыклады з часу напісання тэксту, а рангі модэляў быстра зменшаюцца, таму тэставаць трэба на сасвойых задачах.

    Асновны вывад

    Уявіце сабе кузов гоночнага автомабіля з можлівасцю замены двагуна: што бы вы не установілі, максымальная швальдзіна будзе вялічынай двагуна. Сістэма падтрымкі забезпечвае структуру: планаванне, памяць, падагенты і маршрутызацыю. Модэль жа дае можлівасць правільна выкарыстоўваць усё гэта. Для практычнага выкарыстоўвання, а ўсё болей у банку, дзе вымышлены спіс банкаматаў або фальшывы інвестыцыйны спеціяліст можа завесты серйозныя наследкі, трэба вжываць перэдовыя модэлі і не екануваць на якосці модэляў.

    Час стварыць ўсё гэта

    Дастатнько тэорыі. Дакументацыя без запуску коду — гэта вядомы жарт: дваста стораніц дакументаў, пятнаццац дыяграм, апрануты файл README, але нічога, што б фактычна працавало. Таму жо тут ёсць працуючы дэманстрацыйны прыклад з пяцьма інструментамі для банкавугледу і фальшывымі дадзеннямі.

    Швыракі старт

    Створыце API ключ у консэльтацыянтэ Антропік, а пасля налаеце праект:

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

    Этыя каманды ствараюць папку, інсталююць пакеты, экспортуяць ключ (выкорыстоўваюце свой справжні ключ, ніколі не тыя, якія былі зафіксаваны), і ствараюць тры файлы. Інструменты для bank_tools.py ўключаюць:

    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}
    

    Модуль mock_data зберагае прыкладныя запісі, а модуль tools-config — схемы інструментаў, супарабоцанне ад імен да функцый і запрошэнне для сістэмы. Храніце іх у адзінаковых файлах, каб код агента заставаўся малым. Галоўны цыкл для agent.py выглядае так:

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

    Запуск

    Убедзіцеся, што кантэнт ключа выэкспортаваны, а пасля запусціце агента за дапамою uv run agent.py. Прыклад сесіі:

    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 >
    

    Агент раздзеляе запіт на практычныя крокі, выбірае правыя інструменты, запускае ўсё гэта і збірае рынкты. Калі дапамагае ментальная карта, тады праграма выглядае так: запіт, план, вызовы інструментаў, засобраныя рынкты, фінальная адпаведзь.

    Возможнасць назірання

    Такія сістэмы патрабуюць тэлеметрыі, таму трэба дадаць LangSmith. Інтэграцыя простая: два зменныя сераўісу і апошнія тры радкі коду. LangSmith абгортае вашы існуючыя вызовы заместо таго, каб заменіць іх.

    Гэты скрыпт вызывае безпосерэдня Anthropic SDK, а не LangChain; таму, каб павышыць дакладнасць логаў, можна за бажаннем адзначыць run_agent() атрыбутам @traceable:

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

    Кожны выклік інструмента, рашынка модэлю, колькасць токенаў і час адпаведзення праказуюцца на панелі керування LangSmith, без якой-лебе перархітактуры цыклу агента. Заўёрніце яго знову з болей шырокым запітам:

    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 >
    

    Потым ачынайце сайт LangSmith і перакладзіце запісаныя рэзультаты выканання. Кожны запуск паказвае своі крокі разам з вхіднымі данымі, выходнымі данымі, часам выканання і памяткамі пра адміністрацыю.

    Бесплатны ўровень

    На момент напісання план Developer ёсць бесплатным: 5,000 трагов на месяц без неабяжнасці вікорыстоўвання карточкі дакументацыі. Ён включае повны аналіз кожнага кроку, ў тым вхідныя і выходныя даныя, час адпаведзення, відвяджанне токенаў і памяткі пра адміністрацыю, а таксама інструмент для швыракіх тэстаў. Ён обмежаны однай пазіцыяй і аднам працоўным просторам, з 14-дзённым збераганням трагоў, што падходзіць для індывідуальных протатыпаў і доказоў концэпцыі. LangSmith заявляе, што не трэнуе мадэлі на вашых трагах, якія застаюцца прыватнымі для вашай організацыі. Пераконтавайцеся з чыннымі планамі перад тым, як спалагацца на гэтыя ліміты.

    Корачэй кажучы, пачніце з безплатнага рэжыму. Ён не каштуе нічога, на ўстановку патрабуеяцца прыблізна чвэртак гадзіны, і адразу ж показвае кожны вызов інструменту і прыметку. Перайшоўце на вышэйшы рэжым толькі тады, калі пачне растаць навантажэння з боку рэальных корыстнікаў.

    Што робіць далей

    • Заменіце штучныя даны на рэальныя істочнікі, такія як сістэма центральнага банкавання, CRM або внутраніе API.
    • Створыце іерархію, у якой оркестратор-шлюз направляе запыткі да агентаў домэна.
    • Дадзіце правілы, якія вважліва адхроняюць запыткі, якія не належаць да сферы дзеяння, і перадаюць іх людзям.
    • Зберагачыце історыю размовы між кожнымі крокамі за дапамою Redis або базы дадзеных.
    • Дадзіце меморыю межа сесый, каб памятаць прыходзячых корыстнікаў пра ўсе яныя ранейзькі запыткі і прывычкі.
    • Установіце ліміты частоты і бюджэты токенав на кожнага корыстніка і на кожную сесыю.
    • Створыце набор з 30-50 рэпрэзентатывных запыткаў з прыняцамымі рэзультатамі.
  • Парадуць выконанне таго ж набора eval кожны раз, калі змянюецца код або запіты, ўпэўніваючыся такім чынам у тым, што незначныя збоі будуць выкрываны якомога раней.
  • Кожны новы домэн слід дадаць як околачага агента, зарэўнаванага праз шлюз.