AI-агенты ў мікрасэрвісах Spring Boot са Spring AI
Дадаём AI-агентаў у сэрвісы Spring Boot праз Spring AI: інструменты як біны, circuit breakers, метрыкі токенаў і асінхронныя цыклы агентаў унутры кода, які ў вас ужо працуе.
Крыніцы: How to Integrate AI Agents Into Spring Boot Microservices | 2026 Java AI Guide
Уявіце трыя мікросервісы Spring Boot, які ужо апрацоўваюць трафік у працэйнай асяроддзі: шасць недзеў працы, каб дадаць ім функцыі агента, з якіх два запускаюцца без проблем, а трэці стае прычыной дужа дзяўгіх і дорогіх ускладнэнняў. Гэты сцэнарый, які апісвае тып досвядзення, пра які рассказваюць багато команд, якія працуюць з Java, служыць фундаментам для наступнага матэрыялу. Гэта практычны аналіз інтэграцыі агентных пайплайнаў у існуючыя сервісы, якія маюць ліміты на затрымкі, залежныя команды і рэальных корыстувачаў; матэрыял напісаны для інжынераў бэкенду, якія ведаюць Spring Boot і хочуць адключыць можлівасці AI, не пасвячаючы час на зміну існуючай архітэктуры.
У наступных раздзелах практычна апісваецца, што такое агент AI у асяроддзі Spring Boot (і чаму ён не ёсць тым, каму часта прыроўнююць), чаму команды яго адмацоўваюць, як рэалізаваць выклікі інструментаў за дапамогою Spring AI, тры спосабы збою, якія часта з’яўляюцца толькі пасля запуску, і як спрыяць вікорыстоўванню токенав як важлівага показніка працы сістэмы.
Што такое агент і што ў яго няма
Перш чым пачаць пісаць код, неабходна правільная ментальная мадэль. Большасць інжынераў, якім трапляюцца труднасці з інтэграцыяй агентаў у Java, сталкнуліся не з самай платформай, а з тым, што яны застаўляюць неправільную мадэль.
Агент — гэта не проста розумны вызов API. Гэта цыкл разумовання: мовная мадэль прымеча заданне, выбірае, якія інструменты запусціць, отрымае рэзультаты, аналізуе всю інфармацыю, яку цяпер мае, і або вяртае заканчычную адпаведзь, або запускае ўсё зноў.
Цыкл складаецца з чатырох элементаў:
- Мадэль — гэта механізм разумовання, будзь то GPT-4o, Claude, Gemini або альтэрнатыва з відкрытымі параметрамі, якая працюе праз Ollama.
- Інструменты — гэта функцыі, API або вызовы служб, якія мадэль можа запусціць.
У мікросервісе Spring Boot гэта значыць, што вы не ствараеце обгортку у стылі RestTemplate наваколе канцэнтраў AI. Вы вбудовваеце багатоэтапны, становы і недэтэрміністычны прабег задач у сервіс, прызначаны для обмежанай, сінхронной і прагнозавальной екзекуцыі. Самэўсупадзення гэтых прынцыпаў ёсць прычыной большасці проблем у інтэграціях Java з AI. Короткая способа запам’ятаваць гэта: інструмент — не агент, агентам ёсць цыкл, і пакуль гэта не стане ясным, вы будзеце ствараць канцэнтраў, а не агентов.
Прычыны вжывання агентоў у сервісах Spring Boot
У навучальных матэрыялах частаю прыходзіць зачыніць гэты частак. У іх показваю, як інтэграцыяваць агента, але мало сказана пра тое, чаму організацыя должна гэта зрабіць, яю проблему гэта рашыяе чым каштоўна ўжыцце гэта занадта рана.
За межамі фіксаваных правіл
Класычныя мікросервісы автаматызуюць вядомыя процедуры, калі вхідны даны A праходзяць праз набор правіл B, ў рэзультаце чаго атрымліваецца выхідны даны C, і гэта чырплёва падходзіць для дэтэрміністычных прабегаў. Агенты расшыруюць гэю ідэю на неясныя, багатоэтапныя задачы, у якіх правільны наступны крок залежыць ад проміжных рэзультатаў. Калісці прыклады, якія падходзяць да існуючых архітэктураў Spring Boot:
- Апрацоўка замовленняў. Адны агент перакантролюе запасы, ацэніць правіла цэнаў, застосуе зніжкі для кожнаго кліента і створыць рэкамендацыю па выполненні замовлення ў аднай жа запытцы, тады фронтэнду не трэба коордынаваць чатыры последовныя запыткі.
- Розумеўнік дакументаў. Агент чытае завантажаны PDF, выкарыстоўваея структураваныя поля, пераканальвае іх па правілах бізнесу і або паўтарае падтверджэння, або перадае справу чалавеку-рэвізору, без жадных жорстка заданых правіл выкарыстоўвання дакументаў.
- Падтрымка кліянтаў. У існуючай службе падтрымкі агент запоўнюе інформацыю пра статус абліковання, історыю замовленняў і дакументы політыкі, а таксама складае адпаведны за кантэкстам адпаведзь, што скараць час апрацоўкі, не выкарыстоўваючы чалавека як аддзелу.
- Рэвізія коду і дапамога у CI. У працэсе інжынерыі платформы агент аналізуе неудачныя тэсты, кансультуецца з внутранімі дакументамі і пропануе цільавыя способы выправлення.
У кожнам з іх значэннем ня ёсь «AI» як такое. Гэта замена нестабільной, ручная логіка оркестрацыі на шар аналізу, які прыстосоўваецца да таго, што знаходзіць, замест таго, каб зламацца, калі вхідны даны не палягаюць на правільнай траецеі.
Чаму Spring Boot падходзіць для гэтай задачы
Python домінуе ў туторыях па AI, тады як Java домінуе ў корпоратыўных сістэмах, і разлік межа ўсімі двума ёсь справжняя можлівасць. Spring Boot праставляе структурныя перавагі, якія легкія фрэймворкі Python не даюць з самага пачатку:
- Ввод залежнасцяў дапамагае кераваць об’ектамі, тэставаць іх і складаць без дадатковай настройкі.
- Actuator і Micrometer ператвараюць співвырашэнне токенаў, затрымкі між дзеяннямі агента і частоту паказаў памылак у інструментах у звычныя оператыўныя показнікі.
@Async і CompletableFuture, эфектыва справляюцца з цікламі агентаў, чыя час адработкі змінюецца.Крэм таго, Spring AI апранае кліентывыя канекторы для LLM, інтэграцыю з храніцамі вектараў і вызывы функцый на адной з анотацый @Tool у тым жа экасістэме, таму для стварэння агента прыемнае якосты не трэба пакідаць падход Spring.
Калі агент ўжоць карысны
Агенты займаюць свае месца, калі:
- У працэсе выканання неабяжна прымкнутыя на базе інфармацыі, знайдзенай пад час выканання, а не на базе інфармацыі, вядомай на момент прыйняцья запіту, рашэнні.
- Чынная рэалізацыя вымагае, каб фронтэнд або сервіс-оркестратор коордынаваў калькі запытоў да бэкэнду, і агент могаў бы весты такую коордынацыю на серверэ.
- Вхідныі дадзеныя ў форме нейтаральнай мовы з мянюючыся структурой, пры чым класыфікацыя, выкарыстоўванне інфармацыі, стварэнне апусці або направленне дадзеных адбываецца на адной засадзе ўжо існуючага кантэнту, а не схемы.
- Чынная сістэма працюе некорэктна, але не зламваецца, і агент могаў бы быць спраектаваны так, каб адзначаць неяснасці, а не тыха вярнуць найбольш верагодны некарэктны адказ.
Яны не падаюць пад прыемныя умаставы, калі рабочы працэс ўсё цалкам дэтэрміністычны, вхідныя даны структураваны, а логіка, адаснованая на правілах, лёгкая да падтрымкі. Агенты дадаюць складнасць, і ўжыцце іх мае сэнс толькі тады, калі альтэрнатыва ўжо гіршая.
Бізнесавыя аргументы простымі словамі
Для керуючых інжынерамі і заінтэрэсаваных сторон у продукцыі аргументы базуюцца на трох ключовых аспектах:
- Шырэй час выдання новых можнасцей. Функцыі, якія раней вымагалі тыднів напісання коду для керавання на бэкэндзе, часта можна створыць у варыянтах за калькі дзён, калі агент берае на сябе багатоэтапную коордынацыю. Команды часта адзвярцаюць такое прышвартаванне пасля першай успешнай інтэграцыі, хоча вашы показнікі можу быць разнымі.
- Менш складна адміністрацыя правілаў. Кожна жорсткая закладзенае правіла ў сервісе ўважаецца «заборгаваннем», якое зрастае, калі змінюецца бізнес-логіка, а інструкцыі, напісаныя на нейтральнай мове, зазвычай легчэ адкорэгаваць, чым код, які выражае тую ж логіку інструкцыйным спосабам.
- Аднаковая база для складных AI-сістэм. Одні цяпло інтэграваныя агенты ўтвараюць аднаковую основу для багатоагентных рабочых пралэтактов, пайплайнаў генеравання з падтрымкай пошуку і функцый продуктав, створаных спецыяльна для AI.
Чаму такая трыбоць, і чаму змініўся модэль выканання
Да 2023 года і ў 2024 году AI ў Java значыла не больш, чым апыл канцэнтры LLM і падача адпаведнага тэксту: просты HTTP-зв’язак праз WebClient, таймаут, і больш ніякіх думак.
Этая модэль большэй не практычная. Набор функцый Spring AI (выклік інструментаў і функцый, інтэграцыя з базамі вектараў і API ChatClient, створаныя з урахоўваннем агентных рабочых практык) паказвае, што сама модэль выканання зменілася.
- У старай модэлі была адна запытка, якая прыводзіла да аднаго выкліку LLM і аднай адпаведзі.
- У новай модэлі запытка розпадаецца на N выклікаў інструментаў і M крокаў аналізу, прычым адпаведзь выходзіць толькі пасля гэтага.
Багато інжынераў Spring Boot даўжа вярнае да старай модэлі і ставяцца да ChatClient як да RestTemplate. Такая памылка кацэгорыі спрычыняе проблемы ў працэсе эксплуатацыі за калькі недзеяў пасля запуску, і часта ўсё гэта не ўсвіядомляецца, калі гэтыя проблемы выйшлі на свет.
Цікл — гэта агент
Інжынеры, які толькі пачынаюць працаваць з інтэграцыяй агентаў, зазвычай уявляюць сабе службу, якая заменяе кантролер: адна каштанка @Service, адын ChatClient, які інжэктуецца, і ўсё. гэта толькі канцэнтрык для автодапамогі, а не агент. Настоямы агент запускае цыкл: прыем задання, выбір інструмента, выконанне інструмента, прыем рэзультата, аналіз новага стану, пасля чаго вырашае, чы робіць працу далей, чы адпавядаць. Модэль — гэта механізм аналізу ўнутры цыклу; сам цыкл — гэта агент.
Чаму стандартны дызайн неправільна оцінюе выклікі
Звычная думка такая, што вызов LLM — гэта дорогі і складны элемент, а рэшэнні іншых задач берае на сябе каштанка @Service з Spring. У рэальнасці „рэшэнні іншых задач“ стае распраўленым: насколькі повольныя інструменты, які стан кантэкста пераходзіць з аднаго крока на іншы, якім чынам бягуць каштанкі па багатоэтапных ланцоўках, і якія перапрыбуткі неабходны, калі работа застае незавершанай.
Разглянем гіпотэтычны сервіс для класыфікацыі замоваў. Спачатку ён складаецца з аднаго канцэнтраба POST /orders/classify, які выкананыя аднае запыткі до LLM. Пасля чаго ён перарабатываецца ў агента, які класыфікуе замовак, запытае інструмент для калькуляцыі запасоў, запытае інструмент для выклікання цэн у залежнасці ад запасоў і вяртае рэкамендацыю па выпалненні замова. Кожны запыт да інструмента — гэта рэальны запыт да сервісу з рэальным часам адпаведзення.
Падазроўваючы, што агент завершае працу за менш чым два секунды для 80% запыткаў, тады як для засталых 20% повольны верхній інструмент для калькуляцыі запасоў удзьвайгучвае час адпаведзення да 8–14 секунд. Гэта не проблема ШЫ, а проблема распадзеленых сістэм, якая стала відна завяршэннем ціклу агента.
Компроміс, які застаецца незаўважаным
Цыкл агента не ў стане без даных. Кожны рэзультат работы інструмента дадаецца да размовы і зноў адправляецца да модэлю на наступны крок. Пры высокай працэздатнасі колькасць памяці, якая трэба для кожнага запіту, зрастае з колькасцю крокаў, якія выконвае агент, і сама колькасць запітоў стае менш значным фактам. Сэрвіс, які апрацоўвае 1 000 запітоў за хвіліну пры сярэднім 4 кроках, фактычна выконвае 4 000 вызоў LLM, пры чым розмер кантэксту продовжвае зростаць.
Таму, прыяўшыся да напісання коду агента, спачатку перыяктуйце кожны вызов інструмента, ацэніце паўтарэнне падачы даных (p95) для кожнага з іх і вырахаваце максімальны розмер кантэксту пры максімальной колькасці крокаў. Загадзя распісаце потрэбы ў кантэксце пры праектаванні цыклу. Большасць неудач агентаў у Java-бэкендах насправды ўскладненыя неудачы з працэю часу, якія маскуюцца пад неудачы модэля.
Spring AI дае вам тэхнічную базу, а не план
Spring AI — гэта серйёзны слой абстракцыі, прызначаны для практычнага выкарыстоўвання. Ён адказвае за ChatClient, ToolCallback, VectorStore і API для выканання агентаў, які працуе з ін’екцыяй залежнасцяў, зменой модэляў праз application.properties і падтрымкай рэакtywnых праграмаў за дапамогою Flux. Як пункт выйску для інтэграцыі LLM у Spring Boot, гэты фрэймворк яўляецца ідэяльным выборам.
Аднак ён не з’являе стратэгію для пілотных ліній агентаў, і гэтыя недастаткі разлічваюць пратотыпы ад сервісаў, якія выкарыстоўваюцца у практыцы. Фрэймворк керуе адзінамі вызовамі інструментаў і взаімадзеямі з модэлямі. Ён не адпавядае за:
- Контракты на межы сервісаў межу агентам і сэрвісамі, якія працуюць пасля яго.
- Зберагчэнне стану агента між запытамі, тыяму, памяць сэсіі.
- Логіку захісту ад збоёў, якія распрастраńваюцца на калькі крокаў.
Напісце матрыцу неудач інструмента
Перад запускам неабходна для кожнага методу @Tool апісаць, што будзе вадзіцца ў трох сітуацыях:
- Інструмент вяртае апэктыўны выхід. Агент пераходзіць да наступнага крока логічных раследаванняў.
- Інструмент вяртае памылку. Агент прыме паказаны сігнал памылкі і адлучыцца, чы робіць пракату, выкарыстоўваць альтэрнатыўную версію чы паведаміць корыстніка.
- Інструмент выкананы часовы тайма-аут. Актываўаецца захід абрыву цыклу, вяртаецца альтэрнатыўная значэнне, і агенту паведамляецца, што даныя недоступныя.
Калі для якога-небудзь інструмента другі і трэція сцэны не апісаны, інтэграцыя не завершана. Успешны шлях — гэта не сама служба. Spring AI адпавядае за спосаб, а прычыны, час і варыянты, якшы ўсё пашлася не так, застаюцца вашымі абавясцямі.
Акна кантэксту паводзяцца як непісаныя кантракты
У звычнай службе Spring Boot наявнае адхыленне ад кантракту выклікае асключэнне. У агенце пераплянаванне акна кантэксту не выклікае асключэнняў, паведамленняў аб праблемах чы рагісу памылак. Мадэль тыха адключае старэйшы контэнт у размове, і часта цэй ёсць запрошэнне сістэмы з вашымі правіламі працы. REST API адпавядае кодам 400, калі вы адхыляецеся ад яго кантракту; акно кантэксту проста пачынае забываць, і такія багі значна сложней знайсці.
Прыкладны інцыдэнт
Уявіце сабэслугу для апрацоўкі дакументаў, чыя сістэмная інструкцыя складаеся з апошніх 800 токенаў. Пад час тэставання адпаведзі цаго інструмента станавяць у сярэднем апошніх 1,600 токенаў за адзін запіт, што цэлкам падпадае пад ліміт модэлю. У рэальных умовах адзін конкрэтны прабег задачы запускае ўсе тры вызовы інструментаў з вялікімі об’емамі дадзеных, сярод якіх ёсць адпаведзь пра історыю замовленняў у вузловатай структуры, якая сама по сабе складаецца з апошніх 1,800 токенаў. Аб’ём усіх кантэкстных дадзеных перасягае 6,000 токенаў, сістэмная інструкцыя тыха адсікаецца, а агент вяртае правдападобную адпаведзь, у якой не врачанаўся важны бізнес-правілл.
Нічога не выклікае паўтарэння або апавешчэння. Баг выявіўся пад час ўзаемнай перапрацоўкі даных кожныя тры дні пазней.
Рашэнне: метрыкі токенаў з першага дня
Спрацоўванне кантэксту інструмента пры аправцы. За дапамогай Micrometer гэта значыць чытанне колькасці запітоў і токенав генеравання з об’екта usage у метаданах адпаведнай адпаведзі, а таксама публікацыю кожнага з іх як показніка, напрыклад пад назвамі на кшталт agent.context.input_tokens і agent.context.output_tokens. Точныя назвы элементаў доступу разніцяцца ў разных версіях Spring AI, таму пераканайцеся, якія яны ў версіі, яю вы выкананяе. Пасля чаго паведамляйце пра прыбліжна 80% максімальнага ліміту кантэксту модэлі. Гэта прыбліжна два элементы і адна власнасць канфігурацыі, і ўсё гэта павінна быць на своім месцы першым чым агент будзе запусканы. Аправка агента без показнікаў токенав падобнае да запуску базы дадзенаў без монітарынгу часу выканання запытоў, і гэта заканчываецца о 2 гадзіны ночы.
Стварэнне па шагах
Пярэхусловія: Spring Boot 3.2 або новейшая версія, Spring AI 1.0 або новейшая версія з стартэрам для вашага прадаўца модэляў (стартэр OpenAI у гэтым прыкладзе), адносна чыстае розуменне @Async і CompletableFuture, внутранній сервіс, які трэба выклікваць як інструмент, а таксама Micrometer, прыўязаны да вашага стака для абзяру стану. Назвы артыфактов стартэраў змініліся ў разныя версіі Spring AI, таму паказвайце актуальную назву ў дакументацыі.
Шаг 1: дадаць залежнасці
У файле pom.xml неабяжна дадзіць Spring AI starter для вашага прадаўца, а таксама артыфакт resilience4j-spring-boot3, калі хочаце падтрымкі circuit-breaker для вызоў інструментаў. Крантыцы модэлю размешчаюцца ў файле application.properties. Ключ API чытаецца зяўвішней зменнай, напрыклад OPENAI_API_KEY, праз атрыбут spring.ai.openai.api-key; выбіраецца модэль чату (у прыкладзе выкарыстоўваецца gpt-4o), а значэнне параметра temperature залічваецца нізкім, адпаведна 0,2, каб вядомасці аб выкарыстоўванні інструментаў заставаліся прыкметнымі.
Шаг 2: адзначыць інструменты перад налаштаваннем агента
Парадак мае значэнне, таму што дызайн інструментаў вялі за сабой адносы агента. Сістэмны прапануне павінен аднасацца да конкрэтных можлівасцей інструментаў, а яго напісанне перад стварэнням інструментаў дае нечыткія інструкцыі, якія плутаюць модэль.
У прыкладзе компанента OrderTools пры стварэнні атрымлея InventoryService і PricingService, а таксама адкрывае два методы, пазначаныя анотацыямі. Метод checkInventory(String sku) вяртае наявную колькасць, а калі SKU невядома — -1. Метод getPrice(String sku, String customerTier) вяртае цэну у цэнтавых едыніцах USD. Кожны з методаў мае анотацыю @Tool з апісам.
Пашчутная памылка — калі апісы ўскладненыя. Модэль чытае іх, каб вырашыць, калі вызваць кожны з інструментаў; таму тачныя і полныя апісы значаюць меншую колькасць непатрэбных вызоў і болей тачныя адпаведзі. Указуйце адзіныя едыніцы, значэнні, якія вяртаюцца, і сцэнарый, калі даныя не знайдзеныя, як у прыкладах вышэй.
Шаг 3: задайце ChatClient короткі сістэмны прапанунак
Клас AgentConfig адмініструе аб’ект ChatClient, створаны з вікорыстоўванняя ін’ектаванага канстрактара, а таксама клас OrderTools. Стандартны запрос сістэмы ўскораны і мае імператыўны характар: павінен выступаць як асістэнт па апрацоўцы замовленняў, завжды пераканацца ў наявнасці тавароў пры парадзенні ўмоžнасці ўзяць замовленне, завжды выявіць цэны пры прадастаўленні квоты, аддаць JSON-об’ект з булевым значэннем available, цэлым чыслам price у цэнтах долара США і строкам recommendation; кроме таго, не павінен выдумваць даныя пра наявнасць тавароў чы цены. Інструменты рэгіструюцца ў атрыбуце defaultTools.
Здаровая дысцыпліна ў вікорыстоўванні токенаў тут мае важлівыя наследкі. Кожны токен у запросе сістэмы зменшае прастор для рэзультатаў інструментаў, таму старайцеся не перакрасіць 300 токанаў і без жалю праверайце тэкст.
Шаг 4: запускіце агента асінхронна і логаваце токаны
OrderAgentService абсалюе ChatClient і MeterRegistry. Яго метод processOrder вяртае CompletableFuture<String> і запускае вызов агента ўнутры supplyAsync: адправляе вхідны даны корыстніка, вызывае мадэль, прымае адпаведны адпаведзь чату, чытае колькасць токенав у вхідных і выходных даных і фіксуе іх як показнікі, пасля чаго вяртае тэкст рэзультата.
Чаму асінхронна обработка? Час выканання агента залежыць ад колькасці вызоў інструментаў, а не ад здавальнай складнасці запіту. Сінхронная ніт кантролера, якая будзе заблокавана на 8–14 секунд у ажыяжанай службе, выкаранае пул ніт. З самага пачатку трэба ставіцца да выканання агента як да фонавага задання.
Шаг 5: установіць захіст ад збоёў для кожнага інструмента
Кожны метод адзінства трэба анатаваць за дапамою @CircuitBreaker з бібліятэкі Resilience4j, задаючы назву прызначання для перэрыву (напрыклад, inventoryTool) і метод на выкарыстоўванне ў разы перэрыву. Метод на выкарыстоўванне для адзінства інвентара фіксуе паведамленне пра апавядзінне разам з кодам SKU і вяртае -1, што паведамляе агента пра тое, што даныя інвентара недоступныя. Прагі задаюцца ў файле application.properties: перыод у 10 вызоў, прага каля 50% кантэкста аббіектаў з аббіектамі збою і час чакання у стане перэрыву — 10 секунд.
Калі прызначання для перэрыву, здаецца, ніколі не актывацуюцца, памятайце, што Spring AOP працюе толькі тады, калі вызы праходзяць праз проксі Spring. Правільна інжэктавайце компаненты адзінства і не стварайце іх безпасэродзе.
Шаг 6: адкрыць канцэнтры з асінхронным шаблонам адпаведзення
OrderAgentController, які выкананы на адрэсе /agent, прыймае запыты тыпу POST на /orders, стварае ідэнтыфікатор запыту, запускае агента і зберагае інфармацыю пра яго працу ў карточцы для канкурантных запытоў, пасля чаго адпавядае з кодам 202 Accepted і цім ідэнтыфікаторам. Запыт тыпу GET на /orders/{requestId}/result шукае інфармацыю пра працу агента. Калі ідэнтыфікатор невядомы, вяртаецца код 404; калі праца агента ўсё ўсунутая, вяртаецца код 202 з паведамленнем “Processing”; калі праца завершана, вяртаецца код 200 з рэзультатам; а калі выкананне зазнае адказа, вяртаецца код 500 з паведамленнем пра адказ. Для выкарыстання па-іншаму, чым толькі у дэманстрацыях, неабходна заменіць карточку ў памяці на сховішча, якое застаецца актуальным пасля перзапуску і выкарыстоўваецца для зберагання старых даных з пэўным тэрміном дзейнасці.
Рашынак па выборы прыменяецца да самых інструментаў. Для внутршніх запытоў службы з нізкім часам адпаведзення трэба застаўляць інструменты сінхроннымі, а асінхронную обработку выканаць на роўні службы. Для зовнішніх API з непрадбачальным часам адпаведзення інструменты трэба зробіць асінхроннымі, выкарыстоўваючы спецыяльны пул заданняў і жорсткі таймаут, каб адна повольная залежнасць не спрычыніла необмежанага часу адпаведзення для агента.
Інструменты, якія варта знаць
- Spring AI — галоўная рамка для агентаў у Spring Boot.
- LangChain4j — альтэрнатыва, створаная для Java, часта атрыбутуецца большой эфектывасцю у коордынацыі калькі агентаў.
- Resilience4j — забезпечвае механізмы захоплення цыклаў і павторныя спробы для запытоў да інструментаў.
- Micrometer — публікуе даны пра выкарыстоўванне токенаў і метрыкі агента.
- Ollama — запускае модэлі з адкрытым кодам локальна для разработкі і тэставання.
Тры якія памылкі спалююць час і доверлівасць
Пастка пачатківаўца: тэставанне толькі з дадзеннямі, якія працуюць без проблем. У навучальных матэрыялах вікорыстоўваюцца чыстыя, супрацоўныя тэстовыя даны, але рэальныя корыстувальнікі надаюць дадзеныя, якія працуюць дзяўна, застаюцца неяснымі або вызываюць незвычную працу інструментаў, якая бачыцца толькі у рэальных даных. Створыце сістэму, якая перад кожным выпускам перадае анонімізаваныя прыклады запытоў з рэальных умов, а не сінтэтычныя, на агента ў рэжыме тэставання, і пры тэставанні выкорыстоўвайце прынеймна атакуючыя даны, якія перакрываюць запланаваны ліміт кантэксту.
Экспертная слепая зона: чрэзмерная інжынерызацыя пры выдазве продукту. Інжынеры, якія добра разумеюць літэратуру пра калькулы з удзелам калькulatorаў, інодзе ствараюць сістэмы з оркестраторамі, падкалькulatorамі, шарамі памяці і практыкамі RAG яшчэ до таго, як хоць адзін калькulator дастыгне рэальнага корыстніка. Цэе ў версіі AI тое самае, што будаваць сэрвіс-меш пры тым, калі яшчэ не пераканаліся ў эфектывнасці моноліта. Выдайце адзін калькulator з аднай пакетам інструментаў у аднам сэрвісе, працаваце з яным і дадзіце даполнічную складнасць толькі там, дзе таго трэбуюць даны. Команды, якія найшырэй выходзяць у прымэтную эксплуатацыю, ухіляюцца ад стварэння платформы пры тым, калі у ўсёй ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўс
Сістэмныя проблемы: ніхто не несе адказкі за паведамленні агента. Звычная працоўная несправнасць залечае лог-запіс, паметры і апавешчэнне. Нечыста, але правдападобная адпаведзь агента не залечае нічога з гэтага: ні адключэння, ні апавешчэння, толькі адпаведзь, якая пасходзіць перакананне схемы, але не пасходзіць праблемам бізнес-логікі. Назначыце адпавядача за тое, што кажа агент, а не толькі за тое, чы рэагаваў ён, і ўсё тыдзень пераглядзайце выбраны набор адпаведзей, а не толькі канцэнтрацыю на колькасці памылак. Гэта скорэй організацыйная, чым тэхнічная рашэнне.
Што не паведамляюць нараднікі па пачатку работы
Па большай частцы мнэнняў, самая сложная частка інтэграцыі агента Spring Boot — гэта не ШЫ. Паведамленні модэля, інжынерыя запытоў і інтэрфейс вызываў інструментаў можна выучыць за адны тыдзень. Сложная частка — гэта сінхронная спадчына Java, якая сталкаецца з асінхронным, багатоэтапным характарам выканання агента.
Модэль запыт-адказ у Spring Boot прымее, што час выканання застаецца межавым. Агент так не прымее. Ён выканана столькіх вызоў інструментаў, сколькі трэба для задання, і выканана столькіх крокаў аналізу, сколькі неабходна, не павярагаючыся на таймаут гэйтвэю у 30 секунд. Пайплайны на агентах не падходзяць па фармату запыт-адказ; яны падходзяць па фармату, калі працуе сістэма на адбыванні падзеяў, і чым раней вы перастанеце супертаць гэтаму, тым быстрэй будзе завершана інтэграцыя.
Команды, якім яшчэ больш трудна, намагаюцца падтрымваць сінхронную обработку аж да адказу агента. Тые, хто завершае працу быстрэй, запускаюць агента як фонавую задачу, запускаюць яе на запыт, доставляюць рэзультат праз поллінг або WebSocket і праектуюць кантракт службы адпаведна. Гэты падход не паказваны ў матэрыялах для пачатку работы з Spring AI, і, можа, і не трэба.
Ментальная модэль, якую трэба прымець
Усе вышэсказанае можна запісаць у аднам рэчэнцы: АІ-агент — гэта распраўленыя сістэма з неадзначальным двыгунам выканання ўсерэдзіні яе.
Прынцыпы распраўленых сістэм, якія інжынеры на Java вялікі час ведаюць (ізоляцыя бядаў, абзірванне поведзення, обмежэнне часу выканання, чыткая працэса бядаў), застаюцца актуальнымі, толькі ў ўжо большай меры, адтаколькі бяды ў такіх сістэмах ўступаюць у дзеянне тыхчэй і трэба больш часу, каб яны сталі віднымі. Адраднае ў тым, што Spring Boot чырпаецца для такай працы адлічна. Введэнне залежнасцяў, можлівасці абзірвання на адной з базовых класаў Actuator, асінхронныя прыемнікі і развіты экоспэракт для керавання — гэта справжнія прыямлівасці, а Spring AI — серйозная платформа. Разлік лежыць у ментальным модэлі, а не ў інструментах.
Практычныя правілы:
- Спрыяйце агенту як ціклу разумавання і праектавація контракта службы трэба адбываць на адной з гэтых ціклаў, а не на вызове модэля.
- Іспользуйце агенты, калі робочы працэс залежыць ад інформацыі, якая знаходзіцца пад час ўжыцця, або калі існуючая сістэма коордынацыі ёсць нестабільной і важкай у падтрыманні. Адмовіцеся ад іх, калі робочы працэс ёсць дэтэрміністычным і версія, базаваная на правілах, працюе належначын.
- Spring AI забезпечвае фрэймворк; вы задаеце стратэгію для рашэння проблем з інструментамі, кантролю бюджэтаў кантэксту і забезпечэння прозрачнасці.
- Спрыяйце выкорыстоўванню кантэкстных віндаваў як кантрактов і контролюйце спрытканне токенав пры пачатку працы, а не пасля першага інцыдэту.
- З самага пачатку выкананне агентаў трэба асінхронна, адтолькі ў разе, калі дызайн, заснованы на запыт-адказ, не стварае працоўных труднасцей.
Частыя запытанні
Кальві фрэймворк найкрашчы для агентаў у Spring Boot? Spring AI ёсць найболей прыдатным выборам для аплікацыяў Spring Boot. LangChain4j ёсць сільным альтэрнатыўным варыянтом з шырэйшай падтрымкай коордынацыі калькі агентаў, і оба варыянты актыўна падтрымваны.
Чы гэтыя існуючыя мікросэрвісы неабяжна трэба перапісваць? Не. У гэтым падходзе сэрвіс расшырываецца за дапамою анотацыі @Tool з Spring AI, об’екта ChatClient і выканання з @Async, без змены існуючай логікі сэрвіса.
Як трэба караць неудачы агента ў працэйнай асяроддзі? Кожны метод з @Tool трэба загорнуць у прыстрой Resilience4j circuit breaker, публікуваць даныя пра спрыткі токена праз Micrometer, задаць матрыцу неудач агента пры запуску і назначыць аднаўальніка, які будзе перакантролюваць якосьць адпаведзей, а не толькі частоту памылак.
У чым разлік агента і звычайнага вызову LLM? Звычайны вызов — цэлае запіт і адпаведзь. Агент — цэлая петля, у якой мадэль можа вызываць інструменты, чытаць рэзультаты, аналізаваць іх і вырашаць, чы продовжыць працу чы даць адпаведзь пасля кальколькіх крокаў.
Чы готавы Spring Boot да выканання завад у рэжыме працы? Так, за адпрацоўкай правільных архітэктурных рашэнняў. Асінхроннае выкананне, прыборкі цыклаў, метрыкі токенаў і явнае карыстоўванне вікна кантэксту ўсе можна рэалізаваць за дапамогою існуючых, стабільных бібліятэкаў.
Дзе месца RAG? RAG — адна з адзінакоў інструментальных патэранаў: агент запошчаеяць актуальныя дакументы з хранілішча вектараў, каб адзагульніць свой кантэкст пры выконанні расчынанняў. Ён стаўкаеся калі агенту патрэбна вялікая база знанняў, не ўсё час неабходны для кожнай інтэграцыі, і яго введэнне ў складнасць лепей адбываецца толькі тады, калі ліміт вікна кантэксту стварае рэальныя проблемы.
Супаўзяныя матэрыялы
- Порэшчанне AutoGen і CrewAI: стварэнне команд агентаў, вылічэнне ўсіх затрат — практычнае порэшчанне AutoGen і CrewAI для працы з калькамі агентаў: проксі-цыклы, крытыкі, групавы чат, задачы і команды, а таксама AgentOps для назірання за затратамі.
- Harness, Loop, Graph: тры слоі, якія стояць за большасцю неудач агентаў у працэсе вырабоцтва — чаму агенты, якія перастаюць працаваць у працэсе вырабоцтва, рэдкая разлічваюцца з проблемамі модэля: раздзелэнне інструменту harness, умовы зупінкі цыклу і топалогіі графа, а таксама відпаведныя адпаведальныя.