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

Deep Agents на LangChain: планаванне, субагенты і банкаўскі шлюз

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

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

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

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

Меры простай петлі

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

Такі продукты, як Deep Research, Manus і Claude Code, пасуюць да гэтага за дапамою чатырох элементаў: інструмента планавання, саб-агентаў, сістэмы файлаў і дакладнага запіту. Праект deepagents з’явіўся як праграма разумець, што робіць Claude Code такім універсальным, і ўдосконаліць гэта. У LangChain такія агенты называюцца „глыбокімі агентамі“, таму што яны можаць планаваць складную работу і выконваць яе працоўнае перыяды. Практычна гэта ёсць шлях LangChain да автонамных агентаў у стылі Claude Code, якія можаць распрацоўваць рэальныя, багатыя на крокі задачы, а не толькі ентэрпрыскі запіты.

deepagents — гэта самастоятэльная бібліятэка, створаная на адміністрацыйных элементах агентацкіх механізмаў LangChain і запускаемая на срэдавыце LangGraph, якае забезпечвае надзеяны выконанне заданняў, стрымінг дадзенаў і падтрымку участку чалавека у працэсе. Хорашыя апісанні такой бібліятэкі — гэта «інструменты для керавання агентамі»: той самы цыкл вызывання інструментаў, як у іншых фрэймворках, але з дадатковымі вбудованымі інструментамі і можлівасцямі.

Чатыры складнікі

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

Сістэма файлоў для кантэксту. Інструменты на кшталт ls, read_file, write_file і edit_file дозволяюць агенту зберагаць велікі об’емы кантэксту у памяці чы рошце, ўтрымваючы вікно кантэксту пад контролем і дозволяючы апрацоўваць рэзультаты будзь-якага размеру.

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

Довгі запіты сістэмы. Запіты, створаныя на базе Claude Code, ёсць дужа дзьялеглымі і змяшчаюць інструкціі ўжывання інструментаў, а таксама прыклады дзеяння ў конкрэтных сітуаціях. Без іх агенты мало чаго б змоглі зробіць. Запіты застаюцца важлівымі.

Месца ў стэкі LangChain

Існуе трыя слоі, кожны з якіх будуецца на тым, што знаходзіцца ніжэй. LangGraph — гэта асяроддзе выканання агентаў, прыдатная для сумешчання рабочых працэсаў і агентаў. LangChain — гэта фрэймворк для агентаў, прыдатны для вікорыстання базовага цыклу, а таксама для стварэння запрошэнняў і інструментаў з нуля. Deep Agents — гэта супортнае рашэнне, прыдатная для автонамных, дзейнаючых працоўнікаў, якім паслужаюць вбудованыя механізмы планавання, сістэма файламі і адпоўнайнае дапаможнае програмне забезпечэння. Цяное рашэнне будуецца на абстракцыі агентаў з LangChain, якая у свою чаргу базуецца на LangGraph.

Прыклад з банкаваю сферай

Уявіце банк, які надае пяць інструментаў для працы з конкрэтнымі задачамі: пошук банкоматаў па коду POŭštовага індэкса, перыядык інвестыцыйных спецыялістаў у пэўным горадзе, адлічэнне компаній у інвестыцыйным портфеле банка, падача дакладнаў пра планы на выйшчу з працы і пошук філіяў у розных рэгіонах. Кожны з іх эфектыва справляецца з адной вузкай задачай. Проблемы пачынаюцца, калі корыстувальнік просіць выкарыстаць колькісць з іх адночасна:

Чы можаце вы паказаць спіс апаратных пунктав ATM банка XYZ, а таксама компаніяў у яго інвэстыцыйным портфеле, і таксама падаць месца розташоўкі інвэстыцыйных афісараў у Чыкаго?

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

