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

1. ভূমিকা

শেষ আপডেট: 2024-02-05

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

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

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

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

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

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

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

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

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

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

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

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

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

এই কোডল্যাব কি উপর ফোকাস করছে?

এই কোডল্যাবটি PaLM 2 Large Language Model (LLM) এর উপর ফোকাস করে, যা Google Cloud Vertex AI-তে হোস্ট করা হয়েছে যা সমস্ত মেশিন লার্নিং পণ্য এবং পরিষেবাগুলিকে অন্তর্ভুক্ত করে।

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

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

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

c6d7f7c3fd0d2951.png

আপনি কি শিখবেন

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

আপনি কি প্রয়োজন হবে

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

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

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

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

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

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

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

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

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

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

cb81e7c8e34bc8d.png

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

d95252b003979716.png

ক্লাউড শেলের সাথে সংযোগ করতে এবং সংযোগ করতে এটির মাত্র কয়েক মুহূর্ত লাগবে৷

7833d5e1c5d18f54.png

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

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

  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].

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

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

Vertex AI APIs সক্ষম করুন

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

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

$ gcloud services enable aiplatform.googleapis.com

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

আপনার জাভা কোড উদাহরণ তৈরি করার জন্য, আপনি Gradle বিল্ড টুল এবং Java এর 17 সংস্করণ ব্যবহার করবেন। ক্লাউড শেল টার্মিনালে, গ্রেডলের সাথে আপনার প্রকল্প সেট আপ করতে, একটি ডিরেক্টরি তৈরি করুন (এখানে, palm-workshop ), সেই ডিরেক্টরিতে gradle init কমান্ডটি চালান:

$ mkdir palm-workshop
$ cd palm-workshop

$ gradle init

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

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

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

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

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

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

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

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

BUILD SUCCESSFUL in 51s
2 actionable tasks: 2 executed

আপনি একটি অ্যাপ্লিকেশন তৈরি করবেন (বিকল্প 2), জাভা ভাষা ব্যবহার করে (বিকল্প 3), সাবপ্রজেক্ট ব্যবহার না করে (বিকল্প 1), বিল্ড ফাইলের জন্য গ্রোভি সিনট্যাক্স ব্যবহার করে (বিকল্প 1), নতুন বিল্ড বৈশিষ্ট্যগুলি ব্যবহার করবেন না (বিকল্প নম্বর ), JUnit জুপিটার দিয়ে পরীক্ষা তৈরি করা (বিকল্প 4), এবং প্রকল্পের নামের জন্য আপনি palm-workshop ব্যবহার করতে পারেন, এবং একইভাবে উত্স প্যাকেজের জন্য আপনি palm.workshop ব্যবহার করতে পারেন।

প্রকল্পের কাঠামো নিম্নরূপ দেখাবে:

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

কিছু প্রয়োজনীয় নির্ভরতা যোগ করতে app/build.gradle ফাইলটি আপডেট করা যাক। আপনি guava নির্ভরতা যদি এটি উপস্থিত থাকে তা সরিয়ে ফেলতে পারেন, এবং এটিকে LangChain4J প্রকল্পের নির্ভরতা দিয়ে প্রতিস্থাপন করতে পারেন, এবং লগিং লাইব্রেরি অনুপস্থিত লগার বার্তাগুলি এড়াতে পারেন:

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

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

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

LangChain4J এর জন্য 2টি নির্ভরতা রয়েছে:

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

আমাদের প্রোগ্রাম কম্পাইল এবং চালানোর জন্য 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 ডিরেক্টরিতে ChatPrompts.java নামে একটি নতুন ক্লাস তৈরি করুন (ডিফল্ট App.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 প্রস্তুত করতে পারেন। এটি একটি উচ্চ স্তরের বিমূর্ততা যা একটি কথোপকথন পরিচালনা করার জন্য বিভিন্ন উপাদানকে একত্রে কনফিগার করার জন্য, যেমন চ্যাট ভাষার মডেল নিজেই, কিন্তু সম্ভাব্য অন্যান্য উপাদানগুলি চ্যাট কথোপকথনের ইতিহাস পরিচালনা করতে, বা তথ্য আনার জন্য পুনরুদ্ধারের মতো অন্যান্য সরঞ্জামগুলি প্লাগ করার জন্য ভেক্টর ডাটাবেস। কিন্তু চিন্তা করবেন না, আমরা এই কোডল্যাবে পরে এটিতে ফিরে আসব।

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

সেই মাল্টিটার্ন কথোপকথনটি নিতে, আপনি কেবল চেইনে 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 আপনার 3টি সম্পর্কিত প্রশ্নের উত্তর দিয়েছে!

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

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

5. একটি ব্যক্তিত্বের সাথে একটি দরকারী চ্যাটবট!

পূর্ববর্তী বিভাগে, আপনি সরাসরি 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);
        }
    }
}

আসুন এটি ধাপে ধাপে ভেঙে দেওয়া যাক:

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

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

$ ./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 এবং দাবা খেলোয়াড়দের পরাজিত করে) এবং কথোপকথনটি রাস্তার নিচের দিকে যেতে পারে, মডেলটি গেমের প্রকৃত অবস্থা মনে রাখে না।

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

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

পূর্ববর্তী বিভাগে, আপনি একজন ব্যবহারকারী এবং একটি চ্যাট ভাষার মডেলের মধ্যে কথোপকথন তৈরি করেছেন। কিন্তু 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() পদ্ধতির বিষয়বস্তু দেখি:

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

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

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

> Task :app:run
Anna
23

হ্যাঁ! এই আন্না, তার বয়স 23!

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

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

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

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

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

6c5bb5cb2e3b8088.png

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

2c279c506d7606cd.png

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

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

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

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

একটি কথোপকথন পুনরুদ্ধার চেইন বাস্তবায়ন

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

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

ডকুমেন্ট ইনজেশন পর্বের প্রথম ধাপ হল পিডিএফ ফাইলটি সনাক্ত করা যা আমরা এটি ডাউনলোড করি এবং এটি পড়ার জন্য একটি 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 ক্লাসের জন্য নথিটি খণ্ডে বিভক্ত করা হয়েছে। এটি পিডিএফ ফাইলের পাঠ্যকে 500 অক্ষরের স্নিপেটে বিভক্ত করতে যাচ্ছে, 100 অক্ষরের ওভারল্যাপ সহ (নিম্নলিখিত অংশের সাথে, বিট এবং টুকরো করে শব্দ বা বাক্য কাটা এড়াতে)।

স্টোর "ইনজেস্টর" ডকুমেন্ট স্প্লিটার, ভেক্টর গণনা করার জন্য এমবেডিং মডেল এবং ইন-মেমরি ভেক্টর ডাটাবেসকে লিঙ্ক করে। তারপর, 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();

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

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

এই মুহুর্তে, আপনি ConversationalRetrievalChain ক্লাসটি চালু করতে পারেন (এটি পুনরুদ্ধার অগমেন্টেড জেনারেশন প্যাটার্নের জন্য একটি ভিন্ন নাম):

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

8. অভিনন্দন

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

এরপর কি?

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

আরও পড়া

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