تولید متن هوش مصنوعی در جاوا با PalM و LangChain4J

۱. مقدمه

آخرین به‌روزرسانی: 2023-11-27

هوش مصنوعی مولد چیست؟

هوش مصنوعی مولد یا هوش مصنوعی مولد به استفاده از هوش مصنوعی برای ایجاد محتوای جدید مانند متن، تصاویر، موسیقی، صدا و ویدیو اشاره دارد.

هوش مصنوعی مولد (Generative AI) توسط مدل‌های بنیادی (Foundation Models) (مدل‌های بزرگ هوش مصنوعی) پشتیبانی می‌شود که می‌توانند چندین کار را همزمان انجام دهند و وظایف آماده‌ای از جمله خلاصه‌سازی، پرسش و پاسخ، طبقه‌بندی و موارد دیگر را انجام دهند. به علاوه، با حداقل آموزش مورد نیاز، مدل‌های بنیادی را می‌توان برای موارد استفاده هدفمند با داده‌های نمونه بسیار کم تطبیق داد.

هوش مصنوعی مولد چگونه کار می‌کند؟

هوش مصنوعی مولد با استفاده از یک مدل ML (یادگیری ماشین) برای یادگیری الگوها و روابط موجود در مجموعه داده‌های محتوای ایجاد شده توسط انسان کار می‌کند. سپس از الگوهای آموخته شده برای تولید محتوای جدید استفاده می‌کند.

رایج‌ترین روش برای آموزش یک مدل هوش مصنوعی مولد، استفاده از یادگیری نظارت‌شده است - به این مدل مجموعه‌ای از محتوای ایجاد شده توسط انسان و برچسب‌های مربوطه داده می‌شود. سپس یاد می‌گیرد محتوایی تولید کند که مشابه محتوای ایجاد شده توسط انسان باشد و با همان برچسب‌ها برچسب‌گذاری شود.

کاربردهای رایج هوش مصنوعی مولد چیست؟

هوش مصنوعی مولد، محتوای گسترده‌ای را پردازش می‌کند و از طریق متن، تصاویر و قالب‌های کاربرپسند، بینش‌ها و پاسخ‌هایی ایجاد می‌کند. هوش مصنوعی مولد می‌تواند برای موارد زیر استفاده شود:

  • بهبود تعاملات با مشتری از طریق چت و تجربه جستجوی پیشرفته
  • کاوش حجم عظیمی از داده‌های بدون ساختار از طریق رابط‌های محاوره‌ای و خلاصه‌سازی‌ها
  • کمک به انجام وظایف تکراری مانند پاسخ به درخواست‌های پیشنهاد (RFP)، بومی‌سازی محتوای بازاریابی به پنج زبان و بررسی انطباق قراردادهای مشتری و موارد دیگر

گوگل کلود چه پیشنهاداتی در زمینه هوش مصنوعی مولد ارائه می‌دهد؟

با Vertex AI ، با مدل‌های پایه تعامل داشته باشید، آنها را سفارشی کنید و در برنامه‌های خود جاسازی کنید - به تخصص ML نیاز چندانی ندارید یا اصلاً نیازی به آن ندارید. به مدل‌های پایه در Model Garden دسترسی داشته باشید، مدل‌ها را از طریق یک رابط کاربری ساده در Generative AI Studio تنظیم کنید، یا از مدل‌ها در یک دفترچه یادداشت علوم داده استفاده کنید.

ابزار Vertex AI Search and Conversation سریع‌ترین راه برای ساخت موتورهای جستجو و چت‌بات‌های مبتنی بر هوش مصنوعی را در اختیار توسعه‌دهندگان قرار می‌دهد.

و Duet AI همکار مبتنی بر هوش مصنوعی شماست که در سراسر Google Cloud و IDEها در دسترس است تا به شما کمک کند کارهای بیشتری را سریع‌تر انجام دهید.

این codelab روی چه چیزی تمرکز دارد؟

