PaLM এবং LangChain4J এর সাথে জাভাতে ব্যবহারকারীদের এবং ডক্সের সাথে জেনারেটিভ AI চালিত চ্যাট

1. ভূমিকা

শেষ আপডেট: ২০২৪-০২-০৫

জেনারেটিভ এআই কী?

জেনারেটিভ এআই বা জেনারেটিভ কৃত্রিম বুদ্ধিমত্তা বলতে টেক্সট, ছবি, সঙ্গীত, অডিও এবং ভিডিওর মতো নতুন কন্টেন্ট তৈরিতে এআই ব্যবহারকে বোঝায়।

জেনারেটিভ এআই ফাউন্ডেশন মডেল (বৃহৎ এআই মডেল) দ্বারা চালিত যা বহুমুখী কাজ করতে পারে এবং সারসংক্ষেপ, প্রশ্নোত্তর, শ্রেণিবিন্যাস এবং আরও অনেক কিছু সহ বিভিন্ন ধরণের কাজ সম্পাদন করতে পারে। এছাড়াও, ন্যূনতম প্রশিক্ষণের প্রয়োজনে, খুব কম উদাহরণ ডেটা ব্যবহার করে লক্ষ্যবস্তু ব্যবহারের ক্ষেত্রে ফাউন্ডেশন মডেলগুলিকে অভিযোজিত করা যেতে পারে।

জেনারেটিভ এআই কীভাবে কাজ করে?

জেনারেটিভ এআই একটি এমএল (মেশিন লার্নিং) মডেল ব্যবহার করে মানুষের তৈরি কন্টেন্টের ডেটাসেটে প্যাটার্ন এবং সম্পর্ক শেখার মাধ্যমে কাজ করে। এরপর এটি নতুন কন্টেন্ট তৈরি করতে শেখা প্যাটার্ন ব্যবহার করে।

একটি জেনারেটিভ এআই মডেলকে প্রশিক্ষণ দেওয়ার সবচেয়ে সাধারণ উপায় হল তত্ত্বাবধানে থাকা শিক্ষা ব্যবহার করা - মডেলটিকে মানুষের তৈরি কন্টেন্ট এবং সংশ্লিষ্ট লেবেলের একটি সেট দেওয়া হয়। এরপর এটি এমন কন্টেন্ট তৈরি করতে শেখে যা মানুষের তৈরি কন্টেন্টের মতো এবং একই লেবেলযুক্ত।

সাধারণ জেনারেটিভ এআই অ্যাপ্লিকেশনগুলি কী কী?

জেনারেটিভ এআই বিশাল কন্টেন্ট প্রক্রিয়াজাত করে, টেক্সট, ছবি এবং ব্যবহারকারী-বান্ধব ফর্ম্যাটের মাধ্যমে অন্তর্দৃষ্টি এবং উত্তর তৈরি করে। জেনারেটিভ এআই ব্যবহার করা যেতে পারে:

  • উন্নত চ্যাট এবং অনুসন্ধান অভিজ্ঞতার মাধ্যমে গ্রাহকদের সাথে মিথস্ক্রিয়া উন্নত করুন
  • কথোপকথনমূলক ইন্টারফেস এবং সারসংক্ষেপের মাধ্যমে বিপুল পরিমাণে অসংগঠিত ডেটা অন্বেষণ করুন
  • প্রস্তাবের অনুরোধের (RFP) উত্তর দেওয়া, পাঁচটি ভাষায় বিপণন বিষয়বস্তু স্থানীয়করণ করা এবং গ্রাহক চুক্তির সম্মতি পরীক্ষা করা এবং আরও অনেক কিছুর মতো পুনরাবৃত্তিমূলক কাজে সহায়তা করা।

গুগল ক্লাউডে কোন জেনারেটিভ এআই অফার রয়েছে?

Vertex AI এর সাহায্যে, আপনার অ্যাপ্লিকেশনগুলিতে ফাউন্ডেশন মডেলগুলির সাথে ইন্টারঅ্যাক্ট করুন, কাস্টমাইজ করুন এবং এম্বেড করুন — খুব কম বা কোনও ML দক্ষতার প্রয়োজন নেই। মডেল গার্ডেনে ফাউন্ডেশন মডেলগুলি অ্যাক্সেস করুন, জেনারেটিভ AI স্টুডিওতে একটি সাধারণ UI এর মাধ্যমে মডেলগুলি টিউন করুন, অথবা একটি ডেটা সায়েন্স নোটবুকে মডেলগুলি ব্যবহার করুন।

ভার্টেক্স এআই সার্চ অ্যান্ড কনভারসেশন ডেভেলপারদের জেনারেটিভ এআই চালিত সার্চ ইঞ্জিন এবং চ্যাটবট তৈরির দ্রুততম উপায় প্রদান করে।

এবং, ডুয়েট এআই হল আপনার এআই-চালিত সহযোগী যা গুগল ক্লাউড এবং আইডিই জুড়ে উপলব্ধ যা আপনাকে আরও দ্রুত এবং আরও বেশি কাজ করতে সহায়তা করে।

এই কোডল্যাবটি কীসের উপর দৃষ্টি নিবদ্ধ করছে?

এই কোডল্যাবটি PaLM 2 লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) এর উপর দৃষ্টি নিবদ্ধ করে, যা গুগল ক্লাউড ভার্টেক্স এআই-তে হোস্ট করা হয়েছে যা সমস্ত মেশিন লার্নিং পণ্য এবং পরিষেবাগুলিকে অন্তর্ভুক্ত করে।

আপনি LangChain4J LLM ফ্রেমওয়ার্ক অর্কেস্ট্রেটরের সাথে PaLM API এর সাথে ইন্টারঅ্যাক্ট করার জন্য জাভা ব্যবহার করবেন। প্রশ্নের উত্তর, ধারণা তৈরি, সত্তা এবং কাঠামোগত বিষয়বস্তু নিষ্কাশন এবং সারসংক্ষেপের জন্য LLM এর সুবিধা নিতে আপনাকে বিভিন্ন সুনির্দিষ্ট উদাহরণের মধ্য দিয়ে যেতে হবে।

LangChain4J ফ্রেমওয়ার্ক সম্পর্কে আমাকে আরও বলুন!

