1. はじめに
最終更新日: 2023 年 11 月 27 日
生成 AI とは
生成 AI(Generative Artificial Intelligence)は、AI を活用してテキスト、画像、音楽、音声、動画などの新しいコンテンツを作成することを指します。
生成 AI は、さまざまなタスクに対応した基盤モデル(大規模 AI モデル)をベースにしており、そのままで要約、質疑応答、分類などをすぐに実行できます。さらに、ほんのわずかなサンプルデータで必要最小限のトレーニングを行うだけで、基盤モデルを対象のユースケースに適応させることができます。
生成 AI の仕組み
生成 AI は、ML(ML)モデルを使用して、人間が作成したコンテンツのデータセットにあるパターンと関係を学習します。そして、学習したパターンを使用して新しいコンテンツを生成します。
生成 AI モデルをトレーニングする最も一般的な方法は、教師あり学習を使用することです。教師あり学習では、人間が作成したコンテンツと対応するラベルのセットがモデルに与えられます。次に、人間が作成したコンテンツと類似した、同じラベルが付けられたコンテンツを生成することを学習します。
生成 AI の一般的な用途は何ですか?
生成 AI は膨大な量のコンテンツを処理し、テキストや画像など人間が親しみやすい形式で分析情報と答えを生み出します。生成 AI は、以下のことに使用できます。
- チャットや検索エクスペリエンスを強化して顧客対応を改善する
- 会話型インターフェースと要約を通じて、膨大な量の非構造化データを探索する
- 提案依頼書(RFP)への回答、マーケティング コンテンツの 5 言語へのローカライズ、お客様との契約の遵守状況の確認など、反復的なタスクを支援する
Google Cloud が提供する生成 AI サービス
Vertex AI を使用して、基盤モデルを操作、カスタマイズし、自社のアプリケーションに埋め込むことができます。ML の専門知識はほとんど必要ありません。Model Garden で基盤モデルにアクセスしたり、Generative AI Studio のシンプルな UI でモデルを調整したり、データ サイエンス ノートブックでモデルを使用したりできます。
Vertex AI Search and Conversation を使用すると、デベロッパーは生成 AI を活用した検索エンジンや chatbot を迅速に構築できます。
また、Duet AI は、Google Cloud 全体と IDE でご利用いただける、AI を活用した新しいパートナーです。もっと多くの業務をスピーディーにこなせるようにサポートします。
この Codelab の焦点
この Codelab では、すべての ML プロダクトとサービスを網羅する Google Cloud Vertex AI でホストされている PaLM 2 大規模言語モデル(LLM)に焦点を当てます。
Java を使用して、LangChain4J LLM フレームワーク オーケストレーターと組み合わせて PaLM API を操作します。質問応答、アイデアの生成、エンティティと構造化されたコンテンツの抽出、要約に LLM を活用するための具体的な例をいくつか紹介します。
LangChain4J フレームワークについて詳しく教えてください。
LangChain4J フレームワークは、大規模言語モデルを Java アプリケーションに統合するためのオープンソース ライブラリです。LLM 自体だけでなく、ベクトル データベース(セマンティック検索用)、ドキュメント ローダとスプリッタ(ドキュメントを分析して学習するため)、出力パーサーなど、さまざまなコンポーネントをオーケストレートします。

学習内容
- PaLM と LangChain4J を使用するように Java プロジェクトを設定する方法
- PaLM テキストモデルを初めて呼び出してコンテンツを生成し、質問に回答する方法
- 非構造化コンテンツから有用な情報を抽出する方法(エンティティまたはキーワードの抽出、JSON での出力)
- フューショット プロンプトを使用してコンテンツ分類または感情分析を行う方法
必要なもの
- Java プログラミング言語の知識
- Google Cloud プロジェクト
- ブラウザ(Chrome、Firefox など)
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell の起動
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする]
をクリックします。

Cloud Shell を初めて起動する場合は、その内容を説明する中間画面が表示されます。中間画面が表示された場合は、[続行] をクリックします。

