Tạo văn bản bằng AI tạo sinh trong Java bằng PaLM và LangChain4J

1. Giới thiệu

Lần cập nhật gần đây nhất: 27/11/2023

AI tạo sinh là gì

AI tạo sinh hay trí tuệ nhân tạo tạo sinh là việc sử dụng AI để tạo ra nội dung mới, chẳng hạn như văn bản, hình ảnh, nhạc, âm thanh và video.

AI tạo sinh hoạt động dựa trên các mô hình nền tảng (các mô hình AI lớn), có khả năng làm nhiều việc cùng lúc và thực hiện ngay những việc có thể làm, chẳng hạn như tóm tắt, hỏi và đáp, phân loại, v.v. Ngoài ra, yêu cầu đào tạo rất ít, các mô hình nền tảng có thể được điều chỉnh cho phù hợp với các trường hợp sử dụng được nhắm mục tiêu mà có rất ít dữ liệu mẫu.

AI tạo sinh hoạt động như thế nào?

AI tạo sinh hoạt động bằng cách sử dụng mô hình ML (Máy học) để tìm hiểu các mẫu hình và mối quan hệ trong một tập dữ liệu gồm nội dung do con người tạo ra. Sau đó, công cụ này sử dụng các mẫu đã học để tạo nội dung mới.

Cách phổ biến nhất để huấn luyện một mô hình AI tạo sinh là sử dụng phương pháp học có giám sát. Mô hình này được cung cấp một tập hợp nội dung do con người tạo và các nhãn tương ứng. Sau đó, công nghệ này sẽ học cách tạo ra nội dung tương tự như nội dung do con người tạo và được gắn nhãn có cùng nhãn.

Các ứng dụng AI tạo sinh phổ biến là gì?

AI tạo sinh xử lý nội dung khổng lồ, tạo thông tin chi tiết và câu trả lời bằng văn bản, hình ảnh và các định dạng thân thiện với người dùng. AI tạo sinh có thể được dùng để:

  • Cải thiện mức độ tương tác với khách hàng thông qua trải nghiệm tìm kiếm và trò chuyện nâng cao
  • Khám phá lượng lớn dữ liệu phi cấu trúc thông qua giao diện trò chuyện và nội dung tóm tắt
  • Hỗ trợ những công việc lặp đi lặp lại như phản hồi yêu cầu đề xuất (RFP), bản địa hoá nội dung tiếp thị bằng 5 ngôn ngữ, kiểm tra hợp đồng với khách hàng để đảm bảo tuân thủ, v.v.

Google Cloud cung cấp sản phẩm/dịch vụ AI tạo sinh nào?

Nhờ Vertex AI, bạn có thể tương tác, tuỳ chỉnh và nhúng các mô hình nền tảng vào ứng dụng của mình – mà không cần hoặc không cần kiến thức chuyên môn về công nghệ học máy. Sử dụng các mô hình nền tảng trong Model Garden, điều chỉnh các mô hình thông qua giao diện người dùng đơn giản trên AI Studio tạo sinh hoặc sử dụng các mô hình trong sổ tay khoa học dữ liệu.

Công cụ tìm kiếm và trò chuyện bằng AI tạo sinh mang đến cho nhà phát triển cách nhanh nhất để xây dựng công cụ tìm kiếm và bot trò chuyện dựa trên AI tạo sinh.

Ngoài ra, Duet AI là một cộng sự dựa trên AI, hiện có trên Google Cloud và các môi trường phát triển tích hợp (IDE) để giúp bạn làm được nhiều việc hơn và nhanh hơn.

Lớp học lập trình này tập trung vào chủ đề nào?

Lớp học lập trình này tập trung vào Mô hình ngôn ngữ lớn (LLM) PaLM 2, được lưu trữ trên Vertex AI của Google Cloud, trong đó bao gồm tất cả sản phẩm và dịch vụ học máy.