LangChain4J ফ্রেমওয়ার্ক হল একটি ওপেন সোর্স লাইব্রেরি যা আপনার জাভা অ্যাপ্লিকেশনগুলিতে বৃহৎ ভাষার মডেলগুলিকে একীভূত করে, বিভিন্ন উপাদান যেমন LLM নিজেই, এবং অন্যান্য সরঞ্জাম যেমন ভেক্টর ডাটাবেস (শব্দার্থিক অনুসন্ধানের জন্য), ডকুমেন্ট লোডার এবং স্প্লিটার (ডকুমেন্ট বিশ্লেষণ করতে এবং সেগুলি থেকে শিখতে), আউটপুট পার্সার এবং আরও অনেক কিছুকে অর্কেস্ট্রেট করে।

c6d7f7c3fd0d2951.png সম্পর্কে

তুমি কি শিখবে

  • PaLM এবং LangChain4J ব্যবহার করার জন্য জাভা প্রজেক্ট কিভাবে সেটআপ করবেন
  • অসংগঠিত কন্টেন্ট থেকে কীভাবে দরকারী তথ্য বের করা যায় (সত্তা বা কীওয়ার্ড নিষ্কাশন, JSON-এ আউটপুট)
  • আপনার ব্যবহারকারীদের সাথে কীভাবে একটি কথোপকথন তৈরি করবেন
  • আপনার নিজস্ব ডকুমেন্টেশনে প্রশ্ন জিজ্ঞাসা করার জন্য চ্যাট মডেলটি কীভাবে ব্যবহার করবেন

তোমার যা লাগবে

  • জাভা প্রোগ্রামিং ভাষার জ্ঞান
  • একটি গুগল ক্লাউড প্রকল্প
  • একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স

2. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিসম্পন্ন পরিবেশ সেটআপ

  1. গুগল ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন অথবা বিদ্যমান একটি পুনরায় ব্যবহার করুন। যদি আপনার ইতিমধ্যেই একটি জিমেইল বা গুগল ওয়ার্কস্পেস অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

295004821bab6a87.png সম্পর্কে

37d264871000675d.png সম্পর্কে

