W ostatnim czasie zesp贸艂 乌鸦传媒 mia艂 okazj臋 stworzy膰 kilka aplikacji biznesowych wykorzystuj膮cych sztuczn膮 inteligencj臋, r贸wnie偶 t臋 generatywn膮 鈥 zawdzi臋czaj膮c膮 swoj膮 niezwyk艂膮 popularno艣膰 chatowi GPT. W tym artykule dziel臋 si臋 z Wami swoimi spostrze偶eniami, kt贸re okaza艂y si臋 niezwykle istotne w trakcie budowania takich rozwi膮za艅.

Kiedy m贸wmy o generatywnej sztucznej inteligencji, to niemal od razu my艣limy o tzw. du偶ych modelach j臋zykowych (ang. Large Language Models, LLMs), kt贸re s膮 wprawdzie jej najbardziej rozpoznawalnym, ale nie jedynym, elementem. Budowanie niezawodnych aplikacji opartych na sztucznej inteligencji wymaga holistycznego podej艣cia, w kt贸rym korzystamy z wyspecjalizowanych, najcz臋艣ciej chmurowych, narz臋dzi AI. Co wi臋cej, u偶ywamy ich w oparciu o najnowsze wzorce projektowe z obszaru AI, a tak偶e stosujemy sprawdzone w wielu projektach techniki in偶ynierii oprogramowania.

LLMy: zagl膮damy do 艣rodka

Zakres wiedzy LLM贸w jest ograniczony i zale偶y od zbioru danych u偶ytego w trakcie trenowania modeli. Podczas budowania aplikacji biznesowych niesie to ze sob膮 dwa podstawowe wyzwania: jak wzbogaci膰 du偶e modele j臋zykowe o wiedz臋 specyficzn膮 dla danego biznesu, np. o tre艣ci rozporz膮dze艅 dla pracownik贸w oraz jak zapewni膰, 偶e zmiany w tych rozporz膮dzeniach b臋d膮 od razu widoczne w trakcie u偶ywania tych modeli. Pierwszym pomys艂em, kt贸ry si臋 nasuwa, jest wytrenowanie w艂asnego modelu od podstaw, wzgl臋dnie dotrenowanie modelu bazowego, z u偶yciem swoich danych i powtarzanie tego procesu, gdy konieczna jest ich aktualizacja. Te podej艣cia s膮 jednak w wi臋kszo艣ci przypadk贸w niepraktyczne ze wzgl臋du na ogromne koszty id膮ce nawet w setki milion贸w z艂otych. Bardziej efektywnym rozwi膮zaniem jest metoda uczenia kontekstowego (ang. in-context learning). Polega ona na tym, 偶e w zapytaniu wysy艂anym do modelu, opr贸cz w艂a艣ciwego pytania, np. 鈥淛aka jest procedura zg艂aszania awarii sprz臋tu?鈥, wysy艂amy r贸wnie偶 tre艣膰 dokumentu opisuj膮cego tre艣ci procedur, w tym tej, o kt贸r膮 pytamy. W metodzie uczenia kontekstowego du偶e modele j臋zykowe nie wykorzystuj膮 zatem wiedzy pozyskanej w trakcie ich trenowania, ale u偶ywaj膮 zdolno艣ci do znaczeniowej analizy tekstu (zar贸wno dokumentu, jak i w艂a艣ciwego pytania). Co wi臋cej, ta analiza odbywa si臋 w trakcie generowania odpowiedzi, m贸wi膮c kolokwialnie 鈥渨 locie鈥. Ta metoda ma jednak r贸wnie偶 swoje ograniczenie. Jest nim rozmiar zapytania, czyli tzw. promptu, a co za tym idzie ograniczona ilo艣膰 wiedzy, o jak膮 mo偶emy rozbudowa膰 nasz model. Z tym ograniczeniem mo偶na sobie jednak poradzi膰. Jednym ze sposob贸w jest zastosowanie popularnego wzorca RAG (ang. Retrieval Augmented Generation), polegaj膮cego na umieszczeniu w prompcie tylko tych fragment贸w dokument贸w, kt贸re s膮 istotne z punktu widzenia zadawanego pytania. Drugim sposobem jest鈥 pozbycie si臋 tego ograniczenia i u偶ycie LLMu pozwalaj膮cego na ogromny rozmiar promptu id膮cy w tysi膮ce stron tekstu (np. Gemini 1.5 od Google).

