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

1. مقدمه

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

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

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

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

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

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

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

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

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

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

Google Cloud چه پیشنهادات هوش مصنوعی مولد دارد؟

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

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

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

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

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

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

در مورد چارچوب LangChain4J بیشتر به من بگویید!

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

c6d7f7c3fd0d2951.png

چیزی که یاد خواهید گرفت

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

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

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

2. راه اندازی و الزامات

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

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

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

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

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.

  1. برای تایید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list

خروجی فرمان

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی فرمان

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می توانید آن را با این دستور تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی فرمان

Updated property [core/project].

3. محیط توسعه خود را آماده کنید

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

API های Vertex AI را فعال کنید

  1. در کنسول Google Cloud، مطمئن شوید که نام پروژه شما در بالای کنسول Google Cloud شما نمایش داده شده است. اگر اینطور نیست، روی Select a project کلیک کنید تا Project Selector باز شود و پروژه مورد نظر خود را انتخاب کنید.
  2. اگر در بخش Vertex AI کنسول Google Cloud نیستید، موارد زیر را انجام دهید:
  3. در جستجو ، Vertex AI را وارد کنید، سپس برگردید
  4. در نتایج جستجو، روی Vertex AI کلیک کنید داشبورد Vertex AI ظاهر می شود.
  5. روی Enable All Recommended APIs در داشبورد Vertex AI کلیک کنید.

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

$ gcloud services enable aiplatform.googleapis.com

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

برای ساختن نمونه کدهای جاوا، از ابزار ساخت Gradle و نسخه 17 جاوا استفاده خواهید کرد. برای تنظیم پروژه خود با Gradle، در ترمینال Cloud Shell، یک دایرکتوری ایجاد کنید (اینجا، palm-workshop )، دستور gradle init را در آن دایرکتوری اجرا کنید:

$ mkdir palm-workshop
$ cd palm-workshop

$ gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3

Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] 

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 4

Project name (default: palm-workshop): 
Source package (default: palm.workshop): 

> Task :init
Get more help with your project: https://docs.gradle.org/7.4/samples/sample_building_java_applications.html

BUILD SUCCESSFUL in 51s
2 actionable tasks: 2 executed

شما یک برنامه کاربردی (گزینه 2)، با استفاده از زبان جاوا (گزینه 3)، بدون استفاده از پروژه های فرعی (گزینه 1)، با استفاده از دستور Groovy برای فایل ساخت (گزینه 1)، از ویژگی های ساخت جدید استفاده نکنید (گزینه شماره) می سازید. ) با JUnit Jupiter (گزینه 4) تست ها را ایجاد کنید و برای نام پروژه می توانید از palm-workshop و به طور مشابه برای بسته منبع می توانید از palm.workshop استفاده کنید.

ساختار پروژه به صورت زیر خواهد بود:

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

بیایید فایل app/build.gradle را به روز کنیم تا برخی وابستگی های مورد نیاز را اضافه کنیم. می‌توانید وابستگی guava را در صورت وجود حذف کنید و آن را با وابستگی‌های پروژه LangChain4J و کتابخانه گزارش‌گیری جایگزین کنید تا از آزار دادن پیام‌های از دست رفته لاگر جلوگیری کنید:

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

    // Logging library
    implementation 'org.slf4j:slf4j-jdk14:2.0.9'

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

2 وابستگی برای LangChain4J وجود دارد:

  • یکی در پروژه اصلی،
  • و یکی برای ماژول اختصاصی Vertex AI.

به منظور استفاده از جاوا 17 برای کامپایل و اجرای برنامه های خود، بلوک زیر را در زیر بلوک plugins {} اضافه کنید:

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

یک تغییر دیگر برای ایجاد: به‌روزرسانی بلوک application app/build.gradle ، تا کاربران بتوانند کلاس اصلی را برای اجرا در خط فرمان هنگام فراخوانی ابزار ساخت، لغو کنند:

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

برای بررسی اینکه آیا فایل ساخت شما برای اجرای برنامه شما آماده است، می توانید کلاس اصلی پیش فرض را اجرا کنید که یک Hello World! پیام:

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

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed

اکنون با استفاده از پروژه 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()
}

4. اولین تماس خود را با مدل متنی PalM انجام دهید

اکنون که پروژه به درستی راه اندازی شده است، نوبت به فراخوانی PaLM API رسیده است.

