1. Введение
Последнее обновление: 27.11.2023
Что такое генеративный искусственный интеллект?
Генеративный ИИ, или генеративный искусственный интеллект, — это использование ИИ для создания нового контента, такого как текст, изображения, музыка, аудио и видео.
Генеративный ИИ основан на базовых моделях (больших моделях ИИ), которые могут выполнять многозадачные операции и осваивать готовые решения, включая суммаризацию, ответы на вопросы, классификацию и многое другое. Кроме того, благодаря минимальному объему необходимого обучения, базовые модели могут быть адаптированы для целевых задач с очень небольшим количеством примеров данных.
Как работает генеративный искусственный интеллект?
Генеративный ИИ работает, используя модель машинного обучения (ML) для изучения закономерностей и взаимосвязей в наборе данных, созданном людьми. Затем он использует изученные закономерности для генерации нового контента.
Наиболее распространенный способ обучения модели генеративного ИИ — это использование обучения с учителем: модели предоставляется набор созданного человеком контента и соответствующие метки. Затем она учится генерировать контент, похожий на созданный человеком контент и помеченный теми же метками.
Какие существуют распространенные области применения генеративного искусственного интеллекта?
Генеративный ИИ обрабатывает огромные объемы контента, создавая аналитические данные и ответы на основе текста, изображений и удобных для пользователя форматов. Генеративный ИИ может использоваться для:
- Улучшите взаимодействие с клиентами за счет усовершенствованных функций чата и поиска.
- Изучайте огромные массивы неструктурированных данных с помощью диалоговых интерфейсов и кратких обзоров.
- Оказание помощи в выполнении рутинных задач, таких как ответы на запросы предложений (RFP), локализация маркетингового контента на пять языков, проверка договоров с клиентами на соответствие требованиям и многое другое.
Какие решения в области генеративного искусственного интеллекта предлагает Google Cloud?
С Vertex AI вы можете взаимодействовать с базовыми моделями, настраивать их и встраивать в свои приложения — при этом практически не требуется никаких знаний в области машинного обучения. Получайте доступ к базовым моделям в Model Garden , настраивайте модели с помощью простого пользовательского интерфейса в Generative AI Studio или используйте модели в блокноте для анализа данных.
Vertex AI Search and Conversation предлагает разработчикам самый быстрый способ создания поисковых систем и чат-ботов на основе генеративного искусственного интеллекта.
А Duet AI — это ваш помощник на основе искусственного интеллекта, доступный в Google Cloud и IDE, который поможет вам быстрее и эффективнее выполнять больше задач.
На чём сосредоточено внимание в этом практическом занятии?
Данный практический семинар посвящен модели PaLM 2 Large Language Model (LLM), размещенной на платформе Google Cloud Vertex AI и включающей в себя все продукты и услуги машинного обучения.
Вы будете использовать Java для взаимодействия с API PaLM в сочетании с оркестратором фреймворка LangChain4J LLM. Вы рассмотрите различные конкретные примеры, чтобы использовать преимущества LLM для ответов на вопросы, генерации идей, извлечения сущностей и структурированного контента, а также для составления резюме.
Расскажите подробнее о фреймворке LangChain4J!
Фреймворк LangChain4J — это библиотека с открытым исходным кодом для интеграции больших языковых моделей в ваши Java-приложения, которая объединяет различные компоненты, такие как сама LLM, а также другие инструменты, например, векторные базы данных (для семантического поиска), загрузчики и разделители документов (для анализа документов и обучения на их основе), парсеры выходных данных и многое другое.

Что вы узнаете
- Как настроить Java-проект для использования PaLM и LangChain4J
- Как сделать первый вызов текстовой модели PaLM для генерации контента и ответа на вопросы
- Как извлечь полезную информацию из неструктурированного контента (извлечение сущностей или ключевых слов, вывод в формате JSON)
- Как выполнить классификацию контента или анализ настроений с помощью нескольких подсказок.
Что вам понадобится
- Знание языка программирования Java.
- Проект Google Cloud
- Браузер, например Chrome или Firefox.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Cloud Shell — среду командной строки, работающую в облаке.
Активировать Cloud Shell
- В консоли Cloud нажмите «Активировать Cloud Shell» .
.

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вам был показан промежуточный экран, нажмите «Продолжить» .

