Kluczowe pojęcia i zagadnienia dotyczące tworzenia generacyjnych rozwiązań sztucznej inteligencji
Duże modele językowe (LLM) są niesamowite, ale mają ograniczenia. Jako deweloper musisz zrozumieć te ograniczenia, co LLM-y są w stanie zrobić od razu po uruchomieniu i jak je zmodyfikować, aby uzyskać najlepsze wyniki dla rozwiązań sztucznej inteligencji opartych na generowaniu, które tworzysz. W tym artykule zidentyfikowaliśmy kilka wyzwań i czynników ograniczających elementy LLM. Wyjaśniono w nim typowe sposoby rozwiązywania problemów i przejmowania kontroli nad procesem generowania zawartości niezależnie od typu funkcji generowania sztucznej inteligencji, które tworzysz w aplikacji.
Wyzwania inżynieryjne podczas pracy z LLMs
Poniższa lista zawiera podsumowanie najważniejszych wyzwań lub ograniczeń, o których należy pamiętać podczas pracy z usługami LLM:
odcięcie wiedzy: Ze względu na wysokie koszty szkolenia LLM, treść wiedzy LLM jest ograniczona do tego, na czym zostało przeszkolone w danym momencie czasowym. Bez żadnych wtyczek ani innych dostosowań, LLM nie ma dostępu do informacji w czasie rzeczywistym i nie może uzyskać dostępu do danych prywatnych.
Halucynacje: LLM korzysta z prawdopodobieństw statystycznych i odrobiny losowości do generowania informacji. Stosowane są mechanizmy, aby wygenerowane odpowiedzi były zgodne z intencją człowieka w zadawanych pytaniach oraz z informacjami, na których został przeszkolony LLM, jednak LLM może tworzyć odpowiedzi, które nie są dokładne.
Przezroczystość: Również z powodu sposobu, w jaki LLM jest trenowany, nie ma już dostępu do wiedzy podstawowej, na której został przeszkolony. Nawet jeśli tak, nie ma gwarancji, że informacje były prawdziwe i uzasadnione pierwotnie. Ponadto nie ma kroku weryfikacji, aby upewnić się, że wygenerowana odpowiedź jest dokładna.
pl-PL: Brak wiedzy specyficznej dla domeny: Podobnie jak w przypadku ograniczenia wiedzy, jeśli masz prywatne informacje, takie jak wewnętrzne dokumenty firmowe, LLM nie został przeszkolony na podstawie tych informacji. Nie ma wiedzy na temat danych specyficznych dla domeny.
Co można zrobić, aby złagodzić możliwe wyzwania lub problemy z LLM-ami i uzyskać najlepsze możliwe wyniki, aby pomóc użytkownikom i Twojej organizacji? Zacznij od zrozumienia sposobów, w jakie można uzupełniać źródła danych, z których LLM pobiera swoje informacje.
Gdzie LLM-y pozyskują swoje informacje
Dobrym punktem wyjścia do uzyskania najlepszych wyników z LLM jest zrozumienie, skąd lub w jaki sposób LLM-y uzyskują informacje. Poniższe kategorie reprezentują różne podejścia do tego, jak LLM-y wchodzą w interakcję z różnymi źródłami informacji, aby generować odpowiedzi.
generacji pobierania (ROG): tradycyjne maszyny LLM używają tego modelu. Model generuje odpowiedzi wyłącznie na podstawie wiedzy, na jakiej został przeszkolony, bez uzyskiwania dostępu do jakichkolwiek informacji zewnętrznych ani pobierania ich podczas procesu generowania. Wiedza modelu jest statyczna i ograniczona do tego, co było zawarte w danych treningowych do daty granicznej. Oprócz kreatywnego pisania może ona odpowiedzieć na pytania dotyczące informacji, które są łatwo dostępne w Internecie.
Generowanie wspomagane wyszukiwaniem (RAG): Łączy zdolności generacyjne dużych modeli językowych (LLM) z możliwością pobierania informacji z zewnętrznych baz danych lub dokumentów w czasie rzeczywistym. Model wysyła zapytanie do zewnętrznego źródła w celu znalezienia odpowiednich informacji. Następnie używa informacji w celu utworzenia odpowiedzi. Takie podejście umożliwia modelowi dostarczanie bardziej dokładnych i up-toinformacji o dacie, niż zapewnia, przy użyciu wstępnie wytrenowanej wiedzy. Przypadki użycia obejmują sprawdzanie faktów, odpowiadanie na pytania na podstawie danych w czasie rzeczywistym lub odpowiadanie na pytania na podstawie prywatnych danych specyficznych dla domeny.
Generowania skoncentrowanego na wyszukiwaniu (RCG): Stawia jeszcze większy nacisk na zewnętrznie wyszukiwaną zawartość, często strukturyzując odpowiedzi wokół informacji pozyskiwanych ze źródeł zewnętrznych. Model może bezpośrednio uwzględniać duże segmenty pobranego tekstu w danych wyjściowych, edytując lub dodając do nich adnotacje, aby dopasować je do zapytania użytkownika. Takie podejście można postrzegać jako hybrydę między metodami pobierania i generowania, gdzie równowaga może w dużym stopniu sprzyjać informacjom pobranym ponad własnymi zdolnościami generacyjnymi modelu. Przypadki użycia obejmują podsumowanie dłuższego dokumentu, pomoc badawczą w celu zapewnienia porównań i eksploracji tematycznych w wielu podobnych dokumentach oraz kompilacji lub sortowania różnych źródeł materiału w połączonych danych wyjściowych.
Dobrym przykładem ROG jest ChatGPT. Z kolei Copilot (za pośrednictwem Bing) rozszerza LLM, korzystając z zewnętrznych źródeł wiadomości i udostępniając linki do tych źródeł.
Na pierwszy rzut oka RAG i RCG wydają się podobne, ponieważ obie obejmują integrowanie informacji zewnętrznych z procesem generowania języka. Jednak różnią się sposobem, w jaki nadają priorytety i wykorzystują pobrane informacje w procesie generowania.
W systemie RAG pobieranie danych zewnętrznych służy do rozszerzania zdolności generacyjnych wstępnie wytrenowanego modelu językowego. Pobrane informacje zawierają więcej kontekstu lub konkretnych danych używanych przez model do informowania o jego odpowiedziach. W systemie RAG aspekt generowania modelu językowego pozostaje kluczowy dla odpowiedzi. Pobrane dane działają jako element pomocniczy w celu zwiększenia dokładności lub głębokości.
System RCG stawia silniejszy nacisk na same pobrane informacje. W systemie RCG pobierane dane często są centralnym elementem odpowiedzi, a rolą modelu generowania jest przede wszystkim uściślenie, formatowanie lub nieznaczne ulepszenie pobranego tekstu. Takie podejście jest stosowane szczególnie wtedy, gdy dokładność i bezpośrednie znaczenie informacji są najważniejsze, a wymagana jest mniej twórcza synteza lub ekstrapolacja.
Mechanizmy zewnętrznego pobierania danych, które zasilają zarówno RAG, jak i RCG, zostały omówione w artykułach dotyczących przechowywania wektoryzowanych reprezentacji dokumentów w porównaniu z dostrajaniem LLM, dwóch powszechnych podejść do uzupełnienia wiedzy dostępnej dla LLM w oparciu o jego początkowe szkolenie.
Zrozumienie różnic między modelami pobierania może pomóc w wyborze odpowiedniego podejścia dla określonych aplikacji. Pomaga to zrównoważyć potrzebę twórczej syntezy i dokładności i wierności materiału źródłowego.
Czynniki wpływające na sposób działania wnioskowania
Ponieważ prawdopodobnie znasz internetowy interfejs użytkownika aplikacji ChatGPT, zrozumienie sposobu jego działania w celu udzielenia odpowiedzi na pytania może ułatwić zrozumienie pojęć, które są istotne podczas tworzenia generacyjnych funkcji sztucznej inteligencji we własnych aplikacjach.
Gdy użytkownik rozmawia z ChatGPT, projekt interfejsu użytkownika daje iluzję długiej sesji czatu, która zachowuje kontekst w trakcie kilku wymian między tobą a LLM. W rzeczywistości, dla danej sesji czatu, wszystkie zapytania i wszystkie odpowiedzi LLM (nazywane również jako kompletacje) są wysyłane z każdym nowym zapytaniem. W miarę rozwoju konwersacji wysyłasz coraz więcej tekstu do LLM w celu przetworzenia. W przypadku każdej nowej komendy wysyłasz wszystkie poprzednie komendy i odpowiedzi. ChatGPT używa kontekstu całej sesji czatu, a nie tylko bieżącego monitu, gdy komponuje odpowiedź na bieżący monit. Sesja czatu jako całość jest nazywana oknem kontekstu .
Okno kontekstowe ma limit długości, który różni się od wersji aplikacji ChatGPT, z którą pracujesz. Każda część konwersacji czatu, która przekracza limit długości okna kontekstu, jest ignorowana, gdy chatGPT komponuje odpowiedź na najnowszy monit.
Długie konwersacje mogą początkowo wydawać się dobrym pomysłem, ale długie zakresy kontekstowe mogą wpływać na ilość obliczeń potrzebnych do przetworzenia zapytań i stworzenia wynikowego tekstu. Rozmiar okien kontekstowych wpływa na opóźnienie odpowiedzi i koszty przetwarzania żądania przez usługę OpenAI.
Co to jest limit okna kontekstowego ChatGPT? Ile słów może obsłużyć ChatGPT?
Limit okna kontekstu zależy od modelu LLM, wersji i edycji, z którą pracujesz. Ponadto długość kontekstu jest mierzona w tokenach, a nie słowach. Tokeny to najmniejsze jednostki tekstu, które model może zrozumieć i wygenerować. Te jednostki mogą być wyrazami, częściami wyrazów (takimi jak sylaby lub rdzenie), a nawet poszczególnymi znakami. Tokeny są sercem przetwarzania języka naturalnego (NLP).
Użycie tokenów ma wpływ na dwie ważne kwestie dla deweloperów:
- Maksymalny limit okna kontekstu
- Cena za zapytanie i wykonanie
Co to jest tokenizacja?
tokenizacja to proces konwertowania tekstu na tokeny. Jest to kluczowy etap w przygotowaniu danych do trenowania lub wnioskowania (proces tworzenia uzupełnień na podstawie monitów) za pomocą LLM. Proces obejmuje kilka kroków, w tym podzielenie złożonego tekstu na zarządzane elementy (tokeny), które model może następnie przetworzyć. Ten proces może być prosty, taki jak dzielenie tekstu według spacji i interpunkcji, lub bardziej złożone, obejmujące zaawansowane algorytmy do obsługi różnych języków, morfologii (struktura słów) i składni (układ słów). Naukowcy i deweloperzy LLM decydują o metodzie tokenizacji na podstawie tego, co próbują osiągnąć.
Strona tokenizatora OpenAI zawiera więcej informacji na temat tokenizacji. Strona zawiera nawet kalkulator, który ilustruje podział zdania lub akapitu na tokeny.
Ponieważ uwaga w dolnej części strony Tokenizer openAI stwierdza, w typowych tekstach angielskich jeden token jest odpowiednikiem około czterech znaków. Średnio 100 tokenów jest równych około 75 wyrazom, co daje średnio trzy czwarte wyrazu na token.
Na stronie Tokenizer openAI omówiono również tiktoken, pakiet dla języka Python i języka JavaScript, którego można użyć do programowego oszacowania liczby tokenów wymaganych do wysłania określonego monitu do interfejsu API OpenAI.
Użycie tokenu wpływa na rozliczenia
Każdy interfejs API usługi Azure OpenAI ma inną metodologię rozliczeń. W przypadku przetwarzania i generowania tekstu przy użyciu Chat Completions API opłaty są naliczane na podstawie liczby tokenów, które składają Państwo jako polecenie, oraz liczby tokenów wygenerowanych jako wynik (ukończenie).
Każdy model LLM (na przykład GPT-3.5, GPT-3.5 Turbo lub GPT-4) zwykle ma inną cenę, która odzwierciedla ilość obliczeń wymaganych do przetwarzania i generowania tokenów. Wiele razy cena jest przedstawiana jako "cena za 1000 tokenów" lub "cena za 1 milion tokenów".
Ten model cen ma znaczący wpływ na sposób projektowania interakcji użytkownika oraz ilości wstępnego przetwarzania i przetwarzania końcowego.
Komunikaty systemowe a komunikaty użytkownika
Do tego momentu dyskusja koncentrowała się wyłącznie na monitach użytkownika . Monit użytkownika to typ monitu, który tworzy wymianę między użytkownikiem a ChatGPT.
OpenAI wprowadziło monit systemowy (nazywany również instrukcjami niestandardowymi ). Monit systemowy to nadrzędny zestaw instrukcji zdefiniowanych i dodanych do wszystkich konwersacji na czacie. Pomyśl o tym jako o zbiorze instrukcji meta, które chcesz, aby LLM zawsze przestrzegał za każdym razem, gdy rozpoczynasz nową sesję czatu. Można na przykład ustawić monit systemowy na "zawsze odpowiadać w poetyckiej formie haiku". Od tego momentu każda nowa prośba do ChatGPT powoduje wyświetlenie haiku zawierającego odpowiedź.
Chociaż wyrażenie "odpowiedź w formularzu haiku" nie jest przydatnym przykładem, ilustruje pomysł, że możesz wpłynąć na ukończenie monitu przez zmodyfikowanie samego monitu.
Dlaczego chcesz zmodyfikować monit użytkownika? Jeśli tworzysz funkcjonalność generatywnej sztucznej inteligencji lub aplikację dla profesjonalnych odbiorców, takich jak pracownicy firmy, klienci i partnerzy, bez wątpienia chcesz dodać zabezpieczenia, aby ograniczyć zakres tematów lub domen, na które aplikacja może odpowiadać.
Jednak modyfikowanie monitu użytkownika jest tylko jedną metodą ulepszania środowiska generowania tekstu dla użytkowników.
Metody ulepszania środowiska generowania tekstu dla użytkowników w języku ChatGPT
Aby poprawić wyniki generowania tekstu, deweloperzy są ograniczeni do prostego ulepszania monitu i istnieje wiele technik inżynierii monitów, które mogą pomóc. Jeśli jednak tworzysz własną aplikację do generowania sztucznej inteligencji, istnieje kilka sposobów ulepszania środowiska generowania tekstu dla użytkowników i warto eksperymentować z implementowaniem wszystkich z nich:
- Programowe modyfikowanie monitów użytkownika.
- Zaimplementuj potok wnioskowania.
- Retrieval-Augmented Generacja (omówiona w innych artykułach).
- Dostrajanie (omówione w innych artykułach).
Programowe modyfikowanie monitów użytkownika
Aby dodać monit systemowy do konwersacji użytkownika, nie używasz specjalnego interfejsu API. Wystarczy dołączyć instrukcje do monitu zgodnie z potrzebami.
Możesz jednak użyć kilku technik, aby ulepszyć komendy użytkownika.
- Kontekstowe przygotowanie: Twórz monity systemowe, które wyraźnie ustawiają kontekst rozmowy w danej domenie. Takie podejście polega na podaniu krótkiego opisu lub zestawu instrukcji na początku każdej interakcji. Instrukcje zawierają wskazówki dotyczące sztucznej inteligencji, aby pozostać w domenie problemu.
- przykładowe wskazówki: W pierwszym monicie dołącz przykłady typów pytań i odpowiedzi, które są istotne dla Twojej domeny. Takie podejście pomaga sztucznej inteligencji zrozumieć, jakiego rodzaju odpowiedzi można oczekiwać.
Możesz użyć dowolnej techniki monitowania inżynieryjnego. Jeśli możesz to zrobić programowo, możesz ulepszyć monit użytkownika w ich imieniu.
Zastrzeżeniem tego podejścia jest to, że im dłuższy jest monit, tym wyższy koszt każdego wywołania usługi LLM. Mimo to takie podejście jest prawdopodobnie najtańszym podejściem opisanym w tym artykule.
Wdrożenie potoku wnioskowania
Następnym krokiem poza modyfikowaniem monitu użytkownika jest programowe utworzenie całego potoku wnioskowania.
Potok przetwarzania jest procesem z końca do końca, który "czyści" surowe dane wejściowe (takie jak tekst lub obraz) przed ich użyciem do wykonania podstawowego zadania (wstępne przetwarzanie) lub sprawdza jego zakończenie, aby upewnić się, że spełnia potrzeby użytkownika przed jego wyświetleniem (przetwarzanie końcowe).
Wstępne przetwarzanie może obejmować sprawdzanie słów kluczowych, ocenianie istotności lub przekształcanie zapytania w celu lepszego dopasowania do oczekiwanego języka domeny. Na przykład możesz przeanalizować początkowy monit przesłany przez użytkownika. Zacznij od zapytania LLM, czy monit ma sens, czy mieści się w granicach tego, co jesteś gotów zaakceptować, czy opiera się na błędnym założeniu, lub czy trzeba go przepisać, aby uniknąć pewnych uprzedzeń. Jeśli usługa LLM analizuje monit i znajdzie problemy, możesz pójść o krok dalej. Możesz poprosić LLM o przeformułowanie zapytania, aby potencjalnie poprawić odpowiedź.
Przetwarzanie po przetworzeniu może obejmować walidację istotności i przydatności odpowiedzi do domeny. Może to obejmować usuwanie lub flagowanie odpowiedzi, które nie spełniają wymagań domeny. Na przykład możesz sprawdzić ukończenie dostarczone przez LLM, aby upewnić się, że spełnia wymagania dotyczące jakości i bezpieczeństwa. Możesz poprosić LLM o ocenę odpowiedzi, aby sprawdzić, czy rzeczywiście spełnia ona wymagania, które miała spełniać. Jeśli tak nie jest, możesz poprosić LLM o zmodyfikowanie wyniku. Powtórz te kroki, dopóki nie otrzymasz zadowalającego wyniku.
Istnieje jedno zastrzeżenie dotyczące dodawania kroków przetwarzania wstępnego: za każdym razem, gdy dodasz wywołanie do modułu LLM w potoku wnioskowania, zwiększysz ogólne opóźnienie (czas odpowiedzi) i koszt każdej interakcji z użytkownikiem. Jako doświadczony deweloper oprogramowania prawdopodobnie znasz już tego rodzaju kompromisy wpływające na budżet, wydajność i skuteczność systemu oprogramowania.
Aby uzyskać informacje o konkretnych krokach, które należy wykonać w celu utworzenia potoku wnioskowania, zobacz Utwórz zaawansowany system generowania z wzbogaconym wyszukiwaniem.
Inne czynniki wpływające na ukończenie
Poza programowym modyfikowaniem polecenia, tworzeniem potoku wnioskowania i innymi technikami, więcej szczegółów omówiono w Rozbudowa modelu dużego języka przy użyciu generowania wspomaganego wyszukiwaniem i dostrajania. Ponadto parametry można modyfikować podczas wykonywania wywołań do interfejsu API usługi Azure OpenAI.
Aby przejrzeć wymagane i opcjonalne parametry, które mogą mieć wpływ na różne aspekty ukończenia, zobacz dokumentację interfejsu czatu . Jeśli używasz zestawu SDK, zapoznaj się z dokumentacją zestawu SDK dotyczącą używanego języka. Możesz eksperymentować z parametrami na placu zabaw .
Temperature
: kontrolowanie losowości danych wyjściowych generowanych przez model. Na poziomie zerowym model staje się deterministyczny, konsekwentnie wybierając najbardziej prawdopodobny następny token z danych treningowych. W temperaturze 1 model równoważy między wybraniem tokenów wysokiego prawdopodobieństwa i wprowadzeniem losowości do danych wyjściowych.Max Tokens
: określa maksymalną długość odpowiedzi. Ustawienie wyższego lub niższego limitu może mieć wpływ na szczegóły i zakres wygenerowanej zawartości.Top P
(próbkowanie jądra): używane zTemperature
do kontrolowania losowości odpowiedzi.Top P
ogranicza sztuczną inteligencję do rozważenia tylko najwyższego procentu masy prawdopodobieństwa (P
) podczas generowania każdego tokenu. Niższe wartości prowadzą do tekstu, który jest bardziej skoncentrowany i przewidywalny. Wyższe wartości pozwalają na większą różnorodność.Frequency Penalty
: zmniejsza prawdopodobieństwo powtórzenia tego samego wiersza lub frazy przez model. Zwiększenie tej wartości pomaga uniknąć nadmiarowości wygenerowanego tekstu.Presence Penalty
: zachęca model do wprowadzenia nowych pojęć i terminów w zakończeniu.Presence Penalty
jest przydatne do generowania bardziej zróżnicowanych i kreatywnych wyników.Stop Sequences
: można określić co najmniej jedną sekwencję, aby poinstruować interfejs API o zatrzymaniu generowania większej liczby tokenów.Store Sequences
są przydatne do kontrolowania struktury danych wyjściowych, takich jak zakończenie ukończenia na końcu zdania lub akapitu.Logit Bias
: umożliwia modyfikowanie prawdopodobieństwa pojawienia się określonych tokenów w zakończeniu.Logit Bias
może służyć do kierowania ukończeniem w określonym kierunku lub pomijania określonej zawartości.
Zabezpieczenia Microsoft OpenAI
Oprócz utrzymywania odpowiedzi LLM powiązanych z konkretnymi tematami lub dziedzinami, prawdopodobnie martwisz się również o rodzaje pytań, które użytkownicy zadają LLM. Ważne jest, aby wziąć pod uwagę rodzaje odpowiedzi, które generuje.
Najpierw wywołania interfejsu API do Microsoft OpenAI Services automatycznie filtrują zawartość, którą interfejs API uzna za potencjalnie obraźliwą, i zgłasza to z powrotem do Ciebie w wielu kategoriach filtrowania.
Możesz bezpośrednio użyć interfejsu API moderowania OpenAI, aby sprawdzić dowolną zawartość pod kątem potencjalnie szkodliwej zawartości.
Następnie możesz użyć bezpieczeństwa zawartości sztucznej inteligencji platformy Azure, aby ułatwić moderowanie tekstu, moderowanie obrazów, wykrywanie ryzyka jailbreaku i wykrywanie chronionych materiałów. Łączy to środowisko konfiguracji, konfiguracji i raportowania portalu z kodem, który można dodać do aplikacji w celu zidentyfikowania szkodliwej zawartości.
Końcowe zagadnienia dotyczące projektowania aplikacji
Zrozumienie tokenizacji, cen, okien kontekstowych i implementowanie ulepszeń programowych w celu ulepszenia środowiska generowania tekstu użytkowników wpływa na sposób projektowania systemu generowania sztucznej inteligencji.
Poniżej przedstawiono krótką listę kwestii, które należy wziąć pod uwagę i inne wnioski z tego artykułu, które mogą mieć wpływ na decyzje projektowe aplikacji:
- Oceń konieczność korzystania z najnowszego modelu sztucznej inteligencji w odniesieniu do zagadnień dotyczących kosztów. Modele, które są tańsze, mogą wystarczyć do potrzeb aplikacji. Równoważenie wydajności przy użyciu ograniczeń budżetowych.
- Rozważ optymalizację długości okna kontekstowego, aby zarządzać kosztami bez znaczącego wpływu na środowisko użytkownika. Przycinanie niepotrzebnych części rozmowy może zmniejszyć opłaty za przetwarzanie, jednocześnie utrzymując wysoką jakość interakcji.
- Oceń, jak tokenizacja i stopień szczegółowości danych wejściowych i wyjściowych wpływają na wydajność. Zrozumienie, w jaki sposób wybrana usługa LLM obsługuje tokenizację, może pomóc w optymalizacji wydajności wywołań interfejsu API, potencjalnie zmniejszając koszty i skracając czasy odpowiedzi.
Jeśli chcesz od razu rozpocząć eksperymentowanie z tworzeniem rozwiązania generatywnej sztucznej inteligencji, zalecamy przejrzenie Rozpoczęcie pracy z czatem, korzystając z własnego przykładu danych w Pythonie. Samouczek jest również dostępny w .NET, Javai JavaScript.