PaLM और LangChain4J की मदद से, Java में जनरेटिव एआई की मदद से टेक्स्ट जनरेट करना

1. परिचय

पिछली बार अपडेट किए जाने की तारीख: 27-11-2023

जनरेटिव एआई क्या है

जनरेटिव एआई या जनरेटिव आर्टिफ़िशियल इंटेलिजेंस का मतलब है, एआई का इस्तेमाल करके नया कॉन्टेंट बनाना. जैसे, टेक्स्ट, इमेज, संगीत, ऑडियो, और वीडियो.

जनरेटिव एआई, फ़ाउंडेशन मॉडल (बड़े एआई मॉडल) की मदद से काम करता है. ये एक साथ कई तरह के काम कर सकते हैं. साथ ही, ये कई तरह के काम कर सकते हैं. जैसे, खास जानकारी देना, सवाल और जवाब देना, अलग-अलग कैटगरी बनाना वगैरह. साथ ही, आपको कम से कम ट्रेनिंग की ज़रूरत होती है. ऐसे में, फ़ाउंडेशन मॉडल को टारगेट किए गए उन उदाहरणों के मुताबिक ढाला जा सकता है जिनका इस्तेमाल सिर्फ़ उदाहरण के तौर पर किया जा सकता है.

जनरेटिव एआई कैसे काम करता है?

जनरेटिव एआई, एमएल (मशीन लर्निंग) मॉडल का इस्तेमाल करके, लोगों के बनाए गए कॉन्टेंट के डेटासेट के पैटर्न और संबंधों के बारे में बताता है. इसके बाद, वह सीखे गए पैटर्न का इस्तेमाल करके नया कॉन्टेंट जनरेट करता है.

जनरेटिव एआई मॉडल को ट्रेनिंग देने का सबसे सामान्य तरीका है, निगरानी में रखी गई लर्निंग का इस्तेमाल करना. इस मॉडल को इंसानों के बनाए गए कॉन्टेंट और उनसे जुड़े लेबल का एक सेट दिया जाता है. इसके बाद, वह ऐसा कॉन्टेंट जनरेट करना सीखता है जो इंसानों के बनाए गए कॉन्टेंट से मिलता-जुलता हो और जिसे एक जैसे लेबल के साथ लेबल किया गया हो.

जनरेटिव एआई का इस्तेमाल करने वाले आम ऐप्लिकेशन क्या हैं?

जनरेटिव एआई, बड़े पैमाने पर बनाया गया कॉन्टेंट प्रोसेस करता है. इस तरह, यह टेक्स्ट, इमेज, और लोगों के लिए आसान फ़ॉर्मैट के ज़रिए अहम जानकारी और जवाब तैयार करता है. जनरेटिव एआई का इस्तेमाल इन कामों के लिए किया जा सकता है:

  • बेहतर चैट और खोज के अनुभव की मदद से, ग्राहकों के इंटरैक्शन को बेहतर बनाएं
  • बातचीत वाले इंटरफ़ेस और खास जानकारी की मदद से, कई तरह के अनस्ट्रक्चर्ड डेटा को एक्सप्लोर करें
  • यह सेवा बार-बार किए जाने वाले कामों में मदद करती है. जैसे, प्रस्तावों (आरएफ़पी) के अनुरोधों का जवाब देना, मार्केटिंग कॉन्टेंट को पांच भाषाओं में स्थानीय भाषा में उपलब्ध कराना, ग्राहक से कानूनी समझौते की शर्तों के पालन की जांच करना वगैरह

Google Cloud में जनरेटिव एआई की कौनसी सुविधाएं उपलब्ध हैं?

Vertex AI की मदद से, अपने ऐप्लिकेशन में बुनियादी मॉडल के साथ इंटरैक्ट करें, उन्हें पसंद के मुताबिक बनाएं, और एम्बेड करें — इसके लिए, मशीन लर्निंग की विशेषज्ञता की ज़रूरत नहीं होती है. मॉडल गार्डन पर फ़ाउंडेशन के मॉडल ऐक्सेस करें, जनरेटिव एआई Studio पर आसान यूआई से मॉडल ट्यून करें या डेटा साइंस नोटबुक में मॉडल इस्तेमाल करें.

Vertex AI Search and Conversation की मदद से डेवलपर, जनरेटिव एआई की मदद से काम करने वाले सर्च इंजन और चैटबॉट तेज़ी से बना सकते हैं.

Duet AI, एआई की मदद से काम करने वाला आपका सहयोगी है. यह Google Cloud और IDEs में इस्तेमाल किया जा सकता है. इससे आपको ज़्यादा तेज़ी से काम करने में मदद मिलती है.

यह कोडलैब किस पर फ़ोकस कर रहा है?