Bạn sẽ sử dụng Java để tương tác với PaLM API, kết hợp với trình điều phối khung mô hình ngôn ngữ lớn (LLM) LangChain4J. Bạn sẽ tìm hiểu các ví dụ cụ thể để tận dụng LLM (mô hình ngôn ngữ lớn) nhằm trả lời câu hỏi, tạo ý tưởng, trích xuất thực thể và nội dung có cấu trúc cũng như tóm tắt.

Hãy cho tôi biết thêm về khung LangChain4J!

Khung LangChain4J là một thư viện nguồn mở để tích hợp các mô hình ngôn ngữ lớn trong các ứng dụng Java, bằng cách sắp xếp nhiều thành phần, chẳng hạn như chính LLM và các công cụ khác như cơ sở dữ liệu vectơ (để tìm kiếm ngữ nghĩa), trình tải và bộ chia tài liệu (để phân tích và học hỏi từ các tài liệu đó), trình phân tích cú pháp đầu ra, v.v.

c6d7f7c3fd0d2951.png

Kiến thức bạn sẽ học được

  • Cách thiết lập dự án Java để sử dụng PaLM và LangChain4J
  • Cách thực hiện lệnh gọi đầu tiên đến mô hình văn bản PaLM để tạo nội dung và trả lời câu hỏi
  • Cách trích xuất thông tin hữu ích từ nội dung phi cấu trúc (trích xuất thực thể hoặc từ khoá, kết quả ở định dạng JSON)
  • Cách phân loại nội dung hoặc phân tích cảm xúc chỉ bằng một vài cảnh quay nhắc

Bạn cần có

  • Kiến thức về ngôn ngữ lập trình Java
  • Một dự án trên Google Cloud
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

295004821bab6a87.pngS

37d264871000675d.png.

96d86d3d5655cdbe.png.

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật ứng dụng.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án của mình (thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án), mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Nếu đây là lần đầu tiên khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

d95252b003979716.png

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

7833d5e1c5d18f54.pngS

Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Chuẩn bị môi trường phát triển

Trong lớp học lập trình này, bạn sẽ sử dụng cửa sổ dòng lệnh và trình soạn thảo mã Cloud Shell để phát triển các chương trình Java.

Bật các API Vertex AI

  1. Trong bảng điều khiển Google Cloud, hãy đảm bảo tên dự án của bạn xuất hiện ở đầu bảng điều khiển Google Cloud. Nếu chưa, hãy nhấp vào Chọn dự án để mở Bộ chọn dự án và chọn dự án bạn muốn.
  2. Nếu bạn không có quyền truy cập vào phần Vertex AI trên bảng điều khiển của Google Cloud, hãy làm như sau:
  3. Trong lệnh Tìm kiếm, hãy nhập Vertex AI rồi quay lại
  4. Trong kết quả tìm kiếm, hãy nhấp vào Vertex AI. Bảng điều khiển Vertex AI sẽ xuất hiện.
  5. Nhấp vào Enable All Recommended API (Bật tất cả API được đề xuất) trong trang tổng quan của Vertex AI.

Thao tác này sẽ bật nhiều API, nhưng API quan trọng nhất đối với lớp học lập trình này là aiplatform.googleapis.com. Bạn cũng có thể bật API này trên dòng lệnh trong cửa sổ dòng lệnh của Cloud Shell bằng cách chạy lệnh sau:

$ gcloud services enable aiplatform.googleapis.com

Tạo cấu trúc dự án bằng Gradle

Để xây dựng các ví dụ về mã Java, bạn sẽ sử dụng công cụ xây dựng Gradle và phiên bản 17 của Java. Để thiết lập dự án với Gradle, trong thiết bị đầu cuối Cloud Shell, hãy tạo một thư mục (tại đây, palm-workshop), chạy lệnh gradle init trong thư mục đó:

$ 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

Bạn sẽ xây dựng một ứng dụng (lựa chọn 2), sử dụng ngôn ngữ Java (lựa chọn 3), không sử dụng dự án phụ (lựa chọn 1), sử dụng cú pháp Groovy cho tệp bản dựng (lựa chọn 1), không dùng các tính năng bản dựng mới (lựa chọn không), tạo chương trình kiểm thử bằng JUnit Jupiter (lựa chọn 4), và đối với tên dự án, bạn có thể sử dụng palm-workshop tương tự, bạn có thể sử dụng gói palmworkshop.

