Deep Agents на LangChain: планаванне, субагенты і банкаўскі шлюз
Як абвязка deepagents дадае да цыкла інструментаў планаванне, файлавую сістэму і субагентаў, чым яна адрозніваецца ад ReAct і як размеркаваць інструменты паміж даменнымі агентамі за шлюзам.
Крыніцы: 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, а таксама компаніяў у яго інвэстыцыйным портфеле, і таксама падаць месца розташоўкі інвэстыцыйных афісараў у Чыкаго?
Адпаведзенне на гэты запыт значыць выявленне калькольных намераў у аднай просьбе, выбіранне і коордынацыя правых інструментаў, падтрымка кантэксту між разнымі дадзеннямі і аб’еднанне рэзультатаў у аднай цяплай адпаведзі. Архітэктуры, створаныя для адноэтапных чы рыхлых прайсоў, часта сталквуюцца з труднасцямі ў такіх сітуацыях. Самэ для такіх задач і створаныя глыбокія агенты.
Працэс выглядае так:
- Планаванне. Галоўны оркестрацыст чытае складзены запыт і выкарыстоўвае
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, следуе строгаму цыклу «Мысленне, Дзеянне, Абсарбаванне» пашагоўна, без пярэднега плану. Гэта вызывае трох проблем:
- Ён працуе последоўна, таму спачатку банкаматы, потым портфель, пасля таго спецыялісты. Проблема з карточкамі крэдыту з’яўляецца толькі ў самым канцы, пасля таго, як усё інша будзе завершана.
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, адпавядаючы на запіт пра часы працы банкаматаў, проста таму, што оба пункты належаць да сферы яго дзеяння. Агенты домэны ухілваюцца ад гэтага, даўаючы кожнаму часткавую ідэентыкацыю праз ўсія сістэмныя прампты і наборы інструментоў. Агент, які знае, каму ён належыць, прымечае болей точныя рашэнні ў сваёй сферы дзеяння.
Прыгодны тэст: калі вы спарэчваеце пра тое, чыя гэта адпрацоўчыка — А чы ў Б, то адпрацоўчык або робіць занадта многа і яго трэба раздзеліць, або вам патрэбна трэцяя домэна. Межа должна быць настолькі ж явной, як і рашэнне пра тое, чыя гэта запытка — керавальніку філіяў чы інвестыцыйнаму радніку.
Адкрытыя запыткі
Заставаюцца два пытанні: чы сільна залежаць глыбокія адпрацоўчыкі ад выбору адпраўнай модэлі, і чы можна стварыць цэлы рашэннік «з галавы да ногі» з іх адпамогай. Адказ на другое пытанне — так, і наступны логічны крок — практычная рэалізацыя гэтага банкавага сцэнарыю.