यह कोडलैब, Google Cloud Vertex AI पर होस्ट किए जाने वाले PaLM 2 लार्ज लैंग्वेज मॉडल (एलएलएम) पर फ़ोकस करता है. इसमें मशीन लर्निंग से जुड़े सभी प्रॉडक्ट और सेवाएं शामिल हैं.

आपको LangChain4J एलएलएम फ़्रेमवर्क ऑर्केस्ट्रेटर के साथ मिलकर, PaLM API के साथ इंटरैक्ट करने के लिए Java का इस्तेमाल करना होगा. एलएलएम का इस्तेमाल करके, आपको सवालों के जवाब देने, आइडिया जनरेट करने, कोई इकाई और स्ट्रक्चर्ड कॉन्टेंट निकालने, और खास जानकारी पाने में मदद करने के लिए, अलग-अलग तरह के सटीक उदाहरणों के बारे में बताया जाएगा.

मुझे LangChain4J फ़्रेमवर्क के बारे में और बताएं!

LangChain4J फ़्रेमवर्क एक ओपन सोर्स लाइब्रेरी है. इसकी मदद से, Java ऐप्लिकेशन में बड़े लैंग्वेज मॉडल इंटिग्रेट किए जाते हैं. इसके लिए, एलएलएम जैसे कई कॉम्पोनेंट को ऑर्केस्ट्रा किया जाता है. साथ ही, वेक्टर डेटाबेस (सिमेंटिक खोजों के लिए), दस्तावेज़ लोडर और स्प्लिटर (दस्तावेज़ों का विश्लेषण करने और उनसे सीखने के लिए), आउटपुट पार्सर वगैरह को व्यवस्थित किया जाता है.

c6d7f7c3fd0d2951.png

आपको इनके बारे में जानकारी मिलेगी

  • PaLM और LangChain4J का इस्तेमाल करने के लिए, Java प्रोजेक्ट कैसे सेट अप करें
  • कॉन्टेंट जनरेट करने और सवालों के जवाब देने के लिए, PaLM के टेक्स्ट मॉडल पर पहली बार कॉल करने का तरीका
  • बिना स्ट्रक्चर वाले कॉन्टेंट (इकाई या कीवर्ड निकालने की सुविधा, JSON में आउटपुट) से काम की जानकारी निकालने का तरीका
  • कुछ शॉट के साथ, कॉन्टेंट की कैटगरी तय करने या भावनाओं का विश्लेषण करने का तरीका

आपको इन चीज़ों की ज़रूरत होगी

  • Java प्रोग्रामिंग भाषा की जानकारी
  • Google Cloud प्रोजेक्ट
  • Chrome या Firefox जैसा कोई ब्राउज़र

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेटअप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.

295004821बाबा6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको अपना प्रोजेक्ट आईडी बताना होगा. आम तौर पर, इसकी पहचान PROJECT_ID के रूप में की जाती है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. दूसरा तरीका यह है कि आप खुद भी आज़माकर देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. साथ ही, यह प्रोजेक्ट के खत्म होने तक बना रहता है.
  • आपकी जानकारी के लिए, प्रोजेक्ट नंबर नाम की एक तीसरी वैल्यू दी गई है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, बिलिंग से बचने के लिए संसाधनों को बंद करें. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

Cloud Shell शुरू करना

Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें d1264ca30785e435.png पर क्लिक करें.

cb81e7c8e34bc8d.png

अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

d95252b003979716.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. इसमें लगातार पांच जीबी की होम डायरेक्ट्री मिलती है और यह Google Cloud में काम करती है. यह नेटवर्क की परफ़ॉर्मेंस और ऑथेंटिकेशन को बेहतर बनाने में मदद करती है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट आपके प्रोजेक्ट आईडी पर सेट है.

  1. यह पुष्टि करने के लिए Cloud Shell में नीचे दिया गया कमांड चलाएं कि आपकी पुष्टि हो गई है:
gcloud auth list

कमांड आउटपुट

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell में यह कमांड चलाएं, ताकि यह पुष्टि की जा सके कि gcloud के लिए कमांड को आपके प्रोजेक्ट के बारे में जानकारी है:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इसे इस निर्देश की मदद से सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. डेवलपमेंट एनवायरमेंट को तैयार किया जा रहा है

इस कोडलैब में, Java प्रोग्राम डेवलप करने के लिए, Cloud Shell टर्मिनल और कोड एडिटर का इस्तेमाल किया जा रहा है.

