LangGraph: графы, стан, маршрутызацыя і прадакшн-патэрны
Як LangGraph мадэлюе агентаў цыклічнымі графамі з тыпізаваным станам, рэдзюсерамі, чэкпойнтамі, маршрутызацыяй, інструментамі і цыкламі ReAct, плюс патэрны для прадакшну.
Крыніцы: Mastering LangGraph: The Complete Technical Guide to Building Production-Grade Agentic AI Systems
Першыя прыемнікі застосоўанняя LLM былі простымі: адправіце запіт, атрымайце адпаведзь. Агенты — гэта іншы тып програм. Яны робяць выварыны па шмату крокаў, выбіраюць, што рабіць, на адной з аснов таго, што вучыліся да гэтага часу, і выконваюць дзеянні ў зовнішнім свеце. Гэта выклікае патрэбу ў інфраструктурэ, пабудованай на ціклах, галузях і памяці, а не на простай лініі ад вхідных дадзеных да выходных.
LangGraph — адны з такіх фрэймворкаў. Ён прызначаны для застосоўанняя з станам, у якіх адна або калькі актараў, керованых LLM, працуюць разам. У працоўнасці замест лінейнага ланца ён дазволяе опісаць спрамованую графіку, якая можа мець ціклы, керавацца за адпаведнымі умовамі, зберагаць стан і коордынаваць вызывы інструментаў. Гэтыя элементы — не проста зручнасці. Агент, які павінен справляцца з неяснасцямі, восстанавляцца пасля бядаў і удосконаляць свою работу па калькі пасэў, патрабуе ўсіх іх.
У наступным частках паказана, як фрэймворк працуе внутршнім чынам, чаму важлівы яго праектныя рашэнні і калі застосоўваецца кожны патэрн. Да канца вы должны быце магчымаць прымець рашэнні ў архітэктурэ з абавесцю, дыбагаваць паведанне агента, якое здаецца страннам, і расшырваць фрэймворк па сваімі патрэбамі.
Графы як базовы элемент будавання
Старэйшыя інструменты оркестрацыі мадэлююць рабочы працэс як простую ланцюговую структуру або, ў найкрашчым разе, як спрамованы ацыклічны граф. Гэта падходзіць для заведамых задач, але не працуе, калі агенту трэба павторыць дзеяння, зробіць рэзервную копію або выбраць іншы шлях у рэальны час. LangGraph выходзіць з працоўнай прыпускі працоўнай працоўнай прыпускі і выкорыстоўвае спрамованы граф з цыкламі як свой основны прымітыў.
Чаму ланцюг недастатні
Разлік між ланцюгамі і графамі ёсць практычным, а не формальным. Ланцюг перэдбачае, што вы знаеце точную парадрозу аперацыяў пад час напісання коду. Граф прымеўае, што шлях у сістэме залежыць ад стану пад час выканання, проміжных рэзультатаў і умов, якія ніхто не можа прыгадаць.
Уявіце агента, які даследжвае компанію. Ён пачынае з фінансавых дадзеных. Чы будзе ён далей запрашваць новыні, аналітычныя звярненні чы чытаць дакументы конкурэнтав, залежыць ад таго, што паказалі фінансы. Такая умовная, павтараючаяся поведзенчасць вымагае як цыклів, так і галузей, а ланцюг не можа выразіць ні тое, ні іншэ.
Звычны ўзор агента — гэта цыкл: розглядаецца, што трэба зрабіць, выконуецца дзеянне, спостэрагаецца рэзультат, і гэта павтараецца пакуль не будзе досягнута мета. Калі вы вікорыстоўваеце інструмент на адной ланцузе, у вас ёсць два паслаблія. Можна развернуць цыкл у фіксаваны колькісць крокаў, што пазбавляе гнучкасці, але можна таксама самі напісаць логіку керавання парадульна фрэймворку, што паслабляе можлівасці складання разных элементаў. У LangGraph сам цыкл ёсць ідэя першага класу, якая выражаецца як цыклічны граф з умовнымі рэшткамі.
Вузлы
Вузел — гэта адны дыскрэтны крок вычыслення. Ён прыме якісь тэкучы стан, выконвае дзеянне і вяртае абнаўленні. Гэта дзеянне можа быць вызовам LLM, які прыме рашэнне, вызовам інструмента, які вяршыць работу з зовнішнім сістэмам, трансформацыяй дадзенняў або якой-небудзь логікай маршрутацыі.
Вузлы — гэта звычныя функцыі на Python з адзінаковай структурой: у ўсіх яны прыймаюць тэкст з нынешнім станом, а выдаюць словнік з змянамі. Такі функцыональны інтэрфейс дазволяе ўзаемна ўжываць вузлы і лёгка ў тэставанні. Вузел ніколі не мяніць стан на месцы; ён працавае з тымі змянамі, якія хочаце, а LangGraph з’едынае іх па правілах, якія вы задаеце.
Вузлы можу быць настолькі простымі, як адна толькі вызовка LLM, або настолькі складнымі, як логіка з калькама крокаў. Дзеяныя з іх вызываюць цэлыя іншыя графы, што дазволяе ствараць іерархічных агентаў. Іншыя працуюць асінхронна або включаюць логіку павторных спробаў з экспансіяй у часе. Фрэймворк не пакушаецца разумець, насколькі складны вузел зсероўні.
Рэшткі
Рэшткі вялікі, куды будзе пераданы кантроль, і існуе два іх відзенні з аблічна разнымі сэмантыкамі.
- Статычныя грані ўсегда дэтэрміністычныя. Калі завершаецца выконанне вузла A, кантроль завжды пераходзіць да вузла B. Яны паводзяцца як звычныя вызовы функцый і падыходзяць для последоўнасцей, вядомых загадзя. Пасля ініцыявы доследнага задачы, напрыклад, завжды следуе збір дадзэнняў.
- Умовныя грані направляюць трафік дынамічна на адной залежнасці ад стану. Калі завершыўся збір дадзэнняў, можа знадобіцца выявіць, чых дадзэнняў достатнька для пачатку аналізу, чыі неудачныя вызовы API трэба перапрыявіць. Такі выбор не можа быць здабыты ў момент праектавання, таму функцыя направлення вырабляе яго пад час выканання.
Функцыя направлення пераглядае тэкушчы стан і вяртае строку, якая называе шлях, які трэба выбраць. Фрэймворк зберагае супараднік між гэтымі строкамі і вузламі-падзеямі. Рэзультатам являецца спосаб стварэння дрэва рашэнняў, логікі перапрыявлення, апрацоўкі адзінакоў і адаптатыўных прабегоў, пры чым направлення застаецца явным і прабавамым.
Стан як спяльная памяць
Управленьне станам являецца тым аспектам дызайну LangGraph, які робіць яго ўзначальным. Об’ект стану — гэта спяльная структура, якая пераводзіцца па графе. Кожны вузел чытае тэкушчы стан, а всі змены, якія ён вяртае, з’едынаюцца перад тым, як запускаецца наступны вузел. Такім чынам кожны крок будуецца на тым, што было вывучана ранейшымі крокамі.
Стан можна задаць за дапамою слоўнікаў з атрыбутамі тыпу або модэляў Pydantic, што забезпечвае безпеку тыпаў і чыстае правіле взаімадзеяння між вузламі. Схема прызначае, якія поля існуюць, якія у яных тыпы і як з’едынаюцца змены. Гэты аспект лёгка працізнуць, але ён мае вельмі важлівое значэнне.
Калі вузел вяртае апдэйт, LangGraph павінен вырашыць, як яго спаўніць з тым, што ужо ўсётакі ўсёстые. Для строкі чыстае цыфры замена старага значэння ўсё зрозумела. Для спіса чыстае словніку так не ўсё. Чы хаця бы вярнуты спіс трэба дадаць у канец, заменіць стары чы спаўніць элемент за элементам? На гэтыя пытанні адпавядаюць рэдзюсэры.
Рэдзюсэры
Рэдзюсэр — гэта функцыя, якая керуе тым, як апдэйт спаўніваецца з існуючым станам. Рэдзюсэры ператвараюць стан LangGraph з простага кантэйнера ў ўсё, што можа кераваць патэранамі накоплення.
Па ўзначэнні новая значэнне проста заменяе старое. Гэта падходзіць для большасці поль, але не падходзіць для дадзэнняў, якія накапліваюцца. Уявіце сабе спіс памылак, які сабрал проблемы пад час выканання. Вы не хочаце, каб кожны элемент стыраў пакананыя елементы. Вы хочаце, каб новыя памылкі дадаваліся разам з старымі. Функцыя add_messages рэдзюсер следуе гэй парадыгме, і гэты патэрн можа быць застосаваны не толькі да паведамленняў.
Вы можэце напісаць спецыяльны рэдзюсер для будзь-каго поля. Яго вхіднымі дадзеннямі ёсць значэнне, якое вяліся ў стане, і новае значэнне, а выходным — тое, што поле павінна мець пасля гэтага. Для памылак гэта можа быць з’едынэнне спісаў. Для слоўнікаў — глыбокая з’едынэнне вярстакаваных структураў. Для лічыльнікаў — дадаванне цыфр.
Рэдзюсеры прыўязваюцца за дапамогою патэнтаў Annotated у Python, таму схема застаецца дэкларатыўной:
from typing import TypedDict, Annotated
def append_lists(existing: list, new: list) -> list:
return existing + new
class AgentState(TypedDict):
query: str # Simple replacement
results: Annotated[list, append_lists] # Custom accumulation
iteration: int # Simple replacement
Гэта робіць прыемлівым і цэнтрызаваным спосаб дзеяння з аднаёмленням даных, замест таго каб яны былі распылены па адзінаковых вузлах.
Стварэнне контрольных пунктав
Агенты, якія выконваюць задачы у працоўнай асяроддзі, часта працуюць довга, выконваюць дорогіы запыты API або керуюць операцыямі, якія не павінны быць втрачаны з-за тымчасовых адказоў. Стварэнне контрольных пунктав — гэта механізм, які рашае гэтыя проблемы. Калі гэта функцыя ўвімкнута, LangGraph зберагае полны стан пасля таго, як кожны вузел завершыў сваю працу. Калі працэс зламаецца або заканчыцца памяць, выконанне можа будзе продажыцца з последнага контрольнага пунктава, замест таго каб пачыналася занова. Хуткая последовальная скрыпта стае рабочым працэсам, які можна практычна продажыць.
Контрольныя пунктавы таксама дазволяюць іспользоваць падход, у яком у працэсе выканання ёсць удзел чалавека. Выконанне можа быць націснутае на выбраны момент, каб чалавек могаў пераглянуць або дадаць інфармацыю, а пасля таго продажыцца далей, калі ён даў адказ. Паколькі контрольны пунктав фіксуе точны стан у момент націснення, не мае значэння, чы растуць дні між цім.
Сховышча, якое знаходзіцца за яго, можа быць падключаемым. Контрольныя точкі ў памяці падыходзяць для разработкі, SQLite забезпечвае локальную стойкасць дадзенням, а Redis падходзіць для распадзеленых сістэм. Граф застаецца тым самым, і зменшыцца толькі спосаб рэалізацыі контрольных точак.
Умовна маршрутазацыя
Маршрутазацыя — гэта і частка, дзе поведзенне становіцца справжна дынамічным. Выбір наступнага крока пад час выканання на аднойчы скаладзеных дадзенах — гэта тое, што адзеляў жорсткую аўтаматызацыю ад адаптабельнага агента.
Функцыі маршрутазацыі і супарабатанне канцоў
Функцыя маршрутацыі — гэта невялікая функцыя на Python, якая аналізуе стан і вяртае строку. Калі выконанне доходзіць да умовнага рыбка, LangGraph вызывае гэтую функцыю, берае строку, знаходзіць адпаведны вузел у схеме мапавання і перадае керуванне яму. Пакалькі маршрутацыя адбываецца праз строкі, а не безпосерэднія звязкі з вузламі, вы можэце рэдагаваць схему мапавання без змены функцыі, або заменіць яе на іншую функцыю маршрутацыі без змены структуры графа.
Тыповыя запытаннія, касаюцыся маршрутызацыі, включаюць пытанні пра тое, чы ўсё жыццё для продажу дастаткова, чы операцыя была успешной чы трэба яе прабаваць знову, чы досягнут ліміт прабоўкаў, а таксама чы доверлівасць да аналізу дастаткова высока, каб дзеяць на ўжо. Функцыя можа бачыць усю становішча, таму яна можа пораўняваць калькюляцыі, выкананыя вычытанні, аналізаваць зовнішнія умовы чы застосаваць правіла бізнесу. Ядзіныя трэбаванні — каб яна была дэтэрміністычной і чыстай, тое ўсё жыццё даўшы той самы адказ для той самай становішча.
Утрыманне ад бесканцэнтных цыклаў
Цыклы дазваляюць эфектывае ітэрацыя, але таксама ствараюць адзінак для бесканцэнтных петляў. Агент, які застраг у прабоўках, можа без канца спрацоўваць рэсурсы, а LangGraph праставляе калькюляцыі, якія дапамагаюць утрымацца ад гэтага.
Самым простым спосабам ёсць вікорыстанне лічыльніка ў стане. Функцыя маршрутызацыі паўставляе яго з максімальным значэннем і надае керуванне вузлу завершэння, калі перакроюецца гэты ліміт. Практычна кожны агент у прымэтнай експлуатацыі вікорыстоўвае гэты падход. Болей рафінованыя варыянты включаюць выяўленне збліжэння, калі працэс зупініцца, калі разлік між ітэраціямі стане меншым за певны порог, а таксама завершэння на адлік часу, пры яком урахоўваны ўсё прыгэты час.
Галоўная мысль такая: запобежэнне цыклам — гэта задача маршрутызацыі, а не абмежэнне самай платформы. LangGraph дае можлівасць стварыць захоўнікі, прыстосаваныя да вашага кейсу, замест таго, каб накладваць універсальныя правіла.
Інструменты: ад мовы да дзеяння
Агенты становяцца практычна корыстнымі, калі LLM можа вярбавацца з зовнішнімі сістэмамі. Інструменты — гэта спосаб, як розумэнне мовы ператвараецца на рэальныя дзеяння.
Шаблон выканання
У LangGraph інструмент — гэта вузол, які выкарыстоўваецца для выканання якой-небудзь дзеянні паza межамі процэса. Ён можа вызваць API, запытаць базу дадзэння, запрацаваць код або адшукаць інфармацыю ў Інтэрнэце. Ён прыме параметры з стану, выканае операцыю і вяртае рэзультаты як абнаўленні стану.
Гэты патэрн становіцца моцным, калі яго спаўнае з рашэнням LLM. Вузол LLM чытае стан і выбірае, які інструмент вызваць. Функцыя маршрутацыі перадае кантроль на відпаведны вузел інструмента. Інструмент запрацоўвае і запісвае свой рэзультат у стан. Кантроль вяртаецца да LLM, які інтэрпрэтуюць рэзультат і выбірае наступны крок. Гэта продзеўжаецца да таго часу, пакуль не будзе досягнута мета.
Саврэменныя мадэлі падтрымляюць вызыв функцый, тое значыць, яны выдаюць структураваны запыт з назвай інструмента і яго параметрамі. Вузел LLM парсуе такі запыт з адпаведнай адпаведзі мадэлі і запісвае выбраны інструмент у стан. Функцыя маршрутацыі чытае гэты выбор і направляе поток да правільнага вузла інструмента.
Раскрыцья памылак інструментаў
Зовнішнія сістэмы выконваюцься некорэктна, выклікаюць тайма-аут, вяртаюць некарэктныя даны і наражаюць на рызык пярэдбачэнні. Узлы інструментаў павінны быць гатовыя да такіх сітуацыяў.
- Зафіксаваць і адзвярнуцца. Зафіксаваць асывячанні, запісаць іх і вярнуць дакладныя відомасці памылкі ў стане, а не дазволіць ім зламаць агента. Тады LLM зможа пазнакоміцца з прычыной проблемы і спробаваць знову з іншымі параметрамі або выбраць іншы падход.
- Тайма-ауты. Абгорнуць операцыі так, каб яны завершаліся пасля максімальнага часу выканання. Адна повольная API не павінна зупініць весь агент.
- Параболка. Аналізаваць адпаведзі і пераканацца, чырпаюць яны пасоў схемы. Некарэктныя даны павінны спрычыніць працэс адзвярнення, а не быць збераганыяя, ўскладнюючы працу наступных узлоў.
Цыкл ReAct
ReAct, скрацанне ад «reasoning and acting», — гэта базовая архітэктура агента, яку LangGraph выражае наўмысна, і яе аналіз паказвае, як іншыя концэпцыі взаімаўзаесяць.
Як працюе цыкл
Усё пачынаецца з вузла для рассуджэння. LLM аналізуе стан і выявляе, што робіць далей: вызваць інструмент, запытаць пра дадатковую інфармацыю, даць заканчальную адпаведзь або прабаваць атрымаць ввод ад чалавека. Сюды і ўжо маюць значэнне можымасці мадэлі, адколі яна можа ацэніць складны кантэкст і зробіць тонкі выбор.
Як толькі прынімаецца рашэнне прыняць дзеянне, кантроль пераходзіць да вузла дзеяння, які выканана выбраную операцыю – будзь то вызов API, вычысленне чыя-небудзь запыт да базы дадзэнняў. Вузел дзеяння застаецца дэтэрміністычным і спецыялізаваным, выканана запыт і вяртаюцца рэзультаты.
Далей прыходзіць вузел абзяру, які дадае рэзультаты да стану і падготавляе іх для LLM. Ён можа фарматаваць даны, фільтраваць непатрэбны матэрыял чыя-небудзь вырахоўваць дапаможныя показнікі, якія спрабуюць павялічыць зрозумеласць рэзультатаў. Пасля чаго цыкл знову вяртаецца да аналізу з болей багатым станам. LLM бачыць, што адбылося, і выбірае наступны крок, продовжуючы да таго часу, пакуль у яго не будзе достатнько інфармацыі, каб завершыць задачу.
Знанне пра тое, калі зупініцца
Рашэнне пра тое, калі завершыць цыкл, ёсць важлівай часткай яго функцыонавання, і ў практыцы спостэрагаецца калькі распаў.
- Цель аджэнта дасягнута. Самы ўзгодны случай: LLM паведамляе, што задача завершана, і дае фінальную адпаведзь. Функцыя керавання гэта зафіксавае і пераходзіць да вузла завершэння.
- Ліміт ітэрацый. Пасля максымальнага колькасці цыклів «выявленне прычыны – дзеянне» цыкл заканчваецца, незалежна ад таго, чыргава цель дасягнута чы ні, таму аджэнт завжды зрэштаўшы зупініцца.
- Прага паверы. Калі мадэль досягае достатней паверы, напрыклад 95%, яна можа зупініцца раней, замест таго каб збірала інфармацыю, якая дае ўсё меньшыя рынкі.
- Фатальныя адказы. Калі крытычныя операцыі продовжваюць не выконвацца або аджэнт сталкнуўся з сітуацыяй, якую не можа адрабатваць, ён павінен завершыцца з адказам пра адказ, замест таго каб безцэльна працаваць далей.
Калькі аджэнтов, якія працуюць разам
Дзеянні, які выконваюцься спецыялізаванымі агентамі, частацей лепей падходзяць, чым адна монолітная адпаведна структура. Графік дапамагае проста ўсвядоміць калькіят прыемы саавершання задач.
Іерархія
У іерархічным дызайне адпаведны планавальнік дзеянні дзеліць на часткі і параджае іх спецыялістам. Ён стабілізуе загальную мету і коордынуе дзеянні, але сам не выконвае дэталізаваную працу. З тэхнічной точкі зору дзеянні дзеянні некалькі вузлаў запускаюць іншыя скомпіляваныя графікі. Вузел планавання можа аналізаваць складную задачу, раздзеляць яе на часткі і запускаць спецыялізаваны графік для кожнай з частак. Рэзультаты вяртаюцца да планавальніка, які ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ў
Агенты таксама можаць саўершаць саавершанні як равныя, кожны дапамагаючы сваёю экспертызай. Команда програмных агентоў можа складацца з адзінаковых агентоў для архітэктуры, рэалізацыі, тэставання і документавання, якія всі спілкуюцца праз спяльную шыну паведамленняў. Гэта рэалізуецца за дапамогою спяльнага стану, які кожны агент можа чытаць і запісваць. Функцыя маршрутацыі выбірае, хто будзе далей дзеяць, на адной часці вазьмоўшы за основу стан і неабходныя навыкі. Кожны агент запісвае свой вклад, пазначае яго метаданнымі пра тое, чым ён займіўся, і вяртае кантроль, а маршрутазатор выбірае наступныяпатрэбны агента.
Схемы саавершанні між равнымі прыносяць разнараднія падходы і дазволяюць агентам з’яўляць блекі іншых, пры чым адні можаў знайсці аблыску ў аргументах іншага.
Дыялог і кансэнсус
Для важных рашэнкаў калькі агентаў можа незалежна рашыць проблему, а пасля — спрачацца, каб дасягнуць адноснага сагласнасці. Гэта запоўнівае ідэі констытуцыйнага ІІ і спрыяе спрыйманню розбіжнасцей як сігналу якосці. Тры агентаў аналізуюць сітуацыю і кожны прыметае рашэнне. Модэратар адбывае дыбаты па змене, пры чым кожны агент прыставляе свае аргументы, крытыкуе іншыя і павінен адпаведаць на конкрэтныя крытыкі. Пасля калькі раундаў на стадзіі стварэння кансэнсусу об’едынаюцца даследжэнні, што дае рашэнне, можліва, з урахоўваннем найболей пераканаючых аргументаў.
Гэты падход выяўляе галюцынаціі і памылкі ў аргументацыі, якія моглі бы застацца непазначанымі у аднаго агента, але стаюць віднымі, калі калькі агентаў аналізуюць проблему з разных бакоў.
Адзыскванне інфармацыі ўнутар агентаў
Метод адзысквання інфармацыі, дапамагаючы якому ствараецца тэкст, дае агентаў возможнасць выкарыстоўваць вялікія базы знанняў і матэрыялы па адпаведным домэнам, а графыя робіць гэтае падключэнне ўлогавым.
Адаптаванне падзейдзенняў па запатранню
У класычным RAG інформацыя запрашваецца аднойчы на пачатку задання. У агентнам RAG адаптаванне падзейдзенняў стае інструментам, які агент выкорыстоўвае кожны раз, калі з’яўляецца прычына для змян. Агент прыступае да логічных выводамаў на аднойчы з базовымі знаннямі. Калі ён сталкнуецца з пытаннем, на якое не можа адпаведзець, або калі йому трэба больш кантэксту, ён складае запіт на адаптаванне падзейдзенняў, выкорыстоўвае інструмент і продолжае працу з новым матэрыялам у своем стане.
Гэты падход лепшы за падход з падготавкай ўсіх дадзенняў загадзя з двух прычын. Ён танней, адколькі агент запрашвае толькі тое, што яму трэба. А ён таксама точней, таму што запыты формуюцца на аднойчы з тым, што агент зараз розумее.
Запыты, кераваныя станам
Праўя парадка выявляецца тады, калі запіты адбіваюць усё, што было засборана да гэтага часу, а не толькі первісны вопыт. Возьмімо розследаванне компаніі. Яго можа пачаць запіт з шырокага аптэкстуальнага аналізу. У рэзультатах згадваецца няякшае адкупілле, што спрыяе стварэнню ціляванага запіта пра гэтыя угоды. Гэта выявляе прынтанні, якія прыводзяць да запіта пра адпаведныя правілы. Кожны запіт будуе на попераднім, таму вы отрымваеце сфармаванае розследаванне, а не хаотычны скуп лінків.
Калькі вучоркі
Агенты часта выкарыстоўваюць вучоркі з разным часам адпаведзення, вартасцю і надзеяйнасцю: внутранія дакументы, зовнішнія API, пошук у інтэрнэце, спецыялізаваныя базы дадзеных. LangGraph падтрымляе стратэгіі з калькі вучоркі. Агент можа спачатку пераканацца ў шырокай локальной кэш-базе, пасля чаго перайсці да API і выкарыстаць дорогі пошук у інтэрнэце толькі як апошняе рашэнні. Або ж ён можа запытаць калькі вучоркі паралельна і папросіць LLM супрацаваць з адпаведнымі адпаведзеннямі, якія могу суперсечыцца.
Логіка маршрутацыі можа выбраць джэрэлле на адпаведнасць тыпу запытку. Запыткі, якія выкарыстоўваюць факты, направляюцца да структураванага базы дадзеных, концэптуальныя запыткі — да вектарнага пошуку сярод дакументаў, запыткі пра няўяроўнае часоўпаданне — да пошуку ў інтэрнэце, а історычныя запыткі — да адборнай базы знанняў.
Падготовка да прыменення
Агента для падтверджэння концэпцыі лёгка стварыць за дапамою LangGraph. Для прыменення ў рэальных умовах патрабуюцца праблемы, зв’язаныя з надзеямасцю, стварэннем адпаведных дадзеных і кераваннем працэсамі.
Рэгулюванне памылак на кожным роўні
Агенты вырабаткі разв’язваюць проблемы на калькольных роўнях. Вузлы інструментаў фіксуюць прыгадваныя бяды і вяртаюць іх у вастоце апдэйтаў стану, а не як асключэнні. Функціі маршрутацыі пераказваюць стан бяд і насталяваюць шляхі павторных спробаў з экспансіяйным затрымкам. Граф включае спецыяльныя вузлы для разв’язвання бяд, якія аналізуюць сумарныя бяды і вырашаюць, чы робіць павторную спробу, перайсці на альтэрнатыўны варыянт чы грацыязна завершыць работу. Для крытычных операцый пры разлічных бядах можа быць выкорыстаны «цыркуіт-брэйкер», які паўзае спробы, запобiegаючы каскадным наследкам і захоўваючы апарат, які не працуе, ад дадатковага навантажэння.
Аналіз таго, што адбылася
Калі ўтвараецца проблема, неабходна інформацыя пра тое, што зрабіў агент і чаму. LangGraph інтэгруецца з такімі платформамі, як LangSmith, каб запростаць дэтальныя відлікі выканання кожнага вузла, пераходу стану і вызову LLM. Вузлы должны выдаваць структурованыя лог-файлы з достатнім кантэкстам, які можа адказаць на пытанні пра ўхваленыя імі рашэнні. Відлікі часу паказваюць узгорнутыя моменты, колькасць токенав падтрымлівае расчыткі віткоў, а трэкінг взаімадзеі з корыстнікам дапамагае у ацэнцы. Перэгляд сітуацыі з пунктав перапыткі ёсць особліва корыстным: вы завантажваеце точны стан, у якім выйшла проблема, і пошукаеце ўсунуць ёё прычыну.
Скорачэнне віткоў
Вызовы LLM станавяць большую частку віткоў у большасці агентаў, а калькі прыемаў дапамагаюць скорачыць іх без падрыву якасці.
- Выбір модэлю. Іспользуйце моцны модэль, такі як GPT-4, толькі для складных задач. Простыя задачы класыфікаціі чы выкарыстоўвання інфармацыі крашчэ перадаваць болей шырокім і дэшавым мадэлям, выкарыстоўваючы логіку маршрутацыі, якая аналізуе задачу.
- Кэшаванне адказоў. Храніце выходы для ідэнтычных або сэмантычна падобных вхідных дадзеных. Калі тая ж аналіза павтарыцца, кэшаванне абэрнае зайвыя запыткі, і эмбеддынгі можа падходзіць да запыткаў, якія сформульаваны інакш, але маюць тое ж значэнне.
- Скорачанне запыткаў. Кораткія запыткі, якія маюць толькі неабходную інфармацыю, захоўваюць токены. Шаблоны з заменай зменных дапамагаюць падтрымваць ўніверсальнасць.
- Раннія завершэнне. Зупініцеся, калі агент ужэ мае достатню інфармацыю, а не калі будзе выкарыстана фіксаваная кантыяцыя ітэрацый.
Кансэпты дызайну
Адпрацоўка агентаў LangGraph паказвае, якія патэрны адзеляюць стойкія сістэмы ад нестойкіх пратэйпаў.
Схема стану
Схема ўтварае адну з фундаментальных частак. Ўжывайце модэлі Pydantic замест абыякшых слоўнікаў, каб верыфікацыя могла як можна раней выявіць адмыліні, а таксама задокументавайце значэнне і прызначэнне кожнага поля. Апшыякаваныя поля дазволяюць разным вузлам поступова дапамагаць, тады калі неабходныя поля гарантуюць наявнасць крытычна важлівых дадзеных. Дзяленыя адунацыі разматоўваюць стан, які можа нясці разныя формы залежна ад выбранага шляху. Ўжывайце адмова ад глыбокага вярстачвання, якое ускладняе доступ да полей. Разгладзіце структуру, калі гэта можліва, выбірайце назвы, якія паказваюць асоціяціі, і трывожыце метададзеныя окрэмна ад дадзеных домэна, каб інфармацыя пра кераванне застаўалася аддзельной.
Граніцы вузлаў
Хорашыя вузлы добра практыкуюць адну задачу. Гэта дазволяе іх вікорыстоўваць у розных графах, а таксама спрошчае ў тэставанні і адтрыманні. Вузлы-інструменты должны вырашваць супрацоўку толькі з зовнішнімі сістэмамі, а не маюць прымешванай бізнес-логікі. Вузлы-трансфармацыі выконваюць трансформацію без прымешвання рашэнняў. Вузлы-рашэнні направляюць потокі дадзеных без выкарыстоўвання якіх-лібо операцый. Хаця бы трэба ухіліцца ад супакрытых парадоксальных наследкіў: вузлы павінны быць настолькі чыстымі, насколькі гэта можліва, якомога ясней вяртаючы кожную змяну стану, замест таго каб мяніць глобальныя зменнікі.
Форма графа
Структура должна адаптавацца да падобнаяся способу, якім агент выконвае логічныя выводы. Пачніце з етапу наладжэння, які пераканальвае вхідныя даны і падготавлівае кантэкст. Потым збірайце даны, можа, паралельна. Дадзіце вузлы аналізу, пасля — вузлы сінтэзу, якія ствараюць выходны рэзультат, і вузлы фіналізаціі, якія працююць з данымі пасля ўсіх ператварэнняў. Размясціце умовныя рэшткі ў рэальных пунктах прыняцтва рашэння, дзе наступны крок залежыць ад аднакоў, а статычныя рэшткі — калі прайом ёсць дэтэрміністычным. Храніце кожную графіку на аднам роўні абстракцыі. Калі частка графікі рэалізуе складную падпроцедуру, вынесіце ёю ў самастоятную графіку і выкорыстоўвайце яе як вузел.
Тэставанне
Графы можна тэставаць на калькі разных рэгламентаў. Выконваюцься тэсты на адзінкавыя элементы пасля таго, як задаецца макетны стан і пераканальваецца праверкі змян. Функцыі маршрутацыі тэстуюцца пасля таго, як задаюцца разныя станы і пераканальваецца праверкі вярнутага шляху. Інтэграцыйныя тэсты выконваюцца для цэлых графаў з вядомымі вхіднымі данымі, ў тым час як пераканальваецца фінальны стан. Для таго, каб тэсты былі шырокія і прыгадныя, імітуюцца адпаведныя адпаведзі LLM, а для рэалістычных умов выкарыстоўваюцца запісаныя рэальныя адпаведзі. Тэсты, апараныя на аснове атрыбутаў, можаць пераканальваць правільнае працаванне графаў у шырокім дыяпазоне вхідных дадзеных. Неабходна рэшыткальна тэставаць крытычныя шляхі, а таксама шляхі, якія выклікаюць адказы, адколькі іх важка выклікнуць у рэальных умовах, але яны ўжоць неабходны, калі такія адказы выклікаюцца.
Рашэнне пра тое, чы рэальна яго потрэба
LangGraph ёсць моцным інструментам, але не кожная аплікацыя, якая выкарыстоўвае LLM, выклікае яго неабходнасць.
Гэта схема падходзіць тады, калі агент павінен працаваць ітэратыўна, збіраючы і аналізуючы інформацыю і выявляючы, чы робіць далейшыя дзеянні. Яна таксама падходзіць, калі тэкст керавання залежыць ад стану пад час выканання, напрыклад, пад час пракатоў, вярнення пасля адказаў або адаптатыўных робочых пралэцэсаў; калі калькія інструменты або сістэмы маюць складныя залежнасці; калі стан неабходна зберагаць між разнымі крокамі аб сесіямі; калі выкананне должна націснуцца і пачацца зноў для людзей; або калі калькія агенты саавантажваюцца аб утвараюць іерархію.
Дасцца і ўсё простае, калі задача — гэта звычны запіт і адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адп
Парал практычных аспектаў, калькі тэхнік адкрываюць дадзейніяя можлівасці.
Паралельная експанзія. Узлы, якія не залежаць ад рэзультатаў іншых узлаў, можаць працаваць адразу. Напрыклад, узлы збору дадзэнняя, якія выкарыстоўваюць разныя API, скорачаюць загальны час выканання, калі працуюць паралельна, а фрэймворк збірае і з’едынае рэзультаты. Патрэбны явныя паралельныя зв’язкі, і трэба быць вялікім у паведамленні, што узлы сапраўды незалежныя, без жадных скрытых зв’язкаў праз спяльныя рэсурсы аб глобальны стан.
Стрыімінг. Для дзейнікаў, якія працуюць дзялга, паказанне проміжных рэзультатаў павышае якасць работы. Узлы можаць выдаваць частковыя абнаўленні стану, якія спостэрагачы бачаць адразу. Гэта падходзіць для стварэння атласаў, дзе параграфы можаць з’яўляцца ў момент ўведэння, і для пошуку, дзе рэзультаты паказваюцца ў момент ўскарыстання.
Падграфы. Складныя агенты выгадваюць ад іерархічнага разбіяння. Падграфы складаюцца окалічна і выклікаюцца як вузлы ў гэнеральным графе, прымоўваючы частку стану гэнеральнага графа і вяртаючы абнаўленні, якія злучаюцца з яго станам. Разныя інжынеры можаць кераваць разнымі падграфамі, развойваць і тэставаць іх незалежна, а таксама перадаўаць ужо існуючыя падграфы для вікорыстання ў калькі гэнеральных графаў.
Дынамічныя змены графа. Большасць графаў застаецца незменнымі на этапе праектавання, але ў дзеякіх прыглушэнных случаях граф моцна змініцца пад час выканання. Агент планавання можа стварыць спецыяльны граф пасля аналізу задання, на ходу ствараючы вузлы і рэшткі. Гэта ускладнюе аналіз ўзораў ўжыцця, таму такі падход трэба вялікай асторожнасцю. Однак ён дазволяе мета-агентам разрабатваць і запускаць спецыяльныя рабочыя праграмы для новых тыпаў заданняў.
Заключныя заўважэнні
LangGraph адклікаецца зрэлым наборам засобаў для агентных сістэм. Яго сіла не ў складнасці, а ў тым, насколькі прымітывы падходзяць да спосабу дзеяння агентаў: яны рассуждаюць, дзеяць і спазіруюць у ціклах, прыменяюць рашэнні на аднойчы зібраных ведамасцях, коордынуюць засобы і прыстосоўваюцца, калі ўсё йдзе не так. Вы выражаеце гэтыя патэрны безпосерэдна, а не ствараеце іх з нуля.
Дабы парадуць хорашыя рэзультаты, неабходна володзець методамі керавання станам, умовнага маршрутызавання і інтэграціі засобаў як архітэктурнымі патэрнамі, а не проста як функцыямі. Найлепшыя прыклады застосоўкаў адзічайная адзінакавае планаванне схемы стану, чыстыя адпаведнасці вузлаў, рэшучая борацьба з адмылкамі і цяплыя методы спазірування. Фрэймворк прадае засобы, а не рашэнні. Вашы доменныя ведамасці і суджэнні вялікія ў тым, насколькі яны будуць прыменены, таму пачніце з простага, рана пераканайцеся ў своіх прыпусках і дазвольце рэальным трэбаванням, а не уявным, формаваць архітэктуру.
Супаўзвязаныя матэрыялы
- Агенты чы робочыя праграмы? Раздзелэнне процэса аналізу і выканання ў корпаратыўнай штучнай інтэлекту — Аднойчы агенты выкорыстоўваюцца для выявлення намераў і пошуку інфармацыі, а дэтэрміністычныя робочыя праграмы — для адбыцця транзакцый: як RAG, LangGraph, MCP, працэсы затверджэння і SQS ствараюць болей безпечную архітэктуру.
- Рэкамендатор K-драмаў на аднойчы агентах: BERTopic, RAG і метод злучэння взаімных рангаў — Як рэкамендатор K-драмаў, які ведае прыязні глядача, спалюе тагі BERTopic, практыкуе пошук у ChromaDB, выкарыстоўвае агента для анкетавання, расшырэння запытоў і метод злучэння взаімных рангаў прычым пераранжаванні ад LLM.