RAG: inteligentne wyszukiwanie = mniejszy rozmiar promptu

RAG wykorzystuje mo偶liwo艣ci kolejnych element贸w z obszaru AI: zanurzenie (ang. embeddings) i wektorowe bazy danych (wi臋cej o tych elementach w dalszej cz臋艣ci artyku艂u). Kombinacja tych element贸w pozwala na znalezienie dopasowania znaczeniowego mi臋dzy pytaniem, wracaj膮c do naszego przyk艂adu: 鈥淛aka jest procedura zg艂aszania awarii sprz臋tu?鈥, a fragmentami dokument贸w, kt贸re z du偶ym prawdopodobie艅stwem zawieraj膮 odpowied藕 na to pytanie. Dzi臋ki technice RAG znacz膮co ograniczamy rozmiar promptu oraz zwi臋kszamy jako艣膰 generowanych odpowiedzi, kt贸ra mo偶e by膰 ni偶sza, je艣li prompt zawiera nieistotne informacje, czyli tzw. 鈥渟zum鈥.

LLMy z rozszerzonym oknem kontekstowym

Najnowsze LLMy pozwalaj膮 na zbudowanie promptu o rozmiarze odpowiadaj膮cym nawet ponad tysi膮cu stronom tekstu. To sporo. W wielu wypadkach rozmiar ten pozwoli艂by na umieszczenie w prompcie np. wszystkich procedur firmy. Nie musimy w贸wczas implementowa膰 wzorca RAG. Zaraz, zaraz鈥 Ale co ze wspomnianym wy偶ej 鈥瀞zumem鈥, kt贸ry mo偶e przecie偶 obni偶y膰 jako艣膰 generowanych odpowiedzi? Okazuje si臋, 偶e testy przeprowadzone na modelach z du偶ymi oknami kontekstowymi (inna nazwa na rozmiar promptu), zwane obrazowo szukaniem ig艂y w stogu siana, da艂y bardzo obiecuj膮ce rezultaty i zdaj膮 si臋 nie potwierdza膰 obaw zwi膮zanych ze wspomnianym 鈥瀞zumem鈥: uda艂o si臋 w wi臋kszo艣ci test贸w znale藕膰 przys艂owiow膮 ig艂臋.

Kt贸re podej艣cie wybra膰?

RAG czy LLM z rozszerzonym oknem kontekstowym? W podj臋ciu decyzji mo偶e pom贸c analiza koszt贸w obu rozwi膮za艅. Koszt zapytania do LLMu zale偶y od wielko艣ci promptu, ale w przypadku rozwi膮zania opartego na RAG musimy doliczy膰 koszt wektorowej bazy danych, obliczania zanurze艅 oraz rozwi膮zania samego w sobie.

Dodatkowym argumentem przy wyborze rozwi膮zania powinna by膰 ocena jako艣ci generowanych odpowiedzi. Jak to zrobi膰? O tym w dalszej cz臋艣ci artyku艂u.

Wykorzystanie kreatywno艣ci (lub jej ograniczenie)

Jedn膮 z najbardziej spektakularnych cech LLM贸w jest ich kreatywno艣膰. Szukasz inspiracji, gdzie pojecha膰 na wakacje i jak zaplanowa膰 tam czas? LLM jest w stanie wygenerowa膰 odpowied藕 w ci膮gu kilku sekund! Ale uwaga: ta odpowied藕 mo偶e zawiera膰 zmy艣lone lub nieprawdziwe informacje (halucynacje). Dok艂adnego przeciwie艅stwa, czyli ograniczenia halucynacji, a zamiast kreatywno艣ci – odpowiedzi bazuj膮cej na faktycznych dokumentach, oczekiwaliby艣my natomiast od wirtualnego asystenta odpowiadaj膮cego na wspomniane wcze艣niej pytanie: 鈥淛aka jest procedura zg艂aszania awarii sprz臋tu?鈥 Jak to zrobi膰? Okazuje si臋, 偶e LLMy maj膮 parametry, takie jak temperatura czy top_k, kt贸re umo偶liwiaj膮 kontrolowanie tych aspekt贸w. Na przyk艂ad ustawienie temperatury na 0 i top_k na 1 sprawi, 偶e odpowiedzi b臋d膮 bardziej faktyczne.

