Генеративная генерация текста ИИ на Java с помощью PaLM и LangChain4J

1. Введение

Последнее обновление: 27 ноября 2023 г.

Что такое генеративный ИИ

Генеративный ИИ или генеративный искусственный интеллект — это использование ИИ для создания нового контента, такого как текст, изображения, музыка, аудио и видео.

Генеративный ИИ основан на базовых моделях (крупных моделях ИИ), которые могут выполнять несколько задач и выполнять нестандартные задачи, включая обобщение, вопросы и ответы, классификацию и многое другое. Кроме того, при минимальном обучении базовые модели можно адаптировать для целевых случаев использования с очень небольшим количеством примеров данных.

Как работает генеративный ИИ?

Генеративный ИИ работает с использованием модели ML (машинного обучения) для изучения закономерностей и взаимосвязей в наборе данных контента, созданного человеком. Затем он использует изученные шаблоны для создания нового контента.

Самый распространенный способ обучения генеративной модели ИИ — использование обучения с учителем: модели дается набор созданного человеком контента и соответствующие метки. Затем он учится генерировать контент, похожий на контент, созданный человеком, и помеченный теми же ярлыками.

Каковы распространенные приложения генеративного ИИ?

Генеративный ИИ обрабатывает обширный контент, создавая идеи и ответы с помощью текста, изображений и удобных для пользователя форматов. Генеративный ИИ может использоваться для:

  • Улучшите взаимодействие с клиентами за счет улучшенного чата и поиска.
  • Исследуйте огромные объемы неструктурированных данных с помощью диалоговых интерфейсов и обобщений.
  • Помогите выполнять повторяющиеся задачи, такие как ответы на запросы предложений (RFP), локализация маркетингового контента на пять языков, проверка договоров с клиентами на соответствие требованиям и многое другое.

Какие предложения генеративного искусственного интеллекта есть в Google Cloud?

С помощью Vertex AI взаимодействуйте, настраивайте и встраивайте базовые модели в свои приложения — практически не требуется знаний в области машинного обучения. Получите доступ к базовым моделям в Model Garden , настройте модели с помощью простого пользовательского интерфейса в Generative AI Studio или используйте модели в блокноте для анализа данных.

Vertex AI Search and Conversation предлагает разработчикам самый быстрый способ создания генеративных поисковых систем и чат-ботов на базе искусственного интеллекта.

Duet AI — это ваш помощник на базе искусственного интеллекта, доступный в Google Cloud и IDE, который поможет вам делать больше и быстрее.

На чем фокусируется эта кодовая лаборатория?

В этой лаборатории кода основное внимание уделяется модели большого языка PaLM 2 (LLM), размещенной в Google Cloud Vertex AI, которая охватывает все продукты и услуги машинного обучения.

Вы будете использовать Java для взаимодействия с API PaLM в сочетании с оркестратором инфраструктуры LangChain4J LLM. Вы рассмотрите различные конкретные примеры, чтобы воспользоваться преимуществами LLM для ответов на вопросы, генерации идей, извлечения сущностей и структурированного контента, а также обобщения.

Расскажите мне больше о фреймворке LangChain4J!

Платформа LangChain4J — это библиотека с открытым исходным кодом для интеграции больших языковых моделей в ваши приложения Java путем координации различных компонентов, таких как сам LLM, а также других инструментов, таких как векторные базы данных (для семантического поиска), загрузчики документов и разделители (для анализа документов). и учитесь у них), анализаторы вывода и многое другое.

c6d7f7c3fd0d2951.png

Что вы узнаете

  • Как настроить проект Java для использования PaLM и LangChain4J
  • Как сделать первый вызов текстовой модели PaLM, чтобы сгенерировать контент и ответить на вопросы
  • Как извлечь полезную информацию из неструктурированного контента (извлечение сущности или ключевого слова, вывод в формате JSON)
  • Как провести классификацию контента или анализ настроений с помощью нескольких подсказок

Что вам понадобится

  • Знание языка программирования Java
  • Проект Google Cloud
  • Браузер, например Chrome или Firefox.

2. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

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

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы будете использовать Cloud Shell , среду командной строки, работающую в облаке.

Активировать Cloud Shell

  1. В Cloud Console нажмите «Активировать Cloud Shell». d1264ca30785e435.png .

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

Эта виртуальная машина загружена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью браузера.

После подключения к Cloud Shell вы увидите, что вы прошли аутентификацию и что для проекта установлен идентификатор вашего проекта.

  1. Выполните следующую команду в 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`
  1. Выполните следующую команду в 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

  1. В консоли Google Cloud убедитесь, что название вашего проекта отображается в верхней части консоли Google Cloud . Если это не так, нажмите «Выбрать проект» , чтобы открыть «Выбор проекта» , и выберите нужный проект.
  2. Если вы не находитесь в разделе Vertex AI консоли Google Cloud, выполните следующие действия:
  3. В поле «Поиск» введите Vertex AI, затем вернитесь.
  4. В результатах поиска нажмите Vertex AI. Появится панель управления Vertex AI.
  5. Нажмите «Включить все рекомендуемые API» на панели управления Vertex AI.

Это активирует несколько 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 есть две зависимости:

  • один по основному проекту,
  • и один для специального модуля 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() и передать «подсказку» (т. е. ваш вопрос или инструкции для отправки в 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: 

Измените вызов 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 »
  • Резюме — «Предоставьте краткое изложение следующего документа: PASTE_YOUR_DOC».
  • Креативное поколение — «Напиши стихотворение НА ТЕМУ_ПОЭ_ПОЕМА »
  • Программирование — «Как написать функцию Фибоначчи на 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;

Затем мы можем создать внутренний статический класс внутри нашего класса TextPrompts , который собирает данные, необходимые для передачи заполнителей в приглашении, описанном в аннотации @StructuredPrompt :

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

Затем создайте экземпляр этого нового класса и передайте ему блюдо и ингредиенты нашего рецепта, создайте и передайте приглашение методуgener 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 и PaLM API! Попутно вы обнаружили, что большие языковые модели довольно мощны и способны решать различные задачи, такие как вопросы/ответы, извлечение данных, обобщение, классификация текста, анализ настроений и многое другое.

Что дальше?

Ознакомьтесь со следующими лабораториями кода, чтобы продолжить работу с PaLM на Java:

Дальнейшее чтение

Справочная документация