این آزمایشگاه کد بر مدل زبان بزرگ (LLM) پال‌ام ۲ (PaLM 2) تمرکز دارد که بر روی هوش مصنوعی گوگل کلود ورتکس (Google Cloud Vertex AI) میزبانی می‌شود و شامل تمام محصولات و خدمات یادگیری ماشینی می‌شود.

شما از جاوا برای تعامل با API مربوط به PaLM، به همراه هماهنگ‌کننده‌ی چارچوب LangChain4J LLM، استفاده خواهید کرد. شما با مثال‌های عینی مختلف، از LLM برای پاسخ به سوالات، تولید ایده، استخراج محتوای موجودیت و ساختاریافته و خلاصه‌سازی بهره خواهید برد.

درباره چارچوب LangChain4J بیشتر توضیح دهید!

چارچوب LangChain4J یک کتابخانه متن‌باز برای ادغام مدل‌های زبانی بزرگ در برنامه‌های جاوای شما است که با هماهنگ‌سازی اجزای مختلف، مانند خود LLM، و همچنین ابزارهای دیگری مانند پایگاه‌های داده برداری (برای جستجوهای معنایی)، بارگذاری‌کننده‌ها و تقسیم‌کننده‌های سند (برای تجزیه و تحلیل اسناد و یادگیری از آنها)، تجزیه‌کننده‌های خروجی و موارد دیگر، انجام می‌شود.

c6d7f7c3fd0d2951.png

آنچه یاد خواهید گرفت

  • نحوه راه‌اندازی یک پروژه جاوا برای استفاده از PaLM و LangChain4J
  • چگونه اولین فراخوانی خود را با مدل متنی PaLM برای تولید محتوا و پاسخ به سوالات انجام دهید
  • نحوه استخراج اطلاعات مفید از محتوای بدون ساختار (استخراج موجودیت یا کلمه کلیدی، خروجی در JSON)
  • چگونه با چند عکس، طبقه‌بندی محتوا یا تحلیل احساسات انجام دهیم؟

آنچه نیاز دارید

  • آشنایی با زبان برنامه نویسی جاوا
  • یک پروژه ابری گوگل
  • یک مرورگر، مانند کروم یا فایرفاکس

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

۲۹۵۰۰۴۸۲۱bab6a87.png

37d264871000675d.png

۹۶d86d3d5655cdbe.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

اگرچه می‌توان گوگل کلود را از راه دور و از طریق لپ‌تاپ شما مدیریت کرد، اما در این آزمایشگاه کد از Cloud Shell ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

اگر این اولین باری است که Cloud Shell را اجرا می‌کنید، یک صفحه میانی برای توضیح آن به شما نمایش داده می‌شود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

d95252b003979716.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

7833d5e1c5d18f54.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به 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].

۳. آماده‌سازی محیط توسعه

در این آزمایشگاه کد، شما از ترمینال و ویرایشگر کد Cloud Shell برای توسعه برنامه‌های جاوا خود استفاده خواهید کرد.

فعال کردن API های هوش مصنوعی Vertex

  1. در کنسول گوگل کلود، مطمئن شوید که نام پروژه شما در بالای کنسول گوگل کلود نمایش داده می‌شود. اگر اینطور نیست، روی «انتخاب یک پروژه» کلیک کنید تا « انتخابگر پروژه» باز شود و پروژه مورد نظر خود را انتخاب کنید.
  2. اگر در بخش Vertex AI کنسول Google Cloud نیستید، موارد زیر را انجام دهید:
  3. در قسمت جستجو ، عبارت Vertex AI را وارد کنید، سپس عبارت زیر را برگردانید.
  4. در نتایج جستجو، روی Vertex AI کلیک کنید. داشبورد Vertex AI نمایش داده می‌شود.
  5. در داشبورد Vertex AI، روی فعال کردن همه APIهای پیشنهادی کلیک کنید.

این کار چندین API را فعال می‌کند، اما مهم‌ترین آن‌ها برای codelab، aiplatform.googleapis.com است که می‌توانید آن را در خط فرمان، در ترمینال Cloud Shell، با اجرای دستور زیر فعال کنید:

$ gcloud services enable aiplatform.googleapis.com