96d86d3d5655cdbe.png সম্পর্কে

  • এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রজেক্টের নামটি প্রদর্শন করা হবে। এটি একটি অক্ষর স্ট্রিং যা Google API গুলি ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • সমস্ত Google ক্লাউড প্রোজেক্টে প্রোজেক্ট আইডি অনন্য এবং অপরিবর্তনীয় (সেট করার পরে এটি পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটি কী তা নিয়ে চিন্তা করেন না। বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রোজেক্ট আইডি (সাধারণত PROJECT_ID হিসাবে চিহ্নিত) উল্লেখ করতে হবে। যদি আপনি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য একটি র্যান্ডম তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করে দেখতে পারেন, এবং এটি উপলব্ধ কিনা তা দেখতে পারেন। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকবে।
  • আপনার তথ্যের জন্য, তৃতীয় একটি মান আছে, একটি Project Number , যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
  1. এরপর, ক্লাউড রিসোর্স/API ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবটি চালানোর জন্য খুব বেশি খরচ হবে না, এমনকি কিছু খরচও হবে না। এই টিউটোরিয়ালের বাইরে বিলিং এড়াতে রিসোর্স বন্ধ করতে, আপনি আপনার তৈরি রিসোর্সগুলি মুছে ফেলতে পারেন অথবা প্রকল্পটি মুছে ফেলতে পারেন। নতুন গুগল ক্লাউড ব্যবহারকারীরা $300 USD ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

ক্লাউড শেল শুরু করুন

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন d1264ca30785e435.png সম্পর্কে .

cb81e7c8e34bc8d.png সম্পর্কে

যদি আপনি প্রথমবারের মতো ক্লাউড শেল শুরু করেন, তাহলে আপনাকে একটি মধ্যবর্তী স্ক্রিন দেখানো হবে যা এটি কী তা বর্ণনা করবে। যদি আপনার কাছে একটি মধ্যবর্তী স্ক্রিন থাকে, তাহলে Continue এ ক্লিক করুন।

d95252b003979716.png সম্পর্কে

ক্লাউড শেলের সাথে সংযোগ স্থাপন এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে।

7833d5e1c5d18f54.png সম্পর্কে

এই ভার্চুয়াল মেশিনটিতে প্রয়োজনীয় সকল ডেভেলপমেন্ট টুল রয়েছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি অফার করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার বেশিরভাগ কাজ, যদি সব না হয়, একটি ব্রাউজার দিয়ে করা যেতে পারে।

একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি প্রমাণিত এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে।

  1. আপনি প্রমাণিত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list

কমান্ড আউটপুট

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি তা না হয়, তাহলে আপনি এই কমান্ড দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

৩. আপনার উন্নয়ন পরিবেশ প্রস্তুত করা

এই কোডল্যাবে, আপনি আপনার জাভা প্রোগ্রামগুলি তৈরি করতে ক্লাউড শেল টার্মিনাল এবং কোড এডিটর ব্যবহার করবেন।

Vertex AI API গুলি সক্ষম করুন

  1. গুগল ক্লাউড কনসোলে, নিশ্চিত করুন যে আপনার প্রোজেক্টের নামটি আপনার গুগল ক্লাউড কনসোলের উপরে প্রদর্শিত হচ্ছে। যদি তা না থাকে, তাহলে প্রোজেক্ট সিলেক্টর খুলতে একটি প্রোজেক্ট নির্বাচন করুন এ ক্লিক করুন এবং আপনার উদ্দেশ্যপ্রণোদিত প্রোজেক্টটি নির্বাচন করুন।
  2. আপনি যদি গুগল ক্লাউড কনসোলের ভার্টেক্স এআই অংশে না থাকেন, তাহলে নিম্নলিখিতগুলি করুন:
  3. অনুসন্ধানে , Vertex AI লিখুন, তারপর ফিরে আসুন
  4. অনুসন্ধানের ফলাফলে, Vertex AI এ ক্লিক করুন। Vertex AI ড্যাশবোর্ড প্রদর্শিত হবে।
  5. Vertex AI ড্যাশবোর্ডে সমস্ত প্রস্তাবিত API সক্ষম করুন -এ ক্লিক করুন।

এটি বেশ কয়েকটি API সক্রিয় করবে, তবে কোডল্যাবের জন্য সবচেয়ে গুরুত্বপূর্ণটি হল aiplatform.googleapis.com , যা আপনি ক্লাউড শেল টার্মিনালে কমান্ড-লাইনেও নিম্নলিখিত কমান্ডটি চালিয়ে সক্ষম করতে পারেন:

$ gcloud services enable aiplatform.googleapis.com

গ্র্যাডেল দিয়ে প্রকল্প কাঠামো তৈরি করা

জাভা কোডের উদাহরণ তৈরি করতে, আপনাকে গ্র্যাডল বিল্ড টুল এবং জাভার ১৭ সংস্করণ ব্যবহার করতে হবে। গ্র্যাডল দিয়ে আপনার প্রকল্প সেট আপ করতে, ক্লাউড শেল টার্মিনালে, একটি ডিরেক্টরি তৈরি করুন (এখানে, 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

আপনি একটি অ্যাপ্লিকেশন তৈরি করবেন (বিকল্প ২), জাভা ভাষা ব্যবহার করে (বিকল্প ৩), সাবপ্রজেক্ট ব্যবহার না করে (বিকল্প ১), বিল্ড ফাইলের জন্য গ্রুভি সিনট্যাক্স ব্যবহার করবেন (বিকল্প ১), নতুন বিল্ড বৈশিষ্ট্য ব্যবহার করবেন না (বিকল্প নং), 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 প্রকল্পের জন্য নির্ভরতা এবং লগিং লাইব্রেরি দিয়ে প্রতিস্থাপন করতে পারেন যাতে মিসিং লগার বার্তাগুলি বিরক্ত না হয়:

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 এর জন্য 2টি নির্ভরতা রয়েছে:

  • মূল প্রকল্পের একটি,
  • এবং একটি ডেডিকেটেড ভার্টেক্স এআই মডিউলের জন্য।

আমাদের প্রোগ্রামগুলি কম্পাইল এবং চালানোর জন্য জাভা ১৭ ব্যবহার করার জন্য, plugins {} ব্লকের নীচে নিম্নলিখিত ব্লকটি যুক্ত করুন:

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

আরও একটি পরিবর্তন করতে হবে: app/build.gradle এর application ব্লক আপডেট করুন, যাতে ব্যবহারকারীরা বিল্ড টুলটি ব্যবহার করার সময় কমান্ড-লাইনে চালানোর জন্য প্রধান ক্লাসকে ওভাররাইড করতে সক্ষম হন:

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

আপনার বিল্ড ফাইলটি অ্যাপ্লিকেশন চালানোর জন্য প্রস্তুত কিনা তা পরীক্ষা করার জন্য, আপনি ডিফল্ট main ক্লাসটি চালাতে পারেন যা একটি সাধারণ 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 এর চ্যাট মডেলে আপনার প্রথম কল করা

এখন যেহেতু প্রকল্পটি সঠিকভাবে সেট আপ করা হয়েছে, এখন PaLM API কল করার সময়।

app/src/main/java/palm/workshop ডিরেক্টরিতে (ডিফল্ট App.java ক্লাসের পাশাপাশি) ChatPrompts.java নামে একটি নতুন ক্লাস তৈরি করুন এবং নিম্নলিখিত বিষয়বস্তু টাইপ করুন:

package palm.workshop;

import dev.langchain4j.model.vertexai.VertexAiChatModel;
import dev.langchain4j.chain.ConversationalChain;

public class ChatPrompts {
    public static void main(String[] args) {
        VertexAiChatModel model = VertexAiChatModel.builder()
            .endpoint("us-central1-aiplatform.googleapis.com:443")
            .project("YOUR_PROJECT_ID")
            .location("us-central1")
            .publisher("google")
            .modelName("chat-bison@001")
            .maxOutputTokens(400)
            .maxRetries(3)
            .build();

        ConversationalChain chain = ConversationalChain.builder()
            .chatLanguageModel(model)
            .build();

        String message = "What are large language models?";
        String answer = chain.execute(message);
        System.out.println(answer);

        System.out.println("---------------------------");

        message = "What can you do with them?";
        answer = chain.execute(message);
        System.out.println(answer);

        System.out.println("---------------------------");

        message = "Can you name some of them?";
        answer = chain.execute(message);
        System.out.println(answer);
    }
}

এই প্রথম উদাহরণে, কথোপকথনের মাল্টিটার্ন দিকটি পরিচালনা করা সহজ করার জন্য আপনাকে VertexAiChatModel ক্লাস এবং LangChain4J ConversationalChain আমদানি করতে হবে।

এরপর, main পদ্ধতিতে, আপনি VertexAiChatModel এর বিল্ডার ব্যবহার করে চ্যাট ভাষা মডেলটি কনফিগার করতে যাচ্ছেন, যাতে উল্লেখ করা যায়:

  • শেষ বিন্দু,
  • প্রকল্পটি,
  • অঞ্চল,
  • প্রকাশক,
  • এবং মডেলের নাম ( chat-bison@001 )।

এখন যেহেতু ভাষা মডেলটি প্রস্তুত, আপনি একটি ConversationalChain প্রস্তুত করতে পারেন। এটি LangChain4J দ্বারা অফার করা একটি উচ্চ স্তরের বিমূর্ততা যা কথোপকথন পরিচালনা করার জন্য বিভিন্ন উপাদানগুলিকে একত্রিত করে, যেমন চ্যাট ভাষা মডেল নিজেই, তবে সম্ভাব্যভাবে অন্যান্য উপাদানগুলি চ্যাট কথোপকথনের ইতিহাস পরিচালনা করার জন্য, অথবা ভেক্টর ডাটাবেস থেকে তথ্য সংগ্রহের জন্য retrievers এর মতো অন্যান্য সরঞ্জামগুলিকে প্লাগ করার জন্য। তবে চিন্তা করবেন না, আমরা এই কোডল্যাবে পরে সেই বিষয়ে ফিরে আসব।

তারপর, আপনি চ্যাট মডেলের সাথে একাধিক কথোপকথন শুরু করবেন, বেশ কয়েকটি আন্তঃসম্পর্কিত প্রশ্ন জিজ্ঞাসা করবেন। প্রথমে আপনি LLM সম্পর্কে ভাববেন, তারপর আপনি জিজ্ঞাসা করবেন যে আপনি তাদের সাথে কী করতে পারেন এবং তাদের কিছু উদাহরণ কী। লক্ষ্য করুন যে কীভাবে আপনাকে নিজেকে পুনরাবৃত্তি করতে হবে না, LLM জানে যে "তারা" বলতে LLM বোঝায়, সেই কথোপকথনের প্রেক্ষাপটে।

সেই মাল্টিটার্ন কথোপকথনটি নিতে, আপনাকে কেবল চেইনে execute() পদ্ধতিটি কল করতে হবে, এটি এটিকে কথোপকথনের প্রসঙ্গে যুক্ত করবে, চ্যাট মডেলটি একটি উত্তর তৈরি করবে এবং এটি চ্যাট ইতিহাসেও যুক্ত করবে।

এই ক্লাসটি চালানোর জন্য, ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:

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

আপনি এর মতো একটি আউটপুট দেখতে পাবেন:

$ ./gradlew run -DjavaMainClass=palm.workshop.ChatPrompts
Starting a Gradle Daemon, 2 incompatible and 2 stopped Daemons could not be reused, use --status for details

> Task :app:run
Large language models (LLMs) are artificial neural networks that are trained on massive datasets of text and code. They are designed to understand and generate human language, and they can be used for a variety of tasks, such as machine translation, question answering, and text summarization.
---------------------------
LLMs can be used for a variety of tasks, such as:

* Machine translation: LLMs can be used to translate text from one language to another.
* Question answering: LLMs can be used to answer questions posed in natural language.
* Text summarization: LLMs can be used to summarize text into a shorter, more concise form.
* Code generation: LLMs can be used to generate code, such as Python or Java code.
* Creative writing: LLMs can be used to generate creative text, such as poems, stories, and scripts.

LLMs are still under development, but they have the potential to revolutionize a wide range of industries. For example, LLMs could be used to improve customer service, create more personalized marketing campaigns, and develop new products and services.
---------------------------
Some of the most well-known LLMs include:

* GPT-3: Developed by OpenAI, GPT-3 is a large language model that can generate text, translate languages, write different kinds of creative content, and answer your questions in an informative way.
* LaMDA: Developed by Google, LaMDA is a large language model that can chat with you in an open-ended way, answering your questions, telling stories, and providing different kinds of creative content.
* PaLM 2: Developed by Google, PaLM 2 is a large language model that can perform a wide range of tasks, including machine translation, question answering, and text summarization.
* T5: Developed by Google, T5 is a large language model that can be used for a variety of tasks, including text summarization, question answering, and code generation.

These are just a few examples of the many LLMs that are currently being developed. As LLMs continue to improve, they are likely to play an increasingly important role in our lives.

BUILD SUCCESSFUL in 25s
2 actionable tasks: 2 executed

PaLM আপনার ৩টি সম্পর্কিত প্রশ্নের উত্তর দিয়েছে!

VertexAIChatModel বিল্ডার আপনাকে ঐচ্ছিক প্যারামিটারগুলি সংজ্ঞায়িত করতে দেয় যার ইতিমধ্যেই কিছু ডিফল্ট মান রয়েছে যা আপনি ওভাররাইড করতে পারেন। এখানে কিছু উদাহরণ দেওয়া হল:

  • .temperature(0.2) — আপনি কতটা সৃজনশীল প্রতিক্রিয়া চান তা নির্ধারণ করতে (0 হল কম সৃজনশীল এবং প্রায়শই বেশি তথ্যবহুল, যেখানে 1 হল আরও সৃজনশীল আউটপুটের জন্য)
  • .maxOutputTokens(50) — উদাহরণে, 400 টি টোকেন অনুরোধ করা হয়েছিল (3 টি টোকেন মোটামুটি 4 শব্দের সমতুল্য), আপনি উৎপন্ন উত্তরটি কত দীর্ঘ রাখতে চান তার উপর নির্ভর করে
  • .topK(20) — টেক্সট সম্পূর্ণ করার জন্য সর্বাধিক সম্ভাব্য শব্দের মধ্যে থেকে এলোমেলোভাবে একটি শব্দ নির্বাচন করা (১ থেকে ৪০ পর্যন্ত)
  • .topP(0.95) — সম্ভাব্য শব্দ নির্বাচন করতে যার মোট সম্ভাব্যতা সেই ভাসমান বিন্দু সংখ্যার সাথে যোগ করে (0 এবং 1 এর মধ্যে)
  • .maxRetries(3) — যদি আপনি প্রতি সময় কোটার অনুরোধ অতিক্রম করে থাকেন, তাহলে আপনি মডেলটিকে 3 বার কলটি পুনরায় চেষ্টা করতে বলতে পারেন।

৫. ব্যক্তিত্বসম্পন্ন একটি কার্যকর চ্যাটবট!

আগের অংশে, আপনি কোনও নির্দিষ্ট প্রসঙ্গ না দিয়েই LLM চ্যাটবটকে প্রশ্ন জিজ্ঞাসা করা শুরু করেছিলেন। কিন্তু আপনি কোনও নির্দিষ্ট কাজে বা কোনও নির্দিষ্ট বিষয়ে বিশেষজ্ঞ হওয়ার জন্য এই ধরণের চ্যাটবটকে বিশেষজ্ঞ করতে পারেন।

তুমি এটা কিভাবে করবে? মঞ্চ তৈরি করে: LLM-কে তার কাজ, প্রেক্ষাপট ব্যাখ্যা করে, হয়তো এর কী করা উচিত, এর ব্যক্তিত্ব কী হওয়া উচিত, আপনি কোন ফর্ম্যাটে প্রতিক্রিয়া পেতে চান এবং সম্ভাব্যভাবে একটি সুর, যদি তুমি চাও যে চ্যাটবটটি একটি নির্দিষ্ট উপায়ে আচরণ করুক।

প্রম্পট তৈরির উপর এই নিবন্ধটি এই গ্রাফিকের সাহায্যে এই পদ্ধতিটি সুন্দরভাবে চিত্রিত করে:

8a4c67679dcbd085.png সম্পর্কে

https://medium.com/@eldatero/master-the-perfect-chatgpt-prompt-formula-c776adae8f19

এই বিষয়টি স্পষ্ট করার জন্য, আসুন prompts.chat ওয়েবসাইটগুলি থেকে কিছু অনুপ্রেরণা নেওয়া যাক, যেখানে কাস্টম তৈরি চ্যাটবটগুলির জন্য প্রচুর দুর্দান্ত এবং মজাদার ধারণা তালিকাভুক্ত করা হয়েছে যাতে সেগুলি নিম্নলিখিত হিসাবে কাজ করতে পারে:

একজন LLM চ্যাটবটকে দাবা খেলোয়াড়ে পরিণত করার একটি উদাহরণ আছে! আসুন এটি বাস্তবায়ন করি!

ChatPrompts ক্লাসটি নিম্নরূপ আপডেট করুন:

package palm.workshop;

import dev.langchain4j.chain.ConversationalChain;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.vertexai.VertexAiChatModel;
import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;

public class ChatPrompts {
    public static void main(String[] args) {
        VertexAiChatModel model = VertexAiChatModel.builder()
            .endpoint("us-central1-aiplatform.googleapis.com:443")
            .project("YOUR_PROJECT_ID")
            .location("us-central1")
            .publisher("google")
            .modelName("chat-bison@001")
            .maxOutputTokens(7)
            .maxRetries(3)
            .build();

        InMemoryChatMemoryStore chatMemoryStore = new InMemoryChatMemoryStore();

        MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder()
            .chatMemoryStore(chatMemoryStore)
            .maxMessages(200)
            .build();

        chatMemory.add(SystemMessage.from("""
            You're an expert chess player with a high ELO ranking.
            Use the PGN chess notation to reply with the best next possible move.
            """
        ));


        ConversationalChain chain = ConversationalChain.builder()
            .chatLanguageModel(model)
            .chatMemory(chatMemory)
            .build();

        String pgn = "";
        String[] whiteMoves = { "Nf3", "c4", "Nc3", "e3", "Dc2", "Cd5"};
        for (int i = 0; i < whiteMoves.length; i++) {
            pgn += " " + (i+1) + ". " + whiteMoves[i];
            System.out.println("Playing " + whiteMoves[i]);
            pgn = chain.execute(pgn);
            System.out.println(pgn);
        }
    }
}

ধাপে ধাপে এটি ভেঙে ফেলা যাক:

  • চ্যাটের মেমোরি পরিচালনা করার জন্য কিছু নতুন আমদানির প্রয়োজন।
  • আপনি চ্যাট মডেলটি ইন্সট্যান্টিয়েট করুন, কিন্তু সর্বাধিক কিছু টোকেন দিয়ে (এখানে ৭টি), কারণ আমরা কেবল পরবর্তী পদক্ষেপ তৈরি করতে চাই, দাবা সম্পর্কে একটি সম্পূর্ণ গবেষণাপত্র নয়!
  • এরপর, আপনি চ্যাট কথোপকথন সংরক্ষণ করার জন্য একটি চ্যাট মেমরি স্টোর তৈরি করবেন।
  • শেষ পদক্ষেপগুলি ধরে রাখার জন্য, আপনি একটি প্রকৃত উইন্ডোযুক্ত চ্যাট মেমরি তৈরি করেন।
  • চ্যাট মেমোরিতে, আপনি একটি "সিস্টেম" বার্তা যোগ করেন, যা চ্যাট মডেলকে নির্দেশ দেয় যে এটি কে হওয়া উচিত (অর্থাৎ একজন বিশেষজ্ঞ দাবা খেলোয়াড়)। "সিস্টেম" বার্তাটি কিছু প্রসঙ্গ যোগ করে, যেখানে "ব্যবহারকারী" এবং "এআই" বার্তাগুলি হল আসল আলোচনা।
  • তুমি একটা কথোপকথনের শৃঙ্খলা তৈরি করো যা স্মৃতি এবং চ্যাট মডেলকে একত্রিত করে।
  • তারপর, আমাদের কাছে সাদার জন্য মুভের একটি তালিকা আছে, যেগুলো আপনি পুনরাবৃত্তি করছেন। প্রতিবার পরবর্তী সাদা মুভের মাধ্যমে চেইনটি কার্যকর করা হয়, এবং চ্যাট মডেলটি পরবর্তী সেরা মুভের সাথে উত্তর দেয়।

যখন আপনি এই মুভগুলি দিয়ে এই ক্লাসটি চালাবেন, তখন আপনি নিম্নলিখিত আউটপুটটি দেখতে পাবেন:

$ ./gradlew run -DjavaMainClass=palm.workshop.ChatPrompts
Starting a Gradle Daemon (subsequent builds will be faster)

> Task :app:run
Playing Nf3
1... e5
Playing c4
2... Nc6
Playing Nc3
3... Nf6
Playing e3
4... Bb4
Playing Dc2
5... O-O
Playing Cd5
6... exd5 

ওহ! PaLM দাবা খেলতে জানে? ঠিক তা নয়, তবে প্রশিক্ষণের সময়, মডেলটি অবশ্যই কিছু দাবা খেলার ধারাভাষ্য, এমনকি অতীতের গেমগুলির PGN (পোর্টেবল গেম নোটেশন) ফাইল দেখেছে। যদিও এই চ্যাটবটটি সম্ভবত AlphaZero (যে AI সেরা Go, Shogi এবং দাবা খেলোয়াড়দের পরাজিত করে) এর বিরুদ্ধে জিতবে না এবং কথোপকথন আরও খারাপ হতে পারে, মডেলটি খেলার আসল অবস্থাটি আসলে মনে রাখতে পারবে না।

চ্যাট মডেলগুলি খুবই শক্তিশালী, এবং আপনার ব্যবহারকারীদের সাথে সমৃদ্ধ মিথস্ক্রিয়া তৈরি করতে পারে এবং বিভিন্ন প্রাসঙ্গিক কাজ পরিচালনা করতে পারে। পরবর্তী বিভাগে, আমরা একটি কার্যকর কাজ দেখব: টেক্সট থেকে স্ট্রাকচার্ড ডেটা বের করা

৬. অসংগঠিত পাঠ্য থেকে তথ্য আহরণ করা

আগের অংশে, আপনি একজন ব্যবহারকারী এবং একটি চ্যাট ভাষা মডেলের মধ্যে কথোপকথন তৈরি করেছেন। কিন্তু LangChain4J এর সাহায্যে, আপনি অসংগঠিত পাঠ্য থেকে কাঠামোগত তথ্য বের করার জন্য একটি চ্যাট মডেলও ব্যবহার করতে পারেন।

ধরুন আপনি একজন ব্যক্তির নাম এবং বয়স বের করতে চান, সেই ব্যক্তির জীবনী বা বর্ণনার ভিত্তিতে। আপনি বৃহৎ ভাষা মডেলকে একটি চতুরতার সাথে পরিবর্তন করা প্রম্পট (এটিকে সাধারণত "প্রম্পট ইঞ্জিনিয়ারিং" বলা হয়) দিয়ে JSON ডেটা স্ট্রাকচার তৈরি করার নির্দেশ দিতে পারেন।

আপনি ChatPrompts ক্লাসটি নিম্নরূপ আপডেট করবেন:

package palm.workshop;

import dev.langchain4j.model.vertexai.VertexAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.UserMessage;

public class ChatPrompts {

    static class Person {
        String name;
        int age;
    }

    interface PersonExtractor {
        @UserMessage("""
            Extract the name and age of the person described below.
            Return a JSON document with a "name" and an "age" property, \
            following this structure: {"name": "John Doe", "age": 34}
            Return only JSON, without any markdown markup surrounding it.
            Here is the document describing the person:
            ---
            {{it}}
            ---
            JSON: 
            """)
        Person extractPerson(String text);
    }

    public static void main(String[] args) {
        VertexAiChatModel model = VertexAiChatModel.builder()
            .endpoint("us-central1-aiplatform.googleapis.com:443")
            .project("YOUR_PROJECT_ID")
            .location("us-central1")
            .publisher("google")
            .modelName("chat-bison@001")
            .maxOutputTokens(300)
            .build();
        
        PersonExtractor extractor = AiServices.create(PersonExtractor.class, model);

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

        System.out.println(person.name);
        System.out.println(person.age);
    }
}

আসুন এই ফাইলের বিভিন্ন ধাপগুলি একবার দেখে নেওয়া যাক:

  • একজন ব্যক্তির (তার নাম এবং বয়স) বর্ণনাকারী বিবরণ উপস্থাপন করার জন্য একটি Person ক্লাস সংজ্ঞায়িত করা হয়।
  • PersonExtractor ইন্টারফেসটি এমন একটি পদ্ধতি ব্যবহার করে তৈরি করা হয়েছে যা একটি অসংগঠিত টেক্সট স্ট্রিং প্রদান করলে, একটি ইনস্ট্যান্টিয়েটেড Person ইনস্ট্যান্স প্রদান করে।
  • extractPerson() একটি @UserMessage অ্যানোটেশনের সাথে টীকাযুক্ত যা একটি প্রম্পটকে এর সাথে যুক্ত করে। এই প্রম্পটটি মডেলটি তথ্য বের করার জন্য ব্যবহার করবে এবং JSON ডকুমেন্টের আকারে বিশদগুলি ফেরত দেবে, যা আপনার জন্য পার্স করা হবে এবং একটি Person ইনস্ট্যান্সে আনমার্শল করা হবে।

এবার main() পদ্ধতির বিষয়বস্তু দেখি:

  • চ্যাট মডেলটি ইনস্ট্যান্টিয়েট করা হয়েছে।
  • LangChain4J এর AiServices ক্লাসের মাধ্যমে একটি PersonExtractor অবজেক্ট তৈরি করা সম্ভব।
  • তারপর, আপনি কেবল Person person = extractor.extractPerson(...) কল করে আনস্ট্রাকচার্ড টেক্সট থেকে ব্যক্তির বিবরণ বের করতে পারেন এবং নাম এবং বয়স সহ একটি Person ইনস্ট্যান্স ফিরে পেতে পারেন।

এখন, নিম্নলিখিত কমান্ড দিয়ে এই ক্লাসটি চালান:

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

> Task :app:run
Anna
23

হ্যাঁ! এই আন্না, ওর বয়স ২৩!

এই AiServices পদ্ধতির বিশেষ আকর্ষণ হলো আপনি জোরালোভাবে টাইপ করা অবজেক্ট দিয়ে কাজ করেন। আপনি সরাসরি LLM চ্যাটের সাথে ইন্টারঅ্যাক্ট করছেন না। পরিবর্তে, আপনি নির্দিষ্ট ক্লাসের সাথে কাজ করছেন, যেমন Person ক্লাস যা এক্সট্র্যাক্ট করা ব্যক্তিগত তথ্য উপস্থাপন করে, এবং আপনার একটি PersonExtractor ক্লাস আছে যার একটি extractPerson() পদ্ধতি রয়েছে যা একটি Person ইনস্ট্যান্স ফেরত দেয়। LLM ধারণাটি বিমূর্তভাবে তুলে ধরা হয়েছে, এবং একজন জাভা ডেভেলপার হিসেবে, আপনি কেবল সাধারণ ক্লাস এবং অবজেক্টগুলিকে ম্যানিপুলেট করছেন।

৭. অগমেন্টেড জেনারেশন পুনরুদ্ধার: আপনার ডক্সের সাথে চ্যাট করা

আবার আলোচনায় ফিরে আসা যাক। এবার, আপনি আপনার ডকুমেন্ট সম্পর্কে প্রশ্ন জিজ্ঞাসা করতে পারবেন। আপনি একটি চ্যাটবট তৈরি করবেন যা আপনার ডকুমেন্টের নির্যাস থেকে প্রাসঙ্গিক তথ্য উদ্ধার করতে সক্ষম হবে এবং সেই তথ্য মডেলটি তার প্রশিক্ষণ থেকে আসা প্রতিক্রিয়া তৈরি করার চেষ্টা করার পরিবর্তে তার উত্তরগুলিকে "গ্রাউন্ড" করার জন্য ব্যবহার করবে। এই প্যাটার্নটিকে RAG বা পুনরুদ্ধার অগমেন্টেড জেনারেশন বলা হয়।

সংক্ষেপে, পুনরুদ্ধার অগমেন্টেড জেনারেশনে দুটি পর্যায় রয়েছে:

  1. ইনজেশন ফেজ — ডকুমেন্টগুলি লোড করা হয়, ছোট ছোট অংশে বিভক্ত করা হয় এবং তাদের একটি ভেক্টোরিয়াল উপস্থাপনা (একটি "ভেক্টর এম্বেডিং" ) একটি "ভেক্টর ডাটাবেসে" সংরক্ষণ করা হয় যা শব্দার্থিক অনুসন্ধান করতে সক্ষম।

6c5bb5cb2e3b8088.png সম্পর্কে

  1. কোয়েরি ফেজ — ব্যবহারকারীরা এখন আপনার চ্যাটবটকে ডকুমেন্টেশন সম্পর্কে প্রশ্ন জিজ্ঞাসা করতে পারবেন। প্রশ্নটি একটি ভেক্টরে রূপান্তরিত হবে এবং ডাটাবেসের অন্যান্য সমস্ত ভেক্টরের সাথে তুলনা করা হবে। সবচেয়ে সাদৃশ্যপূর্ণ ভেক্টরগুলি সাধারণত শব্দার্থগতভাবে সম্পর্কিত হয় এবং ভেক্টর ডাটাবেস দ্বারা ফেরত পাঠানো হয়। তারপর, LLM-কে কথোপকথনের প্রেক্ষাপট, ডাটাবেস দ্বারা ফেরত পাঠানো ভেক্টরের সাথে সঙ্গতিপূর্ণ টেক্সটের স্নিপেট দেওয়া হয় এবং সেই স্নিপেটগুলি দেখে উত্তরটি গ্রাউন্ড করতে বলা হয়।

2c279c506d7606cd.png সম্পর্কে

আপনার নথি প্রস্তুত করা হচ্ছে

এই নতুন ডেমোতে, আপনি গুগল দ্বারা প্রবর্তিত "ট্রান্সফরমার" নিউরাল নেটওয়ার্ক আর্কিটেকচার সম্পর্কে প্রশ্ন জিজ্ঞাসা করবেন, যা আজকাল সমস্ত আধুনিক বৃহৎ ভাষার মডেলগুলি কীভাবে বাস্তবায়িত হয়।

আপনি ইন্টারনেট থেকে পিডিএফ ডাউনলোড করার জন্য wget কমান্ড ব্যবহার করে এই স্থাপত্যের বর্ণনা দেওয়া গবেষণাপত্রটি ("আপনার যা দরকার তা হল মনোযোগ") পুনরুদ্ধার করতে পারেন:

wget -O attention-is-all-you-need.pdf \
    https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf

একটি কথোপকথনমূলক পুনরুদ্ধার শৃঙ্খল বাস্তবায়ন করা

আসুন, টুকরো টুকরো করে অন্বেষণ করি, কীভাবে 2-পর্যায়ের পদ্ধতি তৈরি করা যায়, প্রথমে ডকুমেন্ট ইনজেশনের মাধ্যমে, এবং তারপর ব্যবহারকারীরা যখন ডকুমেন্ট সম্পর্কে প্রশ্ন জিজ্ঞাসা করেন তখন কোয়েরির সময়।

ডকুমেন্ট ইনজেশন

ডকুমেন্ট ইনজেশন পর্বের প্রথম ধাপ হল আমরা যে PDF ফাইলটি ডাউনলোড করি তা খুঁজে বের করা এবং এটি পড়ার জন্য একটি PdfParser প্রস্তুত করা:

PdfDocumentParser pdfParser = new PdfDocumentParser();
Document document = pdfParser.parse(
    new FileInputStream(new File("/home/YOUR_USER_NAME/palm-workshop/attention-is-all-you-need.pdf")));

সাধারণ চ্যাট ল্যাঙ্গুয়েজ মডেল তৈরি করার পরিবর্তে, তার আগে, আপনি একটি "এম্বেডিং" মডেলের একটি উদাহরণ তৈরি করবেন। এটি একটি নির্দিষ্ট মডেল এবং শেষ বিন্দু যার ভূমিকা হল টেক্সট টুকরো (শব্দ, বাক্য বা এমনকি অনুচ্ছেদ) এর ভেক্টর উপস্থাপনা তৈরি করা।

VertexAiEmbeddingModel embeddingModel = VertexAiEmbeddingModel.builder()
    .endpoint("us-central1-aiplatform.googleapis.com:443")
    .project("YOUR_PROJECT_ID")
    .location("us-central1")
    .publisher("google")
    .modelName("textembedding-gecko@001")
    .maxRetries(3)
    .build();

এরপর, আপনার একসাথে সহযোগিতা করার জন্য কয়েকটি ক্লাসের প্রয়োজন হবে:

  • পিডিএফ ডকুমেন্টটি লোড করুন এবং খণ্ডে ভাগ করুন।
  • এই সমস্ত অংশের জন্য ভেক্টর এম্বেডিং তৈরি করুন।
InMemoryEmbeddingStore<TextSegment> embeddingStore = 
    new InMemoryEmbeddingStore<>();

EmbeddingStoreIngestor storeIngestor = EmbeddingStoreIngestor.builder()
    .documentSplitter(DocumentSplitters.recursive(500, 100))
    .embeddingModel(embeddingModel)
    .embeddingStore(embeddingStore)
    .build();
storeIngestor.ingest(document);

EmbeddingStoreRetriever retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);

ভেক্টর এম্বেডিং সংরক্ষণের জন্য InMemoryEmbeddingStore , একটি ইন-মেমরি ভেক্টর ডাটাবেসের একটি উদাহরণ তৈরি করা হয়েছে।

DocumentSplitters ক্লাসের মাধ্যমে ডকুমেন্টটি খণ্ডে বিভক্ত করা হয়েছে। এটি পিডিএফ ফাইলের টেক্সটকে ৫০০ অক্ষরের স্নিপেটে বিভক্ত করবে, যার মধ্যে ১০০ অক্ষরের ওভারল্যাপ থাকবে (নিম্নলিখিত অংশটি ব্যবহার করে, যাতে শব্দ বা বাক্য বিচ্ছিন্নভাবে কাটা না যায়)।

"ইনজেস্টর" স্টোরটি ডকুমেন্ট স্প্লিটার, ভেক্টর গণনা করার জন্য এম্বেডিং মডেল এবং ইন-মেমরি ভেক্টর ডাটাবেসের সাথে লিঙ্ক করে। তারপর, ingest() পদ্ধতি ইনজেকশন করার দায়িত্ব নেবে।

এখন, প্রথম পর্যায় শেষ হয়েছে, ডকুমেন্টটি তাদের সংশ্লিষ্ট ভেক্টর এম্বেডিং সহ টেক্সট খণ্ডে রূপান্তরিত হয়েছে এবং ভেক্টর ডাটাবেসে সংরক্ষণ করা হয়েছে।

প্রশ্ন জিজ্ঞাসা করা

প্রশ্ন জিজ্ঞাসা করার জন্য প্রস্তুত হওয়ার সময় এসেছে! কথোপকথন শুরু করার জন্য স্বাভাবিক চ্যাট মডেল তৈরি করা যেতে পারে:

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

আপনার একটি "retriever" ক্লাসেরও প্রয়োজন হবে যা ভেক্টর ডাটাবেস ( embeddingStore ভেরিয়েবলে) এবং এম্বেডিং মডেলের সাথে লিঙ্ক করবে। এর কাজ হল ব্যবহারকারীর কোয়েরির জন্য একটি ভেক্টর এম্বেডিং গণনা করে ভেক্টর ডাটাবেসকে কোয়েরি করা, যাতে ডাটাবেসে অনুরূপ ভেক্টর খুঁজে পাওয়া যায়:

EmbeddingStoreRetriever retriever = 
    EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);

