1. Wprowadzenie
Ostatnia aktualizacja: 27.11.2023 r.
Co to jest generatywna AI
Generatywna AI, czyli generatywna sztuczna inteligencja, odnosi się do wykorzystywania AI do tworzenia nowych treści, takich jak tekst, obrazy, muzyka, dźwięki i filmy.
Generatywna AI korzysta z modeli podstawowych (dużych modeli AI), które mogą wykonywać wiele zadań jednocześnie i wykonywać gotowe zadania, w tym podsumowywanie, pytania i odpowiedzi, klasyfikację i nie tylko. Ponadto modele podstawowe można dostosowywać do docelowych przypadków użycia z bardzo małą ilością przykładowych danych, a ich trenowanie jest ograniczone.
Jak działa generatywna AI?
Generatywna AI wykorzystuje model systemów uczących się do poznawania wzorców i relacji w zbiorze danych z treściami utworzonymi przez człowieka. Wykorzystuje nauczone wzorce do generowania nowych treści.
Najczęstszym sposobem trenowania modelu generatywnej AI jest użycie uczenia nadzorowanego – model otrzymuje zbiór treści stworzonych przez człowieka i odpowiadających im etykiet. Następnie uczy się generować treści podobne do tych stworzonych przez człowieka i oznaczone tymi samymi etykietami.
Jakie są typowe zastosowania generatywnej AI?
Generatywna AI przetwarza ogromne treści, tworząc statystyki i odpowiedzi za pomocą tekstu, obrazów i przyjaznych dla użytkowników formatów. Generatywnej AI można używać do:
- Popraw komunikację z klientami dzięki ulepszonemu czatowi i wyszukiwaniu
- Eksploruj ogromne ilości nieuporządkowanych danych za pomocą interfejsów konwersacyjnych i podsumowań
- Pomagaj w powtarzalnych zadaniach, takich jak odpowiadanie na zapytania ofertowe, tłumaczenie treści marketingowych w 5 językach czy sprawdzanie umów z klientami pod kątem zgodności z zasadami itp.
Jakie rozwiązania w zakresie generatywnej AI oferuje Google Cloud?
Dzięki Vertex AI możesz wchodzić w interakcje z modelami podstawowymi, dostosowywać je i umieszczać w swoich aplikacjach – nie musisz nawet znać się na ML. Uzyskaj dostęp do modeli podstawowych w bazie modeli, dostrajaj modele za pomocą prostego interfejsu w Generative AI Studio lub używaj modeli w notatniku do badania danych.
Usługa Vertex AI Search and Conversation zapewnia deweloperom najszybszy sposób na tworzenie wyszukiwarek i czatbotów opartych na generatywnej AI.
Duet AI to oparta na AI usługa wspomagająca, która jest dostępna w Google Cloud i IDE, dzięki czemu wykonasz więcej zadań szybciej.
Na czym się skupiają te ćwiczenia z programowania?
To ćwiczenia w programie skupiają się na dużym modelu językowym PaLM 2 (LLM) hostowanego w Vertex AI Google Cloud. Obejmuje on wszystkie produkty i usługi systemów uczących się.
Do interakcji z interfejsem PaLM API będziesz używać Javy w połączeniu z administratorem platformy LLM LangChain4J. Poznasz różne konkretne przykłady, które pozwolą Ci wykorzystać LLM do odpowiadania na pytania, generowania pomysłów, wyodrębniania encji i ustrukturyzowanych treści oraz podsumowywania.
Opowiedz mi więcej o platformie LangChain4J.
Platforma LangChain4J to biblioteka typu open source do integrowania dużych modeli językowych (LLM) z aplikacjami w Javie przez administrowanie różnymi komponentami, takimi jak sam LLM, ale też inne narzędzia, takie jak wektorowe bazy danych (do wyszukiwania semantycznego), programy ładujące i dzielniki dokumentów (do analizowania dokumentów i uczenia się na nich), parsery wyjściowe i nie tylko.
Czego się nauczysz
- Jak skonfigurować projekt w języku Java pod kątem PaLM i LangChain4J
- Jak po raz pierwszy wywołać model tekstowy PaLM, aby wygenerować treści i odpowiadać na pytania
- Jak wyodrębniać przydatne informacje z nieuporządkowanych treści (wyodrębnianie encji lub słów kluczowych, dane wyjściowe w formacie JSON)
- Jak przeprowadzić klasyfikację treści lub analizę nastawienia za pomocą kilku ujęć
Czego potrzebujesz
- Znajomość języka programowania Java
- Projekt Google Cloud
- przeglądarki, na przykład Chrome lub Firefox;
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.
- Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
- Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako
PROJECT_ID
). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu. - Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.
Uruchamianie Cloud Shell
Google Cloud można obsługiwać zdalnie z laptopa, ale w ramach tego ćwiczenia z programowania wykorzystasz Cloud Shell – środowisko wiersza poleceń działające w Cloud.
Aktywowanie Cloud Shell
- W konsoli Cloud kliknij Aktywuj Cloud Shell .
Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.
Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.
Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.
Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.
- Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list
Dane wyjściowe polecenia
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project
Dane wyjściowe polecenia
[core] project = <PROJECT_ID>
Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Dane wyjściowe polecenia
Updated property [core/project].
3. Przygotowywanie środowiska programistycznego
W ramach tego ćwiczenia w programie będziesz tworzyć programy w języku Java, używając terminala Cloud Shell i edytora kodu.
Włączanie interfejsów Vertex AI API
- Upewnij się, że w konsoli Google Cloud nazwa Twojego projektu jest wyświetlana u góry konsoli Google Cloud. Jeśli nie, kliknij Wybierz projekt, aby otworzyć Selektor projektów, a następnie wybierz odpowiedni projekt.
- Jeśli nie jesteś w sekcji Vertex AI konsoli Google Cloud, wykonaj te czynności:
- W wyszukiwarce wpisz Vertex AI, a następnie zwróć
- W wynikach wyszukiwania kliknij Vertex AI. Pojawi się panel Vertex AI.
- W panelu Vertex AI kliknij Włącz wszystkie zalecane interfejsy API.
Spowoduje to włączenie kilku interfejsów API, ale najważniejszym z nich w ćwiczeniach z programowania jest interfejs aiplatform.googleapis.com
, który możesz też włączyć z poziomu wiersza poleceń w terminalu Cloud Shell, uruchamiając to polecenie:
$ gcloud services enable aiplatform.googleapis.com
Tworzenie struktury projektu za pomocą Gradle
Aby utworzyć przykładowy kod w Javie, będziesz używać narzędzia do kompilacji Gradle i wersji 17 Javy. Aby skonfigurować projekt przy użyciu Gradle, w terminalu Cloud Shell utwórz katalog (tutaj, palm-workshop
) i uruchom w tym katalogu polecenie gradle init
:
$ mkdir palm-workshop $ cd palm-workshop $ gradle init Select type of project to generate: 1: basic 2: application 3: library 4: Gradle plugin Enter selection (default: basic) [1..4] 2 Select implementation language: 1: C++ 2: Groovy 3: Java 4: Kotlin 5: Scala 6: Swift Enter selection (default: Java) [1..6] 3 Split functionality across multiple subprojects?: 1: no - only one application project 2: yes - application and library projects Enter selection (default: no - only one application project) [1..2] 1 Select build script DSL: 1: Groovy 2: Kotlin Enter selection (default: Groovy) [1..2] 1 Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] Select test framework: 1: JUnit 4 2: TestNG 3: Spock 4: JUnit Jupiter Enter selection (default: JUnit Jupiter) [1..4] 4 Project name (default: palm-workshop): Source package (default: palm.workshop): > Task :init Get more help with your project: https://docs.gradle.org/7.4/samples/sample_building_java_applications.html BUILD SUCCESSFUL in 51s 2 actionable tasks: 2 executed
Aplikację (opcja 2) utworzysz w języku Java (opcja 3), bez używania podprojektów (opcja 1), przy użyciu składni Groovy pliku kompilacji (opcja 1), nie używaj nowych funkcji kompilacji (opcja 1), generując testy za pomocą JUnit Jupaler (opcja 4), a w przypadku nazwy projektu możesz używać pakietu SDK i podobnej nazwy projektu dla pakietu „Palm-work”.
Struktura projektu będzie wyglądać tak:
├── gradle │ └── ... ├── gradlew ├── gradlew.bat ├── settings.gradle └── app ├── build.gradle └── src ├── main │ └── java │ └── palm │ └── workshop │ └── App.java └── test └── ...
Zaktualizujmy plik app/build.gradle
, aby dodać niezbędne zależności. Możesz usunąć zależność guava
, jeśli jest obecna, i zastąpić ją zależnościami projektu LangChain4J oraz biblioteką logowania, aby uniknąć denerwowania brakujących komunikatów rejestratora:
dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
// Logging library
implementation 'org.slf4j:slf4j-jdk14:2.0.9'
// This dependency is used by the application.
implementation 'dev.langchain4j:langchain4j-vertex-ai:0.24.0'
implementation 'dev.langchain4j:langchain4j:0.24.0'
}
W przypadku LangChain4J istnieją 2 zależności:
- w ramach głównego projektu,
- a drugi dla dedykowanego modułu Vertex AI.
Aby do kompilowania i uruchamiania naszych programów używać języka Java 17, dodaj następujący blok pod blokiem plugins {}
:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Jeszcze jedna zmiana: zaktualizuj blok application
obiektu app/build.gradle
, aby umożliwić użytkownikom zastępowanie klasy głównej uruchamianej z poziomu wiersza poleceń podczas wywoływania narzędzia do kompilacji:
application {
mainClass = providers.systemProperty('javaMainClass')
.orElse('palm.workshop.App')
}
Aby sprawdzić, czy plik kompilacji jest gotowy do uruchomienia aplikacji, możesz uruchomić domyślną klasę główną, która wyświetli prosty komunikat Hello World!
:
$ ./gradlew run -DjavaMainClass=palm.workshop.App > Task :app:run Hello World! BUILD SUCCESSFUL in 3s 2 actionable tasks: 2 executed
Teraz możesz zacząć programować duży model tekstowy PaLM przy użyciu projektu LangChain4J.
Poniżej znajdziesz przykładowy obraz pełnego pliku kompilacji app/build.gradle
:
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
java {
toolchain {
// Ensure we compile and run on Java 17
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
// This dependency is used by the application.
implementation 'dev.langchain4j:langchain4j-vertex-ai:0.24.0'
implementation 'dev.langchain4j:langchain4j:0.24.0'
implementation 'org.slf4j:slf4j-jdk14:2.0.9'
}
application {
mainClass = providers.systemProperty('javaMainClass').orElse('palm.workshop.App')
}
tasks.named('test') {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
4. Wykonywanie pierwszego połączenia z modelem tekstowym PaLM
Po prawidłowym skonfigurowaniu projektu możesz wywołać interfejs PaLM API.
Utwórz w katalogu app/src/main/java/palm/workshop
nową klasę o nazwie TextPrompts.java
(oprócz domyślnej klasy App.java
) i wpisz tę treść:
package palm.workshop;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiLanguageModel;
public class TextPrompts {
public static void main(String[] args) {
VertexAiLanguageModel model = VertexAiLanguageModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("text-bison@001")
.maxOutputTokens(500)
.build();
Response<String> response = model.generate("What are large language models?");
System.out.println(response.content());
}
}
W pierwszym przykładzie musisz zaimportować klasę Response
i model językowy Vertex AI dla PaLM.
Następnie w metodzie main
skonfigurujesz model językowy za pomocą konstruktora języka VertexAiLanguageModel
, aby określić:
- i punktu końcowego.
- nad projektem,
- region
- wydawca,
- i nazwa modelu (
text-bison@001
).
Teraz, gdy model językowy jest gotowy, możesz wywołać metodę generate()
i przekazać „prompt” (np. pytanie lub instrukcje, które należy przesłać do LLM). W tym miejscu zadajesz proste pytanie o modele LLM. Możesz jednak zmienić ten prompt, aby wypróbować inne pytania lub zadania.
Aby uruchomić tę klasę, uruchom to polecenie w terminalu Cloud Shell:
./gradlew run -DjavaMainClass=palm.workshop.TextPrompts
Zostaną wyświetlone dane wyjściowe podobne do tych:
Large language models (LLMs) are artificial intelligence systems that can understand and generate human language. They are trained on massive datasets of text and code, and can learn to perform a wide variety of tasks, such as translating languages, writing different kinds of creative content, and answering your questions in an informative way. LLMs are still under development, but they have the potential to revolutionize many industries. For example, they could be used to create more accurate and personalized customer service experiences, to help doctors diagnose and treat diseases, and to develop new forms of creative expression. However, LLMs also raise a number of ethical concerns. For example, they could be used to create fake news and propaganda, to manipulate people's behavior, and to invade people's privacy. It is important to carefully consider the potential risks and benefits of LLMs before they are widely used. Here are some of the key features of LLMs: * They are trained on massive datasets of text and code. * They can learn to perform a wide variety of tasks, such as translating languages, writing different kinds of creative content, and answering your questions in an informative way. * They are still under development, but they have the potential to revolutionize many industries. * They raise a number of ethical concerns, such as the potential for fake news, propaganda, and invasion of privacy.
Kreator VertexAILanguageModel
pozwala zdefiniować parametry opcjonalne, które mają już wartości domyślne, które możesz zastąpić. Oto przykłady:
.temperature(0.2)
– aby określić, jak kreatywna powinna być odpowiedź (0 oznacza mniej kreatywne, często bardziej rzeczowe, a 1 – dla większej liczby wyników kreacji)..maxOutputTokens(50)
– w tym przykładzie zażądano 500 tokenów (3 tokeny to mniej więcej 4 słowa), w zależności od tego, jak długo ma trwać wygenerowana odpowiedź..topK(20)
– aby losowo wybrać słowo z maksymalnej liczby możliwych słów do uzupełnienia (od 1 do 40)..topP(0.95)
– aby wybrać możliwe słowa, których całkowite prawdopodobieństwo sumuje się do liczby zmiennoprzecinkowej (od 0 do 1)..maxRetries(3)
– jeśli liczba żądań w czasie przekracza limit, model może ponowić próbę, np. 3 razy.
Duże modele językowe (LLM) mają dużą skuteczność, mogą zapewnić odpowiedzi na złożone pytania i wykonywać wiele różnych interesujących zadań. W następnej sekcji zajmiemy się przydatnym zadaniem: wyodrębnianiem uporządkowanych danych z tekstu.
5. Wyodrębnianie informacji z nieuporządkowanego tekstu
W poprzedniej sekcji wygenerowano tekst wyjściowy. Jest to odpowiednie rozwiązanie, jeśli chcesz bezpośrednio wyświetlać te dane wyjściowe użytkownikom. Jeśli jednak chcesz pobrać dane wymienione w tych danych wyjściowych, jak wyodrębnić je z tekstu nieuporządkowanego?
Załóżmy, że chcesz wyodrębnić imię i nazwisko oraz wiek osoby na podstawie jej biografii lub opisu. Duży model językowy może generować struktury danych JSON, modyfikując prompt w ten sposób (zwykle nazywa się to „inżynierią promptów”):
Extract the name and age of the person described below. Return a JSON document with a "name" and an "age" property, following this structure: {"name": "John Doe", "age": 34} Return only JSON, without any markdown markup surrounding it. Here is the document describing the person: --- Anna is a 23 year old artist based in Brooklyn, New York. She was born and raised in the suburbs of Chicago, where she developed a love for art at a young age. She attended the School of the Art Institute of Chicago, where she studied painting and drawing. After graduating, she moved to New York City to pursue her art career. Anna's work is inspired by her personal experiences and observations of the world around her. She often uses bright colors and bold lines to create vibrant and energetic paintings. Her work has been exhibited in galleries and museums in New York City and Chicago. --- JSON:
Zmodyfikuj wywołanie model.generate()
w klasie TextPrompts
, tak aby przekazać je w całości w całym promptie tekstowym powyżej:
Response<String> response = model.generate("""
Extract the name and age of the person described below.
Return a JSON document with a "name" and an "age" property, \
following this structure: {"name": "John Doe", "age": 34}
Return only JSON, without any markdown markup surrounding it.
Here is the document describing the person:
---
Anna is a 23 year old artist based in Brooklyn, New York. She was born and
raised in the suburbs of Chicago, where she developed a love for art at a
young age. She attended the School of the Art Institute of Chicago, where
she studied painting and drawing. After graduating, she moved to New York
City to pursue her art career. Anna's work is inspired by her personal
experiences and observations of the world around her. She often uses bright
colors and bold lines to create vibrant and energetic paintings. Her work
has been exhibited in galleries and museums in New York City and Chicago.
---
JSON:
"""
);
Jeśli uruchomisz ten prompt w naszej klasie TextPrompts
, powinien on zwrócić następujący ciąg znaków JSON, który możesz przeanalizować za pomocą parsera JSON, takiego jak biblioteka GSON:
$ ./gradlew run -DjavaMainClass=palm.workshop.TextPrompts > Task :app:run {"name": "Anna", "age": 23} BUILD SUCCESSFUL in 24s 2 actionable tasks: 1 executed, 1 up-to-date
Tak. Anna ma 23 lata
6. Szablony promptów i uporządkowane prompty
Nie tylko odpowiadanie na pytania
Duże modele językowe, takie jak PaLM, doskonale odpowiadają na pytania, ale mogą być używane do wielu innych zadań. Na przykład spróbuj wykonać poniższe prompty w Generative AI Studio (lub modyfikując klasę TextPrompts
). Możesz zamienić słowa wielkimi literami na własne pomysły i sprawdzić ich wyniki:
- Tłumaczenie – „Przetłumacz następujące zdanie po francusku: YOUR_SENTENCE_HERE”
- Podsumowywanie – „Podaj podsumowanie tego dokumentu: PASTE_YOUR_DOC”
- Generowanie kreacji – „Napisz wiersz o: TOPIC_OF_THE_POEM”
- Programowanie – „Jak napisać funkcję Fibonacciego w języku: PROGRAMMING_LANGUAGE?”
Szablony promptów
Jeśli korzystasz z podanych wyżej promptów dotyczących tłumaczenia, podsumowywania, generowania kreacji lub zadań programowania, zastąpisz wartości zastępcze własnymi pomysłami. Zamiast jednak zarządzać ciągami znaków, możesz też skorzystać z „szablonów promptów”, które pozwalają zdefiniować wartości zastępcze i wypełnić to pole swoimi danymi.
Spójrzmy na pyszny prompt, który pozwala zastąpić całą treść metody main()
tym kodem:
VertexAiLanguageModel model = VertexAiLanguageModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("text-bison@001")
.maxOutputTokens(300)
.build();
PromptTemplate promptTemplate = PromptTemplate.from("""
Create a recipe for a {{dish}} with the following ingredients: \
{{ingredients}}, and give it a name.
"""
);
Map<String, Object> variables = new HashMap<>();
variables.put("dish", "dessert");
variables.put("ingredients", "strawberries, chocolate, whipped cream");
Prompt prompt = promptTemplate.apply(variables);
Response<String> response = model.generate(prompt);
System.out.println(response.content());
Dodając następujące importy:
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
import java.util.HashMap;
import java.util.Map;
Następnie uruchom aplikację ponownie. Dane wyjściowe powinny wyglądać mniej więcej tak:
$ ./gradlew run -DjavaMainClass=palm.workshop.TextPrompts > Task :app:run **Strawberry Shortcake** Ingredients: * 1 pint strawberries, hulled and sliced * 1/2 cup sugar * 1/4 cup cornstarch * 1/4 cup water * 1 tablespoon lemon juice * 1/2 cup heavy cream, whipped * 1/4 cup confectioners' sugar * 1/4 teaspoon vanilla extract * 6 graham cracker squares, crushed Instructions: 1. In a medium saucepan, combine the strawberries, sugar, cornstarch, water, and lemon juice. Bring to a boil over medium heat, stirring constantly. Reduce heat and simmer for 5 minutes, or until the sauce has thickened. 2. Remove from heat and let cool slightly. 3. In a large bowl, combine the whipped cream, confectioners' sugar, and vanilla extract. Beat until soft peaks form. 4. To assemble the shortcakes, place a graham cracker square on each of 6 dessert plates. Top with a scoop of whipped cream, then a spoonful of strawberry sauce. Repeat layers, ending with a graham cracker square. 5. Serve immediately. **Tips:** * For a more elegant presentation, you can use fresh strawberries instead of sliced strawberries. * If you don't have time to make your own whipped cream, you can use store-bought whipped cream.
Pyszne!
Dzięki szablonom promptów możesz przesłać wymagane parametry przed wywołaniem metody generowania tekstu. To świetny sposób na przekazywanie danych i dostosowywanie promptów pod kątem różnych wartości podanych przez użytkowników.
Zgodnie z nazwą klasy klasa PromptTemplate
tworzy prompt szablonu i możesz przypisać wartości do elementów zastępczych, stosując mapę nazw i wartości obiektów zastępczych.
Uporządkowane prompty (OPCJONALNIE)
Innym sposobem tworzenia struktury promptów jest użycie adnotacji @StructuredPrompt
, jeśli chcesz zastosować bardziej szczegółowe podejście do obiektów. Dodajesz adnotację do klasy, a jej pola odpowiadają zmiennym zdefiniowanym w prompcie. Zobaczmy, jak to działa.
Najpierw potrzebujemy nowych importów:
import java.util.Arrays;
import java.util.List;
import dev.langchain4j.model.input.structured.StructuredPrompt;
import dev.langchain4j.model.input.structured.StructuredPromptProcessor;
Następnie możemy utworzyć w ramach klasy TextPrompts
wewnętrzną klasę statyczną, która będzie zbierać dane potrzebne do przekazania obiektów zastępczych w prompcie opisanym w adnotacji @StructuredPrompt
:
@StructuredPrompt("Create a recipe of a {{dish}} that can be prepared using only {{ingredients}}")
static class RecipeCreationPrompt {
String dish;
List<String> ingredients;
}
Następnie utwórz instancję nowej klasy i prześlij jej danie oraz składniki naszego przepisu, utwórz i przekaż prompt do metody generate()
tak jak poprzednio:
RecipeCreationPrompt createRecipePrompt = new RecipeCreationPrompt();
createRecipePrompt.dish = "salad";
createRecipePrompt.ingredients = Arrays.asList("cucumber", "tomato", "feta", "onion", "olives");
Prompt prompt = StructuredPromptProcessor.toPrompt(createRecipePrompt);
Response<String> response = model.generate(prompt);
Zamiast wypełniać luki w mapie, możesz użyć obiektu Java z polami, które mogą być automatycznie uzupełniane przez IDE, w sposób bezpieczniejszy podczas pisania.
Oto cały kod, jeśli chcesz łatwiej wkleić te zmiany w klasie TextPrompts
:
package palm.workshop;
import java.util.Arrays;
import java.util.List;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiLanguageModel;
import dev.langchain4j.model.input.structured.StructuredPrompt;
import dev.langchain4j.model.input.structured.StructuredPromptProcessor;
public class TextPrompts {
@StructuredPrompt("Create a recipe of a {{dish}} that can be prepared using only {{ingredients}}")
static class RecipeCreationPrompt {
String dish;
List<String> ingredients;
}
public static void main(String[] args) {
VertexAiLanguageModel model = VertexAiLanguageModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("text-bison@001")
.maxOutputTokens(300)
.build();
RecipeCreationPrompt createRecipePrompt = new RecipeCreationPrompt();
createRecipePrompt.dish = "salad";
createRecipePrompt.ingredients = Arrays.asList("cucumber", "tomato", "feta", "onion", "olives");
Prompt prompt = StructuredPromptProcessor.toPrompt(createRecipePrompt);
Response<String> response = model.generate(prompt);
System.out.println(response.content());
}
}
7. Klasyfikowanie tekstu i analizowanie nastawienia
Podobnie jak w poprzedniej sekcji, odkryjesz też inną metodę „inżynierii promptów”, dzięki której model PaLM może klasyfikować tekst i analizować nastawienia. Porozmawiajmy o „krótkich promptach”. To sposób na wzbogacenie promptów o kilka przykładów, które pomogą nakierować model językowy na pożądany kierunek i lepiej zrozumieć Twoje intencje.
Przeanalizujmy zajęcia TextPrompts
, aby skorzystać z szablonów promptów:
package palm.workshop;
import java.util.Map;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiLanguageModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
public class TextPrompts {
public static void main(String[] args) {
VertexAiLanguageModel model = VertexAiLanguageModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("text-bison@001")
.maxOutputTokens(10)
.build();
PromptTemplate promptTemplate = PromptTemplate.from("""
Analyze the sentiment of the text below. Respond only with one word to describe the sentiment.
INPUT: This is fantastic news!
OUTPUT: POSITIVE
INPUT: Pi is roughly equal to 3.14
OUTPUT: NEUTRAL
INPUT: I really disliked the pizza. Who would use pineapples as a pizza topping?
OUTPUT: NEGATIVE
INPUT: {{text}}
OUTPUT:
""");
Prompt prompt = promptTemplate.apply(
Map.of("text", "I love strawberries!"));
Response<String> response = model.generate(prompt);
System.out.println(response.content());
}
}
Zwróć uwagę na podejście polegające na podawaniu w prompcie kilku przykładowych danych wejściowych i wyjściowych. Oto „kilka ujęć” które pomagają LLM zachować tę samą strukturę. Gdy model otrzyma dane wejściowe, powinien zwrócić dane wyjściowe pasujące do wzorca danych wejściowych i wyjściowych.
Działanie programu powinno zwrócić samo słowo POSITIVE
, bo truskawki też są pyszne!
$ ./gradlew run -DjavaMainClass=palm.workshop.TextPrompts
> Task :app:run
POSITIVE
Analiza nastawienia stanowi również scenariusz klasyfikacji treści. Możesz zastosować tę samą metodę „few-shot prompting”, aby podzielić dokumenty na kategorie.
8. Gratulacje
Gratulujemy. Udało Ci się utworzyć pierwszą aplikację generatywnej AI w języku Java przy użyciu LangChain4J i interfejsu PaLM API. Po drodze zauważyłeś, że duże modele językowe są bardzo wydajne i radzą sobie z różnymi zadaniami, takimi jak pytania i odpowiedzi, wyodrębnianie danych, podsumowywanie, klasyfikacja tekstu, analiza nastawienia i nie tylko.
Co dalej?
Aby dowiedzieć się więcej o PaLM w języku Java, wykonaj te ćwiczenia z programowania:
Więcej informacji
- Typowe przypadki użycia generatywnej AI
- Zasoby szkoleniowe dotyczące generatywnej AI
- Interakcje z PaLM za pomocą Generative AI Studio
- Odpowiedzialna AI