ایجاد ساختار پروژه با Gradle

برای ساخت نمونه‌های کد جاوا، از ابزار ساخت Gradle و نسخه ۱۷ جاوا استفاده خواهید کرد. برای راه‌اندازی پروژه خود با 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

شما یک برنامه خواهید ساخت (گزینه ۲)، با استفاده از زبان جاوا (گزینه ۳)، بدون استفاده از زیرپروژه‌ها (گزینه ۱)، با استفاده از سینتکس Groovy برای فایل ساخت (گزینه ۱)، از ویژگی‌های ساخت جدید استفاده نکنید (گزینه شماره)، تست‌ها را با JUnit Jupiter تولید کنید (گزینه ۴)، و برای نام پروژه می‌توانید از 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 و کتابخانه ثبت وقایع جایگزین کنید تا از پیام‌های مزاحم گم شدن logger جلوگیری شود:

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.

برای استفاده از جاوا ۱۷ برای کامپایل و اجرای برنامه‌هایمان، بلوک زیر را زیر بلوک 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

اکنون شما آماده‌اید تا با استفاده از پروژه LangChain4J، با مدل متن زبان بزرگ PaLM برنامه‌نویسی کنید!

برای مرجع، فایل کامل ساخت app/build.gradle اکنون باید به این شکل باشد:

plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
}

java {
    toolchain {
        // Ensure we compile and run on Java 17
        languageVersion = JavaLanguageVersion.of(17)
    }
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'

    // This dependency is used by the application.
    implementation 'dev.langchain4j:langchain4j-vertex-ai:0.24.0'
    implementation 'dev.langchain4j:langchain4j:0.24.0'
    implementation 'org.slf4j:slf4j-jdk14:2.0.9'
}

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

tasks.named('test') {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}

۴. اولین فراخوانی مدل متنی 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 را برای 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) ‎ - در این مثال، ۵۰۰ توکن درخواست شده است (۳ توکن تقریباً معادل ۴ کلمه است)، بسته به اینکه می‌خواهید پاسخ تولید شده چقدر طول داشته باشد.
  • .topK(20) ‎ - برای انتخاب تصادفی یک کلمه از بین حداکثر تعداد کلمات احتمالی برای تکمیل متن (از ۱ تا ۴۰)
  • .topP(0.95) ‎ - برای انتخاب کلمات ممکن که مجموع احتمال آنها برابر با آن عدد اعشاری (بین ۰ و ۱) باشد.
  • .maxRetries(3) ‎ - در صورتی که سهمیه درخواست در هر زمان از حد مجاز فراتر رود، می‌توانید مدل را طوری تنظیم کنید که مثلاً فراخوانی را ۳ بار دوباره امتحان کند.

مدل‌های زبان بزرگ بسیار قدرتمند هستند و می‌توانند به سوالات پیچیده پاسخ دهند و قادر به انجام طیف وسیعی از وظایف جالب هستند. در بخش بعدی، نگاهی به یک وظیفه مفید خواهیم داشت: استخراج داده‌های ساختاریافته از متن .

۵. استخراج اطلاعات از متن بدون ساختار

در بخش قبلی، شما یک خروجی متنی ایجاد کردید. اگر می‌خواهید این خروجی را مستقیماً به کاربران نهایی خود نشان دهید، این خوب است. اما اگر می‌خواهید داده‌هایی را که در این خروجی ذکر شده است بازیابی کنید، چگونه آن اطلاعات را از متن بدون ساختار استخراج می‌کنید؟

فرض کنید می‌خواهید نام و سن یک شخص را با توجه به بیوگرافی یا توضیحات آن شخص استخراج کنید. می‌توانید با تغییر اعلان به شکل زیر، به مدل زبان بزرگ دستور دهید تا ساختارهای داده 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 تغییر دهید تا کل متن prompt بالا به آن ارسال شود:

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

بله! آنا ۲۳ ساله است!

۶. قالب‌های پرسش و پاسخ و پرسش‌های ساختاریافته

فراتر از پاسخ به سوال

