1. Giới thiệu
Lần cập nhật gần đây nhất: Ngày 5 tháng 2 năm 2024
AI tạo sinh là gì
AI tạo sinh là hình thứ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 được hỗ trợ bởi các mô hình nền tảng (mô hình AI lớn) có thể thực hiện nhiều nhiệm vụ cùng một lúc và đáp ứng các yêu cầu sáng tạo, chẳng hạn như tóm tắt, hỏi đáp, phân loại và hơn thế. Ngoài ra, với yêu cầu tối thiểu về việc huấn luyện, các mô hình cơ sở có thể được điều chỉnh cho các trường hợp sử dụng mục tiêu với 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 học máy (ML) để 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. Sau đó, AI sẽ sử dụng các mẫu đã học đượ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. Theo đó, mô hình sẽ đượ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 đó, mô hình này sẽ học cách tạo nội dung tương tự như nội dung do con người tạo ra và được gắn nhãn tương tự.
Các ứng dụng phổ biến của AI tạo sinh là gì?
AI tạo sinh xử lý lượng nội dung khổng lồ, tạo ra thông tin chi tiết và câu trả lời thông qua 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 hoạt động tương tác với khách hàng thông qua trải nghiệm trò chuyện và tìm kiếm nâng cao
- Khám phá lượng lớn dữ liệu không có cấu trúc thông qua các giao diện đàm thoại và bản tóm tắt
- Hỗ trợ các công việc lặp đi lặp lại như trả lờ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 của khách hàng để đảm bảo tuân thủ và nhiều việc khác
Google Cloud có những giải pháp nào dựa trên AI tạo sinh?
Với Vertex AI, bạn có thể tương tác, tuỳ chỉnh và nhúng các mô hình cơ sở vào ứng dụng của mình mà không cần hoặc chỉ cần rất ít kiến thức chuyên môn về học máy. Truy cập vào các mô hình cơ sở trên Model Garden, điều chỉnh các mô hình thông qua một giao diện người dùng đơn giản trên Generative AI Studio hoặc sử dụng các mô hình trong sổ tay khoa học dữ liệu.
Vertex AI Search and Conversation cung cấp cho nhà phát triển cách nhanh nhất để tạo công cụ tìm kiếm và chatbot dựa trên AI tạo sinh.
Ngoài ra, Duet AI là cộng sự dựa trên AI, có mặt trên Google Cloud và các 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 vấn đề gì?
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, bao gồm tất cả cá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 LLM LangChain4J. Bạn sẽ xem xét nhiều ví dụ cụ thể để tận dụng LLM cho việc 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.
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 vào các ứng dụng Java của bạn, bằng cách điều phối nhiều thành phần, chẳng hạn như chính LLM, mà còn 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à trình phân tách tài liệu (để phân tích tài liệu và học hỏi từ tài liệu), trình phân tích cú pháp đầu ra, v.v.

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 trích xuất thông tin hữu ích từ nội dung không có cấu trúc (trích xuất thực thể hoặc từ khoá, đầu ra ở định dạng JSON)
- Cách tạo cuộc trò chuyện với người dùng
- Cách sử dụng mô hình trò chuyện để đặt câu hỏi về tài liệu của riêng bạn
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 tốc độ của riêng bạn
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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.



- 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ự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
- Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án. - Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyê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í trị giá 300 USD.
Khởi động Cloud Shell
Mặc dù 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 trên đám mây.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.