এই মুহুর্তে, আপনি ConversationalRetrievalChain ক্লাসটি চালু করতে পারেন (এটি Retrieval Augmented Generation প্যাটার্নের জন্য কেবল একটি ভিন্ন নাম):

ConversationalRetrievalChain rag = ConversationalRetrievalChain.builder()
    .chatLanguageModel(model)
    .retriever(retriever)
    .promptTemplate(PromptTemplate.from("""
        Answer to the following query the best as you can: {{question}}
        Base your answer on the information provided below:
        {{information}}
        """
    ))
    .build();

এই "শৃঙ্খল" একসাথে আবদ্ধ:

  • আপনার আগে কনফিগার করা চ্যাট ভাষার মডেল।
  • রিট্রিভার একটি ভেক্টর এম্বেডিং কোয়েরি ডাটাবেসের ভেক্টরগুলির সাথে তুলনা করে।
  • একটি প্রম্পট টেমপ্লেট স্পষ্টভাবে বলে যে চ্যাট মডেলটি প্রদত্ত তথ্যের উপর ভিত্তি করে তার প্রতিক্রিয়া তৈরি করবে (অর্থাৎ ডকুমেন্টেশনের প্রাসঙ্গিক অংশ যার ভেক্টর এম্বেডিং ব্যবহারকারীর প্রশ্নের ভেক্টরের অনুরূপ)।