مدل‌های زبانی بزرگ مانند PaLM برای پاسخ به سوالات قدرتمند هستند، اما می‌توانید از آنها برای کارهای بسیار بیشتری استفاده کنید! به عنوان مثال، دستورات زیر را در Generative AI Studio (یا با تغییر کلاس TextPrompts ) امتحان کنید. کلمات را با حروف بزرگ با ایده‌های خود تغییر دهید و خروجی آنها را بررسی کنید:

  • ترجمه — «جمله‌ی زیر را به فرانسوی ترجمه کنید: YOUR_SENTENCE_HERE »
  • خلاصه‌سازی — «خلاصه‌ای از سند زیر ارائه دهید: PASTE_YOUR_DOC»
  • نسل خلاق — «شعری در مورد موضوع شعر بنویسید»
  • برنامه‌نویسی — «چگونه یک تابع فیبوناچی را در زبان برنامه‌نویسی بنویسیم؟»

قالب‌های اعلان

اگر از دستورات بالا برای ترجمه، خلاصه‌سازی، تولید خلاقانه یا وظایف برنامه‌نویسی استفاده کرده‌اید، مقادیر جای‌نگهدار را با ایده‌های خودتان جایگزین کرده‌اید. اما به جای دستکاری رشته‌ها، می‌توانید از «الگوهای دستور» نیز استفاده کنید که به شما امکان می‌دهد آن مقادیر جای‌نگهدار را تعریف کنید و بعداً جای خالی را با داده‌های خود پر کنید.

بیایید نگاهی به یک اعلان جذاب و خلاقانه بیندازیم، که در آن کل محتوای متد 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 های زیر:

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 خود ایجاد کنیم که داده‌های مورد نیاز برای ارسال placeholderها در prompt که در حاشیه‌نویسی @StructuredPrompt توضیح داده شده است را جمع‌آوری می‌کند:

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

سپس آن کلاس جدید را نمونه‌سازی کنید و غذا و مواد تشکیل‌دهنده دستور پخت ما را به آن بدهید، مانند قبل، اعلان را ایجاد کرده و به متد generate() ارسال کنید:

RecipeCreationPrompt createRecipePrompt = new RecipeCreationPrompt();
createRecipePrompt.dish = "salad";
createRecipePrompt.ingredients = Arrays.asList("cucumber", "tomato", "feta", "onion", "olives");
Prompt prompt = StructuredPromptProcessor.toPrompt(createRecipePrompt);

Response<String> response = model.generate(prompt);

به جای پر کردن جاهای خالی از طریق یک نقشه، می‌توانید از یک شیء جاوا با فیلدهایی که می‌توانند به صورت خودکار توسط IDE شما تکمیل شوند، به روشی ایمن‌تر برای نوع داده‌ها، استفاده کنید.

اگر می‌خواهید راحت‌تر این تغییرات را در کلاس 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());
    }
}

۷. طبقه‌بندی متن و تحلیل احساسات

مشابه آنچه در بخش قبل آموختید، تکنیک «مهندسی سریع» دیگری را برای وادار کردن مدل 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

تحلیل احساسات نیز یک سناریوی طبقه‌بندی محتوا است. شما می‌توانید از همان رویکرد «راهنمایی چند مرحله‌ای» برای دسته‌بندی اسناد مختلف در دسته‌های مختلف استفاده کنید.

۸. تبریک

تبریک می‌گویم، شما با موفقیت اولین برنامه هوش مصنوعی مولد خود را در جاوا با استفاده از LangChain4J و رابط برنامه‌نویسی کاربردی PaLM ساختید! در طول مسیر متوجه شدید که مدل‌های زبانی بزرگ بسیار قدرتمند هستند و قادر به انجام وظایف مختلفی مانند پرسش و پاسخ، استخراج داده‌ها، خلاصه‌سازی، طبقه‌بندی متن، تحلیل احساسات و موارد دیگر می‌باشند.

بعدش چی؟

برای آشنایی بیشتر با PaLM در جاوا، به برخی از آزمایشگاه‌های کد زیر نگاهی بیندازید:

مطالعه بیشتر

اسناد مرجع