PaLM ve LangChain4J ile Java'da üretken yapay zekayla metin oluşturma

1. Giriş

Son Güncelleme: 2023-11-27

Üretken yapay zeka nedir?

Üretken yapay zeka, metin, resim, müzik, ses ve video gibi yeni içerikler oluşturmak için yapay zekanın kullanılmasını ifade eder.

Üretken yapay zeka, özetleme, soru-cevap ve sınıflandırma gibi kullanıma hazır görevleri yerine getirebilen ve çok görevli çalışabilen temel modeller (büyük yapay zeka modelleri) tarafından desteklenir. Ayrıca, temel modeller çok az örnek veriyle hedeflenen kullanım alanlarına uyarlanabilir ve minimum eğitim gerektirir.

Üretken yapay zeka nasıl çalışır?

Üretken yapay zeka, insan tarafından oluşturulan içeriklerden oluşan bir veri kümesindeki kalıpları ve ilişkileri öğrenmek için bir makine öğrenimi modeli kullanarak çalışır. Ardından, öğrendiği kalıpları kullanarak yeni içerikler üretir.

Üretken yapay zeka modellerini eğitmenin en yaygın yolu, gözetimli öğrenmeyi kullanmaktır. Bu yöntemde modele, insanlar tarafından oluşturulan bir dizi içerik ve bunlara karşılık gelen etiketler verilir. Ardından, kullanıcılar tarafından oluşturulan içeriklere benzer ve aynı etiketlerle etiketlenmiş içerikler oluşturmayı öğrenir.

Üretken yapay zekanın yaygın kullanım alanları nelerdir?

Üretken yapay zeka, metin, resim ve kullanıcı dostu formatlar aracılığıyla analizler ve yanıtlar oluşturarak büyük miktarda içeriği işler. Üretken yapay zeka şu amaçlarla kullanılabilir:

  • Gelişmiş sohbet ve arama deneyimleriyle müşteri etkileşimlerini iyileştirme
  • Sohbet arayüzleri ve özetler aracılığıyla büyük miktarda yapılandırılmamış veriyi keşfedin
  • Teklif isteklerine (RFP) yanıt verme, pazarlama içeriklerini beş dilde yerelleştirme ve müşteri sözleşmelerinin uygunluğunu kontrol etme gibi tekrarlayan görevlere yardımcı olma

Google Cloud'un sunduğu üretken yapay zeka teklifleri nelerdir?

Vertex AI ile temel modellerle etkileşim kurabilir, bunları özelleştirebilir ve uygulamalarınıza yerleştirebilirsiniz. Makine öğrenimi konusunda uzman olmanız gerekmez. Model Garden'daki temel modellere erişin, Generative AI Studio'daki basit bir kullanıcı arayüzü aracılığıyla modelleri ayarlayın veya modelleri bir veri bilimi not defterinde kullanın.

Vertex AI Arama ve Sohbet, geliştiricilere üretken yapay zeka destekli arama motorları ve chatbot'lar oluşturmanın en hızlı yolunu sunar.

Ayrıca, Duet AI, Google Cloud ve IDE'lerde kullanılabilen yapay zeka destekli ortak çalışma aracınızdır. Bu araç sayesinde daha fazla işi daha kısa sürede yapabilirsiniz.

Bu codelab neye odaklanıyor?

Bu codelab, tüm makine öğrenimi ürün ve hizmetlerini kapsayan Google Cloud Vertex AI'de barındırılan PaLM 2 Büyük Dil Modeli'ne (LLM) odaklanmaktadır.

PaLM API ile etkileşim kurmak için Java'yı ve LangChain4J LLM çerçevesi düzenleyicisini kullanacaksınız. Soru yanıtlama, fikir üretme, varlık ve yapılandırılmış içerik ayıklama ve özetleme için LLM'den yararlanmak üzere farklı somut örnekleri inceleyeceksiniz.

LangChain4J çerçevesi hakkında daha fazla bilgi ver.

LangChain4J çerçevesi, büyük dil modellerini Java uygulamalarınıza entegre etmek için kullanılan açık kaynaklı bir kitaplıktır. Bu kitaplık, LLM'nin kendisi gibi çeşitli bileşenlerin yanı sıra vektör veritabanları (semantik aramalar için), belge yükleyiciler ve ayırıcılar (belgeleri analiz etmek ve bunlardan bilgi edinmek için), çıkış ayrıştırıcılar gibi diğer araçları da düzenler.

c6d7f7c3fd0d2951.png

