Проектаванне стойкіх графаў AI-агентаў: перапрыбуткі, альтернатывныя варыянты та GraphRAG
Выучыце, як ствараць робочыя процесы AI-агентаў, стойкіх да абыякоўых парадох, з викорыстаннем явных галузей для адпаведзення на неудачы, логіки перапрыбутку, LangGraph, а таксама калі GraphRAG прадае над звычным RAG чы роўнамі агента.
Калі выходзяць на працу адсутнасці: планаванне альтернатывных шляхоў
Продаваючы далей тое, чаму мы пасвятилі пачатковую дыскусію, уявімся, што на гэты момент агент з фінансавых даследжэнняў стаў значна болей прыгожым.
Памятайце прыклад пытання, якое можа задаць менеджер портфеля — напрыклад, чаму адпаведны акцыя пахілася пасля публікацыі звясткі пра ўспэльнення, і якія рызыкі трэба старанна адступіцца. Граф практычна можа разбіць такое пытанне на часткі, запрашаць данні з разных джэрел, аналізаваць рынкавыя рэзультаты, падготавіць адпаведны адказ, пераканацца ў яго правільнасці і, калі трэба, перадаць яго чалавеку-рэвізору — фактычна, гэта ўзор работы з участю чалавека.
Аднак ёсць адна дыякт, якую мы пачаўна не розглядалі: што выходзіць, калі якісь з етапаў гэтага процесу не працюе?
Уявіце сабе, што граф доходзіць да веткаў, якія адпаведна за кантролем дадзеныяў рынку.
Ён адправляе запит пра змяны цэны і обсяг трынку, але прадаўцы даных не адпавядае.
У такім случае проста перейсці да крока Analyze так, як нічога не сталося, не ўзьмашліва.
У той жа час абаранець цэлага процесу зазвычай ёсць занадта крайнім рашэнням, адколі системы праўзводства патрабуюць якога-небудзь альтернатыўнага спосабу дзеяння.
Самэ гэтая прычына, чаму аблучанне заслуговае на тое, каб яго расслягалі як свой окремы галузь у графе, а не як дадатковы элемент.
Первісны, просты прайход выглядае так:
Search Market Data
↓
Analyze
Мы можамы перакашталеваць яго ў кашто-тае падобнае да гэтага:
Search Market Data
/ \
↓ ↓
Success Failure
↓ ↓
Analyze Retry (how to handle this!?)
З такой структурам граф мае чыстае рашэнне пра тое, што рабіць, калі запит аблучваецца.
Кантролюванне логікі павторных спроб
Якщо павторная спроба будзе успешной, рабочы процес проста продовжыцца як звычайна.
Якщо ж усё зноў не запрацюе, можа буць логічней перейсці на іншы джерэла даных або перадаць справу на розгляд людзя, замест таго кожны раз падаць на той самы запит.
Ось болей детальная версія гэтага розгалужэння:
Search Market Data
/ \
↓ ↓
Success Failure
↓ ↓
Analyze Retry
↓
┌──────┴──────┐
↓ ↓
Success Failure
↓ ↓
Analyze Alternative
Source
Тут важліва не колькість спроб павторэння — а тое, што обработка неудач вбудована ў дзеянне графа з самага пачатку. Як паказана на дыяграме, разныя виды неудач можу прывести да розных шляхоў.
Скажамо, API з данымі рынку проста выключаецца через таймаут. Павторэння є разумным, адколі проблема, верагатна, тымчасовая.
Але якщо запит праходзіць нормальна, але проста не вяртае нічога корыстнага за даны періяд, павторэння таго самага запиту нічога не дасть.
У такім случае кращы варыянт — запитаць у альтернатыўнага, затверджанага джэрэла даных.
Якщо і ў такім случае нічога не будзе атрыбуавана, верагатэльна, ситуацыю варта перадаць чалавеку-рэвізору. Саме такія деталі вядуць ад нестабільнага процесу работы да надзеянага.
Функцыя маршрутацыі, якая гэта керуе, можа выглядаць так:
def route_after_market_search(state):
if state["market_data"]:
return "analyze"
if state["retry_count"] < 2:
return "retry"
return "human_review"
Гэтыя умовы задаюць чыстыя межы графу — дазволена пракатка, але не безканцова.
Той жа прынцып застосоўваецца да всіх частак графу, адколі па дорозе можа выйсці багато проблем:
- Крок атрымання дадзеных можа зазнаць неудачы
- Званне да LLM можа зазнаць неудачы
- Адпаведны источнік можа быть тымчасова недоступны
- Сгенераваны адказ можа не працаваць пасля пераканальнага адзначэння
У замяне таго, каб усю аплікацыю загорнуць у ўжоўдзеньны кантролер памылак, можна на кожнай вузле аддзельна вырашыць, што трэба зрабіць самэ тады, калі ўтвараецца проблема.
Гэта ў частыні прычын, чаму моделюванне рабочага практыку як графа ёсць прываблівым. Калі выйшае аберэчна ситуацыя, вам не трэба запытацца абстрактным пытаннем на кшталт "чаму агент не выканаў задачу?"
У замене вы можете праследаваць точны шлях, які прыйшоў у выкарыстоўванні, і точна выявіць, дзе ўсё пайшло не так:
Understand
↓
Search Filings ✓
↓
Search Earnings ✓
↓
Search Market Data ✗
↓
Retry ✓
↓
Analyze
↓
Write
↓
Check
Гэта дае вам конкрэтны аб’ект для аналізу, а не проста "чорную скрынку"
Звычайна, калі граф расширваецца, кераванне всімі гэтымя элементамі вручную пачынае выклікваць значныя зусилля — і гэта ўсё ж правамерная прычына для занепакоення.
У такі момент вам трэба разв’язваць проблемы логіки выканання, керавання станам, умовнага направлення, обробкі практык пры спробах зноў, зберагання дадзеных і спосабу перагляду таго, што на самай працэ выканання насправды адбылася.
Гэта саме тая ситуацыя, дзе фреймворк вырашае проблему неабходнасці занова ствараць тую ж самую систему коордынаціі на кожны проект.
Самэ гэту праслюду падтрымвае LangGraph.
LangGraph
За дапамою такой палітры ваша рабочая схема можа быць раздзелена на окольныя доследнічыя задачы, пасля чаго можна з’едыніць рэзультаты, практыкаваць зноў тыя крокі, якія не выйшлі, на час зупініцца, каб чалавек могаў дапамагчы, а таксама стежыць за станом працы праз усі етапы ўжывання.
Звычайна, стварэнне такой графікі і ўжыванне яе все рава вымагаюць працы.
Вы моглі б самі кераваць усім процесам, але гэта значыць, што вам даведзяцца пільнуваць значным колам інфраструктуры, якая будзе супакоўвацца рыжом ад вашай основнай логікі ШІ.
LangGraph створаны самэ для керавання такім слоем.
LangGraph — это палітра, створаная для будавання рабочых схем агентаў, якія выкарыстоўваюць стан і графы. У працоўным процесе агента не розглядаецца як адна петля, якая постаўляе запыты модэлю мовы пра наступны крок, а вялікі спосабом задаюцца вузлы, переходы межы ямі, спяльны стан і загальны прайскуп працы.
Вярнуўшыся да агента для даследжэння NVIDIA, які быў практыкуемы раней, его структуру можна накрэсліць так:
Question
↓
Understand
↓
┌──────────┼──────────┐
↓ ↓ ↓
Filings Earnings Market
↓ ↓ ↓
└──────────┼──────────┘
↓
Analyze
↓
Write
↓
Check
↙ ↓ ↘
Search Rewrite Human
↓ ↓ Review
└───────┴───────┘
↓
Send
Следавальнае ў тым, што структура графа і фактычная логіка прыемленае можу сасуществаваць у адной і той жа базе коду.
Спрощаная рэалізацыя LangGraph для таго ж алгорытму можа выглядаць так:
from langgraph.graph import StateGraph, END
builder = StateGraph(ResearchState)
builder.add_node("understand", understand)
builder.add_node("search_filings", search_filings)
builder.add_node("search_earnings", search_earnings)
builder.add_node("search_market", search_market)
builder.add_node("analyze", analyze)
builder.add_node("write", write)
builder.add_node("check", check)
builder.set_entry_point("understand")
builder.add_edge("understand", "search_filings")
builder.add_edge("understand", "search_earnings")
builder.add_edge("understand", "search_market")
builder.add_edge("analyze", "write")
builder.add_edge("write", "check")
Вышэўшы фрагмент ўмышлена мінімалістычны, каб вы моглі сфокусавацца на асновнай канцэпцыі — з’еднанні вузлаў, рэчак і поняцый стану, якія былі представлены раней у гэтай серыі.
- Кожны вузел обрабоўвае адну елементарную задачу
- Граф визначае, як гэтыя елементы з’ѐднуюцца між сабою
- Стан — гэта тое, што перадае інфармацыю з адного вузла на другі
Усё працоўна ў гэтым. Гэтая канцэпцыя набагато простейшая для розумення, чым спроба упакаваць усё ў адну вялічызную інструкцыю для агента.
Вы можете паглядзець на сам граф і зрозумець, калі мае выконвацца процес роботы, прычаму яшчэ перш чым заглубляцца ў тое, як реалізаваны кожны окремы вузел.
Спадзяймося, вы хочаце дадаць крок з апраўдкай чалавека пры выдачы фінальнай адпаведзі — тады вам дасцягнецца безпасова зменіць структуру процесу роботы:
Check
↓
Human Review
↓
Send
Няма прычыны хаваць такія рашэнні ў якомнебудзь запите. Сама структура робіць яе ясной і прыемнай для разумеення вашай камандай.
Чаму выбіраць LangGraph замест простага цыклу агента?
Традыцыйны цыкл агента зазвычай мае такую структуру:
Think
↓
Choose Tool
↓
Use Tool
↓
Think Again
↓
Choose Tool
↓
...
У такім разыявленні модель мае значны прастор для выбору таго, што будзе далей. Гэта гнучкасць ёсць практычна ценная, калі задача за сваёй прыродай є відкрытай.
Але процес анаізу фінансавых дадзейнаў, які описаны тут, уключае калькольныя пункты, якія, верагодна, хочаце контролаваць болей строго. Гэта разлік і ёсць сутністая частка прыблуды.
Не кожны процес выконання задачы трэбуе наявнасці циклу агента.
Разглянем калькольныя прыклады:
- Можа знадобіцца, каб система скарысталася конкрэтнымі дапамогамі перш чым яна зможа даць адпаведны адказ.
- Можа быць неабходна, каб даныя рынку і звесткі сабраныя былі незалежна адзін ад другога.
- Можа знадобіцца крок пераканання, пры яком усё будзе пераданае чалавеку-рэвізору.
- Можа хацецца, каб працэс аўтаматычна зупініўся пасля назначанага колькісці спроб.
Гэтыя не ўсе варыянты выбору, якія неабходна залишаць на рашэнне моделі ў кожны раз. У цикле немагчыма гарантаваць, што модель будзе выконваць той самы крок ў кожны момент.
Граф дазваляе безпасяродна уключыць гэтыя абмежнення ў структуру рабочага прайсупутку. Модэль все ўсё можа выконваць логічныя расчынання ў кожным окремым вузле, але супакоўчаная система вярнюе, куды ёй дазволена працаваць даўжэй.
Гэтае — галоўная разліка, якую трэба памяць. Мета не ў тым, каб адняць логічныя расчынання у агента, а ў тым, каб цікава запяць, дзе гэтыя расчынання павінны знаходзіцца, а дзе краща падходзіць дэтерміністычная оркестрацыя.
Калі вы продовжаваеце ствараць рабочыя прайсупуткі, якіе працуюць з структураванымі фінансавымі дадзеннямі, з’яўляецца новы пытанне.
Зараз наш агент запоўнюе дакументы і цифры з разных выхадных адказоў. Але што будзе, калі базавая інфармацыя будзе мець зв’язкі, якія насправды маюць значэнне?
- Компаніі прыемляюць керуючых адносоў
- Этыя керуючыя адносы часта працуюць у радах дзяржавных компаній
- Одна компанія можа выкупіць іншую
Дапэўна, мы ўсё гэта час адносіліся да кожнага фрагмента дадзеных як да аднароднага. Але вышэўказаныя зв’язкі важка адобразіць, якщо ваша база знання складаецца толькі з незалежных дакументаў.
Гэта прыводзіць нас да ўжо аднаго з ключовых паняць: GraphRAG.
GraphRAG
Дапэўна, мы ўсё гэта час викорыстоўвалі графы пераважна для керування спосабам дзеяння агента. Але графы можу служыць і другой мэты:
організаваць самыя знання.
У нашым прыкладзе традыцыйная структура RAG могла б збіраць дакументы, у якіх упомінаюцца показніки прибылі NVIDIA, прогназы, сумы выручкі, маржы і реакція рынку.
Такі падчынныя працуюць добра, калі адказ знаходзится пераважна ў калькі актуальных дакументаў. Але фінансавыя пытанні не завжды залягаюць так чыста.
Значны адказ часта залежыць від спаявання інформацыі, распадзеленай між калькамі аддзельных дакументаў.
Тепер уявіце, што хочаце зразумець не толькі тое, што аднаводзіла NVIDIA, але і як разныя часткі таго аднаводу стаюць у зв’язку між сабою (гэта самэ та ситуацыя, з якой мы маем справу).
Самэ тут і прадставляе цяню граф знаёмых.
Узамест таго, каб зберагаць знаёмыя чыста як фрагменты тексту, мы можаме смоделіраваць важлівыя энтытэты і зв’язкі межаў іх:
NVIDIA ──→ produces ──→ GPUs
│
├──→ reports ──→ Earnings
│
├──→ depends on ──→ Suppliers
│
├──→ competes with ──→ AMD
│
└──→ operates in ──→ AI Infrastructure
Граф тепер фіксуе зв’язкі, якія можаць ніколі не стаць відчутнымі пад час чытання якога-небудзь аддзельнага дакумента.
RAG у порэвананні з GraphRAG
Стандартны RAG зазвычай працюе па тэпе, калі ён запрашоўвае значымы фрагменты тэксту і падае іх модэлю як контекст. Ёсць спроставаны відблік гэтага процесу:
Question
↓
Retrieve relevant chunks
↓
LLM
↓
Answer
GraphRAG адкрывае дадатковы слой. Сістэма можа выкарыстоўваць адносы між ентытамі, каб з’ясаваць, какія інформацыі на самай праўдзе маюць значэнне:
Question
↓
Identify entities
↓
Traverse relationships
↓
Retrieve relevant information
↓
LLM
↓
Answer
Для нашага агента для фінансавых даследжэнняў гэта стае цінным, калі пытанне выкалічвае неабходнасць адночаснага з’ўязку кальколькі ентытамоў або дакументаў.
Прыпустім, керавальнік портфеля запытае: якія рызыкі могу пацягнуцься да NVIDIA, якщо спрага да інфраструктуры AI зменшыцца?
Ёжысткі адказ на гэта пытанне можа выкарыстоўваць з’ўязак між NVIDIA і яе продуктамі, кліентамі, прадавцамі, конкурэнтамі, загальнымі рыночнымі умаставамі, а таксама рызыкамі, якія ўжо былі зазначаныя ў паказвальных даследжэннях.
Граф дае системе адзыскання структураваны шлях для анаізу ўсіх эйтых звязей.
NVIDIA
/ | \
/ | \
Products Suppliers Competitors
| | |
↓ ↓ ↓
AI GPUs Supply Risk AMD
|
↓
AI Infrastructure
|
↓
Demand
З таго моменту модель можа аналізаваць усё, што было запрашана з тых перадвязанных аб’ектаў.
Гэта не значыць, што GraphRAG завжды перамага звычны RAG. Дадатковая структура практычна корыстная тады, калі адносы межа фрагментамі інфармацыі є ключовымі для заданага запиту.
Якщо адказ знаходзіцца чыста ў аднам звіте пра доходы, верагатна будзе дастатнек паўстановачага канвэйру.
Якщо для адпаведзення на запыт неабходна збір інфармацыі, распрашанай між багатымі аб’ектамі та джэрамі, падход, базаваны на графе, стае значна прываблівейшым.
Існуе ўтрохце адзіна разліка, які таксама варта памяцать: ваш граф рабочага прыему і ваш граф знанняў — гэта два абсалютна разныя элементы.
Граф прабэты працы адпавяда на запитанне, што агент должен зрабіць далей. Граф ведамасцей адпавяда на запитанне, што якія элементы з’ўязаны ў межах дадзеных, з якімі вы працуеце.
У нашай системе яны можаюць існаваць падольгу:
WORKFLOW GRAPH:
Question
↓
Retrieve
↓
Analyze
↓
Write
↓
Check
У той час як на нижнім роўні шар выкарыстоўвання дадзеных працюе з:
KNOWLEDGE GRAPH:
NVIDIA
├── Products
├── Suppliers
├── Competitors
├── Executives
├── Filings
└── Industry
Зверніце ўвагу на разпад адпаведнасцяў: адна структура керуе выкананнем, тады як іншая організуе ведамасці та зв’язкі ў ёй.
Калі этыя два падходы начнуць адно другога падкрэпляць, агент для фінансавых даследжэнняў стане значна болей спроможным.
- Граф прабэты працы вялічынуе спосаб выканання даследжэння.
- Граф ведамасцей вялічынуе канкрэтныя фрагменты інформаціі, якія з’ўязаны.
Звычайна, гэта паднімае дапаможныя запытанні: якщо графы даюць такі высокі рэгулярнік, чы не трэба кожны рабочы процес ствараць у вигляде графа?
Не обавязкова.
У багатох случаях для рашэння проблемы достатньа простая петля агента.
Таму, замест таго каб за звычай ператвараць кожны рабочы процес AI у граф, варта безпосередна парабяляць гэтыя два падходы і выявіць колі дапаможная складнасць працы з графамі дэйсна дае плоды.
Варта памяцаць, што графы даюць большы рэгулярнік, але гэты рэгулярнік супакоўвае дадатковую працу: тепер трэба самостоятельна проектаваць і падтрымліваць гэю структуру.
Якщо сама задача справды простая, ёе упаковка ў граф насправды можа зробіць систему сложнейшай у розумеенні, не даючы значных перадоў.
Вернімся да прыклад агента для фінансавых даследжэнняў. Спадзяймося, ўжо корыстнік запитае што-та падобнае да: падсумаваць найнэўжылейшы звясткі пра выручку NVIDIA.
Это ўзвужаны, самастойны запит.
Яго можна адмахнуцца, запрашаючы неабходны звястак і передаючы яго модэлю для стварэння падсумку:
Question
↓
Retrieve Report
↓
Summarize
↓
Answer
Няма рэальных разгалужэнняў і ніякай складной логіки, якаю трэба кераваць. Звычайны прайсепт RAG або простая цыклічная структура агента чыста добра справяцца з гэтым.
Теперы паўставім гэта ў адносе да шырэйшага запиту, калі корыстнік хоча разумець, што стала прычыной падвышэння цены акцій пасля апублікавання звястакоў, хоча пабачыць, як гэты результат паўстанае ў адносе да прогназаў аналітыкаў, хоча паказваць спіс рызыкаў, якія варта стежыць у будучыні, і хоча маты можласць затвердзіць вынікі перш чым яны будуць уключаныя ў звястку пра портфель.
Это абоўсумна іншы тип задачы.
Эта версія включае розныя виды даследжэнняў, выкарыстоўвае іншыя джерэлы, патрабуе паўтарной перапрацоўкі, можа вымагаць калькі спроб і абумоўчвае етап людскага перагляду.
Процес работы тепер выглядае больш-менш так:
Question
↓
Understand
↓
┌──────────┼──────────┐
↓ ↓ ↓
Filings Earnings Market
↓ ↓ ↓
└──────────┼──────────┘
↓
Analyze
↓
Write
↓
Check
↙ ↓ ↘
Search Rewrite Human
↓ ↓ Review
└───────┴──────┘
↓
Send
Працэўна ў такім ступені складзенасці, калі процес работы описваецца чытра, пачынае даваць рэзультаты.
Тады калі дастатнек циклу агента?
Цикл агента зазвычай ёст кращы выбар, калі модэль можа выбіраць, які інструмент выкарыстаць далей, што дае яе прыбутак.
Напрыклад:
Question
↓
LLM decides what to do
↓
Tool
↓
LLM decides what to do next
↓
Tool
↓
Answer
Калі задача ўладзеўная, а немагчыма заздалегідь запрацаваць колькасць крокаў, такая гнучкасць ёст справжняя цэннасць.
Агент можа вырашыць, што яму трэба пераканаліць выкарыстоўваецца звіт пра доходы, пасля чаго выявіць конкрэтны паказнік, а потым шукаць дадатковы контекст. Вам не трэба заздалегідь планаваць кожны можлівы шлях.
Калі граф становіцца болей зрозумелым?
Граф становіць сэнс тады, калі процес работае па правілах, якія дзейсна маюць значэнне.
Для системы фінансавых даследжэнняя эта правіла можу выглядаць так:
Retrieve evidence
↓
Run analysis
↓
Generate draft
↓
Verify claims
↓
Human review
↓
Publish
Это ўмовы на рэвэле процеса, і граф дазволяе вам зашыфраваць их безпосередна, замест таго каб спадзявацца, што модель сама іх вывучыць.
Компрэсія
Граф дае вам контроль, але таксама значыць неабходнае выкарыстоўванне большай архітэктуры.
Тепер вам трэба продумаць:
- як структуруецца стан
- логіку маршрутаўвання
- што выходзіць, калі ў чымса з’яўляюцца проблемы
- паведінку пад час перапрыбуткаў
- перазбіранне дадзенняў
Нічога з гэтаго сама па сабе не ўскладнена — гэта проста значыць, што граф трэба падтрымаць за рахунак додатковых зусиль, якія ён вносіць.
Для даследнічага агента NVIDIA не мае сэнсу з самага пачатку ствараць цэлы граф толькі таму, што графы ўважаюцца цікавымі.
У замен дадатковая структура павінна быць дагаўлена толькі тады, калі цэга працы фактычна гэтаго выкарыстоўвае:
- Пачніце з простага.
- Дадайце розгалужэння тады, калі ў іх даслівна ёсць патрэба.
- Дадайце паралельную експансію тады, калі задачы справдзе можаць выконвацца незалежна ад другіх.
- Дадайце пункты контролю тады, калі цэга працы трэба на час зупініць або вярнуцца пасля перарыву.
- Дадайце этап людзкага адгляду тады, калі значэнне задачі пацярплівае дадатковых зусиль.
- Уведзіце GraphRAG тады, калі адносіны ў самай інформацыі пачнуць мяць значэнне.
Такім чынам граф існуе таму, што проблема яго выклікае, а не таму, што ён доступны.
Заключныя мысляў
Гэта, верагодна, галоўны урок з працы над такім дзяйствам.
Граф існуе не для таго, каб система ШІ выглядала сложнаю. Ён існуе для таго, каб працэвыканне стала лёгкей для разумення і керавання.
Агент для фінансавых даследжэнняў, створанный на адной з гэтых дыскусый, тепер можа роздзяляць задачі, прабаваць знову, настаўляць паузу, включаць людскага рэвізора, а таксама выкарыстоўваць зв’язкі межу часткамі веды, калі гэта ўжоць корыстна.
Протыма, гэта не значыць, што кожная система патрэбуе графа. Інодзе простая схема RAG ёсць достатня. Інодзе цікл агента пакрывае ўсё, чаго выкарыстоўвае проблема.
Праўя спэцыялізацыя — гэта здатнасць визначыць той момент, калі проблема становіцца настолькі складной, што граф стае вартым інвестыцыі.