Cấu trúc dự án sẽ như sau:

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

Hãy cập nhật tệp app/build.gradle để thêm một số phần phụ thuộc cần thiết. Bạn có thể xoá phần phụ thuộc guava (nếu có) rồi thay thế bằng các phần phụ thuộc cho dự án LangChain4J và thư viện ghi nhật ký để tránh việc thiếu thông điệp của người ghi nhật ký:

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

Có 2 phần phụ thuộc cho LangChain4J:

  • một cho dự án cốt lõi,
  • và một cho mô-đun Vertex AI chuyên dụng.

Để sử dụng Java 17 cho việc biên dịch và chạy các chương trình, hãy thêm khối sau bên dưới khối plugins {}:

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

Một thay đổi nữa cần thực hiện: cập nhật khối application của app/build.gradle để cho phép người dùng có thể ghi đè lớp chính chạy trên dòng lệnh khi gọi công cụ bản dựng:

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

Để kiểm tra xem tệp bản dựng đã sẵn sàng chạy ứng dụng hay chưa, bạn có thể chạy lớp chính mặc định để in thông báo Hello World! đơn giản:

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

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed

Bây giờ, bạn đã sẵn sàng lập trình với mô hình văn bản ngôn ngữ lớn PaLM bằng cách sử dụng dự án LangChain4J!

Để tham khảo, hiện tệp bản dựng app/build.gradle đầy đủ sẽ có dạng như sau:

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. Thực hiện lệnh gọi đầu tiên đến mô hình văn bản PaLM

Hiện tại, dự án đã được thiết lập đúng cách, đã đến lúc gọi API PaLM.

Tạo một lớp mới có tên là TextPrompts.java trong thư mục app/src/main/java/palm/workshop (cùng với lớp App.java mặc định) rồi nhập nội dung sau:

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

Trong ví dụ đầu tiên này, bạn cần nhập lớp Response và mô hình ngôn ngữ Vertex AI cho PaLM.

Tiếp theo, trong phương thức main, bạn sẽ định cấu hình mô hình ngôn ngữ bằng cách sử dụng trình tạo cho VertexAiLanguageModel để chỉ định:

  • điểm cuối,
  • dự án,
  • khu vực,
  • nhà xuất bản,
  • và tên mô hình (text-bison@001).

Mô hình ngôn ngữ hiện đã sẵn sàng, bạn có thể gọi phương thức generate() và truyền "lời nhắc" (tức là câu hỏi hoặc hướng dẫn của bạn để gửi đến LLM). Ở đây, bạn chỉ cần đặt một câu hỏi đơn giản về định nghĩa của LLM. Tuy nhiên, bạn có thể thay đổi câu lệnh này để thử các câu hỏi hoặc nhiệm vụ khác.

Để chạy lớp này, hãy chạy lệnh sau trong cửa sổ dòng lệnh của Cloud Shell:

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

Bạn sẽ thấy kết quả tương tự như kết quả sau:

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.

Trình tạo VertexAILanguageModel cho phép bạn xác định các tham số không bắt buộc đã có một số giá trị mặc định mà bạn có thể ghi đè. Dưới đây là một số ví dụ:

  • .temperature(0.2) – để xác định mức độ phù hợp của mẫu quảng cáo bạn muốn nhận được (0 là mẫu quảng cáo thấp và thường là thực tế hơn, trong khi 1 là dành cho nhiều mẫu quảng cáo hơn)
  • .maxOutputTokens(50) – trong ví dụ, 500 mã thông báo đã được yêu cầu (3 mã thông báo gần tương đương với 4 từ), tuỳ thuộc vào thời lượng bạn muốn câu trả lời được tạo
  • .topK(20) – để chọn ngẫu nhiên một từ trong số tối đa số từ có thể cần để hoàn thành văn bản (từ 1 đến 40)
  • .topP(0.95) – để chọn những từ có thể có tổng xác suất cộng lại bằng số thực đó (từ 0 đến 1)
  • .maxRetries(3) – trong trường hợp bạn chạy vượt quá hạn mức yêu cầu cho mỗi thời gian, bạn có thể yêu cầu mô hình thử gọi lại lệnh gọi 3 lần, ví dụ:

