Pembuatan teks AI generatif di Java dengan PaLM dan LangChain4J

1. Pengantar

Terakhir diperbarui: 27-11-2023

Apa itu AI Generatif

AI generatif atau kecerdasan buatan generatif mengacu pada penggunaan AI untuk membuat konten baru, seperti teks, gambar, musik, audio, dan video.

AI generatif didukung oleh model dasar (model AI besar) yang dapat melakukan beberapa tugas sekaligus dan melakukan tugas siap pakai, termasuk perangkuman, tanya jawab, klasifikasi, dan sebagainya. Selain itu, dengan sedikit pelatihan, model dasar dapat diadaptasikan untuk kasus penggunaan tertarget dengan data contoh yang sangat sedikit.

Bagaimana cara kerja AI Generatif?

AI generatif bekerja menggunakan model ML (Machine Learning) untuk mempelajari pola dan hubungan dalam sebuah set data yang terdiri dari konten buatan manusia. Sistem ini kemudian menggunakan pola-pola yang telah dipelajarinya untuk membuat konten baru.

Cara yang paling umum digunakan untuk melatih model AI generatif adalah dengan menggunakan pembelajaran yang diawasi atau supervised learning, yakni model AI generatif diberi satu set konten buatan manusia dan label yang sesuai. AI generatif kemudian belajar membuat konten yang serupa dengan konten buatan manusia tersebut dan diberi label yang sama.

Apa saja aplikasi AI Generatif yang umum?

AI generatif memproses konten yang sangat banyak, membuat insight dan jawaban melalui teks, gambar, dan format yang mudah digunakan. AI generatif dapat digunakan untuk:

  • Meningkatkan interaksi pelanggan melalui chat dan pengalaman penelusuran yang ditingkatkan kualitasnya
  • Menjelajahi jumlah data tak terstruktur yang sangat banyak melalui antarmuka percakapan dan perangkuman
  • Membantu pelaksanaan tugas berulang, seperti membalas permintaan proposal (RFP), melokalkan konten pemasaran dalam lima bahasa, dan memeriksa kontrak pelanggan terkait kepatuhan, dan banyak lagi

Penawaran AI Generatif apa yang dimiliki Google Cloud?

Dengan Vertex AI, Anda dapat berinteraksi dengan model dasar, menyesuaikan model tersebut, dan menyematkannya ke aplikasi Anda tanpa memerlukan keahlian ML. Anda dapat mengakses model dasar di Model Garden, menyesuaikan berbagai model melalui UI yang sederhana di Generative AI Studio, atau menggunakan model dalam notebook data science.

Vertex AI Search and Conversation menawarkan cara tercepat bagi para developer untuk membangun mesin telusur dan chatbot yang didukung teknologi AI generatif.

Selain itu, Duet AI adalah kolaborator Anda dengan teknologi AI yang tersedia di Google Cloud dan IDE untuk membantu Anda menyelesaikan lebih banyak hal dengan lebih cepat.

Apa yang difokuskan oleh codelab ini?

Codelab ini berfokus pada PaLM 2 Large Language Model (LLM), yang dihosting di Vertex AI Google Cloud dan mencakup semua produk dan layanan machine learning.

Anda akan menggunakan Java untuk berinteraksi dengan PaLM API, bersama dengan orkestrasi framework LLM LangChain4J. Anda akan mempelajari berbagai contoh konkret untuk memanfaatkan LLM ini guna menjawab pertanyaan, pembuatan ide, ekstraksi entitas dan konten terstruktur, serta perangkuman.

Ceritakan lebih banyak tentang framework LangChain4J.

Framework LangChain4J adalah library open source untuk mengintegrasikan model bahasa besar (LLM) di aplikasi Java, dengan mengorkestrasi berbagai komponen, seperti LLM itu sendiri, serta alat lain seperti database vektor (untuk penelusuran semantik), loader dokumen, dan pemisah (untuk menganalisis dokumen dan belajar darinya), parser output, dan banyak lagi.

c6d7f7c3fd0d2951.png

Yang akan Anda pelajari

  • Cara menyiapkan project Java untuk menggunakan PaLM dan LangChain4J
  • Cara melakukan panggilan pertama ke model teks PaLM untuk membuat konten dan menjawab pertanyaan
  • Cara mengekstrak informasi bermanfaat dari konten tidak terstruktur (ekstraksi entitas atau kata kunci, output di JSON)
  • Cara melakukan klasifikasi konten atau analisis sentimen dengan beberapa shot yang diminta