Nếu đây là lần đầu tiên bạ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 thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Đầu ra của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- 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
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt nó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Đầu ra của 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 thiết bị đầu cuối 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 của Vertex AI
- Trong bảng điều khiển 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 Cloud. Nếu không, hãy nhấp vào Chọn dự án để mở Trình chọn dự án rồi chọn dự án bạn muốn.
- Nếu bạn không ở phần Vertex AI của bảng điều khiển Cloud Google, hãy làm như sau:
- Trong phần Tìm kiếm, hãy nhập Vertex AI rồi nhấn phím Return
- Trong kết quả tìm kiếm, hãy nhấp vào Vertex AI. Trang tổng quan Vertex AI sẽ xuất hiện.
- Nhấp vào Bật tất cả API được đề xuất trong trang tổng quan Vertex AI.
Thao tác này sẽ bật một số API, nhưng API quan trọng nhất đối với lớp học lập trình 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ổ 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
Để tạo các ví dụ về mã Java, bạn sẽ sử dụng công cụ tạo Gradle và Java phiên bản 17. Để thiết lập dự án bằng Gradle, trong thiết bị đầu cuối Cloud Shell, hãy tạo một thư mục (ở đây là 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ẽ tạo một ứng dụng (lựa chọn 2), bằng ngôn ngữ Java (lựa chọn 3), không dùng các dự án con (lựa chọn 1), 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 các kiểm thử bằng JUnit Jupiter (lựa chọn 4) và bạn có thể dùng palm-workshop cho tên dự án, cũng như palm.workshop cho gói nguồn.
Cấu trúc dự án sẽ có dạng 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ó và 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 các thông báo thiếu trình ghi nhật ký gây phiền toái:
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 có 2 phần phụ thuộc:
- 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ụ tạo:
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 một 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
Giờ đây, bạn đã sẵn sàng lập trình bằng 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, sau đây là nội dung của tệp app/build.gradle đầy đủ hiện tại:
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 trò chuyện của PaLM
Bây giờ 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à ChatPrompts.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.vertexai.VertexAiChatModel;
import dev.langchain4j.chain.ConversationalChain;
public class ChatPrompts {
public static void main(String[] args) {
VertexAiChatModel model = VertexAiChatModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("chat-bison@001")
.maxOutputTokens(400)
.maxRetries(3)
.build();
ConversationalChain chain = ConversationalChain.builder()
.chatLanguageModel(model)
.build();
String message = "What are large language models?";
String answer = chain.execute(message);
System.out.println(answer);
System.out.println("---------------------------");
message = "What can you do with them?";
answer = chain.execute(message);
System.out.println(answer);
System.out.println("---------------------------");
message = "Can you name some of them?";
answer = chain.execute(message);
System.out.println(answer);
}
}
Trong ví dụ đầu tiên này, bạn cần nhập lớp VertexAiChatModel và ConversationalChain LangChain4J để dễ dàng xử lý khía cạnh nhiều lượt của cuộc trò chuyện.
Tiếp theo, trong phương thức main, bạn sẽ định cấu hình mô hình ngôn ngữ trò chuyện bằng cách sử dụng trình tạo cho VertexAiChatModel để chỉ định:
- điểm cuối,
- dự án,
- khu vực,
- nhà xuất bản,
- và tên của mô hình (
chat-bison@001).
Giờ đây, khi mô hình ngôn ngữ đã sẵn sàng, bạn có thể chuẩn bị một ConversationalChain. Đây là một lớp trừu tượng cấp cao hơn do LangChain4j cung cấp để định cấu hình cùng nhau các thành phần khác nhau nhằm xử lý một cuộc trò chuyện, chẳng hạn như chính mô hình ngôn ngữ trò chuyện, nhưng có thể là các thành phần khác để xử lý nhật ký cuộc trò chuyện hoặc để cắm các công cụ khác như trình truy xuất để tìm nạp thông tin từ cơ sở dữ liệu vectơ. Nhưng đừng lo lắng, chúng ta sẽ quay lại vấn đề đó ở phần sau của lớp học lập trình này.
Sau đó, bạn sẽ thực hiện một cuộc trò chuyện nhiều lượt với mô hình trò chuyện để đặt một số câu hỏi có liên quan với nhau. Trước tiên, bạn thắc mắc về LLM, sau đó bạn hỏi xem mình có thể làm gì với LLM và một số ví dụ về LLM. Lưu ý rằng bạn không cần phải lặp lại, LLM biết rằng "họ" có nghĩa là LLM, trong bối cảnh của cuộc trò chuyện đó.
Để thực hiện cuộc trò chuyện nhiều lượt, bạn chỉ cần gọi phương thức execute() trên chuỗi. Phương thức này sẽ thêm cuộc trò chuyện vào bối cảnh của cuộc trò chuyện, mô hình trò chuyện sẽ tạo một câu trả lời và thêm câu trả lời đó vào nhật ký trò chuyện.
Để chạy lớp này, hãy chạy lệnh sau trong cửa sổ dòng lệnh Cloud Shell:
./gradlew run -DjavaMainClass=palm.workshop.ChatPrompts
Bạn sẽ thấy kết quả tương tự như sau:
$ ./gradlew run -DjavaMainClass=palm.workshop.ChatPrompts Starting a Gradle Daemon, 2 incompatible and 2 stopped Daemons could not be reused, use --status for details > Task :app:run Large language models (LLMs) are artificial neural networks that are trained on massive datasets of text and code. They are designed to understand and generate human language, and they can be used for a variety of tasks, such as machine translation, question answering, and text summarization. --------------------------- LLMs can be used for a variety of tasks, such as: * Machine translation: LLMs can be used to translate text from one language to another. * Question answering: LLMs can be used to answer questions posed in natural language. * Text summarization: LLMs can be used to summarize text into a shorter, more concise form. * Code generation: LLMs can be used to generate code, such as Python or Java code. * Creative writing: LLMs can be used to generate creative text, such as poems, stories, and scripts. LLMs are still under development, but they have the potential to revolutionize a wide range of industries. For example, LLMs could be used to improve customer service, create more personalized marketing campaigns, and develop new products and services. --------------------------- Some of the most well-known LLMs include: * GPT-3: Developed by OpenAI, GPT-3 is a large language model that can generate text, translate languages, write different kinds of creative content, and answer your questions in an informative way. * LaMDA: Developed by Google, LaMDA is a large language model that can chat with you in an open-ended way, answering your questions, telling stories, and providing different kinds of creative content. * PaLM 2: Developed by Google, PaLM 2 is a large language model that can perform a wide range of tasks, including machine translation, question answering, and text summarization. * T5: Developed by Google, T5 is a large language model that can be used for a variety of tasks, including text summarization, question answering, and code generation. These are just a few examples of the many LLMs that are currently being developed. As LLMs continue to improve, they are likely to play an increasingly important role in our lives. BUILD SUCCESSFUL in 25s 2 actionable tasks: 2 executed
PaLM đã trả lời 3 câu hỏi liên quan của bạn!
Trình tạo VertexAIChatModel cho phép bạn xác định các tham số không bắt buộc. Các tham số này đã 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 độ sáng tạo mà bạn muốn câu trả lời có được (0 là mức độ sáng tạo thấp và thường mang tính thực tế hơn, trong khi 1 là mức độ sáng tạo cao hơn).maxOutputTokens(50)– trong ví dụ này, 400 mã thông báo đã được yêu cầu (3 mã thông báo tương đương với khoảng 4 từ), tuỳ thuộc vào độ dài mà bạn muốn câu trả lời được tạo có.topK(20)– để chọn ngẫu nhiên một từ trong số tối đa các từ có thể có để 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 bằng với số thực đó (từ 0 đến 1).maxRetries(3)– trong trường hợp vượt quá hạn mức yêu cầu theo thời gian, bạn có thể yêu cầu mô hình thử lại lệnh gọi 3 lần, chẳng hạn
5. Một chatbot hữu ích và có cá tính!
Trong phần trước, bạn đã bắt đầu đặt câu hỏi ngay cho chatbot LLM mà không cung cấp bất kỳ bối cảnh cụ thể nào. Tuy nhiên, bạn có thể chuyên biệt hoá chatbot như vậy để trở thành chuyên gia về một nhiệm vụ cụ thể hoặc về một chủ đề cụ thể.
Bạn làm thế nào? Bằng cách thiết lập bối cảnh: bằng cách giải thích cho LLM về nhiệm vụ hiện tại, bối cảnh, có thể đưa ra một vài ví dụ về những việc LLM phải làm, tính cách mà LLM nên có, định dạng mà bạn muốn nhận được phản hồi và có thể là giọng điệu, nếu bạn muốn chatbot hoạt động theo một cách nhất định.
Bài viết về cách tạo câu lệnh minh hoạ rõ ràng phương pháp này bằng hình ảnh sau:

https://medium.com/@eldatero/master-the-perfect-chatgpt-prompt-formula-c776adae8f19
Để minh hoạ điểm này, hãy tham khảo một số ý tưởng trên trang web prompts.chat. Trang web này liệt kê nhiều ý tưởng hay và thú vị về chatbot được điều chỉnh tuỳ chỉnh để cho phép chatbot hoạt động như:
- một trình dịch biểu tượng cảm xúc – để dịch tin nhắn của người dùng thành biểu tượng cảm xúc
- một công cụ nâng cao câu lệnh – để tạo câu lệnh hiệu quả hơn
- người đánh giá tạp chí – để giúp đánh giá các bài nghiên cứu
- một chuyên gia tư vấn phong cách cá nhân – để nhận gợi ý về phong cách quần áo
Có một ví dụ về cách biến chatbot LLM thành một người chơi cờ vua! Hãy triển khai điều đó!
Cập nhật lớp ChatPrompts như sau:
package palm.workshop;
import dev.langchain4j.chain.ConversationalChain;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.vertexai.VertexAiChatModel;
import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
public class ChatPrompts {
public static void main(String[] args) {
VertexAiChatModel model = VertexAiChatModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("chat-bison@001")
.maxOutputTokens(7)
.maxRetries(3)
.build();
InMemoryChatMemoryStore chatMemoryStore = new InMemoryChatMemoryStore();
MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryStore(chatMemoryStore)
.maxMessages(200)
.build();
chatMemory.add(SystemMessage.from("""
You're an expert chess player with a high ELO ranking.
Use the PGN chess notation to reply with the best next possible move.
"""
));
ConversationalChain chain = ConversationalChain.builder()
.chatLanguageModel(model)
.chatMemory(chatMemory)
.build();
String pgn = "";
String[] whiteMoves = { "Nf3", "c4", "Nc3", "e3", "Dc2", "Cd5"};
for (int i = 0; i < whiteMoves.length; i++) {
pgn += " " + (i+1) + ". " + whiteMoves[i];
System.out.println("Playing " + whiteMoves[i]);
pgn = chain.execute(pgn);
System.out.println(pgn);
}
}
}
Hãy cùng phân tích từng bước:
- Bạn cần nhập một số dữ liệu mới để xử lý bộ nhớ của cuộc trò chuyện.
- Bạn tạo thực thể cho mô hình trò chuyện, nhưng với số lượng mã thông báo tối đa nhỏ (ở đây là 7), vì chúng ta chỉ muốn tạo nước đi tiếp theo, chứ không phải toàn bộ luận văn về cờ vua!
- Tiếp theo, bạn tạo một kho lưu trữ bộ nhớ trò chuyện để lưu các cuộc trò chuyện.
- Bạn tạo một bộ nhớ trò chuyện thực tế theo cửa sổ để lưu giữ các bước di chuyển gần đây nhất.
- Trong bộ nhớ trò chuyện, bạn thêm một thông báo "hệ thống" để hướng dẫn mô hình trò chuyện về danh tính mà mô hình này phải có (ví dụ: một kỳ thủ cờ vua chuyên nghiệp). Thông báo "hệ thống" cung cấp một số bối cảnh, trong khi thông báo "người dùng" và "AI" là nội dung thảo luận thực tế.
- Bạn tạo một chuỗi trò chuyện kết hợp bộ nhớ và mô hình trò chuyện.
- Sau đó, chúng ta có một danh sách các nước đi cho bên trắng mà bạn đang lặp lại. Chuỗi này được thực thi với nước đi tiếp theo của bên trắng mỗi lần, và mô hình trò chuyện sẽ trả lời bằng nước đi tốt nhất tiếp theo.
Khi chạy lớp này với các bước di chuyển này, bạn sẽ thấy kết quả sau:
$ ./gradlew run -DjavaMainClass=palm.workshop.ChatPrompts Starting a Gradle Daemon (subsequent builds will be faster) > Task :app:run Playing Nf3 1... e5 Playing c4 2... Nc6 Playing Nc3 3... Nf6 Playing e3 4... Bb4 Playing Dc2 5... O-O Playing Cd5 6... exd5
Woh! PaLM có biết cách chơi cờ vua không? Không hẳn, nhưng trong quá trình huấn luyện, mô hình này chắc hẳn đã xem một số bình luận về các trận đấu cờ vua, hoặc thậm chí là các tệp PGN (Ký hiệu di động cho ván cờ) của các trận đấu trước đây. Tuy nhiên, chatbot này có thể không thắng được AlphaZero (AI đánh bại những người chơi cờ vây, cờ tướng và cờ vua giỏi nhất) và cuộc trò chuyện có thể đi chệch hướng hơn nữa, với việc mô hình không thực sự nhớ trạng thái thực tế của trò chơi.
Các mô hình trò chuyện rất mạnh mẽ, có thể tạo ra nhiều lượt tương tác phong phú với người dùng và xử lý nhiều tác vụ theo ngữ cảnh. Trong phần tiếp theo, chúng ta sẽ xem xét một nhiệm vụ hữu ích: trích xuất dữ liệu có cấu trúc từ văn bản.
6. 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 các cuộc trò chuyện giữa người dùng và một mô hình ngôn ngữ trò chuyện. Nhưng với LangChain4J, bạn cũng có thể sử dụng một mô hình trò chuyện để trích xuất thông tin có cấu trúc 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 nội dung 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 một câu lệnh được điều chỉnh khéo léo (thường được gọi là "thiết kế câu lệnh").
Bạn sẽ cập nhật lớp ChatPrompts như sau:
package palm.workshop;
import dev.langchain4j.model.vertexai.VertexAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.UserMessage;
public class ChatPrompts {
static class Person {
String name;
int age;
}
interface PersonExtractor {
@UserMessage("""
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:
---
{{it}}
---
JSON:
""")
Person extractPerson(String text);
}
public static void main(String[] args) {
VertexAiChatModel model = VertexAiChatModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("chat-bison@001")
.maxOutputTokens(300)
.build();
PersonExtractor extractor = AiServices.create(PersonExtractor.class, model);
Person person = extractor.extractPerson("""
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.
"""
);
System.out.println(person.name);
System.out.println(person.age);
}
}
Hãy xem các bước trong tệp này:
- Một lớp
Personđược xác định để biểu diễn thông tin chi tiết mô tả một người (tên và tuổi). - Giao diện
PersonExtractorđược tạo bằng một phương thức. Phương thức này sẽ trả về một thực thểPersonđã được khởi tạo khi nhận được một chuỗi văn bản không có cấu trúc. extractPerson()được chú giải bằng chú giải@UserMessageđể liên kết một câu lệnh với chú giải đó. Đó là câu lệnh mà mô hình sẽ dùng để trích xuất thông tin và trả về thông tin chi tiết dưới dạng tài liệu JSON. Tài liệu này sẽ được phân tích cú pháp cho bạn và chuyển đổi thành một thực thểPerson.
Bây giờ, hãy xem nội dung của phương thức main():
- Mô hình trò chuyện được tạo thực thể.
- Đối tượng
PersonExtractorđược tạo nhờ lớpAiServicescủa LangChain4J. - Sau đó, bạn chỉ cần gọi
Person person = extractor.extractPerson(...)để trích xuất thông tin chi tiết của người đó từ văn bản không có cấu trúc và nhận lại một thực thểPersoncó tên và độ tuổi.
Bây giờ, hãy chạy lớp này bằng lệnh sau:
$ ./gradlew run -DjavaMainClass=palm.workshop.ChatPrompts > Task :app:run Anna 23
Có! Đây là Anna, cô ấy 23 tuổi!
Điều đặc biệt thú vị với phương pháp AiServices này là bạn thao tác với các đối tượng được gõ mạnh. Bạn không tương tác trực tiếp với LLM trò chuyện. Thay vào đó, bạn đang làm việc với các lớp cụ thể, chẳng hạn như lớp Person để biểu thị thông tin cá nhân đã trích xuất và bạn có một lớp PersonExtractor với phương thức extractPerson() trả về một thực thể Person. Khái niệm về LLM được trừu tượng hoá và với tư cách là nhà phát triển Java, bạn chỉ cần thao tác với các lớp và đối tượng thông thường.
7. Tạo sinh tăng cường khả năng truy xuất: trò chuyện với tài liệu của bạn
Hãy quay lại phần cuộc trò chuyện. Lần này, bạn có thể đặt câu hỏi về tài liệu của mình. Bạn sẽ tạo một chatbot có thể truy xuất thông tin liên quan từ cơ sở dữ liệu gồm các đoạn trích trong tài liệu của bạn. Mô hình sẽ sử dụng thông tin đó để "căn cứ" câu trả lời thay vì cố gắng tạo câu trả lời dựa trên dữ liệu huấn luyện của mô hình. Mẫu này được gọi là RAG, hay Tạo sinh tăng cường truy xuất.
Trong quá trình Tạo thông tin tăng cường dựa trên truy xuất, về cơ bản có 2 giai đoạn:
- Giai đoạn tiếp nhận – Các tài liệu được tải, chia thành các phần nhỏ hơn và một bản trình bày dạng vectơ của các tài liệu đó (một "mã nhúng vectơ") được lưu trữ trong một "cơ sở dữ liệu vectơ" có khả năng thực hiện các tìm kiếm ngữ nghĩa.

- Giai đoạn truy vấn – Giờ đây, người dùng có thể đặt câu hỏi cho chatbot của bạn về tài liệu. Câu hỏi cũng sẽ được chuyển đổi thành một vectơ và so sánh với tất cả các vectơ khác trong cơ sở dữ liệu. Các vectơ tương tự nhất thường có liên quan về mặt ngữ nghĩa và được cơ sở dữ liệu vectơ trả về. Sau đó, LLM được cung cấp bối cảnh của cuộc trò chuyện, các đoạn văn bản tương ứng với các vectơ do cơ sở dữ liệu trả về và được yêu cầu đưa ra câu trả lời dựa trên những đoạn văn bản đó.

Chuẩn bị giấy tờ
Đối với bản minh hoạ mới này, bạn sẽ đặt câu hỏi về cấu trúc mạng nơ-ron "transformer" do Google tiên phong phát triển. Đây là cách mà tất cả các mô hình ngôn ngữ lớn hiện đại được triển khai ngày nay.
Bạn có thể truy xuất bài nghiên cứu mô tả kiến trúc này ("Attention is all you need") bằng cách dùng lệnh wget để tải PDF xuống từ Internet:
wget -O attention-is-all-you-need.pdf \
https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf
Triển khai chuỗi truy xuất đàm thoại
Hãy cùng khám phá từng bước cách xây dựng phương pháp gồm 2 giai đoạn, trước tiên là nhập tài liệu, sau đó là thời gian truy vấn khi người dùng đặt câu hỏi về tài liệu.
Nhập tài liệu
Bước đầu tiên của giai đoạn nhập tài liệu là xác định vị trí của tệp PDF mà chúng ta tải xuống và chuẩn bị một PdfParser để đọc tệp đó:
PdfDocumentParser pdfParser = new PdfDocumentParser();
Document document = pdfParser.parse(
new FileInputStream(new File("/home/YOUR_USER_NAME/palm-workshop/attention-is-all-you-need.pdf")));
Thay vì tạo mô hình ngôn ngữ trò chuyện thông thường, trước đó, bạn sẽ tạo một phiên bản của mô hình "nhúng". Đây là một mô hình và điểm cuối cụ thể có vai trò tạo ra các biểu diễn vectơ của các đoạn văn bản (từ, câu hoặc thậm chí là đoạn văn).
VertexAiEmbeddingModel embeddingModel = VertexAiEmbeddingModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("textembedding-gecko@001")
.maxRetries(3)
.build();
Tiếp theo, bạn sẽ cần một vài lớp để cộng tác với nhau nhằm:
- Tải và chia tài liệu PDF thành nhiều phần.
- Tạo các vectơ nhúng cho tất cả các đoạn này.
InMemoryEmbeddingStore<TextSegment> embeddingStore =
new InMemoryEmbeddingStore<>();
EmbeddingStoreIngestor storeIngestor = EmbeddingStoreIngestor.builder()
.documentSplitter(DocumentSplitters.recursive(500, 100))
.embeddingModel(embeddingModel)
.embeddingStore(embeddingStore)
.build();
storeIngestor.ingest(document);
EmbeddingStoreRetriever retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);
Một thực thể của InMemoryEmbeddingStore (cơ sở dữ liệu vectơ trong bộ nhớ) được tạo để lưu trữ các mục nhúng vectơ.
Tài liệu được chia thành các đoạn nhờ lớp DocumentSplitters. Công cụ này sẽ chia văn bản của tệp PDF thành các đoạn có 500 ký tự, với độ chồng chéo là 100 ký tự (với đoạn tiếp theo, để tránh cắt từ hoặc câu thành nhiều phần).
"Trình tiếp nhận" của cửa hàng liên kết trình phân chia tài liệu, mô hình nhúng để tính toán các vectơ và cơ sở dữ liệu vectơ trong bộ nhớ. Sau đó, phương thức ingest() sẽ đảm nhận việc truyền dẫn.
Giờ đây, giai đoạn đầu tiên đã kết thúc, tài liệu đã được chuyển đổi thành các đoạn văn bản có các vectơ nhúng được liên kết và được lưu trữ trong cơ sở dữ liệu vectơ.
Đặt câu hỏi
Đã đến lúc chuẩn bị đặt câu hỏi! Bạn có thể tạo mô hình trò chuyện thông thường để bắt đầu cuộc trò chuyện:
VertexAiChatModel model = VertexAiChatModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("chat-bison@001")
.maxOutputTokens(1000)
.build();
Bạn cũng sẽ cần một lớp "retriever" (trình truy xuất) để liên kết cơ sở dữ liệu vectơ (trong biến embeddingStore) và mô hình nhúng. Công việc của mô hình này là truy vấn cơ sở dữ liệu vectơ bằng cách tính toán một vectơ nhúng cho cụm từ tìm kiếm của người dùng, để tìm các vectơ tương tự trong cơ sở dữ liệu:
EmbeddingStoreRetriever retriever =
EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);
Tại thời điểm này, bạn có thể tạo thực thể lớp ConversationalRetrievalChain (đây chỉ là một tên khác cho mẫu Tạo thông tin tăng cường để truy xuất):
ConversationalRetrievalChain rag = ConversationalRetrievalChain.builder()
.chatLanguageModel(model)
.retriever(retriever)
.promptTemplate(PromptTemplate.from("""
Answer to the following query the best as you can: {{question}}
Base your answer on the information provided below:
{{information}}
"""
))
.build();
"Chuỗi" này liên kết với nhau:
- Mô hình ngôn ngữ trò chuyện mà bạn đã định cấu hình trước đó.
- Công cụ truy xuất so sánh một truy vấn nhúng vectơ với các vectơ trong cơ sở dữ liệu.
- Mẫu câu lệnh cho biết rõ rằng mô hình trò chuyện phải trả lời dựa trên thông tin được cung cấp (tức là các đoạn trích có liên quan trong tài liệu có vectơ nhúng tương tự như vectơ của câu hỏi của người dùng).
Giờ thì bạn đã sẵn sàng đặt câu hỏi!
String result = rag.execute("What neural network architecture can be used for language models?");
System.out.println(result);
System.out.println("------------");
result = rag.execute("What are the different components of a transformer neural network?");
System.out.println(result);
System.out.println("------------");
result = rag.execute("What is attention in large language models?");
System.out.println(result);
System.out.println("------------");
result = rag.execute("What is the name of the process that transforms text into vectors?");
System.out.println(result);
Chạy chương trình bằng cách:
$ ./gradlew run -DjavaMainClass=palm.workshop.ChatPrompts
Trong kết quả đầu ra, bạn sẽ thấy câu trả lời cho các câu hỏi của mình:
The Transformer is a neural network architecture that can be used for language models. It is based solely on attention mechanisms, dispensing with recurrence and convolutions. The Transformer has been shown to outperform recurrent neural networks and convolutional neural networks on a variety of language modeling tasks. ------------ The Transformer is a neural network architecture that can be used for language models. It is based solely on attention mechanisms, dispensing with recurrence and convolutions. The Transformer has been shown to outperform recurrent neural networks and convolutional neural networks on a variety of language modeling tasks. The Transformer consists of an encoder and a decoder. The encoder is responsible for encoding the input sequence into a fixed-length vector representation. The decoder is responsible for decoding the output sequence from the input sequence. The decoder uses the attention mechanism to attend to different parts of the input sequence when generating the output sequence. ------------ Attention is a mechanism that allows a neural network to focus on specific parts of an input sequence. In the context of large language models, attention is used to allow the model to focus on specific words or phrases in a sentence when generating output. This allows the model to generate more relevant and informative output. ------------ The process of transforming text into vectors is called word embedding. Word embedding is a technique that represents words as vectors in a high-dimensional space. The vectors are typically learned from a large corpus of text, and they capture the semantic and syntactic relationships between words. Word embedding has been shown to be effective for a variety of natural language processing tasks, such as machine translation, question answering, and sentiment analysis.
Giải pháp toàn diện
Để giúp bạn sao chép và dán dễ dàng, sau đây là toàn bộ nội dung của lớp ChatPrompts:
package palm.workshop;
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.parser.PdfDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.input.PromptTemplate;
import dev.langchain4j.model.vertexai.VertexAiChatModel;
import dev.langchain4j.model.vertexai.VertexAiEmbeddingModel;
import dev.langchain4j.retriever.EmbeddingStoreRetriever;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ChatPrompts {
public static void main(String[] args) throws IOException {
PdfDocumentParser pdfParser = new PdfDocumentParser();
Document document = pdfParser.parse(new FileInputStream(new File("/ABSOLUTE_PATH/attention-is-all-you-need.pdf")));
VertexAiEmbeddingModel embeddingModel = VertexAiEmbeddingModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("textembedding-gecko@001")
.maxRetries(3)
.build();
InMemoryEmbeddingStore<TextSegment> embeddingStore =
new InMemoryEmbeddingStore<>();
EmbeddingStoreIngestor storeIngestor = EmbeddingStoreIngestor.builder()
.documentSplitter(DocumentSplitters.recursive(500, 100))
.embeddingModel(embeddingModel)
.embeddingStore(embeddingStore)
.build();
storeIngestor.ingest(document);
EmbeddingStoreRetriever retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);
VertexAiChatModel model = VertexAiChatModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("genai-java-demos")
.location("us-central1")
.publisher("google")
.modelName("chat-bison@001")
.maxOutputTokens(1000)
.build();
ConversationalRetrievalChain rag = ConversationalRetrievalChain.builder()
.chatLanguageModel(model)
.retriever(retriever)
.promptTemplate(PromptTemplate.from("""
Answer to the following query the best as you can: {{question}}
Base your answer on the information provided below:
{{information}}
"""
))
.build();
String result = rag.execute("What neural network architecture can be used for language models?");
System.out.println(result);
System.out.println("------------");
result = rag.execute("What are the different components of a transformer neural network?");
System.out.println(result);
System.out.println("------------");
result = rag.execute("What is attention in large language models?");
System.out.println(result);
System.out.println("------------");
result = rag.execute("What is the name of the process that transforms text into vectors?");
System.out.println(result);
}
}
8. Xin chúc mừng
Xin chúc mừng! Bạn đã tạo thành công ứng dụng trò chuyện AI tạo sinh đầu tiên của mình bằng Java, sử dụng LangChain4J và PaLM API! Trong quá trình này, bạn nhận thấy các mô hình trò chuyện ngôn ngữ lớn khá mạnh mẽ và có khả năng xử lý nhiều tác vụ như hỏi/đáp, ngay cả trên tài liệu của riêng bạn, trích xuất dữ liệu và ở một mức độ nào đó, mô hình này thậm chí có thể chơi cờ!
Tiếp theo là gì?
Hãy xem một số lớp học lập trình sau đây để tìm hiểu thêm về PaLM trong Java:
Tài liệu đọc thêm
- Các trường hợp sử dụng phổ biến của AI tạo sinh
- Tài nguyên đào tạo về AI tạo sinh
- Tương tác với PaLM thông qua Generative AI Studio
- AI có trách nhiệm