すぐにプロビジョニングが実行され、Cloud Shell に接続されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。このコードラボで行う作業のほとんどはブラウザから実行できます。
Cloud Shell に接続すると、認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。
- Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list
コマンド出力
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
コマンド出力
[core] project = <PROJECT_ID>
上記のようになっていない場合は、次のコマンドで設定できます。
gcloud config set project <PROJECT_ID>
コマンド出力
Updated property [core/project].
3. 開発環境を準備する
この Codelab では、Cloud Shell のターミナルとコードエディタを使用して Java プログラムを開発します。
Vertex AI API を有効にする
- Google Cloud コンソールで、Google Cloud コンソールの上部にプロジェクト名が表示されていることを確認します。表示されていない場合は、[プロジェクトの選択] をクリックして [Project Selector] を開き、目的のプロジェクトを選択します。
- Google Cloud コンソールの [Vertex AI] セクションが表示されていない場合は、次の操作を行います。
- [検索] に「Vertex AI」と入力して Enter キーを押します。
- 検索結果で、[Vertex AI] をクリックします。Vertex AI ダッシュボードが表示されます。
- Vertex AI ダッシュボードで、[すべての推奨 API を有効化] をクリックします。
これにより、複数の API が有効になりますが、この Codelab で最も重要なのは aiplatform.googleapis.com です。これは、次のコマンドを実行して、Cloud Shell ターミナルのコマンドラインで有効にすることもできます。
$ gcloud services enable aiplatform.googleapis.com
Gradle を使用してプロジェクト構造を作成する
Java コード例をビルドするには、Gradle ビルドツールと Java バージョン 17 を使用します。Gradle でプロジェクトを設定するには、Cloud Shell ターミナルでディレクトリ(ここでは palm-workshop)を作成し、そのディレクトリで 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
アプリケーション(オプション 2)を Java 言語(オプション 3)を使用して、サブプロジェクトを使用せずに(オプション 1)、ビルドファイルの Groovy 構文を使用して(オプション 1)、新しいビルド機能を使用せずに(オプションなし)、JUnit Jupiter(オプション 4)でテストを生成します。プロジェクト名には palm-workshop を使用し、ソース パッケージには palm.workshop を使用します。
プロジェクトの構造は次のようになります。
├── gradle
│ └── ...
├── gradlew
├── gradlew.bat
├── settings.gradle
└── app
├── build.gradle
└── src
├── main
│ └── java
│ └── palm
│ └── workshop
│ └── App.java
└── test
└── ...
必要な依存関係を追加するために、app/build.gradle ファイルを更新しましょう。guava 依存関係が存在する場合は削除し、LangChain4J プロジェクトの依存関係とロギング ライブラリに置き換えて、ロガー メッセージの欠落に関する警告が表示されないようにします。
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'
}
LangChain4J には次の 2 つの依存関係があります。
- 1 つはコア プロジェクトに、
- 専用の Vertex AI モジュール用です。
プログラムのコンパイルと実行に Java 17 を使用するには、plugins {} ブロックの下に次のブロックを追加します。
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
もう 1 つ変更があります。app/build.gradle の application ブロックを更新して、ビルドツールを呼び出すときにコマンドラインで実行するメインクラスをユーザーがオーバーライドできるようにします。
application {
mainClass = providers.systemProperty('javaMainClass')
.orElse('palm.workshop.App')
}
ビルドファイルでアプリケーションを実行する準備ができていることを確認するには、デフォルトのメインクラスを実行します。このクラスは、シンプルな Hello World! メッセージを出力します。
$ ./gradlew run -DjavaMainClass=palm.workshop.App > Task :app:run Hello World! BUILD SUCCESSFUL in 3s 2 actionable tasks: 2 executed
これで、LangChain4J プロジェクトを使用して、PaLM 大規模言語テキスト モデルでプログラミングする準備が整いました。
参考として、完全な 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. PaLM のテキストモデルへの最初の呼び出しを行う
プロジェクトが適切に設定されたので、PaLM API を呼び出します。
app/src/main/java/palm/workshop ディレクトリ(デフォルトの App.java クラスと同じ場所)に TextPrompts.java という新しいクラスを作成し、次の内容を入力します。
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());
}
}
最初の例では、Response クラスと PaLM 用の Vertex AI 言語モデルをインポートする必要があります。
次に、main メソッドで、VertexAiLanguageModel のビルダーを使用して言語モデルを構成し、次の項目を指定します。
- エンドポイント、
- プロジェクト
- リージョン、
- パブリッシャー、
- モデルの名前(
text-bison@001)。
言語モデルの準備ができたので、generate() メソッドを呼び出して「プロンプト」(LLM に送信する質問や指示など)を渡すことができます。ここでは、LLM とは何かという簡単な質問をします。ただし、このプロンプトを変更して、別の質問やタスクを試すこともできます。
このクラスを実行するには、Cloud Shell ターミナルで次のコマンドを実行します。
./gradlew run -DjavaMainClass=palm.workshop.TextPrompts
次のような出力が表示されます。
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.
VertexAILanguageModel ビルダーを使用すると、デフォルト値がすでに設定されている任意のパラメータを定義できます。このデフォルト値はオーバーライドできます。次に例を示します。
.temperature(0.2)- 回答のクリエイティブさを定義します(0 はクリエイティブさが低く、事実に基づいた回答になることが多く、1 はクリエイティブな回答になります)。.maxOutputTokens(50)- この例では、生成される回答の長さに応じて 500 トークンがリクエストされました(3 トークンは約 4 語に相当します)。.topK(20)- テキスト補完の候補となる単語の最大数(1 ~ 40)の中から単語をランダムに選択します。.topP(0.95)- 確率の合計がその浮動小数点数(0 ~ 1)になる候補単語を選択します。.maxRetries(3)- 時間あたりのリクエスト数の割り当てを超えている場合は、モデルに呼び出しを 3 回再試行させることができます。
大規模言語モデルは非常に強力で、複雑な質問に回答したり、さまざまな興味深いタスクを処理したりできます。次のセクションでは、テキストから構造化データを抽出するという便利なタスクについて説明します。
5. 非構造化テキストから情報を抽出する
前のセクションでは、テキスト出力を生成しました。この出力をエンドユーザーに直接表示する場合は、これで問題ありません。この出力で言及されているデータを取得したい場合、非構造化テキストからその情報を抽出するにはどうすればよいでしょうか?
たとえば、人物の伝記や説明から、その人物の名前と年齢を抽出するとします。プロンプトを次のように調整することで、大規模言語モデルに JSON データ構造を生成するように指示できます(これは一般に「プロンプト エンジニアリング」と呼ばれます)。
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:
TextPrompts クラスの model.generate() 呼び出しを変更して、上記のテキスト プロンプト全体を渡します。
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:
"""
);
このプロンプトを TextPrompts クラスで実行すると、次の JSON 文字列が返されます。この文字列は、GSON ライブラリなどの JSON パーサーで解析できます。
$ ./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
はい。Anna は 23 歳です。
6. プロンプト テンプレートと構造化プロンプト
質問応答を超えて
PaLM などの大規模言語モデルは質問に答えるのに強力ですが、他にも多くのタスクに使用できます。たとえば、Generative AI Studio で次のプロンプトを試してください(または TextPrompts クラスを変更します)。大文字の単語を独自のアイデアに置き換え、出力を確認します。
- 翻訳 - 「次の文をフランス語に翻訳してください: YOUR_SENTENCE_HERE」
- 要約 - 「次のドキュメントの要約を提供してください: PASTE_YOUR_DOC」
- クリエイティブな生成 - 「TOPIC_OF_THE_POEMについての詩を書いてください」
- プログラミング - 「PROGRAMMING_LANGUAGE でフィボナッチ関数を作成するにはどうすればよいですか?」
プロンプト テンプレート
上記のプロンプトを翻訳、要約、クリエイティブの生成、プログラミング タスクに使用した場合は、プレースホルダの値を独自のアイデアに置き換えます。文字列を操作する代わりに、プロンプト テンプレートを利用することもできます。これにより、プレースホルダ値を定義し、後でデータで空白を埋めることができます。
main() メソッドの内容を次のコードに置き換えて、おいしそうなクリエイティブなプロンプトを見てみましょう。
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());
次のインポートを追加します。
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
import java.util.HashMap;
import java.util.Map;
次に、アプリケーションを再度実行します。出力は次のようになります。
$ ./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.
おいしい!
プロンプト テンプレートを使用すると、テキスト生成メソッドを呼び出す前に必要なパラメータを渡すことができます。これは、ユーザーが提供するさまざまな値に対してデータを渡し、プロンプトをカスタマイズするのに最適な方法です。
クラス名が示すように、PromptTemplate クラスはテンプレート プロンプトを作成します。プレースホルダ名と値のマッピングを適用することで、プレースホルダ要素に値を割り当てることができます。
構造化プロンプト(省略可)
よりリッチなオブジェクト指向のアプローチを使用する場合は、@StructuredPrompt アノテーションを使用してプロンプトを構造化することもできます。このアノテーションでクラスにアノテーションを付けます。そのフィールドは、プロンプトで定義されたプレースホルダに対応します。実際に見てみましょう。
まず、新しいインポートが必要です。
import java.util.Arrays;
import java.util.List;
import dev.langchain4j.model.input.structured.StructuredPrompt;
import dev.langchain4j.model.input.structured.StructuredPromptProcessor;
次に、@StructuredPrompt アノテーションで説明されているプロンプトのプレースホルダに渡すために必要なデータを収集する、TextPrompts クラス内に内部静的クラスを作成します。
@StructuredPrompt("Create a recipe of a {{dish}} that can be prepared using only {{ingredients}}")
static class RecipeCreationPrompt {
String dish;
List<String> ingredients;
}
次に、その新しいクラスをインスタンス化し、レシピの料理と材料を渡して、以前と同様にプロンプトを作成して generate() メソッドに渡します。
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);
マップを使用してギャップを埋める代わりに、IDE で自動補完できるフィールドを含む Java オブジェクトを、よりタイプセーフな方法で使用できます。
変更を 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. テキストの分類と感情分析
前のセクションで学習した内容と同様に、PaLM モデルでテキストを分類したり、感情を分析したりするための別の「プロンプト エンジニアリング」手法を学習します。少数ショット プロンプトについて説明します。これは、言語モデルを意図した方向に誘導し、意図をより深く理解するために、いくつかの例をプロンプトに追加する方法です。
プロンプト テンプレートを活用するように TextPrompts クラスを修正しましょう。
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());
}
}
プロンプトで入出力の例をいくつか提供するアプローチに注目してください。これらは、LLM が同じ構造に従うのに役立つ「少数ショット」です。モデルは、入力が与えられると、入力/出力パターンに一致する出力を返そうとします。
プログラムを実行すると、イチゴもおいしいので、POSITIVE という単語だけが返されます。
$ ./gradlew run -DjavaMainClass=palm.workshop.TextPrompts
> Task :app:run
POSITIVE
感情分析もコンテンツ分類のシナリオです。同じ「フューショット プロンプト」 アプローチを適用して、さまざまなドキュメントをさまざまなカテゴリ バケットに分類できます。
8. 完了
おつかれさまでした。LangChain4j と PaLM API を使用して、Java で初めての生成 AI アプリケーションを構築できました。大規模言語モデルは非常に強力で、質問/回答、データ抽出、要約、テキスト分類、感情分析など、さまざまなタスクを処理できることがわかりました。
次のステップ
Java で PaLM をさらに活用するには、次の Codelab をご覧ください。