Подготовка и подключение к Cloud Shell займут всего несколько минут.

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.
После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.
- Выполните следующую команду в 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. Подготовка среды разработки
В этом практическом занятии вы будете использовать терминал Cloud Shell и редактор кода для разработки своих программ на Java.
Включите API Vertex AI
- В консоли Google Cloud убедитесь, что название вашего проекта отображается в верхней части окна . Если это не так, нажмите «Выбрать проект» , чтобы открыть окно выбора проекта , и выберите нужный проект.
- Если вы не находитесь в разделе Vertex AI консоли Google Cloud, выполните следующие действия:
- В поле «Поиск» введите Vertex AI, затем нажмите Enter.
- В результатах поиска нажмите на Vertex AI. Откроется панель управления Vertex AI.
- На панели управления Vertex AI нажмите «Включить все рекомендуемые API» .
Это позволит активировать несколько API, но наиболее важным для практического занятия является 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 зависимости:
- один из основных проектов,
- и еще один для специализированного модуля Vertex AI.
Для использования Java 17 при компиляции и запуске наших программ добавьте следующий блок после блока plugins {} `:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Ещё одно изменение: обновить блок application в файле app/build.gradle , чтобы пользователи могли переопределять основной класс для запуска из командной строки при вызове инструмента сборки:
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
Теперь вы готовы программировать с использованием текстовой модели большого языка PaLM, применяя проект LangChain4J!
Для справки, вот как теперь должен выглядеть полный файл сборки 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.
Теперь, когда проект должным образом настроен, пришло время обратиться к API PaLM.
Создайте новый класс с именем TextPrompts.java в каталоге app/src/main/java/palm/workshop (рядом со стандартным классом App.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 и языковую модель Vertex AI для PaLM.
Далее, в main методе, вы настроите языковую модель, используя построитель для VertexAiLanguageModel , чтобы указать:
- конечная точка,
- проект,
- регион,
- издатель,
- и название модели (
text-bison@001).
Теперь, когда языковая модель готова, вы можете вызвать метод generate() и передать свой "запрос" (то есть ваш вопрос или инструкции для отправки в языковую модель). Здесь вы задаете простой вопрос о том, что такое языковые модели. Но вы можете изменить этот запрос, чтобы попробовать другие вопросы или задания.
Для запуска этого занятия выполните следующую команду в терминале 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:
Измените вызов model.generate() в классе TextPrompts , передав ему весь текстовый запрос, указанный выше:
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, которую вы можете разобрать с помощью парсера JSON, например, библиотеки 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
Да! Анне 23 года!
6. Шаблоны подсказок и структурированные подсказки
Помимо ответов на вопросы
Большие языковые модели, такие как PaLM, обладают мощным потенциалом для ответа на вопросы, но их можно использовать для решения гораздо большего количества задач! Например, попробуйте следующие подсказки в Generative AI Studio (или изменив класс TextPrompts ). Замените слова, написанные заглавными буквами, своими собственными идеями и изучите результат:
- Перевод — "Переведите следующее предложение на французский: YOUR_SENTENCE_HERE "
- Краткое изложение — «Предоставьте краткое содержание следующего документа: ВСТАВЬТЕ_СВОЙ_ДОКУМЕНТ»
- Творческое поколение — «Напишите стихотворение на ТЕМУ СТИХОТВОРЕНИЯ »
- Программирование — «Как написать функцию Фибоначчи на языке программирования ?»
Шаблоны подсказок
Если вы использовали приведенные выше подсказки для перевода, составления резюме, генерации креативных идей или программирования, вы заменили значения-заполнители своими собственными идеями. Но вместо того, чтобы заниматься искажением строк, вы также можете воспользоваться «шаблонами подсказок» , которые позволяют определить эти значения-заполнители, а затем заполнить пробел своими данными.
Давайте рассмотрим интересную и креативную задачу, заменив всё содержимое метода 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;
Затем мы можем создать внутренний статический класс внутри нашего класса 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);
Вместо заполнения пробелов с помощью карты, вы можете использовать объект Java с полями, которые могут быть автоматически заполнены вашей IDE, что обеспечивает более типобезопасный подход.
Вот полный код, если вы хотите проще вставить эти изменения в свой класс 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. Поздравляем!
Поздравляем, вы успешно создали свое первое приложение генеративного ИИ на Java, используя LangChain4J и API PaLM! В процессе работы вы обнаружили, что большие языковые модели довольно мощны и способны решать различные задачи, такие как ответы на вопросы, извлечение данных, суммирование, классификация текста, анализ настроений и многое другое.
Что дальше?
Ознакомьтесь с приведенными ниже примерами кода, чтобы глубже изучить PaLM в Java:
Дополнительная информация
- Типичные примеры использования генеративного ИИ
- Учебные материалы по генеративному искусственному интеллекту
- Взаимодействуйте с PaLM через студию генеративного искусственного интеллекта.
- Ответственный ИИ