Neler öğreneceksiniz?

  • PaLM ve LangChain4J'yi kullanmak için Java projesi oluşturma
  • İçerik oluşturmak ve soruları yanıtlamak için PaLM metin modeline ilk çağrınızı yapma
  • Yapılandırılmamış içerikten yararlı bilgileri çıkarma (varlık veya anahtar kelime çıkarma, JSON biçiminde çıktı)
  • Birkaç görev istemiyle içerik sınıflandırması veya duygu analizi yapma

Gerekenler

  • Java programlama dili hakkında bilgi
  • Google Cloud projesi
  • Chrome veya Firefox gibi bir tarayıcı

2. Kurulum ve şartlar

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak bu codelab'de bulutta çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i d1264ca30785e435.png tıklayın.

cb81e7c8e34bc8d.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

d95252b003979716.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

7833d5e1c5d18f54.png

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list

Komut çıkışı

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Geliştirme ortamınızı hazırlama

Bu codelab'de, Java programlarınızı geliştirmek için Cloud Shell terminalini ve kod düzenleyiciyi kullanacaksınız.

Vertex AI API'lerini etkinleştirme

  1. Google Cloud Console'da proje adınızın Google Cloud Console'unuzun üst kısmında gösterildiğinden emin olun. Açılmıyorsa Proje seçin'i tıklayarak Proje Seçici'yi açın ve istediğiniz projeyi seçin.
  2. Google Cloud Console'un Vertex AI bölümünde değilseniz aşağıdakileri yapın:
  3. Arama bölümüne Vertex AI yazıp Enter tuşuna basın.
  4. Arama sonuçlarında Vertex AI'ı tıklayın. Vertex AI kontrol paneli görünür.
  5. Vertex AI kontrol panelinde Enable All Recommended APIs'i (Önerilen Tüm API'leri Etkinleştir) tıklayın.

Bu işlemle birkaç API etkinleştirilir. Ancak bu kod laboratuvarı için en önemlisi aiplatform.googleapis.com API'sidir. Bu API'yi komut satırında, Cloud Shell terminalinde aşağıdaki komutu çalıştırarak da etkinleştirebilirsiniz:

$ gcloud services enable aiplatform.googleapis.com

Gradle ile proje yapısını oluşturma

Java kodu örneklerinizi oluşturmak için Gradle derleme aracını ve Java'nın 17. sürümünü kullanacaksınız. Projenizi Gradle ile ayarlamak için Cloud Shell terminalinde bir dizin oluşturun (burada palm-workshop) ve bu dizinde gradle init komutunu çalıştırın:

$ 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

Alt projeleri kullanmadan (1. seçenek), Java dilini (3. seçenek) kullanarak uygulama (2. seçenek) oluşturacak, derleme dosyası için Groovy söz dizimini (1. seçenek) kullanacak, yeni derleme özelliklerini kullanmayacak (seçenek yok), JUnit Jupiter ile testler oluşturacak (4. seçenek) ve proje adı olarak palm-workshop'u, kaynak paketi olarak da palm.workshop'u kullanacaksınız.

Proje yapısı şu şekilde görünür:

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

Gerekli bazı bağımlılıkları eklemek için app/build.gradle dosyasını güncelleyelim. guava bağımlılığını kaldırabilir ve eksik günlükçü mesajlarının gösterilmesini önlemek için LangChain4J projesinin bağımlılıkları ve günlük kaydı kitaplığıyla değiştirebilirsiniz:

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 için 2 bağımlılık vardır:

  • biri temel proje,
  • ve özel Vertex AI modülü için bir tane olmak üzere iki ayrı modül vardır.

Programlarımızı derlemek ve çalıştırmak için Java 17'yi kullanmak üzere aşağıdaki bloğu plugins {} bloğunun altına ekleyin:

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

Yapılacak bir değişiklik daha var: Kullanıcıların derleme aracını çağırırken komut satırında çalıştırılacak ana sınıfı geçersiz kılabilmesi için application app/build.gradle bloğunu güncelleyin:

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

Derleme dosyanızın uygulamanızı çalıştırmaya hazır olup olmadığını kontrol etmek için basit bir Hello World! mesajı yazdıran varsayılan ana sınıfı çalıştırabilirsiniz:

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

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed

Artık LangChain4J projesini kullanarak PaLM büyük dil metin modeliyle programlamaya başlayabilirsiniz.

Referans olarak, tam app/build.gradle derleme dosyasının artık nasıl görünmesi gerektiği aşağıda verilmiştir:

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'nin metin modeline ilk çağrınızı yapma

Proje düzgün şekilde ayarlandığına göre artık PaLM API'yi çağırma zamanı.

app/src/main/java/palm/workshop dizininde (varsayılan App.java sınıfının yanında) TextPrompts.java adlı yeni bir sınıf oluşturun ve aşağıdaki içeriği yazın:

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