Aby zwi臋kszy膰 wiarygodno艣膰 odpowiedzi, mo偶emy doda膰 linki do dokument贸w 藕r贸d艂owych, a nawet opatrzy膰 odpowied藕 cytatami z tych 藕r贸de艂. Mo偶emy r贸wnie偶 poinstruowa膰 model (o tym jak to zrobi膰, w dalszej cz臋艣ci artyku艂u), aby w razie, gdy nie mo偶na by艂o znale藕膰 odpowiedzi w samym prompcie, nie 鈥瀐alucynowa艂鈥, ale odpowiedzia艂 po prostu 鈥瀗ie wiem鈥. Warto wspomnie膰 przy tej okazji, 偶e ca艂kowite wyeliminowanie halucynacji z LLM贸w, kt贸re s膮 modelami statystycznymi, a wi臋c niedeterministycznymi, nie jest na ten moment mo偶liwe. Nale偶y ten fakt wzi膮膰 pod uwag臋 projektuj膮c rozwi膮zanie biznesowe. W niekt贸rych wypadkach nie da si臋 zupe艂nie wyeliminowa膰 cz艂owieka w podj臋ciu decyzji biznesowej (ang. human in the loop).

Wektorowe reprezentacje: cichy bohater

Zanurzenia s膮 wektorow膮 reprezentacj膮 znaczenia pojedynczego s艂owa czy fragmentu tekstu (ale r贸wnie偶 obrazu lub d藕wi臋ku). Ta 鈥瀞ucha鈥 definicja nie oddaje jednak ogromnych mo偶liwo艣ci zastosowania tego elementu sztucznej inteligencji w budowanych aplikacjach biznesowych. M贸wi膮c o znaczeniu mam na my艣li jego ca艂y kontekst z uwzgl臋dnieniem wielu niuans贸w (np. kulturowych). Zreszt膮 najlepszym dowodem potwierdzaj膮cym te mo偶liwo艣ci jest fakt, 偶e zanurzenia s膮 wykorzystywane w trakcie trenowania samych LLM贸w, a tak偶e za ka偶dym razem, gdy wysy艂amy do nich nasz prompt. Jakie mog膮 by膰 potencjalne rozwi膮zania biznesowe z u偶yciem zanurze艅? Na przyk艂ad wyszukiwanie kontekstowe zamiast tradycyjnego bazuj膮cego na s艂owach kluczowych albo system rekomendacji produkt贸w w oparciu o aktualny koszyk zam贸wie艅.

Buduj膮c aplikacje biznesowe z elementami AI najcz臋艣ciej zaczynamy od LLMa, ale mo偶e si臋 okaza膰, 偶e nie jest on w og贸le potrzebny, bo to w艂a艣nie wektorowe reprezentacje s膮 rozwi膮zaniem naszego wyzwania biznesowego. Warto te偶 sprawdzi膰 w dokumentacji technicznej czy wybrany model wektorowych reprezentacji wspiera j臋zyk tekst贸w danej aplikacji (np. opisy produkt贸w).

Wektorowa baza danych: znajd藕 podobie艅stwa

W jaki spos贸b wyszuka膰 podobne znaczeniowo fragmenty dokument贸w albo – jak wspomniano wcze艣niej w metodzie RAG – znale藕膰 te zawieraj膮ce odpowied藕 na zadane pytanie? Z pomoc膮 przychodz膮 wektorowe bazy danych, kt贸re umozliwiaj膮 przechowywanie wektor贸w, a wraz z nimi np. tekst贸w. Co wi臋cej, produkty te umozliwiaj膮 efektywne przeszukiwanie wielowymiarowych przestrzeni wektorowych w celu znalezienia tych znajduj膮cych si臋 blisko siebie, co za tym idzie, odpowiadaj膮cych im podobnych znaczeniowo tekst贸w.