Vertex AI API को चालू करें

  1. पक्का करें कि Google Cloud Console में, आपके प्रोजेक्ट का नाम Google Cloud Console में सबसे ऊपर दिख रहा हो. अगर ऐसा नहीं है, तो प्रोजेक्ट सिलेक्टर खोलने के लिए, कोई प्रोजेक्ट चुनें पर क्लिक करें और अपनी पसंद का प्रोजेक्ट चुनें.
  2. अगर आप Google Cloud Console के Vertex AI वर्शन में शामिल नहीं हैं, तो ये काम करें:
  3. Search में, Vertex AI डालें और वापस आएं
  4. खोज के नतीजों में, Vertex AI The Vertex AI डैशबोर्ड दिखेगा.
  5. Vertex AI डैशबोर्ड में, सुझाए गए सभी एपीआई चालू करें पर क्लिक करें.

ऐसा करने से कई एपीआई चालू हो जाएंगे, लेकिन कोडलैब के लिए सबसे ज़रूरी aiplatform.googleapis.com है. इसे Cloud Shell टर्मिनल में कमांड-लाइन पर भी चालू किया जा सकता है. इसके लिए, यह कमांड इस्तेमाल किया जा सकता है:

$ gcloud services enable aiplatform.googleapis.com

Gredle की मदद से प्रोजेक्ट स्ट्रक्चर बनाना

अपने Java कोड के उदाहरण बनाने के लिए, आपको Gradle बिल्ड टूल और Java के वर्शन 17 का इस्तेमाल करना होगा. Gradle के साथ अपना प्रोजेक्ट सेट अप करने के लिए, Cloud Shell टर्मिनल में, एक डायरेक्ट्री (यहां, palm-workshop) बनाएं, तो उस डायरेक्ट्री में gradle init कमांड चलाएं:

$ mkdir palm-workshop
$ cd palm-workshop

$ gradle init

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

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

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

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

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

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

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

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

BUILD SUCCESSFUL in 51s
2 actionable tasks: 2 executed

आपको ऐप्लिकेशन (दूसरा विकल्प), सब-प्रोजेक्ट का इस्तेमाल किए बिना (तीसरा विकल्प), सब-प्रोजेक्ट का इस्तेमाल किए बिना (पहला विकल्प), बिल्ड फ़ाइल के लिए ग्रूवी सिंटैक्स (विकल्प 1) का इस्तेमाल करके, नई बिल्ड सुविधाओं का इस्तेमाल न करें (विकल्प नंबर), JUnit Jupiter की मदद से टेस्ट जनरेट करना होगा.साथ ही, चौथे प्रोजेक्ट के नाम के लिए भी palm-workshop का इस्तेमाल करना होगा.

प्रोजेक्ट का स्ट्रक्चर इस तरह दिखेगा:

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

कुछ ज़रूरी डिपेंडेंसी जोड़ने के लिए, app/build.gradle फ़ाइल को अपडेट करते हैं. अगर guava डिपेंडेंसी मौजूद है, तो उसे हटाया जा सकता है. साथ ही, इसे LangChain4J प्रोजेक्ट और लॉगिंग लाइब्रेरी डिपेंडेंसी से बदला जा सकता है, ताकि आपको लॉगर मैसेज न मिलें:

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

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

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

LangChain4J के लिए दो डिपेंडेंसी होती हैं:

  • पहला चरण है,
  • इनमें से एक ख़ास तौर पर Vertex AI मॉड्यूल के लिए किया जाएगा.

हमारे प्रोग्राम को कंपाइल और चलाने के लिए Java 17 का इस्तेमाल करने के लिए, plugins {} ब्लॉक के नीचे यह ब्लॉक जोड़ें:

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

आपको एक और बदलाव करना है: app/build.gradle के application ब्लॉक को अपडेट करें, ताकि उपयोगकर्ता बिल्ड टूल को शुरू करते समय मुख्य क्लास को कमांड-लाइन पर चला सकें:

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 को कॉल करें.

app/src/main/java/palm/workshop डायरेक्ट्री (डिफ़ॉल्ट App.java क्लास के साथ) में, TextPrompts.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());
    }
}

इस पहले उदाहरण में, आपको PaLM के लिए, Response क्लास और Vertex AI लैंग्वेज मॉडल को इंपोर्ट करना होगा.

इसके बाद, main वाले तरीके में, VertexAiLanguageModel के लिए बिल्डर का इस्तेमाल करके लैंग्वेज मॉडल को कॉन्फ़िगर करें. इससे आपको यह जानकारी मिलेगी:

  • एंडपॉइंट,
  • प्रोजेक्ट,
  • क्षेत्र,
  • प्रकाशक,
  • और मॉडल का नाम (text-bison@001).

अब भाषा का मॉडल तैयार है. इसलिए, generate() वाले तरीके को कॉल करके "प्रॉम्प्ट" पास करें (जैसे, आपका सवाल या एलएलएम को भेजने के लिए निर्देश). यहाँ आपको एलएलएम के बारे में आसान सवाल पूछना होगा. हालांकि, इस प्रॉम्प्ट में बदलाव करके अलग-अलग सवाल पूछे जा सकते हैं या टास्क पूरे किए जा सकते हैं.