یک کلاس جدید به نام TextPrompts.java در دایرکتوری app/src/main/java/palm/workshop (در کنار کلاس App.java پیش فرض) ایجاد کنید و محتوای زیر را تایپ کنید:

package palm.workshop;

import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiLanguageModel;

public class TextPrompts {
    public static void main(String[] args) {
        VertexAiLanguageModel model = VertexAiLanguageModel.builder()
            .endpoint("us-central1-aiplatform.googleapis.com:443")
            .project("YOUR_PROJECT_ID")
            .location("us-central1")
            .publisher("google")
            .modelName("text-bison@001")
            .maxOutputTokens(500)
            .build();

        Response<String> response = model.generate("What are large language models?");

        System.out.println(response.content());
    }
}

در این مثال اول، باید کلاس Response و مدل زبان Vertex AI را برای PalM وارد کنید.

سپس، در روش main ، با استفاده از سازنده VertexAiLanguageModel ، مدل زبان را پیکربندی می‌کنید تا مشخص کنید:

  • نقطه پایانی،
  • پروژه،
  • منطقه،
  • ناشر،
  • و نام مدل ( text-bison@001 ).

اکنون که مدل زبان آماده است، می‌توانید متد generate() فراخوانی کنید و «اعلان» خود (یعنی سؤال یا دستورالعمل‌های ارسال به LLM) را ارسال کنید. در اینجا، شما یک سوال ساده در مورد اینکه LLM چیست می پرسید. اما با خیال راحت این دستور را تغییر دهید تا سؤالات یا کارهای مختلف را امتحان کنید.

برای اجرای این کلاس، دستور زیر را در ترمینال Cloud Shell اجرا کنید:

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

شما باید خروجی مشابه این را ببینید:

Large language models (LLMs) are artificial intelligence systems that can understand and generate human language. They are trained on massive datasets of text and code, and can learn to perform a wide variety of tasks, such as translating languages, writing different kinds of creative content, and answering your questions in an informative way.

LLMs are still under development, but they have the potential to revolutionize many industries. For example, they could be used to create more accurate and personalized customer service experiences, to help doctors diagnose and treat diseases, and to develop new forms of creative expression.

However, LLMs also raise a number of ethical concerns. For example, they could be used to create fake news and propaganda, to manipulate people's behavior, and to invade people's privacy. It is important to carefully consider the potential risks and benefits of LLMs before they are widely used.

Here are some of the key features of LLMs:

* They are trained on massive datasets of text and code.
* They can learn to perform a wide variety of tasks, such as translating languages, writing different kinds of creative content, and answering your questions in an informative way.
* They are still under development, but they have the potential to revolutionize many industries.
* They raise a number of ethical concerns, such as the potential for fake news, propaganda, and invasion of privacy.

سازنده VertexAILanguageModel به شما امکان می دهد پارامترهای اختیاری را تعریف کنید که قبلاً مقادیری پیش فرض دارند که می توانید آنها را لغو کنید. در اینجا چند نمونه آورده شده است:

  • .temperature(0.2) - برای تعریف اینکه می خواهید پاسخ چقدر خلاقانه باشد (0 خلاقیت پایین و اغلب واقعی تر است، در حالی که 1 برای خروجی های خلاقانه تر است)
  • .maxOutputTokens(50)
  • .topK(20) - برای انتخاب تصادفی یک کلمه از بین حداکثر تعداد کلمات احتمالاً برای تکمیل متن (از 1 تا 40)
  • .topP(0.95) - برای انتخاب کلمات ممکن که مجموع احتمال آنها به عدد ممیز شناور (بین 0 و 1) می رسد.
  • .maxRetries(3) - در صورتی که درخواست را در هر سهمیه زمانی پشت سر گذاشته اید، می توانید از مدل بخواهید برای مثال 3 بار تماس را دوباره امتحان کند.

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

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

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

فرض کنید می خواهید نام و سن یک فرد را با توجه به بیوگرافی یا شرحی از آن شخص استخراج کنید. می‌توانید با تغییر دادن دستور به شکل زیر به مدل زبان بزرگ دستور دهید تا ساختارهای داده JSON را تولید کند (این را معمولاً «مهندسی سریع» می‌گویند):

Extract the name and age of the person described below.

Return a JSON document with a "name" and an "age" property, 
following this structure: {"name": "John Doe", "age": 34}
Return only JSON, without any markdown markup surrounding it.