Yang Anda butuhkan

  • Pengetahuan tentang bahasa pemrograman Java
  • Project Google Cloud
  • Browser, seperti Chrome atau Firefox

2. Penyiapan dan persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

295004821bab6a87.pngS

37d264871000675d.png

96d86d3d5655cdbe.pngS

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan secara jarak jauh dari laptop Anda, dalam codelab ini Anda akan menggunakan Cloud Shell, yakni lingkungan command line yang berjalan di Cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

d95252b003979716.png

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

7833d5e1c5d18f54.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang diperlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Menyiapkan lingkungan pengembangan Anda

Dalam codelab ini, Anda akan menggunakan terminal dan editor kode Cloud Shell untuk mengembangkan program Java.

Mengaktifkan Vertex AI API

  1. Di konsol Google Cloud, pastikan nama project Anda ditampilkan di bagian atas Konsol Google Cloud. Jika tidak, klik Select a project untuk membuka Project Selector, lalu pilih project yang Anda inginkan.
  2. Jika Anda tidak berada dalam bagian Vertex AI pada Konsol Google Cloud, lakukan hal berikut:
  3. Di Search, masukkan Vertex AI, lalu kembali
  4. Di hasil penelusuran, klik Vertex AI. Dasbor Vertex AI akan muncul.
  5. Klik Enable All Recommended APIs di dasbor Vertex AI.

Tindakan ini akan mengaktifkan beberapa API, tetapi yang paling penting untuk codelab adalah aiplatform.googleapis.com, yang juga dapat Anda aktifkan pada command line, di terminal Cloud Shell, menjalankan perintah berikut:

$ gcloud services enable aiplatform.googleapis.com

Membuat struktur project dengan Gradle

Untuk membuat contoh kode Java, Anda akan menggunakan alat build Gradle, dan Java versi 17. Untuk menyiapkan project dengan Gradle, di terminal Cloud Shell, buat direktori (di sini, palm-workshop), jalankan perintah gradle init di direktori tersebut:

$ 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

Anda akan membuat aplikasi (opsi 2), menggunakan bahasa Java (opsi 3), tanpa menggunakan subproject (opsi 1), menggunakan sintaksis Groovy untuk file build (opsi 1), jangan gunakan fitur build baru (opsi tidak), menghasilkan pengujian dengan JUnit Jupiter (opsi 4), dan untuk nama project, Anda dapat menggunakan paket workpalm-workpalm., dan juga dapat menggunakan paket workpalm.

Struktur project akan terlihat seperti berikut:

├── gradle 
│   └── ...
├── gradlew 
├── gradlew.bat 
├── settings.gradle 
└── app
    ├── build.gradle 
    └── src
        ├── main
        │   └── java 
        │       └── palm
        │           └── workshop
        │               └── App.java
        └── test
            └── ...

Mari kita update file app/build.gradle untuk menambahkan beberapa dependensi yang diperlukan. Anda dapat menghapus dependensi guava jika ada, dan menggantinya dengan dependensi untuk project LangChain4J, dan library logging untuk menghindari gangguan pesan logger yang hilang:

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'
}

Ada 2 dependensi untuk LangChain4J:

  • satu di proyek inti,
  • dan satu lagi untuk modul Vertex AI khusus.

Agar dapat menggunakan Java 17 untuk mengompilasi dan menjalankan program, tambahkan blok berikut di bawah blok plugins {}:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Satu perubahan lagi yang harus dilakukan: perbarui blok application dari app/build.gradle, agar pengguna dapat mengganti class utama untuk dijalankan di command line saat memanggil alat build:

application {
    mainClass = providers.systemProperty('javaMainClass')
                         .orElse('palm.workshop.App')
}

Untuk memeriksa apakah file build siap menjalankan aplikasi, Anda dapat menjalankan class utama default yang mencetak pesan Hello World! sederhana:

$ ./gradlew run -DjavaMainClass=palm.workshop.App

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed

Sekarang Anda siap memprogram dengan model teks bahasa besar PaLM menggunakan project LangChain4J.

Sebagai referensi, berikut adalah tampilan file build app/build.gradle lengkap sekarang:

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. Membuat panggilan pertama ke model teks PaLM

Setelah project disiapkan dengan benar, sekarang saatnya memanggil PaLM API.

Buat class baru bernama TextPrompts.java di direktori app/src/main/java/palm/workshop (bersama class App.java default), lalu ketik konten berikut:

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());
    }
}

Dalam contoh pertama ini, Anda perlu mengimpor class Response, dan model bahasa Vertex AI untuk PaLM.

