1. はじめに
最終更新日: 2023 年 11 月 27 日
生成 AI とは
生成 AI(Generative Artificial Intelligence)は、AI を活用してテキスト、画像、音楽、音声、動画などの新しいコンテンツを作成することを指します。
生成 AI は、さまざまなタスクに対応した基盤モデル(大規模 AI モデル)をベースにしており、そのままで要約、質疑応答、分類などをすぐに実行できます。 さらに、ほんのわずかなサンプルデータで必要最小限のトレーニングを行うだけで、基盤モデルを対象のユースケースに適応させることができます。
生成 AI の仕組み
生成 AI は、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 は AI を活用したコラボレーターで、Google Cloud や IDE で利用でき、より多くのことをより速くこなすことができます。
この 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 上で動作するコマンドライン環境である Cloud Shell を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする]
をクリックします。
Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。
Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。
この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。
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 を使用できます。
プロジェクトの構造は次のようになります。
├── 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 つはコアプロジェクト
- 2 つ目は 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()
メソッドを呼び出して「prompt」を渡します。(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 つの単語を選択します(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
はい。アンナは 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
クラスはテンプレート プロンプトを作成します。プレースホルダの名前と値のマップを適用して、プレースホルダ要素に値を割り当てることができます。
構造化プロンプト(省略可)
プロンプトを構成するもう 1 つの方法は、より豊富なオブジェクト指向アプローチを使用したい場合に、@StructuredPrompt
アノテーションを使用することです。クラスにこのアノテーションを付けます。そのフィールドは、プロンプトで定義されたプレースホルダに対応します。実際に見てみましょう。
まず、新しい import が必要になります。
import java.util.Arrays;
import java.util.List;
import dev.langchain4j.model.input.structured.StructuredPrompt;
import dev.langchain4j.model.input.structured.StructuredPromptProcessor;
次に、TextPrompts
クラス内に内部静的クラスを作成します。このクラスは、@StructuredPrompt
アノテーションで説明されているプロンプトのプレースホルダに渡すために必要なデータを収集します。
@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 をご覧ください。