Mô hình ngôn ngữ lớn rất mạnh mẽ, có thể cung cấp câu trả lời cho các câu hỏi phức tạp cũng như xử lý nhiều nhiệm vụ thú vị. Trong phần tiếp theo, chúng ta sẽ tìm hiểu một công việc hữu ích: trích xuất dữ liệu có cấu trúc khỏi văn bản.

5. Trích xuất thông tin từ văn bản không có cấu trúc

Trong phần trước, bạn đã tạo một số dữ liệu đầu ra văn bản. Điều này là bình thường nếu bạn muốn trực tiếp hiển thị kết quả này cho người dùng cuối. Nhưng nếu bạn muốn truy xuất dữ liệu được đề cập trong kết quả này, làm cách nào để trích xuất thông tin đó từ văn bản không có cấu trúc?

Giả sử bạn muốn trích xuất tên và tuổi của một người dựa trên tiểu sử hoặc thông tin mô tả về người đó. Bạn có thể hướng dẫn mô hình ngôn ngữ lớn tạo cấu trúc dữ liệu JSON bằng cách tinh chỉnh câu lệnh như sau (thường được gọi là "prompt kỹ thuật"):

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: 

Sửa đổi lệnh gọi model.generate() trong lớp TextPrompts để truyền toàn bộ lời nhắc bằng văn bản ở trên:

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

Nếu chạy lời nhắc này trong lớp TextPrompts, lời nhắc sẽ trả về chuỗi JSON sau. Bạn có thể phân tích cú pháp bằng trình phân tích cú pháp JSON như thư viện 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

Có! Anna 23 tuổi!

6. Mẫu câu lệnh và câu lệnh có cấu trúc

Không chỉ giải đáp câu hỏi

Các mô hình ngôn ngữ lớn như PaLM rất hữu ích trong việc giải đáp thắc mắc, nhưng bạn còn có thể dùng những mô hình này cho nhiều nhiệm vụ khác! Ví dụ: hãy thử các câu lệnh sau trong AI tạo sinh (hoặc bằng cách sửa đổi lớp TextPrompts). Thay đổi chữ viết hoa theo ý tưởng của riêng bạn và kiểm tra kết quả của chúng:

  • Bản dịch — "Dịch câu sau đây sang tiếng Pháp: YOUR_SENTENCE_HERE"
  • Tóm tắt — "Cung cấp bản tóm tắt về tài liệu sau: PASTE_YOUR_DOC"
  • Tạo mẫu quảng cáo — "Viết một bài thơ về TOPIC_OF_THE_POEM"
  • Programming – "Làm cách nào để viết một hàm Fibonacci trong PROGRAMMING_LANGUAGE?"

Mẫu câu lệnh

Nếu đã thử những lời nhắc ở trên cho các nhiệm vụ dịch, tóm tắt, tạo mẫu quảng cáo hoặc lập trình, bạn đã thay thế các giá trị phần giữ chỗ bằng ý tưởng của riêng mình. Nhưng thay vì thực hiện một số thao tác xáo trộn chuỗi, bạn cũng có thể tận dụng "mẫu lời nhắc". Tính năng này cho phép bạn xác định các giá trị phần giữ chỗ đó rồi điền dữ liệu vào chỗ trống sau đó.

Hãy cùng xem một câu lệnh sáng tạo và ngon miệng bằng cách thay thế toàn bộ nội dung của phương thức main() bằng mã sau:

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

Và bằng cách thêm các lệnh nhập sau:

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

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

Sau đó, chạy lại ứng dụng. Kết quả đầu ra sẽ có dạng như sau:

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

Ngon tuyệt!