Selanjutnya, dalam metode main, Anda akan mengonfigurasi model bahasa, menggunakan builder untuk VertexAiLanguageModel, guna menentukan:

  • endpoint,
  • menyelesaikan proyek tersebut.
  • wilayah tersebut,
  • penerbit,
  • dan nama model (text-bison@001).

Setelah model bahasa siap, Anda dapat memanggil metode generate() dan meneruskan "prompt" (yaitu pertanyaan atau petunjuk Anda untuk dikirimkan ke LLM). Di sini, Anda mengajukan pertanyaan sederhana tentang apa itu LLM. Namun, jangan ragu untuk mengubah {i>prompt<i} ini untuk mencoba pertanyaan atau tugas yang berbeda.

Untuk menjalankan class ini, jalankan perintah berikut di terminal Cloud Shell:

./gradlew run -DjavaMainClass=palm.workshop.TextPrompts

Anda akan melihat output yang mirip dengan output ini:

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.

Builder VertexAILanguageModel memungkinkan Anda menentukan parameter opsional yang sudah memiliki beberapa nilai default yang dapat Anda ganti. Berikut beberapa contohnya:

  • .temperature(0.2) — untuk menentukan seberapa kreatifkah respons yang Anda inginkan (0 jika materi iklan rendah dan sering kali lebih faktual, sedangkan 1 untuk output materi iklan yang lebih banyak)
  • .maxOutputTokens(50) — dalam contoh, 500 token diminta (3 token kira-kira setara dengan 4 kata), bergantung pada berapa lama Anda ingin jawaban yang dihasilkan
  • .topK(20) — untuk memilih kata secara acak dari jumlah maksimum kata yang mungkin untuk pelengkapan teks (dari 1 sampai 40)
  • .topP(0.95) — untuk memilih kemungkinan kata yang total probabilitasnya menjumlahkan bilangan floating point tersebut (antara 0 dan 1)
  • .maxRetries(3) — jika Anda melampaui kuota permintaan per waktu, Anda dapat meminta model untuk mencoba kembali panggilan 3 kali, misalnya

Model Bahasa Besar sangat canggih, dan dapat memberikan jawaban atas pertanyaan yang kompleks, serta mampu menangani berbagai tugas menarik. Pada bagian selanjutnya, kita akan melihat tugas yang berguna: mengekstrak data terstruktur dari teks.

5. Mengekstrak informasi dari teks yang tidak terstruktur

Di bagian sebelumnya, Anda telah menghasilkan beberapa output teks. Tidak masalah jika Anda ingin menampilkan output ini secara langsung kepada pengguna akhir. Tetapi jika Anda ingin mengambil data yang disebutkan dalam {i>output<i} ini, bagaimana Anda mengekstrak informasi itu dari teks yang tidak terstruktur?

Misalkan Anda ingin mengekstrak nama dan usia seseorang, berdasarkan biografi atau deskripsi orang tersebut. Anda dapat menginstruksikan model bahasa besar (LLM) untuk menghasilkan struktur data JSON dengan menyesuaikan prompt sebagai berikut (biasanya disebut "prompt engineering"):

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: 