Jak膮 baz臋 wybra膰?

Jaki produkt bazodanowy wybra膰? Cho膰 na rynku jest sporo specjalizowanych produkt贸w, np. Pinecone, Amazon Kendra albo Azure AI Search, rozwa偶y艂bym u偶ycie tradycyjnej, relacyjnej bazy danych z rozszerzeniem wektorowym, np. PostgreSQL i pgvector. Szczeg贸lnie w pocz膮tkowej fazie budowania aplikacji, kiedy nie znamy jeszcze dok艂adnych wymaga艅 wydajno艣ciowych, warto postawi膰 na takie hybrydowe rozwi膮zanie, tym bardziej, 偶e w ten spos贸b znacz膮co ograniczymy koszty chmury.

In偶ynieria Prompt贸w: j臋zyk AI

Tre艣膰, kt贸r膮 wysy艂amy do LLMa, czli tzw. prompt, mo偶e zawiera膰 nie tylko samo pytanie, ale r贸wnie偶 instrukcje wraz dodatkowymi informacjami. Na przyk艂ad, w opisywanym wcze艣niej podej艣ciu uczenia kontekstowego, prompt zawiera instrukcj臋, aby odpowiedzie膰 na pytanie w oparciu o za艂膮czone fragmenty dokument贸w. Nie jest to niczym innym ni偶 programowaniem w j臋zyku naturalnym! Na potwierdzenie tych s艂贸w warto zacytowa膰 tutaj Andreja Karpathy鈥檈go, badacza i popularyzatora AI: The hottest new programming language is English. Tak jak w tradycyjnym programowaniu pos艂ugujemy si臋 pewnymi wzorcami, tak i w tym swoistym j臋zyku AI takich potrzebujemy. Sztuk臋 tworzenia prompt贸w okre艣la si臋 mianem in偶ynierii prompt贸w. Cho膰 ten termin brzmi bardzo powa偶nie, nie trzeba by膰 tutaj specjalist膮. Wed艂ug mnie podstawowe techniki in偶ynierii prompt贸w powinien zna膰 ka偶dy, a ich nauczanie powinno zacz膮膰 si臋 ju偶 w szkole podstawowej!

Opr贸cz podstawowych technik mamy r贸wnie偶 zaawansowane, takie jak Chain-of-Thought czy ReAct. Ta ostatnia pozwala na z艂o偶one wnioskowanie anga偶uj膮ce wiele 藕r贸de艂 danych, zar贸wno wewn臋trznych w danej organizacji, jak i zwn臋trznych, np. Wikipedia.

Jako艣膰 ma znaczenie: struktura ponad wszystko

Jako艣膰 wygenerowanych przez LLM odpowiedzi w du偶ym stopniu zale偶y od jako艣ci danych wej艣ciowych. Formaty danych, takie jak Markdown, JSON czy HTML s膮 ustrukturyzowane, np. s膮 podzielone na rozdzia艂y, w nich akapity, a w nich z kolei mog膮 by膰 tekst czy tabele. Prompty tworzone w oparciu o takie ustrukturyzowane dane, u艂atwiaj膮 LLMom zrozumienie kontekstu, a w konsekwencji generowanie sensownych odpowiedzi.

Dane nieustrukturyzowane, np. pliki w formacie PDF, obrazy czy diagramy, mog膮 wymaga膰 wst臋pnego przetwarzania (tradycyjnie lub z u偶yciem sztucznej inteligencji) lub zastosowania multimodalnych LLM贸w (np. akceptuj膮cych na wej艣ciu obrazy), np. Gemini Pro (Vision) czy GPT-4o, aby poprawnie zrozumie膰 kontekst. Pos艂u偶my si臋 przyk艂adem. Pewien dokument PDF zawiera, opr贸cz tekstu, z艂o偶ony wykres ilustruj膮cy trendy sprzeda偶y. Multimodalny LLM potrafi wygenerowa膰 s艂owny opis tego wykresu, kt贸ry wraz z pozosta艂膮 cz臋艣ci膮 dokumentu mo偶e pos艂u偶y膰 do wygenerowania odpowiedzi na pytanie dotycz膮ce sprzeda偶y.