আর এখন তুমি অবশেষে তোমার প্রশ্ন জিজ্ঞাসা করার জন্য প্রস্তুত!

String result = rag.execute("What neural network architecture can be used for language models?");
System.out.println(result);
System.out.println("------------");

result = rag.execute("What are the different components of a transformer neural network?");
System.out.println(result);
System.out.println("------------");

result = rag.execute("What is attention in large language models?");
System.out.println(result);
System.out.println("------------");

result = rag.execute("What is the name of the process that transforms text into vectors?");
System.out.println(result);

প্রোগ্রামটি চালান:

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

আউটপুটে, আপনার প্রশ্নের উত্তর দেখতে হবে:

The Transformer is a neural network architecture that can be used for 
language models. It is based solely on attention mechanisms, dispensing 
with recurrence and convolutions. The Transformer has been shown to 
outperform recurrent neural networks and convolutional neural networks on 
a variety of language modeling tasks.
------------
The Transformer is a neural network architecture that can be used for 
language models. It is based solely on attention mechanisms, dispensing 
with recurrence and convolutions. The Transformer has been shown to 
outperform recurrent neural networks and convolutional neural networks on a 
variety of language modeling tasks. The Transformer consists of an encoder 
and a decoder. The encoder is responsible for encoding the input sequence 
into a fixed-length vector representation. The decoder is responsible for 
decoding the output sequence from the input sequence. The decoder uses the 
attention mechanism to attend to different parts of the input sequence when 
generating the output sequence.
------------
Attention is a mechanism that allows a neural network to focus on specific 
parts of an input sequence. In the context of large language models, 
attention is used to allow the model to focus on specific words or phrases 
in a sentence when generating output. This allows the model to generate 
more relevant and informative output.
------------
The process of transforming text into vectors is called word embedding. 
Word embedding is a technique that represents words as vectors in a 
high-dimensional space. The vectors are typically learned from a large 
corpus of text, and they capture the semantic and syntactic relationships 
between words. Word embedding has been shown to be effective for a variety 
of natural language processing tasks, such as machine translation, question 
answering, and sentiment analysis.