इस क्लास को चलाने के लिए, Cloud Shell टर्मिनल में नीचे दिया गया कमांड चलाएं:

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

आपको इससे मिलता-जुलता आउटपुट दिखेगा:

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

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

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

Here are some of the key features of LLMs:

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

VertexAILanguageModel बिल्डर की मदद से, ऐसे वैकल्पिक पैरामीटर तय किए जा सकते हैं जिनमें पहले से ही कुछ डिफ़ॉल्ट वैल्यू मौजूद होती हैं. इन्हें बदला जा सकता है. यहां कुछ उदाहरण दिए गए हैं:

  • .temperature(0.2) — इससे यह पता चलता है कि जवाब कितना क्रिएटिव होना चाहिए (0 का मतलब है कम क्रिएटिव होना और ज़्यादातर मामलों में तथ्य भी, जबकि 1 का मतलब ज़्यादा क्रिएटिव आउटपुट के लिए होना चाहिए)
  • .maxOutputTokens(50) — उदाहरण में, 500 टोकन का अनुरोध किया गया था (तीन टोकन करीब 4 शब्दों के बराबर होते हैं). यह इस बात पर निर्भर करता है कि जनरेट किए गए जवाब को कितने समय के लिए सेट करना है
  • .topK(20) — पूरे टेक्स्ट के लिए, तय किए गए ज़्यादा से ज़्यादा शब्दों में से किसी भी क्रम में कोई शब्द चुना जा सकता है. यह संख्या 1 से 40 तक हो सकती है
  • .topP(0.95) — ऐसे संभावित शब्दों को चुनने के लिए जिनकी कुल संभावना को उस फ़्लोटिंग पॉइंट नंबर (0 और 1 के बीच) में जोड़ा जाता है
  • .maxRetries(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: 

ऊपर दिए गए पूरे टेक्स्ट प्रॉम्प्ट को पास करने के लिए, TextPrompts क्लास के model.generate() कॉल में बदलाव करें:

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 स्ट्रिंग देगा, जिसे GSON लाइब्रेरी जैसे JSON पार्सर के साथ पार्स किया जा सकता है:

$ ./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 जैसे बड़े लैंग्वेज मॉडल, सवालों के जवाब देने में कारगर होते हैं. हालांकि, इनका इस्तेमाल कई और कामों के लिए किया जा सकता है! उदाहरण के लिए, जनरेटिव एआई स्टूडियो में (या 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);

मैप के ज़रिए खाली जगहों को भरने के बजाय, फ़ील्ड के साथ Java ऑब्जेक्ट का इस्तेमाल किया जा सकता है. इसे आपके आईडीई से, ज़्यादा सुरक्षित तरीके से अपने-आप पूरा किया जा सकता है.

अगर आपको इन बदलावों को अपनी 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());
    }
}

प्रॉम्प्ट में इनपुट और आउटपुट के कुछ उदाहरण देने के तरीके पर ध्यान दें. ये हैं "कुछ शॉट" इससे एलएलएम को उस स्ट्रक्चर को अपनाने में मदद मिलती है. इसके बाद, जब मॉडल को कोई इनपुट मिलता है, तो वह इनपुट/आउटपुट पैटर्न से मेल खाने वाला आउटपुट देना चाहता है.

प्रोग्राम चलाने से सिर्फ़ POSITIVE शब्द दिखना चाहिए, क्योंकि स्ट्रॉबेरी भी स्वादिष्ट होती हैं!

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

> Task :app:run
POSITIVE

भावनाओं का विश्लेषण करने की सुविधा, कॉन्टेंट की कैटगरी तय करने की भी प्रोसेस है. अलग-अलग दस्तावेज़ों को अलग-अलग कैटगरी के हिसाब से कैटगरी में बांटने के लिए, "कुछ शॉट प्रॉम्प्ट" वाला यही तरीका लागू किया जा सकता है.

8. बधाई हो

बधाई हो, आपने LangChain4J और PaLM API का इस्तेमाल करके, Java में अपना पहला जनरेटिव एआई ऐप्लिकेशन बनाने का काम पूरा कर लिया है! इस दौरान आपको पता चला कि लार्ज लैंग्वेज मॉडल काफ़ी दमदार होते हैं. साथ ही, इनमें कई तरह के काम आसानी से किए जा सकते हैं. जैसे, सवाल/जवाब, डेटा निकालना, खास जानकारी देना, टेक्स्ट की कैटगरी तय करना, भावनाओं का विश्लेषण करना वगैरह.

आगे क्या होगा?

Java में PaLM के साथ आगे बढ़ने के लिए, यहां दिए गए कोड लैब देखें:

आगे पढ़ें

रेफ़रंस के लिए दस्तावेज़