Aby poprawi膰 jako艣膰, warto pozyska膰 od u偶ytkownik贸w aplikacji informacj臋 zwrotn膮 dotycz膮c膮 ich subiektywnej oceny trafno艣ci odpowiedzi. Przyk艂adowa implementacja mo偶e mie膰 form臋 przycisk贸w “lubi臋/nie lubi臋” czy formularza. Zebrane w ten spos贸b sugestie mog膮 pos艂u偶y膰 np. do doprecyzowania instrukcji w prompcie.

Testowanie w erze sztucznej inteligencji

Niedeterministyczny charakter LLM贸w oznacza, 偶e powtarzaj膮c test dla tego samego wej艣cia mo偶emy otrzyma膰 za ka偶dym razem nieco inn膮 odpowied藕. Jak zatem testowa膰 takie aplikacje? Z pomoc膮 zn贸w przychodzi nasz “cichy bohater鈥 – zanurzenie. Aby por贸wa膰 oczekiwane odpowiedzi z tymi wygenerowanymi przez LLMy, wystarczy w obu wypadkach znale藕膰 wektorowe reprezentacje i por贸wna膰 odleg艂o艣ci mi臋dzy tymi wektorami. W贸wczas nawet je艣li odpowied藕 wyra偶ona jest w nieco inny spos贸b, ale nadal jest prawid艂owa, mo偶na test uzna膰 za pozytywny.

W trakcie budowania aplikacji, szczeg贸lnie chatbot贸w, testowanie prompt贸w i ich odpowiedzi jest niezmierne wa偶nym elementem. Pami臋tajmy, 偶e prompt jest w zasadzie programem napisanym w j臋zyku naturalnym, wi臋c konsekwencje braku test贸w s膮 podobne do nieprzetestowanego kodu 藕r贸d艂owego. W przypadku niedeterministycznych LLM贸w brak test贸w prompt贸w ma jeszcze wi臋kszy negatywny wp艂yw na stabilno艣膰 i niezawodno艣膰 aplikacji.

Bezpiecze艅stwo: Tu nie ma kompromis贸w

Elementy AI w aplikacjach nie s膮 wyj膮tkiem I r贸wnie偶 wymagaj膮 dodatkowej uwagi z punktu widzenia bezpiecze艅stwa. Je艣li do LLMa wysy艂amy w prompcie tre艣ci spoza aplikacji (np. wprowadzone przez u偶ytkownika albo przys艂ane mailem) musimy je sprawdzi膰 czy nie zawieraj膮 np. instrukcji aby ujawni膰 poufne informacje albo kieruj膮 rozmow臋 na tematy nie zwi膮zane z przenaczeniem danej aplikacji (tzw. prompt injection). Podobnie z generowanymi odpowiedziami: nale偶y sprawdzi膰 czy te nie zawieraj膮 tre艣ci mog膮cych wp艂yn膮膰 negatywnie na reputacj臋 danej firmy. Na szcz臋艣cie s膮 na rynku narz臋dzia, zar贸wno komercyjne, jak i open source, kt贸re umo偶liwiaj膮 skutecznie wdro偶y膰 te 艣rodki bezpiecze艅stwa.

Mi艂ego kodowania!

Budowanie aplikacji chmurowych opartych na sztucznej inteligencji jest sporym wyzwaniem. Temu wyzwaniu mo偶na jednak podo艂a膰, je艣li pozna si臋 elementy oraz narz臋dzia AI, a tak偶e zastosuje wzorce i dobre praktyki z tego obszaru. W艂a艣nie przybli偶enie tych ostatnich by艂o celem mojego artyku艂u. Mam nadziej臋, 偶e moje spostrze偶enia pomog膮 w tworzeniu wydajnych, bezpiecznych i innowacyjnych rozwi膮za艅 opartych na sztucznej inteligencji. Mi艂ego kodowania!