সম্পূর্ণ সমাধান

কপি এবং পেস্ট করার সুবিধার্থে, ChatPrompts ক্লাসের সম্পূর্ণ বিষয়বস্তু এখানে দেওয়া হল:

package palm.workshop;

import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.parser.PdfDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.segment.TextSegment; 
import dev.langchain4j.model.input.PromptTemplate;
import dev.langchain4j.model.vertexai.VertexAiChatModel;
import dev.langchain4j.model.vertexai.VertexAiEmbeddingModel;
import dev.langchain4j.retriever.EmbeddingStoreRetriever;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ChatPrompts {
    public static void main(String[] args) throws IOException {
        PdfDocumentParser pdfParser = new PdfDocumentParser();
        Document document = pdfParser.parse(new FileInputStream(new File("/ABSOLUTE_PATH/attention-is-all-you-need.pdf")));

        VertexAiEmbeddingModel embeddingModel = VertexAiEmbeddingModel.builder()
            .endpoint("us-central1-aiplatform.googleapis.com:443")
            .project("YOUR_PROJECT_ID")
            .location("us-central1")
            .publisher("google")
            .modelName("textembedding-gecko@001")
            .maxRetries(3)
            .build();

        InMemoryEmbeddingStore<TextSegment> embeddingStore = 
            new InMemoryEmbeddingStore<>();

        EmbeddingStoreIngestor storeIngestor = EmbeddingStoreIngestor.builder()
            .documentSplitter(DocumentSplitters.recursive(500, 100))
            .embeddingModel(embeddingModel)
            .embeddingStore(embeddingStore)
            .build();
        storeIngestor.ingest(document);

        EmbeddingStoreRetriever retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);

        VertexAiChatModel model = VertexAiChatModel.builder()
            .endpoint("us-central1-aiplatform.googleapis.com:443")
            .project("genai-java-demos")
            .location("us-central1")
            .publisher("google")
            .modelName("chat-bison@001")
            .maxOutputTokens(1000)
            .build();

        ConversationalRetrievalChain rag = ConversationalRetrievalChain.builder()
            .chatLanguageModel(model)
            .retriever(retriever)
            .promptTemplate(PromptTemplate.from("""
                Answer to the following query the best as you can: {{question}}
                Base your answer on the information provided below:
                {{information}}
                """
            ))
            .build();

        String result = rag.execute("What neural network architecture can be used for language models?");
        System.out.println(result);
        System.out.println("------------");

        result = rag.execute("What are the different components of a transformer neural network?");
        System.out.println(result);
        System.out.println("------------");

        result = rag.execute("What is attention in large language models?");
        System.out.println(result);
        System.out.println("------------");

        result = rag.execute("What is the name of the process that transforms text into vectors?");
        System.out.println(result);
    }
}

৮. অভিনন্দন

অভিনন্দন, আপনি LangChain4J এবং PaLM API ব্যবহার করে জাভাতে আপনার প্রথম জেনারেটিভ এআই চ্যাট অ্যাপ্লিকেশনটি সফলভাবে তৈরি করেছেন! আপনি পথ চলতে চলতে আবিষ্কার করেছেন যে বৃহৎ ভাষার চ্যাট মডেলগুলি বেশ শক্তিশালী এবং প্রশ্ন/উত্তরের মতো বিভিন্ন কাজ পরিচালনা করতে সক্ষম, এমনকি আপনার নিজস্ব ডকুমেন্টেশন, ডেটা এক্সট্রাকশন, এবং কিছুটা হলেও, এটি কিছু দাবা খেলতেও সক্ষম ছিল!

এরপর কী?

জাভাতে PaLM ব্যবহার করে আরও এগিয়ে যাওয়ার জন্য নিম্নলিখিত কিছু কোডল্যাব দেখুন:

আরও পড়া

রেফারেন্স ডক্স