Spring AI у кампаніі: агент падтрымкі з інструментамі, RAG і праверкай
Spring AI для асістэнта сартавання інцыдэнтаў: промпты як кантракты, структураваны вывад, выклік інструментаў, выяўленне праз MCP, RAG на Qdrant, трасіроўка і абмежаваныя цыклы агента.
Крыніцы: Leveraging Spring AI for building the next generation of enterprise applications
Заява на падкістку як тэстовы кейс
Внутршній майстэрні з разработкі AI для інжынераў прыстаноўкі на рынку фінансавых тэхналогій з’явіўся на адной з сітуацый, з якімі практычна кожны распрацоўшчык сталкнуцца раней чым пазней. Прыходзіць заява на падкістку. Лог-файлы маюць толькі частковыя доказы. Адпаведны код знаходзіцца ў внутршнім хранілішчы. Той, хто працуе на зміну, патрэбуе ціхае першага аналізу, а не універсальнай адпаведзі.
Spring AI падходзіць для такіх задач, таму што ён прыносіць функцыі AI у экасістэму, у якой распрацоўшчыкі Java і Spring ужо ўжо ўжываюць ў сваей ўздоўжнай рабоце. Ён прысвячае абстракціі для модэляў, запытанняў, структураваных выходных даных, вызываў і запрашэнняў інструментаў, і ўсе гэта легка інтэгруецца ў існуючую архітэктуру прыстаноўкі без значных працягоў.
Выкліканне LLM з Java-застосунку — гэта не сама цікавая частка. Гэта, што мае значэння, — гэта выкананне гэтаго за адміністрацыйнымі прынцыпамі, якія ўмовляюцься у сферэ фінтэху: чысткія контракты, інструменты з мінімальнымі правамі, можлівасць відстэйкання дзеянняў і людская пераглядка там, дзе рашэнні мае важылівасць.
Таму масштабы гэтага падходу выходзяць за межы простага семінару. Праект «Агент падтрымкі» служыць практычным прыкладам таго, як паў’язаць AI з існуючымі сістэмамі, дзе мае знаходзіцца мадэль у архітэктурэ, як яна даходзіць да можлівасцяў і дадзэнняў падпрыемства, а таксама як асупрацоўваючыя сістэмы падтрымліваюць ўпорадкованасць, прыдатнасць і контроль над ўсімі дзеяннямі.
Проблема інтэграцыі, а не проблема модэлі
Інтагруванне ШЫ ў корпаратывныя сістэмы здараецца пераважна праз інтэграцыю і мала стосунакоў да выбору модэлі. Команды зазвычай розумеюць гэта пасля першага пратотыпа. Надасць запіт модэлі — гэта проста, а рэзультаты можуць выглядаць вражаюча. Аднак, калі ШЫ прайшоў у працэйную сістэму, пачынаюць выяўляцца базовыя прытыканні.
Корпаратывныя програмы ствараюцца на аднаковасці. Яны залежаць ад строгіх угод, прыемлівай латэнцыі і чыста апісанага потоку дадзеных. Адпаведны вхідны даны должны даць аднаковы выхідны рэзультат, а поведэнне можна праследаваць праз код.
Сістэмы ШЫ працуюць інакш. Яны за сваёю прыродай ёсць верагатывістычнымі, часта выкарыстоўваюць нейтаральную мову замест структураваных вхідных даных і павяржаюцца у зовнішніх прадаўцоў. Аднойчы той самы запіт можа даць разныя адпаведзі, а частка логікі знаходзіцца ў самай модэлі, за межамі кантролю сістэмы.
Рэзультатам являецца структурны несувяз: надзеяны элемент, які функцыонуе недэтэрміністычна, знаходзіцца ўнутрь дэтэрміністычнай архітэктуры. Звычныя прыязнанні ў абласці тэставання, манітарынгу і надзеяносці больш не дапамагаюць. Складнасць не ў стварэнні хытрых адпаведзенняў, а ў ўпоркнуць іх у сістэмы, якія выклікаюць патрэбу контролю.
Spring AI адпавядае, спрацоўваючы інтэлектуальныя сістэмы як ўсё толькі ўзаемадзейнальны элемент у экасыстэме Spring, а не як спецыяльны каскад. Spring вялікі час абстрагуе базы дадзеных, сістэмы карэспандэнціі і запыты REST, а Spring AI дадае адпоўнай прыроды абстракцыі для мовных модэляў, сховішча вектараў і рабочых практык, керованых інтэлектуальнымі сістэмамі. Мета не ў тым, ўсё цяперашнюю складнасць спрыяць, а ў тым, ўпорадакаваць яе так, каб яна паследавала існуючым архітэктурным шаблонам.
У тыповай наладзе інтэлектуальная сістэма не знаходзіцца ў окрэмай службе. Яна ўбудована як код для інтэграціі ў слой аплікацыі.
Логіка праекта працюе так: прыходзіць запіт, а бізнес-запыты адхоўваны. Рэальныя інцыдэнты прабываюць у відпаведным тыкеце. Інструмент Spring AI аналізуе лог-файлы, а дыягназыс перакладаецца у Java-запіс. Адпаведны код выкарыстоўваецца з вектарнага хранілішча, падтрымванага Qdrant, генеруецца працэўнае запрошэнне, і тыкет апцэнзуецца, каб чалавек могаў яго пераглядзець.
Для распрацоўшчыка AI стае ўсё ўжо адной з залежнасцей, а прыкладненне застаецца адпаведальным за весь працэс. Мадэлі налаштовуюцца як і будзь-яя іншая частка інфраструктуры, а взаімадзеянні вядуцца праз чытразначаныя API, а не праз спецыяльныя HTTP-запыты.
У праекце SupportAgentController прымае запыт як SupportTicketRequest. Ён перадае расчынанні ШЫ до SupportAnalysisService, зберагае стан праз SupportTicketService, запрашоўвае вучоркод праз GithubRagService і зберагае створаны спосаб рашэння на тыкцэ.
Значныя парадуктныя наследкі — гэта тое, што бізнес-логіка застаецца незалежной ад прадаўца модэляў. Змена прадаўцоў або дадаць альтэрнатывы не паўтараееся ў основнам кодзе. У далёкай перспектыве гэта мае меньшы сэнс у спроможнасці до змян, чым у падтрыманні архітэктурнага кантролю. Калі модэль недоступны, наведзены выкананне все раве должна стварыць тыкцу, пазначыць аналіз ШЫ як недоступны і перадаць справу ў чалавечыя рады.
@PostMapping("/requests")
public ResponseEntity<?> submitSupportRequest(@Valid @RequestBody SupportTicketRequest request) {
boolean isBusiness = supportAnalysisService.isItBusinessRequest(request);
if (isBusiness) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(ErrorResponse.businessRequest());
}
SupportTicket ticket = ticketService.createTicket(request);
LogCauseReport logCauseReport = supportAnalysisService.analyzeLogs(request);
String classCode = ragService.findRelevantClass(null, logCauseReport.repoName(), null, logCauseReport.className()).stream()
.map(SupportAgentController::stripMetadataLines)
.filter(content -> !content.isBlank())
.collect(Collectors.joining(System.lineSeparator() + System.lineSeparator()));
String solution = supportAnalysisService.suggestFix(classCode, logCauseReport.causeOfProblem());
ticketService.updateTicket(ticket.getId(), SupportStatus.SUBMITTED,
"Cause of the problem: " + logCauseReport.causeOfProblem() + "\n\nSuggested fix: " + solution);
return ResponseEntity.status(HttpStatus.CREATED).body(SupportTicketResponse.from(ticket));
}
ChatClient і запіты як кантракты
Spring AI базуецца на API ChatClient — структураваным спосабе для вяселавання з мадэлямі мовы. У зменшэнні на неабяжлівыя запыткі HTTP, разрабатчыкі выкарыстоўваюць удобнае API, якое абгружае працэс стварэння запыткаў, ўжыцце іх і апрацоўку адпаведзей.
Першая спроба стварэння класыфікатора тыкетаў у праекце Support Agent выглядала так.
String result = chatClient.prompt("Analyze if incoming support ticket is about some kind of issue or is it a business request. "
+ "If it's a business request, the text will ask you to create something new or ask for estimation, if it's a support request "
+ "the text will say that something is not working properly, something is down or needs fixing. Answer with true if it's a "
+ "business request and false if it's a support request" + request.description())
.call()
.content();
Ён падобны з звычным API, за выключэннем таго, што кантракт візначаецца прамтам, а не схемай JSON.
Чы гэты спосаб будзе даваць точныя рэзультаты ў працоўнай суперактуальнасці? Оерагодна ні. Ён сумешчае постацейныя інструкцыі з ненадзеяным уводам ад корыстніка ў адну строчку, не аддзеляе содэржынь тыкета і прыпускае, што модэль вярнуе ўсё, што Java можа распазнаць як булева значэння. Версія, адпрацоўваная для працоўнай суперактуальнасці, больш падобная да кантракта прыемлі, дзе інструкцыі на рэжыме сістэмы знаходзяцца околачы ўвод ад корыстніка.
String result = chatClient.prompt()
.system("""
You classify incoming tickets for an L3 support workflow.
Return exactly one token: true or false.
Return true when the request asks for new functionality, estimation, planning, or project work.
Return false when the request reports broken, degraded, unavailable, or incorrect production behavior.
Do not explain your answer.
""")
.user(u -> u.text("""
Ticket title: {title}
Ticket source: {source}
Ticket description:
---
{description}
---
""")
.param("title", request.title())
.param("source", request.source())
.param("description", request.description()))
.call()
.content();
Сістэмныя інструкцыі задаюць парадакты і ліміты працы, тады калі у прыемніка ад корыстніка знаходзіцца зменны вхідны даны. Запросы стаюць часткай самай структуры, фіксуючы падзячанні, задаючы тон і вплываючы на спосаб прачытання запітоў.
Гэта прыводзіць да новай дысцыпліны — інжынерыі запросаў. Запрос больш не ёсць простаю строчкай тэксту. Ён ўжо ёсць артыфактам, які трэба версіяваць, тэставаць і падтрымваць, і такой падход неабходны для стабільных сістэм. Старонкі-парады Spring AI пра запросы і пра ChatClient ёсць наступным логічным джэрэлам інфармацыі.
Структураваны выхід
Аднам з першых вызоваў пад час адключэння AI да бэкэнд-сістэм ёсць неструктураваны выхід. Мадэлі па сваім прыродным чынніку ствараюць тэкст у вольнай форме, тады калі корпаратывныя прыкладнікі патрабуюць структураваных дадзеных.
Spring AI скасоўвае гэтыя прыемнікі, ператвараючы адпаведзі прымусова ў об’екты Java. Чырвонта гэта неабходнасць у ручнай парсацыі і зменшае можлівасці непаўнай інтэрпрэтаціі рэзультатаў.
У зяместо таго, каб атрымаць параграф пра тое, што ўсё зламалася, агент падтрымкі выкарыстоўвае запіс Java, каб пазначыць, які рэпазітарый і клас, верагодна, ўчаствуюць у інцыдэнцы.
@Service
@RequiredArgsConstructor
public class SupportAnalysisService {
private final ChatClient chatClient;
private final LogRetrievalTool logRetrievalTool;
public LogCauseReport analyzeLogs(SupportTicketRequest request) {
var converter = new BeanOutputConverter<>(LogCauseReport.class);
var format = converter.getFormat();
String response = chatClient.prompt("Analyze the support problem and provide solution, use available MCP tools to access logs. "
+ "Incoming support request description: " + request.description()
+ " \n provide response in this format " + format).tools(logRetrievalTool).call().content();
LogCauseReport report = converter.convert(response);
return report;
}
}
public record LogCauseReport(String causeOfProblem, String repoName, String className) {
}
Хутчэй, модэль керуецца так, каб выдавала адпаведны адказ, які можна безпосерэдна ператворыць у об’ект з чыстаю тыпаванасцю, чым інтэграцыя пераходзіць з нечыстаеобработкі тэксту на выразныя контракты.
Прыбыткі вельмі вялікі. Неструктураваны выход змушвае да вікорыстоўвання нестабільных методаў парсінгу, якія ламаюцца, калі формулівкі нейкім чынам змінююцца. Структураваны выход можна пераканаць, задаць у логах і перадаваць, як і любы іншы тып дадзеных. У офіцыйных дакументах опісваецца падход з вікорыстоўванням канвертара.
Наветнейшыя версіі Spring AI таксама праставляюць можлівасць карэткавання аб’ектаў з чыстаю тыпаванасцю, а ў дзеяных прадаўцаў — натыўны структураваны выход; оба варыянты варуць рассмотрэць. Забезпечэнне супакоўкі з модэлью бліжэй да самай модэлі значыць, што аплікацыя патрабуе менш коду для парсінгу.
Выклікі інструментаў
Стварэнне тэксту ёсць корыстным, але справжняя цэннаяя прыходзіць тады, калі AI можа взаімацься з сістэмай праз запрашэнне дадзеных, запуск робочых пралэцэсаў аб выкананне бізнес-логікі.
Інструменты, які выклікаюцца, дазваляюць гэта здарыцца, адкрываючы функцыі прыкладнення, якія модэль можа выклікваць на адказ на свае міркуванні. Модэль не трэба спрыягаць як аператара з прымытным доступам да інфраструктуры. Яна запрашоўвае певную можлівасць, а прыкладненне вяршыць рашэнне, чы гэтая можлівасць існуе, як пераканальваюцца аргументы, якія даныя вяртаюцца і як фіксуецца выкананне.
Унутрь праекта SupportAnalysisService адкрывае LogRetrievalTool для крока аналізу логаў. Для апісання інструмента выкарыстоўваецца анотацыя @Tool, а параметр з опісам дапамагае модэлі выбраць момент выклікання функцыі.
@Tool(name = "analyze_logs", description = "Analyzes provided logs and summarizes potential issues")
public LogCauseReport analyzeLogs(
@ToolParam(description = "Application name") String applicationName) {
var converter = new BeanOutputConverter<>(LogCauseReport.class);
var format = converter.getFormat();
String prompt = """
You are a support AI specialized in analyzing application logs to identify potential issues.
Given the application name "%s", analyze the relevant logs and provide a structured report.
Respond ONLY with a single JSON object that strictly matches this format:
%s
Do NOT return the schema itself, only valid JSON with values filled in.
""".formatted(applicationName, format);
String jsonResponse = chatClient.prompt()
.user(prompt)
.call()
.content();
return converter.convert(jsonResponse);
}
Калі модэль выявляе, што ў яе ўсё ж трэба больш інформацыі, яна вызывае адпаведную функцыю, адразу включае яе рэзультат і продовжае генеравацыю. Па суты, модэль стае керуючым элементам сістэмных можлівасцей.
Аднак, калі сістэмы растуць, жорсткая інтэграцыя стае обмежальнай, адтолькі ўсё новыя інструменты паўтараюць зв’язак між модэлью і прыкладнай програмай.
Адкрыць інструменты за дапамойкой MCP
Протакол Model Context Protocol рашае гэту проблему. MCP стандартызуе спосаб, якім інструменты і службы ўводзяцца ў працу для модэляў, тады яны можна адкрыць дынамічна і не патрэбна ўбудовваць іх у прыкладную програму.
MCP ператварае фіксаваныя інтэграцыі на дынамічную экасыстэму, дзе можна дадаць новыя можлівасці або ўзменіць існуючыя без змян у самай основнай прыкладнай програме, што ўсьмо гэта ёсць адным з асновных крокаў на шляху да масштабавання архітэктураў, заснованых на агентах. Дакументацыя Spring AI па выкліканню інструментаў опісвае модэль программавання і прабег выканання. Калі інструменты патрабуюць дынамічнага аднаходжэння або ўжо трэба яныя раздаваць межы процэсамі, падтрымка MCP являецца логічным наступным крокам.
Генераванне з дапамогай аднаходжэння дадзэнняў
Модэлі ўжо ёсць моцнымі, але не ведаюць ніч пра дадзеныя вашых сістэм. Кліянты, продукты і внутрашнія працэсы застаюцца невядомымі, калі толькі інформацыя пра іх не будзе падана.
RAG рашае гэтыя проблемы паляганням на аднаходжэнні дадзэнняў прыбліжна перад генераваннем. Адпаведныя дакументы выкарыстоўваюцца з базы вектарных дадзэнняў і включаюцца ў запіт, чым выходны рэзультат стае абмовленым на базе корпаратыўных дадзэнняў, такіх як інструкцыі, лог-файлы працы і код прыкладных програм.
Для агента падкісткі RAG задае код для выправлення паводзя ў працоўнай сітцы, выкарыстоўваючы клас Java, названы ў логах прыкладнення.
Першы крок — SupportAgentController запрашвае фрагменты коду праз GithubRagService, які працюе на аднойчыні з LogCauseReport, які містыць падозрэваны рэпазітарый і клас.
String classCode = ragService.findRelevantClass(null, logCauseReport.repoName(), null, logCauseReport.className()).stream()
.map(SupportAgentController::stripMetadataLines)
.filter(content -> !content.isBlank())
.collect(Collectors.joining(System.lineSeparator() + System.lineSeparator()));
У другім кроці служба адміністрування стварыць фільтры метадаў і запускае пошук на адпоўненасць у векторным сховішчы Qdrant.
SearchRequest.Builder searchRequestBuilder = SearchRequest.builder();
if (expressions != null) {
searchRequestBuilder = searchRequestBuilder.filterExpression(expressions.build());
}
Set<String> results = Objects.requireNonNull(vectorStore.similaritySearch(searchRequestBuilder.topK(10).build()))
.stream()
.map(Document::getFormattedContent)
.collect(Collectors.toSet());
Трэці крок — гэта запуск адаптаванага коду ў запіт, у яком прасіцца прыняць выправленні.
String prompt = """
You are a Senior Java Developer. You have the following class code:
%s
The code has the following problem: %s
Provide a detailed suggestion on how to fix the problem in the code.
Format your response in markdown with clear sections.
""".formatted(classCode, problemDescription);
String suggestion = chatClient.prompt(prompt).call().content();
Этот падчынак памагае прыемлівацу перайсці з ролі загальнага асістэнта да асістэнта, які разумее конкрэтную галерэю. RAG галоўная мета якога — зменшыць галюцынаціі і прабавіцца падтрымаць адпаведнасць адказоў з внутранімі знаннямі, але за цэну дадатковай складнасці.
Ён дадае модэлі імбеддынгу, вектарныя базы дадзеных і логіку пошуку, якія ўсе патрабуюць карыстоўвання і налаштавання. Для корпаратыўнага выкарыстоўвання такая складнасць часта ўніварыянтна, адколі якасць адказоў залежыць ад кальколькі фактараў: насколькі свежыя ўваходзячыяся даны, якасць метададзеных, стратэгія разбівання на часткі, автарызацыя і сачыце за доказамі. Дакументацыя Spring AI пра RAG, вектарныя хранілішчы і Qdrant раскрывае панявы, прынятныя ў гэтым раздзеле.
Візуабільнасць, ацэнка і кантроль эксплуатацыі
Абляваемасць для ШЫ працюе інакш. Звычныя функцыі логавання і манітарынгу выкладваюцца на дэтэрміністычнае паведамленне, але ШЫ дагаўляе дапаможныя выміры для назірання. Следжыранне часу адпаведзення і часткі пакрыцця бягамі не ўсё, і камандам таксама неабходна бачыць запіты, выходы модэляў, выкарыстоўванне токэнаў і взаімадзею з інструментамі.
Агент падтрымкі выкарыстоўвае Micrometer як сваю парадку абляваемасці, якая фіксуе:
- ідэнтыфікаторы і кантэкст кожнага запіту, такія як квітанцыя, абярнучы і выконвальная сістэма
- праўодніка модэля і яго назву, версію запіту, затрымку, выкарыстоўванне токэнаў і прычыну завершэння
- чы паводзілася канвертаванне ў структураваны выход
- кожны вызов інструмента, з нормалізаванымі аргументамі, розмерам рэзультата і затрымкай
- каторыя рэпазітарыі, файлы, рэйтынгі вектараў і часткі даных былі атрыбуаваны
- паўнайшы статус квітанцыі і чы чалавек-рэвізор прыняў чы змяніў прыказ
Такі дэталі ўжоць неабходны для адлучэння бягаў і оптымізацыі, калі ўжоць ўжоць адказваюць на пытанне, чаму сістэма паводзіцца так, як паводзіцца. У прымэненнях у працэўнай супэрвізіі чутлівыя запытанні і рэзультаты не трэба ліставаць слова ў слова. Адлічным альтэрнатыўным рашэннем ёсць структураваная ліставка падзей з ідэнтыфікаторам запытання, ідэнтыфікаторам модэлі, колькасцю токэнаў і рэзультатам правіл.
Ацэнка рэзультатаў дадае ўжоць адну слой. Сістэмы можаць ацэніць якасць адпаведзі да заранее вяліканых крэтэрыяў і не трэбаць прыпускаць, што адпаведзі правыя. Гэта дазволяе ствараць такія патэрны, як цыклы ацэнавальніка-оптымізатора, калі адпаведзь падганяецца перад тым, як яна дасягне корыстніка.
Гэта таксама змінюе спосаб, якім эвалююць сістэмы. Калі ўжоць ўжоць змінюецца запытанне, модэль укладання, падход да чакання частак або версія модэлі, рэзультат можна паўставіць у супараванне з вядомымі прыкладамі, тады каманда можа з’ясавіць, чыі змяны павышаюць карыстнасць робочага процэсу, і чыі яны не залежаць ад кальколькі вражаючых прыкладаў.
Перш чым адкрыць асістэнта для іншых каманд, для праекту былі розглянуты некалькі правіл керавання ўработайомасцю:
- жорсткі таймауты для вызоў да модэлі, інструментаў і сховішча вектараў
- бюджэты токенаў на кожны запіт і на кожнага корыстувальніка, што абмежвае вітраты і можлівасці збою
- перапрыбуткі толькі там, дзе яны безпечныя і абмежаныя
- станы альтэрнатыўнага функцыонавання, калі модэль, інструмент або Qdrant не працуюць
- маскаванне секрэтных даных, аутантыкацыйных даных і персональных дадзей пры стварэнні запітоў і логаў
- фіксацыя контэнту за замовчаннем, або толькі пад апраўданымі правіламі доступу
- чыстае правіла зберагання запітоў, рэзультатаў, вкладзенняў і выходных даных інструментаў
- панелі керавання і апавешчэнні пра збоі перакладу, порожнія рэзультаты, бягы інструментаў і адхіленні рэвізораў
Рэштата адхоўлення адзінакоў кажа больш за ўсё пра рэальную выкарыстоўванне. Калі інжынеры рэгулярна перапісваюць або адкідаюць створаныя рэкамендаціі, асістэнт стварае дадзейнае навантажэнне. Сістэма для працы трэба ўчыцца на гэтым сігнале. Автаматычная наладка для усяго — гэта не правільны падход. Лепшы шлях — аперацыйны: павышаць качэнне запытанняў, інструментаў, процэсаў пошуку і правіл за дапамогою пераканальных доказаў. Дакументацыя Spring AI пра абзірнасць пакрывае вбудованыя інструменты.
Праектаванне рамкаваных агентных рабочых практык
Спалучыўшы ўсё вышэсказанае, з’яўляецца новы патэрн: агентная сістэма.
Традыцыйныя прыкладнікі следуюць заранее візначаным рабочым практыкам. Агентныя працююць у ітэратыўнай петлі спаглядання, разумовага аналізу і дзеяння. Яны зберагаюць стан, выкарыстоўваюць памяць і дынамічна выбіраюць, якія дзеянні выконваць.
Стан, памяць і автонамія стаюць ключовымі аспектамі, і кожны з іх адпавядае адной з можнасцей, якія ужо надае Spring AI:
- Стан — гэта тое, што відбываецца пад час тэкушчай взаімадзеі.
- Памяць — гэта тое, што застаецца праз усі взаімадзеі.
- Інструменты вызначаюць, якія дзеянні дазволены.
- Рэгламенты пазначаюць, што забараняецца або трэбуе параджування.
- Крэтэрыяі завершэння паведамляюць, калі петля павінна завершыцца.
Гэта зменшае ролю прыкладнення паўстаноўна з класычнага корпаратыўнага процэсу. Уместо таго, каб візначаць кожны крок, сістэма візначае можлівасці і обмежэнні, і дазволяе модэлю організаваць дзеянні ў межах гэтых лімітав.
У агента падтрымкі цыкл пачынаецца з запіту. Агент аналізуе яго, выклікае інструменты і запрашвае код. Пасля чаго ён складае рэкамендацыю і апдэйтуе заявку. Гэта не автонамны оператар вырабоцтва, і ён не павінен стаць такім. У фінансовых тэхналогіях гэтыя межы вялікія за тое, якія дзеянні можа выконваць агент у паводзе данага кантэксту. Модэлю можна даваць доверлівасць у стварэнні падсумку лог-даных задоўжыцей, прычыму яе не можна даваць доверлівасць у маніпуляцыі заявкамі.
Стварэнне эфектываў агентоў — гэта складная задача, а дакументацыя Spring AI на гэту тэму ёсць хорашым пачатковым пунктом.
З эксперыментаў да корпаратыўных сістэм
Штучны інтэлект — гэта не проста ўтэмніцца. Ён дадае корпаратыўным сістэмам новы слой, які ёсць верагатычным, дынамічным і тычыцца безпосерэдна да зовнішніх залежнасцяў. Без структуры гэты слой быстра прыводзіць да кранкіх, непрадвідвальных формаў поведзення.
Spring AI адказвае спосабом інтэграцыі яго, захоўваючы інжынерныя практыкі, якія робяць корпаратыўныя сістэмы надзеянымі. Знайомыя абстракцыі і чытка апісаныя шаблоны інтэграцыі дазволяюць командам уведаць тэхналогіі AI без адмовы ад чыстаўных кантрактов, кантролюемых взаімадзеяў і прыкладнага паведання.
Таму змяны не стосуюцца толькі дадаўнення можлівасцяў AI. Ооны стосуюцца эвалюцыі сістэм, каб AI стаў корыстным, кантролюемым і спостэрагаемым элементам архітэктуры. Наступныя корпаратыўныя прыкладнікі будуць ацэнены за тое, насколькі добра яны інтэгруюць AI, а спосаб ўжытку яго будзе менш значным.
Супаўзеленыя матэрыялы
- Практычныя прытамулы: RAG ўмер. LLM Wiki — ідэя Андрэя Карпаты — гэта тое, што будзе далей — Паследовы разбор практычных прытамулов: RAG ўмер. LLM Wiki — ідэя Андрэя Карпаты — гэта тое, што будзе далей: контракты, перакрыццяі і блокі коду для команд, якія розробляюць RAG.
- Праект RAG — гэта не адны вялікі файл на Python: структура папак, якая можа расшырвацца — Разбіўка дэмавай прыкладнай програмы RAG на часткі: практыкаванне дадзенняў, разбіўка на часткі, стварэнне эмбеджаў, храненне вектараў, адзыскванне інфармацыі, формулювання запытанняў, кліент LLM, API, тэсты і логі, ўсё гэта дапамагае праекту расшырвацца за межы пачатковага этапу.