Ubah panggilan model.generate() di class TextPrompts untuk meneruskan seluruh perintah teks di atas:

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: 
    """
);

Jika Anda menjalankan perintah ini di class TextPrompts, perintah tersebut akan menampilkan string JSON berikut, yang dapat Anda urai dengan parser JSON seperti library 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

Ya. Anna berusia 23 tahun!

6. Template perintah dan perintah terstruktur

Lebih dari sekadar menjawab pertanyaan

Model bahasa besar seperti PaLM sangat andal untuk menjawab pertanyaan, tetapi Anda dapat menggunakannya untuk lebih banyak tugas. Misalnya, coba perintah berikut di Generative AI Studio (atau dengan mengubah class TextPrompts). Ubah kata-kata berhuruf besar dengan ide Anda sendiri, dan periksa {i>output-<i}nya:

  • Terjemahan — "Terjemahkan kalimat berikut dalam bahasa Prancis: YOUR_SENTENCE_HERE"
  • Summarisasi — "Berikan ringkasan dokumen berikut: PASTE_YOUR_DOC"
  • Pembuatan kreatif — "Tulis puisi tentang TOPIC_OF_THE_POEM"
  • Pemrograman — "Bagaimana cara menulis fungsi Fibonacci dalam PROGRAMMING_LANGUAGE?"

Template perintah

Jika Anda mencoba perintah di atas untuk menerjemahkan, perangkuman, pembuatan kreatif, atau tugas pemrograman, Anda mengganti nilai placeholder dengan ide Anda sendiri. Namun, daripada melakukan beberapa perubahan string, Anda juga dapat memanfaatkan "template perintah", yang memungkinkan Anda menentukan nilai placeholder tersebut, dan mengisi bagian yang kosong setelahnya dengan data Anda.

Mari kita lihat perintah yang lezat dan kreatif, dengan mengganti seluruh konten metode main() dengan kode berikut:

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());

Dan dengan menambahkan impor berikut:

import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;

import java.util.HashMap;
import java.util.Map;

Kemudian jalankan aplikasi lagi. Output-nya akan terlihat seperti berikut:

$ ./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.

Enak!

Dengan template perintah, Anda dapat memasukkan parameter yang diperlukan sebelum memanggil metode pembuatan teks. Ini adalah cara yang bagus untuk meneruskan data dan menyesuaikan dialog untuk berbagai nilai yang disediakan oleh pengguna Anda.

Seperti yang disarankan oleh nama class, class PromptTemplate membuat perintah template, dan Anda dapat menetapkan nilai ke elemen placeholder dengan menerapkan peta nama dan nilai placeholder.

Perintah terstruktur (OPSIONAL)

Cara lain untuk menyusun prompt adalah dengan anotasi @StructuredPrompt, jika Anda ingin menggunakan pendekatan berorientasi objek yang lebih kaya. Anda akan menganotasi class dengan anotasi ini, dan kolomnya sesuai dengan placeholder yang ditentukan dalam perintah. Mari kita lihat bagaimana penerapannya.

Pertama, kita akan memerlukan beberapa impor baru:

import java.util.Arrays;
import java.util.List;
import dev.langchain4j.model.input.structured.StructuredPrompt;
import dev.langchain4j.model.input.structured.StructuredPromptProcessor;

Kemudian, kita dapat membuat class statis bagian dalam di class TextPrompts yang mengumpulkan data yang diperlukan untuk meneruskan placeholder dalam perintah yang dijelaskan dalam anotasi @StructuredPrompt:

@StructuredPrompt("Create a recipe of a {{dish}} that can be prepared using only {{ingredients}}")
static class RecipeCreationPrompt {
    String dish;
    List<String> ingredients;
}

Kemudian, buat instance class baru tersebut dan memberinya hidangan serta bahan-bahan resep, lalu buat dan teruskan perintah ke metode generate() seperti sebelumnya:

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);

Daripada mengisi kekurangan melalui peta, Anda dapat menggunakan objek Java dengan kolom yang dapat diisi otomatis oleh IDE Anda, dengan cara yang lebih aman.

Berikut ini keseluruhan kode jika Anda ingin lebih mudah menempelkan perubahan tersebut ke class 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. Mengklasifikasikan teks dan menganalisis sentimen

Sama seperti yang telah dipelajari di bagian sebelumnya, Anda akan menemukan teknik "rekayasa perintah" lain untuk membuat model PaLM mengklasifikasi teks atau menganalisis sentimen. Mari kita bahas "few-shot prompting". Ini adalah cara untuk meningkatkan kualitas perintah Anda dengan beberapa contoh yang akan membantu mengarahkan model bahasa ke arah yang Anda inginkan, untuk lebih memahami maksud Anda.

Mari kita kerjakan ulang class TextPrompts untuk memanfaatkan template perintah:

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());
    }
}

Perhatikan pendekatan yang memberikan beberapa contoh input dan output dalam prompt. Ini adalah "beberapa foto" yang membantu LLM mengikuti struktur yang sama. Ketika kemudian mendapatkan input, model akan menampilkan output yang cocok dengan pola input/output.

Menjalankan program akan menampilkan hanya kata POSITIVE, karena stroberi juga lezat!

$ ./gradlew run -DjavaMainClass=palm.workshop.TextPrompts

> Task :app:run
POSITIVE

Analisis sentimen juga merupakan skenario klasifikasi konten. Anda dapat menerapkan pendekatan "few-shot prompting" yang sama untuk mengategorikan dokumen yang berbeda ke dalam bucket kategori yang berbeda.

8. Selamat

Selamat, Anda telah berhasil membangun aplikasi AI Generatif pertama di Java menggunakan LangChain4J dan PaLM API. Dalam prosesnya, Anda telah mempelajari bahwa model bahasa besar cukup ampuh dan mampu menangani berbagai tugas seperti tanya jawab, ekstraksi data, perangkuman, klasifikasi teks, analisis sentimen, dan banyak lagi.

Apa selanjutnya?

Lihat beberapa codelab berikut untuk melanjutkan dengan PaLM di Java:

Bacaan lebih lanjut

Dokumen referensi