Працэс выглядае так:

  1. Планаванне. Галоўны оркестрацыст чытае складзены запыт і выкарыстоўвае write_todos, каб разбіць яго на тры задачы: атрыманне спісу апаратных пунктав ATM, атрыманне інформацыі пра компаніяў у портфеле і атрыманне дакументаў пра афісараў у Чыкаго.
  • Створэння элементаў. Замест того, ўбачаць усе тры етапы поспалу в одному розрызненому кантэксце, сістэма запускае тры підагента, по одному на задачы, кожэн з якіх мае власне вікно кантэксту, ўбачаць усе не перэшкоджалі однаму іншому.
  • Віклік інструментаў. Кожэн підагент вікорыстовуе саме правільній з п’яты інструментаў: get_atm_centers(zipcode=...), get_trusted_portfolio_companies() і get_investment_officers(city="Chicago").
  • Сінтэзування. Рэзультаты повертаюцца до організатора, які об’еднуе іх у одну добрэ сформатавану відповідзь і позначае всі задачы як віконаны.
  • Прадацавы агент для вызоўвання інструмента мог бы обрабатваць усе тры задачы па спраўнасці ў однам кантэксце. Ён мог бы забыць ранейшыя рэзультаты, апусціць з увагай, на якое запітанне ён адпавядае, або перасіць ліміт кантэкста. Глыбокі агент падтрымвае раздзеленасць задач і сочыць за прагрэсам праз спіс задач, таму нават калі адзін вызов зазнае неудачы або вяртае частковыя даны, керуючы агент ведае, якая ў становішчы справа.

    Структура ўскладненая:

    from deepagents import create_deep_agent
    
    agent = create_deep_agent(
        tools=[
            get_atm_centers,         # your ATM tool
            get_investment_officers, # your officers tool
            get_portfolio_companies, # your portfolio tool
            get_retirement_plans,    # your retirement tool
            get_bank_locations,      # your locations tool
        ],
        system_prompt="You are XYZ Bank's AI assistant. Always answer completely and cite sources."
    )
    
    result = agent.invoke({"messages": [{"role": "user", "content": "Can you give me a list of ATM centers for XYZ bank and also list the name of companies XYZ has in its investment portfolio? Also can you give me the location of XYZ investment agents in Chicago?"}]})
    

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

    ReAct проты глęбокіх агентаў, калі інструмент не ёсць

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

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

    ReAct, скрацанне ад Reasoning plus Acting, следуе строгаму цыклу «Мысленне, Дзеянне, Абсарбаванне» пашагоўна, без пярэднега плану. Гэта вызывае трох проблем:

    • Ён працуе последоўна, таму спачатку банкаматы, потым портфель, пасля таго спецыялісты. Проблема з карточкамі крэдыту з’яўляецца толькі ў самым канцы, пасля таго, як усё інша будзе завершана.
  • Ён ніколі не скануе доступныя інструменты. Ён знаходзіць нехваткавае інструмента пад час выканання, калі намагаецца яго вызваць, і залежна ад LLM і спосабу рэалізацыі ён можа зупініцца, спробаваць знову з вымышленым іменем інструмента або, што найгорша, стварыць правдападобны спіс крэдытных картак, таму што ён спадзяецца на наявнасць адпаведнай адказы.
  • Пакалькі неудача выходзіць падчас віканання цыклу, ніч гарантавае, што трохі празьледзяўшыя рэзультаты дасягнуць корыстніка чыста. Агент можа проста выдаць памылку і ніч не вернуць.
  • ReAct падходзіць для короткіх, чыста апісаных задач, дзе ведама наявнасць кожнага інструмента. Deep agents прызначаны для болей сложнага рэальнага свету, дзе запытанні ёсць складнымі, інструменты можу не быць, але вы все рава хочаце даць як магчыма большую цэннасць з таго, што ў вас ёсць.

    Запытанне па дызайне: адны агент з усімі інструментамі?

    Цікава пытанне: чы гэта значыць, што мы должны стварыць множнасць інструментоў і выклікваць іх усе праз аднаго агента? Нята. Адзін агент, які мае 50 чы больш інструментоў, ёсць анты-патэрн. Лепшы варыянт — іерархія агентоў. Уявіце сабе агента, чыя настройкі маюць сотні інструментоў — ад пошуку ў Інтэрнэце і электранай пашты да броніравання рэйсоў і запуску ракет, з інструкцыяй „знаходзіць рашэнне сам“. Гэта можа працаваць часамі, і час ад часу ён можа адпаведзець на прытварку з праўільнаю доставкай, броніруючы рэйс, заплачваючы податкі і замовляючы піцу. Ніхто гэтага не хоча.

    Уласнасц домэну

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

    У разы працы банкаў нейкразны падзел выглядае так:

    • Агент філіі і банкаматаў з функціямі get_atm_centers і get_bank_locations, якія адпавядаюць за фізычную прымесцовасць: коды поштовых індэксаў, горады, часы працы.
    • Агент з інвестыцыямі з функціямі get_portfolio, get_officers і get_retirement_plans, якія адпавядаюць за карыстаўанне грошамі, укладаючы ў сябе фінансавыя правілы, сертыфікаты спецыялістаў і тыпы планаў.
    • Агент з товарамі з функціяй get_credit_cards (колі такія існуюць), а таксама з крэдытамі і заўёсковымі рахункамі, якія адпавядаюць за каталог товароў. Калі якісь толькі аб’ект не існуе, толькі гэты агент адзвяртае ўвагу на гэты прынт, а іншыя продавяжаюць сваю работу без змян.

    Код таксама адпавядае гэй выкладцы:

    from deepagents import create_deep_agent
    # Each domain agent is self-contained
    branch_agent = create_deep_agent(
        tools=[get_atm_centers, get_bank_locations],
        system_prompt="You are the Branch & ATM specialist for XYZ Bank..."
    )
    investments_agent = create_deep_agent(
        tools=[get_portfolio, get_officers, get_retirement_plans],
        system_prompt="You are the Investments specialist for XYZ Bank..."
    )
    products_agent = create_deep_agent(
        tools=[get_credit_cards],  # sparse now, grows over time
        system_prompt="You are the Products specialist for XYZ Bank..."
    )
    # Gateway knows nothing about tools — only about agents
    gateway = create_deep_agent(
        tools=[
            branch_agent.as_tool(name="branch_atm_agent"),
            investments_agent.as_tool(name="investments_agent"),
            products_agent.as_tool(name="products_agent"),
        ],
        system_prompt="""You are the XYZ Bank assistant gateway.
        Parse the user's intent, delegate to the right domain agent(s),
        and synthesize a unified response. Never answer directly — always route."""
    )
    

    Чаму гэта функцыонаваець

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

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

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

    Адкрытыя запыткі

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