Bu ilk örnekte, Response sınıfını ve PaLM için Vertex AI dil modelini içe aktarmanız gerekir.

Ardından, main yönteminde, VertexAiLanguageModel için oluşturucuyu kullanarak dil modelini yapılandıracak ve şunları belirteceksiniz:

  • uç nokta,
  • gösterir.
  • bölge,
  • yayıncı,
  • ve modelin adı (text-bison@001).

Dil modeli hazır olduğuna göre artık generate() yöntemini çağırabilir ve "istem"inizi (ör. LLM'ye gönderilecek sorunuz veya talimatlarınız) iletebilirsiniz. Burada, LLM'lerin ne olduğuyla ilgili basit bir soru soruyorsunuz. Ancak farklı soruları veya görevleri denemek için bu istemi değiştirebilirsiniz.

Bu sınıfı çalıştırmak için Cloud Shell terminalinde aşağıdaki komutu çalıştırın:

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

Şuna benzer bir çıkış görürsünüz:

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 oluşturucu, geçersiz kılınabilecek bazı varsayılan değerlere sahip isteğe bağlı parametreler tanımlamanıza olanak tanır. Aşağıda bazı örnekler verilmiştir:

  • .temperature(0.2): Yanıtın ne kadar yaratıcı olmasını istediğinizi tanımlamak için kullanılır (0 değeri, yaratıcılığın düşük olduğu ve genellikle daha gerçekçi yanıtlar için, 1 değeri ise daha yaratıcı yanıtlar için kullanılır).
  • .maxOutputTokens(50): Örnekte, oluşturulan yanıtın ne kadar uzun olmasını istediğinize bağlı olarak 500 jeton istenmiştir (3 jeton yaklaşık 4 kelimeye eşittir).
  • .topK(20): Metin tamamlama için olası kelimeler arasından rastgele bir kelime seçmek üzere kullanılır (1-40 arası).
  • .topP(0.95): Toplam olasılığı bu kayan noktalı sayıya (0 ile 1 arasında) ulaşan olası kelimeleri seçmek için kullanılır.
  • .maxRetries(3): Zaman başına istek kotasını aşıyorsanız modelin aramayı örneğin 3 kez yeniden denemesini sağlayabilirsiniz.

Büyük dil modelleri çok güçlüdür, karmaşık sorulara yanıt verebilir ve çok çeşitli ilginç görevleri yerine getirebilir. Bir sonraki bölümde, metinden yapılandırılmış veri ayıklama gibi faydalı bir göreve göz atacağız.

5. Yapılandırılmamış metinlerden bilgi ayıklama

Önceki bölümde bazı metin çıkışları oluşturmuştunuz. Bu çıkışı doğrudan son kullanıcılarınıza göstermek istiyorsanız bu yöntem uygundur. Ancak bu çıktıda belirtilen verileri almak istiyorsanız bu bilgileri yapılandırılmamış metinden nasıl ayıklarsınız?

Bir kişinin biyografisi veya açıklaması verildiğinde bu kişinin adını ve yaşını çıkarmak istediğinizi varsayalım. İstemde aşağıdaki gibi değişiklikler yaparak büyük dil modeline JSON veri yapıları oluşturma talimatı verebilirsiniz (bu işleme genellikle "istem mühendisliği" adı verilir):

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() sınıfındaki TextPrompts çağrısını, yukarıdaki metin isteminin tamamını iletecek şekilde değiştirin:

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

Bu istemi TextPrompts sınıfımızda çalıştırırsanız aşağıdaki JSON dizesini döndürmesi gerekir. Bu dizeyi GSON kitaplığı gibi bir JSON ayrıştırıcıyla ayrıştırabilirsiniz:

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

Evet! Anna 23 yaşında!

6. İstem şablonları ve yapılandırılmış istemler

Soru yanıtlama dışında

PaLM gibi büyük dil modelleri soruları yanıtlamada oldukça başarılıdır ancak bu modelleri daha birçok görev için kullanabilirsiniz. Örneğin, Generative AI Studio'da (veya TextPrompts sınıfını değiştirerek) aşağıdaki istemleri deneyin. Büyük harfli kelimeleri kendi fikirlerinizle değiştirin ve sonuçlarını inceleyin:

  • Çeviri: "Aşağıdaki cümleyi Fransızcaya çevir: YOUR_SENTENCE_HERE"
  • Özetleme: "Aşağıdaki dokümanın özetini sağla: PASTE_YOUR_DOC"
  • Reklam öğesi oluşturma: "TOPIC_OF_THE_POEM hakkında bir şiir yaz"
  • Programlama: "PROGRAMMING_LANGUAGE dilinde Fibonacci işlevi nasıl yazılır?"

İstem şablonları

Çeviri, özetleme, yaratıcı içerik oluşturma veya programlama görevleri için yukarıdaki istemleri denediyseniz yer tutucu değerleri kendi fikirlerinizle değiştirdiniz. Ancak bazı dize işlemleri yapmak yerine, yer tutucu değerleri tanımlamanıza ve ardından boşluğu verilerinizle doldurmanıza olanak tanıyan "istem şablonlarından" da yararlanabilirsiniz.

main() yönteminin tüm içeriğini aşağıdaki kodla değiştirerek lezzetli ve yaratıcı bir isteme göz atalım:

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

Ayrıca aşağıdaki içe aktarma işlemlerini ekleyerek:

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

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

Ardından uygulamayı tekrar çalıştırın. Çıkış aşağıdaki gibi görünmelidir:

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

Lezzetli!

İstem şablonlarıyla, metin oluşturma yöntemini çağığırmadan önce gerekli parametreleri girebilirsiniz. Bu, kullanıcılarınız tarafından sağlanan farklı değerler için verileri aktarmanın ve istemleri özelleştirmenin harika bir yoludur.

Sınıfın adından da anlaşılacağı gibi, PromptTemplate sınıfı bir şablon istemi oluşturur. Yer tutucu adları ve değerlerinin eşlemesini uygulayarak yer tutucu öğelere değerler atayabilirsiniz.

Yapılandırılmış istemler (İSTEĞE BAĞLI)

Daha zengin bir nesne yönelimli yaklaşım kullanmak istiyorsanız istemlerinizi @StructuredPrompt ek açıklamasıyla da yapılandırabilirsiniz. Bir sınıfı bu ek açıklamayla not eklediğinizde alanları, istemde tanımlanan yer tutuculara karşılık gelir. Bunu uygulamalı olarak görelim.

Öncelikle bazı yeni içe aktarmalar yapmamız gerekiyor:

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

Ardından, TextPrompts sınıfımızda, @StructuredPrompt açıklamasında belirtilen istemdeki yer tutuculara iletmek için gereken verileri toplayan bir iç statik sınıf oluşturabiliriz:

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

Ardından, bu yeni sınıfı örnekleyin ve tarifimizin yemeğini ve malzemelerini bu sınıfa aktarın. İstem oluşturup generate() yöntemine iletin:

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

Boşlukları bir harita aracılığıyla doldurmak yerine, IDE'niz tarafından otomatik olarak tamamlanabilen alanlara sahip bir Java nesnesi kullanabilirsiniz. Bu, daha tür güvenli bir yöntemdir.

Bu değişiklikleri TextPrompts sınıfınıza daha kolay yapıştırmak isterseniz kodun tamamını aşağıda bulabilirsiniz:

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. Metin sınıflandırma ve duygu analizi

Önceki bölümde öğrendiğiniz gibi, PaLM modelinin metinleri sınıflandırmasını veya duyguları analiz etmesini sağlamak için başka bir "istem mühendisliği" tekniği keşfedeceksiniz. "Az örnekli istem" konusunu ele alalım. Bu özellik, dil modelini istediğiniz yöne yönlendirmenize yardımcı olacak birkaç örnekle istemlerinizi geliştirerek amacınızı daha iyi anlamanızı sağlar.

İstem şablonlarından yararlanmak için TextPrompts sınıfımızı yeniden düzenleyelim:

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

İstemde birkaç giriş ve çıkış örneği sunma yaklaşımına dikkat edin. Bunlar, LLM'nin aynı yapıyı izlemesine yardımcı olan "birkaç görev"dir. Model daha sonra bir giriş aldığında, giriş/çıkış kalıbıyla eşleşen bir çıkış döndürmek ister.

Programı çalıştırmak, çilekler de lezzetli olduğu için yalnızca POSITIVE kelimesini döndürmelidir.

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

> Task :app:run
POSITIVE

Duygu analizi de bir içerik sınıflandırma senaryosudur. Farklı dokümanları farklı kategori gruplarına ayırmak için aynı "az görevli istem" yaklaşımını uygulayabilirsiniz.

8. Tebrikler

Tebrikler, LangChain4J ve PaLM API'yi kullanarak Java'da ilk üretken yapay zeka uygulamanızı başarıyla oluşturdunuz. Bu süreçte, büyük dil modellerinin oldukça güçlü olduğunu ve soru/cevap, veri ayıklama, özetleme, metin sınıflandırma, duygu analizi gibi çeşitli görevleri yerine getirebildiğini öğrendiniz.

Yapabilecekleriniz

Java'da PaLM ile daha fazlasını yapmak için aşağıdaki codelab'lere göz atın:

Daha fazla bilgi

Referans belgeleri