Với mẫu lời nhắc, bạn có thể cung cấp các tham số cần thiết trước khi gọi phương thức tạo văn bản. Đây là một cách hiệu quả để truyền dữ liệu và tuỳ chỉnh lời nhắc theo các giá trị do người dùng cung cấp.

Đúng như tên của lớp, lớp PromptTemplate sẽ tạo một lời nhắc theo mẫu và bạn có thể gán giá trị cho các phần tử phần giữ chỗ bằng cách áp dụng bản đồ tên và giá trị của phần giữ chỗ.

Câu lệnh có cấu trúc (KHÔNG BẮT BUỘC)

Một cách khác để sắp xếp cấu trúc các lời nhắc là chú thích @StructuredPrompt, nếu bạn muốn sử dụng một phương pháp phong phú hơn về hướng đối tượng. Bạn chú thích một lớp bằng chú thích này và các trường của lớp đó tương ứng với phần giữ chỗ được xác định trong lời nhắc. Hãy xem ví dụ thực tế.

Trước tiên, chúng ta sẽ cần một số lệnh nhập mới:

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

Sau đó, chúng ta có thể tạo một lớp tĩnh bên trong trong lớp TextPrompts. Lớp này thu thập dữ liệu cần thiết để truyền vào phần giữ chỗ trong câu lệnh được mô tả trong chú thích @StructuredPrompt:

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

Sau đó, tạo thực thể cho lớp mới đó rồi cho lớp đó ăn món ăn và nguyên liệu trong công thức của chúng ta, tạo và chuyển lời nhắc đến phương thức generate() như trước:

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

Thay vì lấp đầy khoảng trống thông qua một bản đồ, bạn có thể sử dụng đối tượng Java với các trường có thể được IDE tự động hoàn thành theo cách an toàn hơn về kiểu.

Dưới đây là toàn bộ mã nếu bạn muốn dán các thay đổi đó vào lớp TextPrompts dễ dàng hơn:

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. Phân loại văn bản và phân tích ý kiến

Tương tự như những gì bạn đã tìm hiểu trong phần trước, bạn sẽ khám phá một kỹ thuật "kỹ thuật câu lệnh" khác để giúp mô hình PaLM phân loại văn bản hoặc phân tích ý kiến. Hãy nói về "một vài lời nhắc". Đây là một cách để cải thiện câu lệnh của bạn bằng một số ví dụ nhằm giúp định hướng mô hình ngôn ngữ theo hướng bạn muốn, để hiểu rõ hơn ý định của bạn.

Hãy chỉnh sửa lớp TextPrompts của chúng ta để tận dụng các mẫu lời nhắc:

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

Hãy lưu ý phương pháp cung cấp một vài ví dụ về dữ liệu đầu vào và đầu ra trong câu lệnh. Sau đây là "một vài bức ảnh" giúp LLM tuân theo cấu trúc tương tự. Khi nhận được một đầu vào, mô hình sẽ muốn trả về một đầu ra khớp với mẫu đầu vào/đầu ra.

Việc chạy chương trình chỉ nên trả về từ POSITIVE, vì dâu tây cũng rất ngon!

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

> Task :app:run
POSITIVE

Phân tích cảm xúc cũng là một tình huống phân loại nội dung. Bạn có thể áp dụng cùng một phương pháp "nhắc nhở nhanh" để phân loại các tài liệu khác nhau vào các nhóm danh mục khác nhau.

8. Xin chúc mừng

Xin chúc mừng! Bạn đã tạo thành công ứng dụng AI tạo sinh đầu tiên trong Java bằng LangChain4J và PaLM API! Bạn đã khám phá ra rằng các mô hình ngôn ngữ lớn khá mạnh mẽ và có thể xử lý nhiều công việc như đặt câu hỏi/trả lời, trích xuất dữ liệu, tóm tắt, phân loại văn bản, phân tích quan điểm, v.v.

Tiếp theo là gì?

Hãy tham khảo một số lớp học lập trình sau đây để tìm hiểu sâu hơn về PaLM trong Java:

Tài liệu đọc thêm

Tài liệu tham khảo