{"id":30911,"date":"2025-04-28T05:00:00","date_gmt":"2025-04-28T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=30911"},"modified":"2025-04-24T13:31:07","modified_gmt":"2025-04-24T11:31:07","slug":"sztuczna-inteligencja-w-ekosystemie-spring-boot","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/sztuczna-inteligencja-w-ekosystemie-spring-boot\/","title":{"rendered":"Sztuczna inteligencja w ekosystemie Spring Boot"},"content":{"rendered":"\n<p>Sztuczna inteligencja zmienia spos\u00f3b, w jaki budujemy aplikacje, oferuj\u0105c nowe mo\u017cliwo\u015bci w zakresie personalizacji, automatyzacji i analizy danych. W szczeg\u00f3lno\u015bci modele takie jak GPT-4o od OpenAI rewolucjonizuj\u0105 podej\u015bcie do przetwarzania j\u0119zyka naturalnego (NLP), pozwalaj\u0105c na tworzenie inteligentnych system\u00f3w opartych na rozmowach, analizach tekstu czy generowaniu tre\u015bci.<\/p>\n\n\n\n<p>Poni\u017cszy artyku\u0142 odpowie na nast\u0119puj\u0105cy zestaw pyta\u0144:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jak mo\u017cna \u0142atwo i skalowalnie po\u0142\u0105czy\u0107 aplikacj\u0119 springow\u0105 ze sztuczn\u0105 inteligencj\u0105?<\/li>\n\n\n\n<li>Czy popularne modele LLM to tak naprawd\u0119 podkr\u0119cona wyszukiwarka internetowa?<\/li>\n\n\n\n<li>Czym jest Spring Functions i czy bean mo\u017ce by\u0107\u2026funkcj\u0105?<\/li>\n\n\n\n<li>Czym jest prompt enrichment?<\/li>\n<\/ul>\n\n\n\n<p>Je\u017celi na chocia\u017c jedno z tych pyta\u0144 nie znasz odpowiedzi, to zapraszam gor\u0105co do poni\u017cszego wpisu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Integracja AI z aplikacjami<\/strong><\/h2>\n\n\n\n<p>Ekosystem Spring Boot, jako fundament nowoczesnych aplikacji, staje si\u0119 idealn\u0105 platform\u0105 do integracji modeli. Jednak zanim przejdziemy dalej, zbudujmy szerszy kontekst, zastanawiaj\u0105c si\u0119 nad aktualnym sposobem u\u017cytkowania AI.<\/p>\n\n\n\n<p>Obecnie popularne modele, takie jak GPT-4o, s\u0105 najcz\u0119\u015bciej u\u017cywane przez interfejs graficzny \u2013 np. poprzez ChatGPT. U\u017cytkownik wchodzi na stron\u0119, wpisuje zapytanie w polu tekstowym, a model zwraca odpowied\u017a w oknie czatu. Jest to prosty i intuicyjny spos\u00f3b korzystania z AI, kt\u00f3ry zrewolucjonizowa\u0142 interakcje z technologi\u0105.<\/p>\n\n\n\n<p>Natomiast gdy projektujemy bardziej z\u0142o\u017cone aplikacje, w kt\u00f3rych model AI ma by\u0107 elementem architektury systemu i dzia\u0142a\u0107 jako integralna cz\u0119\u015b\u0107 backendu, konieczne jest nawi\u0105zanie komunikacji z modelem z poziomu kodu. Sam interfejs graficzny to wygodny punkt startowy, ale nie umo\u017cliwia on bezpo\u015bredniej integracji z mechanizmami mikrous\u0142ug, us\u0142ugami REST czy infrastruktur\u0105 chmurow\u0105. Innymi s\u0142owy \u2013 <strong>w \u015bwiecie oprogramowania liczy si\u0119 mo\u017cliwo\u015b\u0107 automatyzacji, skalowalno\u015bci i integracji z innymi systemami.<\/strong><\/p>\n\n\n\n<p>To prowadzi nas do kluczowego zagadnienia \u2013 integracji AI z aplikacjami. Dzi\u0119ki niej mo\u017cemy budowa\u0107 aplikacje, kt\u00f3re potrafi\u0105 m.in.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>obs\u0142ugiwa\u0107 zapytania klient\u00f3w w czasie rzeczywistym (popularne chatboty osadzone w domenie klienta),<\/li>\n\n\n\n<li>analizowa\u0107 dokumenty albo opinie klienta, generuj\u0105c automatycznie podsumowania lub raporty,<\/li>\n\n\n\n<li>inteligentnie realizowa\u0107 przetwarzanie wsadowe, analizuj\u0105c setki lub tysi\u0105ce dokument\u00f3w i szukaj\u0105c trend\u00f3w w czasie nieosi\u0105galnym dla cz\u0142owieka,<\/li>\n\n\n\n<li>wzbogaca\u0107 komunikacj\u0119 z modelem wzbogacaj\u0105c prompty o dodatkowe \u017ar\u00f3d\u0142a danych takie jak REST API, bazy danych czy systemy kolejkowe,<\/li>\n\n\n\n<li>analizowa\u0107 strumienie danych w domenie IoT w czasie rzeczywistym, dzi\u0119ki czemu mog\u0105 generowa\u0107 alarmy na podstawie wykrycia niestandardowego wzorca.<\/li>\n<\/ul>\n\n\n\n<p>Kluczowe wi\u0119c jest zrozumienie, \u017ce <strong>integracja AI z aplikacjami nie ma na celu zast\u0105pi\u0107 chatbot\u00f3w typu ChatGPT, ale ma realizowa\u0107 inny rodzaj potrzeb<\/strong>. Nie m\u00f3wimy tutaj o rywalizacji, ale <strong>synergicznym uzupe\u0142nieniu<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Scenariusz demonstracyjny<\/strong><\/h2>\n\n\n\n<p>Maj\u0105c ju\u017c nadany kontekst wprowadzaj\u0105cy w domen\u0119 pracy AI z aplikacj\u0105, przyjrzyjmy si\u0119 przyk\u0142adowej demonstracji takiej integracji. Scenariusz zak\u0142ada sytuacj\u0119, w kt\u00f3rej u\u017cytkownik chce pozna\u0107 <strong>najnowsze<\/strong> <strong>rekomendacje<\/strong> na temat ksi\u0105\u017cek science-fiction. Chc\u0105c wyj\u015b\u0107 maksymalnie naprzeciw u\u017cytkownika, nasz system pozwala przes\u0142a\u0107 prompt w postaci nagrania audio,&nbsp;tak \u017ceby u\u017cytkownik m\u00f3g\u0142 prawie wr\u0119cz \u201erozmawia\u0107\u201d z nasz\u0105 aplikacj\u0105.<\/p>\n\n\n\n<p>Naszym zadaniem jest otrzymanie od u\u017cytkownika nagrania, wyekstrahowanie z niego tre\u015bci promptu, odpytanie modelu, a nast\u0119pnie zwr\u00f3cenie odpowiedzi u\u017cytkownikowi. Zadanie z pozoru trywialne oka\u017ce si\u0119 jednak nie tak proste, gdy zrozumiemy lepiej, jak dzia\u0142aj\u0105 modele LLM.<\/p>\n\n\n\n<p>Mianowicie \u2013 sam model nie ma dost\u0119pu do Internetu \u2013 opiera si\u0119 na zestawie wytrenowanych danych, do kt\u00f3rych ma dost\u0119p. Odpytanie go wi\u0119c o najnowsze ksi\u0105\u017cki z gatunku science-fiction musi by\u0107 skazane na pora\u017ck\u0119, co wida\u0107 poni\u017cej:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/image1-2.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-large&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-30912&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:1685,&quot;targetHeight&quot;:773,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Powi\\u0119ksz obrazek: Odpytanie modelu o ksi\\u0105\\u017cki science-fiction &quot;,&quot;alt&quot;:&quot;Odpytanie modelu o ksi\\u0105\\u017cki science-fiction &quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"470\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image1-2-1024x470.png\" alt=\"Odpytanie modelu o ksi\u0105\u017cki science-fiction \" class=\"wp-image-30912\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image1-2-1024x470.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image1-2-300x138.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image1-2-768x352.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image1-2-1536x705.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image1-2.png 1685w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz obrazek: Odpytanie modelu o ksi\u0105\u017cki science-fiction \"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 1 Odpytanie modelu o ksi\u0105\u017cki science-fiction<\/figcaption><\/figure>\n\n\n\n<p>Jest to fundamentalne ograniczenie, kt\u00f3re wynika z architektury samego modelu oraz jego treningu. Innymi s\u0142owy \u2013 same modele <strong>nie dzia\u0142aj\u0105 jak wyszukiwarka internetowa<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>GPT-4o jako przyk\u0142ad<\/strong><\/h3>\n\n\n\n<p>GPT-4o to model statystyczny, kt\u00f3ry zosta\u0142 wytrenowany na ogromnym zbiorze danych do okre\u015blonego momentu w przesz\u0142o\u015bci. Po zako\u0144czeniu treningu model staje si\u0119 \u201ezamro\u017cony\u201d \u2013 nie posiada mechanizmu do dynamicznego uczenia si\u0119 nowych danych w czasie rzeczywistym ani mo\u017cliwo\u015bci samodzielnego ich pobierania. Nie jest to wyszukiwarka ani aplikacja, kt\u00f3ra w trakcie dzia\u0142ania mog\u0142aby komunikowa\u0107 si\u0119 z zewn\u0119trznymi \u017ar\u00f3d\u0142ami informacji.<\/p>\n\n\n\n<p>Dzi\u0119ki temu utrzymana jest lepsza kontrola nad dzia\u0142aniem samego modelu, poniewa\u017c proces jego trenowania jest nadzorowany i, co ciekawe, nie chodzi tutaj nawet od odcinanie go od sieci rodem w\u0142a\u015bnie z gatunku sci-fi, \u017ceby nie sta\u0142 si\u0119 rodzajem omnipotentnego bytu \u2013 ale \u017ceby nie straci\u0107 wysokiej jako\u015bci wyselekcjonowanego treningu, na kt\u00f3ry ca\u0142a masa \u015bmieciowego contentu mog\u0142aby mie\u0107 wp\u0142yw. Do tego dochodz\u0105 oczywi\u015bcie kwestie ochrony prywatno\u015bci danych oraz po prostu kwestie wydajno\u015bciowe same w sobie \u2013 <strong>brak dost\u0119pu do Internetu to wi\u0119c \u015bwiadomy wyb\u00f3r projektowy.<\/strong> <\/p>\n\n\n\n<p>W zwi\u0105zku z tym, chc\u0105c projektowa\u0107 systemy opieraj\u0105ce si\u0119 na danych zmieniaj\u0105cych si\u0119 w czasie rzeczywistym, musimy doprowadzi\u0107 do zjawiska tzw. \u201eprompt enrichment\u201d \u2013 <strong>czyli wzbogacenia naszego promptu o kontekst, w ramach kt\u00f3rego model b\u0119dzie m\u00f3g\u0142 wnioskowa\u0107<\/strong>. W rozumieniu naszego scenariusza, musimy wi\u0119c sami zadba\u0107 o to, \u017ceby mie\u0107 dost\u0119p do \u017ar\u00f3d\u0142a danych na temat najnowszych ksi\u0105\u017cek sci-fi, a nast\u0119pnie wzbogaci\u0107 o nie naszego prompta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Implementacja<\/strong><\/h2>\n\n\n\n<p>Opisane wy\u017cej zadanie realizuje poni\u017csza architektura:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/image2-2.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-large&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-30914&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:1173,&quot;targetHeight&quot;:892,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Powi\\u0119ksz obrazek: Architektura niezb\\u0119dna do realizacji zadania&quot;,&quot;alt&quot;:&quot;Architektura niezb\\u0119dna do realizacji zadania&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"779\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image2-2-1024x779.png\" alt=\"Architektura niezb\u0119dna do realizacji zadania\" class=\"wp-image-30914\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image2-2-1024x779.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image2-2-300x228.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image2-2-768x584.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image2-2.png 1173w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz obrazek: Architektura niezb\u0119dna do realizacji zadania\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 2 Architektura niezb\u0119dna do realizacji zadania<\/figcaption><\/figure>\n\n\n\n<p>Opieraj\u0105c si\u0119 na warstwie abstrakcji, poprzez interfejs TranscriptService oraz ReasoningService sprawiamy, \u017ce domenowa logika aplikacji staje si\u0119 niezale\u017cna od konkretnego modelu, na kt\u00f3ry patrzymy tutaj jak na konkretn\u0105 implementacj\u0119 rozwi\u0105zania interesuj\u0105cego nas problemu.<\/p>\n\n\n\n<p>W powy\u017cszym scenariuszu odpowiedzialno\u015b\u0107 ekstrakcji tekstu z pliku audio wydzielono do AssemblyAi jako rozwi\u0105zania specjalizuj\u0105cego si\u0119 w tej odpowiedzialno\u015bci, ale tak\u017ce dlatego, \u017ce ma ono bardziej interesuj\u0105ce plany u\u017cywania ich API \u2013 dywersyfikuj\u0105c odpowiedzialno\u015bci w ten spos\u00f3b, mo\u017cemy zaoszcz\u0119dzi\u0107 na u\u017cywaniu modeli, co jest szczeg\u00f3lnie wa\u017cne, bior\u0105c pod uwag\u0119 generowane koszty.<\/p>\n\n\n\n<p>Chc\u0105c zrealizowa\u0107 funkcjonalno\u015b\u0107 pobierania informacji na temat ksi\u0105\u017cek sci-fi, wykorzystano Google API Books oraz <strong>Spring Functions<\/strong>. To cz\u0119\u015b\u0107 ekosystemu Springa, kt\u00f3ra pozwala na tworzenie lekkich funkcji wielokrotnego u\u017cytku, kt\u00f3re s\u0105 ukierunkowane na realizowanie jednego jasno okre\u015blonego zadania, enkapsuluj\u0105c w sobie ca\u0142\u0105 logik\u0119 potrzebn\u0105 do jego realizacji.<\/p>\n\n\n\n<p>Natomiast \u2013 co jest najciekawsze \u2013 <strong>funkcje te s\u0105 rejestrowane jako beany<\/strong>, dzi\u0119ki czemu mog\u0105 by\u0107 wielokrotnie u\u017cyte w wielu miejscach aplikacji. Podej\u015bcie to jest jeszcze bardziej wspierane w Spring Cloud, kt\u00f3ry umo\u017cliwia tworzanie bardzo wydajnych rozwi\u0105za\u0144 serverless np. z wykorzystaniem AWS Lambdy.<\/p>\n\n\n\n<p>W ramach naszego scenariusza Spring tak\u017ce oferuje wsparcie dla wykorzystania tej funkcji poprzez zarejestrowanie jej w ramach budowanego przez nas promptu w ten spos\u00f3b:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/image3-2.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-full&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-30916&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:552,&quot;targetHeight&quot;:297,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Powi\\u0119ksz obrazek: Rejestrowanie promptu&quot;,&quot;alt&quot;:&quot;Rejestrowanie promptu&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-full wp-lightbox-container\"><img decoding=\"async\" width=\"552\" height=\"297\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image3-2.png\" alt=\"Rejestrowanie promptu\" class=\"wp-image-30916\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image3-2.png 552w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image3-2-300x161.png 300w\" sizes=\"(max-width: 552px) 100vw, 552px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz obrazek: Rejestrowanie promptu\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 3 Rejestrowanie promptu<\/figcaption><\/figure>\n\n\n\n<p>gdzie \u201efetchBooks\u201d to w\u0142a\u015bnie nazwa naszej funkcji, kt\u00f3ra wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/image4-1.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-full&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-30918&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:1021,&quot;targetHeight&quot;:142,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Powi\\u0119ksz obrazek: Funkcja \\u201efetchBooks\\u201d&quot;,&quot;alt&quot;:&quot;Funkcja \\u201efetchBooks\\u201d&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1021\" height=\"142\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image4-1.png\" alt=\"Funkcja \u201efetchBooks\u201d\" class=\"wp-image-30918\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image4-1.png 1021w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image4-1-300x42.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image4-1-768x107.png 768w\" sizes=\"(max-width: 1021px) 100vw, 1021px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz obrazek: Funkcja \u201efetchBooks\u201d\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 4 Funkcja \u201efetchBooks\u201d<\/figcaption><\/figure>\n\n\n\n<p>Zach\u0119cam Was do przej\u015bcia oraz przeanalizowania ca\u0142ego kodu <a href=\"https:\/\/github.com\/BartDro\/SpringAi\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >za pomoc\u0105 dedykowanego repozytorium<\/a>.<\/p>\n\n\n\n<p>Uruchomiwszy tak zrealizowan\u0105 architektur\u0119, mo\u017cemy odpyta\u0107 system w ramach za\u0142o\u017conego przez nas scenariusza, wysy\u0142aj\u0105c request na poni\u017cszy endpoint:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/image5-1.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-full&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-30920&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:717,&quot;targetHeight&quot;:287,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Powi\\u0119ksz obrazek: Wysy\\u0142anie requesta na endpoint&quot;,&quot;alt&quot;:&quot;Wysy\\u0142anie requesta na endpoint&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-full wp-lightbox-container\"><img decoding=\"async\" width=\"717\" height=\"287\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image5-1.png\" alt=\"Wysy\u0142anie requesta na endpoint\" class=\"wp-image-30920\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image5-1.png 717w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image5-1-300x120.png 300w\" sizes=\"(max-width: 717px) 100vw, 717px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz obrazek: Wysy\u0142anie requesta na endpoint\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 5 Wysy\u0142anie requesta na endpoint<\/figcaption><\/figure>\n\n\n\n<p>co doprowadzi do nast\u0119puj\u0105cej odpowiedzi:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/image6-1.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-large&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-30922&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:1436,&quot;targetHeight&quot;:897,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Powi\\u0119ksz obrazek: Odpowied\\u017a&quot;,&quot;alt&quot;:&quot;Odpowied\\u017a&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"640\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image6-1-1024x640.png\" alt=\"Odpowied\u017a\" class=\"wp-image-30922\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image6-1-1024x640.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image6-1-300x187.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image6-1-768x480.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/image6-1.png 1436w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz obrazek: Odpowied\u017a\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 6 Odpowied\u017a<\/figcaption><\/figure>\n\n\n\n<p>Jak wida\u0107, daty publikacji ksi\u0105\u017cek s\u0105 nowsze ni\u017c ostatnia aktualizacja modelu, ale dodane adresy URL wskazuj\u0105 na domen\u0119 Google, co jednoznacznie pokazuje, \u017ce model otrzyma\u0142 prompt wzbogacony kontekstowo. Dzi\u0119ki temu by\u0142 w stanie przeprowadzi\u0107 wnioskowanie i dostarczy\u0107 nam odpowied\u017a.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/oferty-pracy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/praca-PL-k-3.jpg\" alt=\"oferty pracy\" class=\"wp-image-30924\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/praca-PL-k-3.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/praca-PL-k-3-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Podczas eksploracji mo\u017cliwo\u015bci integracji sztucznej inteligencji z aplikacjami opartymi na Spring Boot zademonstrowali\u015bmy, jak modele j\u0119zykowe, takie jak GPT-4o, mog\u0105 by\u0107 wzbogacone o zewn\u0119trzne \u017ar\u00f3d\u0142a danych, aby przezwyci\u0119\u017cy\u0107 swoje ograniczenia.<\/p>\n\n\n\n<p>Kluczow\u0105 kwesti\u0105 jest zrozumienie, \u017ce modele takie jak GPT-4o nie maj\u0105 natywnego dost\u0119pu do internetu, co wynika z ich architektury i ogranicze\u0144 projektowych. W naszym scenariuszu, gdzie u\u017cytkownik oczekuje rekomendacji najnowszych ksi\u0105\u017cek science-fiction na podstawie zapytania w formie audio, to w\u0142a\u015bnie brak aktualnych danych stanowi wyzwanie. <strong>Rozwi\u0105zaniem by\u0142o zastosowanie mechanizmu &#8222;prompt enrichment&#8221;<\/strong>, gdzie dane z Google Books API zosta\u0142y w\u0142\u0105czone do prompta, umo\u017cliwiaj\u0105c modelowi wygenerowanie odpowiedzi opartej na bie\u017c\u0105cych informacjach.<\/p>\n\n\n\n<p>Ca\u0142o\u015b\u0107 pokazuje, jak Spring Boot i jego ekosystem wspieraj\u0105 tworzenie nowoczesnych aplikacji, kt\u00f3re s\u0105 elastyczne, skalowalne i dostosowane do dynamicznych potrzeb u\u017cytkownik\u00f3w. Wdro\u017cenie tego rodzaju architektury pozwala zbudowa\u0107 systemy zdolne do przetwarzania z\u0142o\u017conych danych, analizy w czasie rzeczywistym i wsp\u00f3\u0142pracy z r\u00f3\u017cnorodnymi \u017ar\u00f3d\u0142ami informacji. Dzi\u0119ki temu u\u017cytkownicy mog\u0105 do\u015bwiadcza\u0107 bardziej inteligentnych i spersonalizowanych aplikacji, kt\u00f3re wychodz\u0105 naprzeciw ich potrzebom.<\/p>\n\n\n\n<p><strong>Ten przyk\u0142ad to dow\u00f3d, \u017ce dobrze zaprojektowana integracja mi\u0119dzy AI a Spring Boot mo\u017ce dostarczy\u0107 realn\u0105 warto\u015b\u0107, \u0142\u0105cz\u0105c zalety modeli AI<\/strong> <strong>z moc\u0105 sprawdzonych narz\u0119dzi backendowych<\/strong>. To idealne rozwi\u0105zanie dla ka\u017cdego, kto chce tworzy\u0107 aplikacje na miar\u0119 wsp\u00f3\u0142czesnych wyzwa\u0144 technologicznych.<\/p>\n\n\n\n<p>Warto pami\u0119ta\u0107, \u017ce takie systemy nie maj\u0105 na celu zast\u0105pi\u0107 cz\u0142owieka, ale wspiera\u0107 go, umo\u017cliwiaj\u0105c skupienie si\u0119 na bardziej warto\u015bciowych zadaniach. <strong>To podej\u015bcie, w kt\u00f3rym sztuczna inteligencja i backend tworz\u0105 zgrany duet,<\/strong> dostarczaj\u0105c rozwi\u0105zania odpowiadaj\u0105ce na realne potrzeby u\u017cytkownik\u00f3w i u\u0142atwiaj\u0105ce prac\u0119 tw\u00f3rc\u00f3w. Jest to dopiero pocz\u0105tek nowego podej\u015bcia, w kt\u00f3rym technologia, dane i inteligencja wsp\u00f3\u0142graj\u0105 w spos\u00f3b bardziej naturalny ni\u017c kiedykolwiek wcze\u015bniej. Wszystko zale\u017cy od tego, jak z tego skorzystamy i jakie praktyczne rozwi\u0105zania z tego stworzymy.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 tematyka AI, zajrzyj koniecznie r\u00f3wnie\u017c <a href=\"https:\/\/sii.pl\/blog\/all\/ai\/\" target=\"_blank\" rel=\"noopener\" title=\"\">do innych artyku\u0142\u00f3w naszych ekspert\u00f3w<\/a>. <\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;30911&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;4&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 4)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Sztuczna inteligencja w ekosystemie Spring Boot&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 4)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Sztuczna inteligencja zmienia spos\u00f3b, w jaki budujemy aplikacje, oferuj\u0105c nowe mo\u017cliwo\u015bci w zakresie personalizacji, automatyzacji i analizy danych. W szczeg\u00f3lno\u015bci &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/sztuczna-inteligencja-w-ekosystemie-spring-boot\/\">Continued<\/a><\/p>\n","protected":false},"author":601,"featured_media":30926,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[1609,1546,1512,680,1033],"class_list":["post-30911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-chatgpt","tag-przeglad-narzedzi","tag-poradnik","tag-ai","tag-spring"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/04\/AI_2.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/30911"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/601"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=30911"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/30911\/revisions"}],"predecessor-version":[{"id":30930,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/30911\/revisions\/30930"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/30926"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=30911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=30911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=30911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}