Here is the document describing the person:
---
Anna is a 23 year old artist based in Brooklyn, New York. She was 
born and raised in the suburbs of Chicago, where she developed a 
love for art at a young age. She attended the School of the Art 
Institute of Chicago, where she studied painting and drawing. 
After graduating, she moved to New York City to pursue her art career. 
Anna's work is inspired by her personal experiences and observations 
of the world around her. She often uses bright colors and bold lines 
to create vibrant and energetic paintings. Her work has been 
exhibited in galleries and museums in New York City and Chicago.
---

JSON: 

فراخوانی model.generate() را در کلاس TextPrompts تغییر دهید تا کل اعلان متن بالا را به آن ارسال کنید:

Response<String> response = model.generate("""
    Extract the name and age of the person described below.
    Return a JSON document with a "name" and an "age" property, \
    following this structure: {"name": "John Doe", "age": 34}
    Return only JSON, without any markdown markup surrounding it.
    Here is the document describing the person:
    ---
    Anna is a 23 year old artist based in Brooklyn, New York. She was born and 
    raised in the suburbs of Chicago, where she developed a love for art at a 
    young age. She attended the School of the Art Institute of Chicago, where 
    she studied painting and drawing. After graduating, she moved to New York 
    City to pursue her art career. Anna's work is inspired by her personal 
    experiences and observations of the world around her. She often uses bright 
    colors and bold lines to create vibrant and energetic paintings. Her work 
    has been exhibited in galleries and museums in New York City and Chicago.    
    ---
    JSON: 
    """
);

اگر این دستور را در کلاس TextPrompts ما اجرا کنید، باید رشته JSON زیر را برگرداند که می‌توانید با تجزیه‌کننده JSON مانند کتابخانه GSON آن را تجزیه کنید:

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

> Task :app:run
{"name": "Anna", "age": 23}

BUILD SUCCESSFUL in 24s
2 actionable tasks: 1 executed, 1 up-to-date

بله! آنا 23 ساله است!

6. الگوهای اعلان و اعلان های ساخت یافته

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

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

  • ترجمه - "جمله زیر را به فرانسوی ترجمه کنید: YOUR_SENTENCE_HERE "
  • خلاصه کردن - "خلاصه ای از سند زیر را ارائه دهید: PASTE_YOUR_DOC"
  • نسل خلاق — "شعری در مورد TOPIC_OF_THE_POEM بنویس"
  • برنامه نویسی — "چگونه یک تابع فیبوناچی در PROGRAMMING_LANGUAGE بنویسیم؟"

الگوهای سریع

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

بیایید با جایگزین کردن کل محتوای متد main() با کد زیر به یک دستور جالب و خلاقانه نگاهی بیندازیم:

VertexAiLanguageModel model = VertexAiLanguageModel.builder()
            .endpoint("us-central1-aiplatform.googleapis.com:443")
            .project("YOUR_PROJECT_ID")
            .location("us-central1")
            .publisher("google")
            .modelName("text-bison@001")
            .maxOutputTokens(300)
            .build();

PromptTemplate promptTemplate = PromptTemplate.from("""
    Create a recipe for a {{dish}} with the following ingredients: \
    {{ingredients}}, and give it a name.
    """
);

Map<String, Object> variables = new HashMap<>();
variables.put("dish", "dessert");
variables.put("ingredients", "strawberries, chocolate, whipped cream");

Prompt prompt = promptTemplate.apply(variables);

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

System.out.println(response.content());

و با افزودن واردات زیر:

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

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

سپس دوباره برنامه را اجرا کنید. خروجی باید چیزی شبیه به شکل زیر باشد:

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

> Task :app:run
**Strawberry Shortcake**

Ingredients:

* 1 pint strawberries, hulled and sliced
* 1/2 cup sugar
* 1/4 cup cornstarch
* 1/4 cup water
* 1 tablespoon lemon juice
* 1/2 cup heavy cream, whipped
* 1/4 cup confectioners' sugar
* 1/4 teaspoon vanilla extract
* 6 graham cracker squares, crushed

Instructions:

1. In a medium saucepan, combine the strawberries, sugar, cornstarch, water, and lemon juice. Bring to a boil over medium heat, stirring constantly. Reduce heat and simmer for 5 minutes, or until the sauce has thickened.
2. Remove from heat and let cool slightly.
3. In a large bowl, combine the whipped cream, confectioners' sugar, and vanilla extract. Beat until soft peaks form.
4. To assemble the shortcakes, place a graham cracker square on each of 6 dessert plates. Top with a scoop of whipped cream, then a spoonful of strawberry sauce. Repeat layers, ending with a graham cracker square.
5. Serve immediately.

**Tips:**

* For a more elegant presentation, you can use fresh strawberries instead of sliced strawberries.
* If you don't have time to make your own whipped cream, you can use store-bought whipped cream.

خوشمزه!

با الگوهای سریع، می توانید قبل از فراخوانی روش تولید متن، پارامترهای مورد نیاز را تغذیه کنید. این یک راه عالی برای ارسال داده ها و سفارشی کردن درخواست ها برای مقادیر مختلف است که توسط کاربران ارائه شده است.

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

درخواست‌های ساختاریافته (اختیاری)

اگر می‌خواهید از یک رویکرد شی گرا غنی‌تر استفاده کنید، راه دیگری برای ساختار دادن به دستورات خود، حاشیه‌نویسی @StructuredPrompt است. شما یک کلاس را با این حاشیه‌نویسی حاشیه‌نویسی می‌کنید و فیلدهای آن با متغیرهایی که در اعلان تعریف شده است مطابقت دارد. بیایید آن را در عمل ببینیم.

ابتدا به چند واردات جدید نیاز داریم:

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

سپس می‌توانیم یک کلاس استاتیک درونی در کلاس TextPrompts خود ایجاد کنیم که داده‌های مورد نیاز برای ارسال در محل‌های نگهدارنده در اعلان شرح داده شده در حاشیه‌نویسی @StructuredPrompt را جمع‌آوری می‌کند:

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

سپس آن کلاس جدید را نمونه سازی کنید و غذا و مواد اولیه دستور غذا را به آن بدهید، دستور را ایجاد کنید و مانند قبل به متد 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());
    }
}

7. طبقه بندی متن و تجزیه و تحلیل احساسات

مشابه آنچه در بخش قبل یاد گرفتید، تکنیک دیگری را برای "مهندسی سریع" کشف خواهید کرد تا مدل PALM را طبقه بندی کند یا احساسات را تجزیه و تحلیل کند. بیایید در مورد "تشویق چند شات" صحبت کنیم. این راهی است برای تقویت اعلان‌های خود با چند مثال که به هدایت مدل زبان به سمتی که می‌خواهید کمک می‌کند تا منظورتان را بهتر درک کنید.

بیایید کلاس TextPrompts خود را دوباره کار کنیم تا از الگوهای سریع استفاده کنیم:

package palm.workshop;

import java.util.Map;

import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiLanguageModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;

public class TextPrompts {
    public static void main(String[] args) {
        VertexAiLanguageModel model = VertexAiLanguageModel.builder()
            .endpoint("us-central1-aiplatform.googleapis.com:443")
            .project("YOUR_PROJECT_ID")
            .location("us-central1")
            .publisher("google")
            .modelName("text-bison@001")
            .maxOutputTokens(10)
            .build();

        PromptTemplate promptTemplate = PromptTemplate.from("""
            Analyze the sentiment of the text below. Respond only with one word to describe the sentiment.

            INPUT: This is fantastic news!
            OUTPUT: POSITIVE

            INPUT: Pi is roughly equal to 3.14
            OUTPUT: NEUTRAL

            INPUT: I really disliked the pizza. Who would use pineapples as a pizza topping?
            OUTPUT: NEGATIVE

            INPUT: {{text}}
            OUTPUT: 
            """);

        Prompt prompt = promptTemplate.apply(
            Map.of("text", "I love strawberries!"));

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

        System.out.println(response.content());
    }
}

به رویکرد ارائه چند نمونه از ورودی و خروجی در اعلان توجه کنید. اینها "چند عکس" هستند که به LLM کمک می کنند تا از همان ساختار پیروی کنند. هنگامی که مدل یک ورودی دریافت می کند، می خواهد خروجی را برگرداند که با الگوی ورودی/خروجی مطابقت دارد.

اجرای برنامه باید فقط کلمه POSITIVE را برگرداند، زیرا توت فرنگی ها نیز خوشمزه هستند!

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

> Task :app:run
POSITIVE

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

8. تبریک می گویم

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

بعدش چی؟

برای ادامه کار با PalM در جاوا، کدهای زیر را بررسی کنید:

در ادامه مطلب

اسناد مرجع