1. مقدمه
آخرین به روز رسانی: 2024-02-05
هوش مصنوعی Generative چیست
هوش مصنوعی مولد یا هوش مصنوعی مولد به استفاده از هوش مصنوعی برای ایجاد محتوای جدید مانند متن، تصاویر، موسیقی، صدا و ویدئو اشاره دارد.
هوش مصنوعی مولد از مدلهای پایه (مدلهای هوش مصنوعی بزرگ) پشتیبانی میکند که میتوانند چند کار را انجام دهند و کارهای خارج از چارچوب، از جمله خلاصهسازی، پرسش و پاسخ، طبقهبندی و موارد دیگر را انجام دهند. به علاوه، با حداقل آموزش مورد نیاز، مدل های پایه را می توان برای موارد استفاده هدفمند با داده های نمونه بسیار کمی تطبیق داد.
هوش مصنوعی Generative چگونه کار می کند؟
هوش مصنوعی مولد با استفاده از مدل ML (Machine Learning) برای یادگیری الگوها و روابط موجود در مجموعه داده ای از محتوای ساخته شده توسط انسان کار می کند. سپس از الگوهای آموخته شده برای تولید محتوای جدید استفاده می کند.
رایج ترین راه برای آموزش یک مدل هوش مصنوعی مولد استفاده از یادگیری تحت نظارت است – به مدل مجموعه ای از محتوای ایجاد شده توسط انسان و برچسب های مربوطه داده می شود. سپس یاد می گیرد که محتوایی تولید کند که شبیه به محتوای ساخته شده توسط انسان است و با همان برچسب ها برچسب گذاری شده است.
برنامه های رایج هوش مصنوعی Generative چیست؟
هوش مصنوعی مولد محتوای وسیعی را پردازش میکند، بینش و پاسخهایی را از طریق متن، تصاویر و قالبهای کاربرپسند ایجاد میکند. از هوش مصنوعی مولد می توان برای موارد زیر استفاده کرد:
- تعاملات مشتری را از طریق چت و تجربه جستجوی پیشرفته بهبود بخشید
- حجم وسیعی از داده های بدون ساختار را از طریق رابط های مکالمه و خلاصه سازی کاوش کنید
- کمک به کارهای تکراری مانند پاسخ به درخواستهای پیشنهادی (RFP)، بومیسازی محتوای بازاریابی به پنج زبان، و بررسی قراردادهای مشتری برای انطباق، و موارد دیگر.
Google Cloud چه پیشنهادات هوش مصنوعی مولد دارد؟
با Vertex AI ، مدلهای پایه را در برنامههای خود در تعامل، سفارشیسازی و جاسازی کنید — به تخصص ML نیازی نیست. به مدلهای پایه در Model Garden دسترسی داشته باشید، مدلها را از طریق یک رابط کاربری ساده در Generative AI Studio تنظیم کنید، یا از مدلها در یک دفترچه یادداشت علم داده استفاده کنید.
Vertex AI Search and Conversation به توسعه دهندگان سریع ترین راه را برای ساخت موتورهای جستجو و چت بات های مبتنی بر هوش مصنوعی ارائه می دهد.
و، Duet AI همکار مبتنی بر هوش مصنوعی شما است که در Google Cloud و IDE ها در دسترس است تا به شما کمک کند کارهای بیشتری را سریعتر انجام دهید.
این نرم افزار کد روی چه چیزی تمرکز دارد؟
این آزمایشگاه کد بر روی مدل زبان بزرگ PalM 2 (LLM) متمرکز است که در Google Cloud Vertex AI میزبانی میشود و همه محصولات و خدمات یادگیری ماشین را در بر میگیرد.
شما از جاوا برای تعامل با PaLM API، در ارتباط با ارکستراتور چارچوب LangChain4J LLM استفاده خواهید کرد. برای استفاده از LLM برای پاسخگویی به سؤال، تولید ایده، استخراج محتوای ساختاریافته و خلاصه، نمونههای عینی مختلفی را مرور خواهید کرد.
در مورد چارچوب LangChain4J بیشتر به من بگویید!
چارچوب LangChain4J یک کتابخانه منبع باز برای ادغام مدل های زبان بزرگ در برنامه های جاوا شما، با هماهنگ کردن اجزای مختلف، مانند خود LLM، و همچنین ابزارهای دیگر مانند پایگاه های داده برداری (برای جستجوهای معنایی)، بارکننده اسناد و تقسیم کننده ها (برای تجزیه و تحلیل اسناد) است. و از آنها یاد بگیرید)، تجزیه کننده های خروجی، و موارد دیگر.
چیزی که یاد خواهید گرفت
- نحوه راه اندازی یک پروژه جاوا برای استفاده از PaLM و LangChain4J
- نحوه استخراج اطلاعات مفید از محتوای بدون ساختار (استخراج موجودیت یا کلمه کلیدی، خروجی در JSON)
- چگونه با کاربران خود مکالمه ایجاد کنیم
- چگونه از مدل چت برای پرسیدن سوالات در مورد اسناد خود استفاده کنید
آنچه شما نیاز دارید
- آشنایی با زبان برنامه نویسی جاوا
- یک پروژه Google Cloud
- مرورگری مانند کروم یا فایرفاکس
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورتحساب فراتر از این آموزش، میتوانید منابعی را که ایجاد کردهاید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
Cloud Shell را فعال کنید
- از Cloud Console، روی Activate Cloud Shell کلیک کنید .
اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه میکند و در Google Cloud اجرا میشود، که عملکرد و احراز هویت شبکه را بسیار افزایش میدهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.
پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.
- برای تایید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list
خروجی فرمان
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project
خروجی فرمان
[core] project = <PROJECT_ID>
اگر اینطور نیست، می توانید آن را با این دستور تنظیم کنید:
gcloud config set project <PROJECT_ID>
خروجی فرمان
Updated property [core/project].
3. محیط توسعه خود را آماده کنید
در این لبه کد، شما از ترمینال Cloud Shell و ویرایشگر کد برای توسعه برنامه های جاوا خود استفاده می کنید.
API های Vertex AI را فعال کنید
- در کنسول Google Cloud، مطمئن شوید که نام پروژه شما در بالای کنسول Google Cloud شما نمایش داده شده است. اگر اینطور نیست، روی Select a project کلیک کنید تا Project Selector باز شود و پروژه مورد نظر خود را انتخاب کنید.
- اگر در بخش Vertex AI کنسول Google Cloud نیستید، موارد زیر را انجام دهید:
- در جستجو ، Vertex AI را وارد کنید، سپس برگردید
- در نتایج جستجو، روی Vertex AI کلیک کنید داشبورد Vertex AI ظاهر می شود.
- روی Enable All Recommended APIs در داشبورد Vertex AI کلیک کنید.
این چندین API را فعال میکند، اما مهمترین آنها برای Codelab aiplatform.googleapis.com
است که میتوانید آن را در خط فرمان، در ترمینال Cloud Shell، با اجرای دستور زیر فعال کنید:
$ gcloud services enable aiplatform.googleapis.com
ایجاد ساختار پروژه با Gradle
برای ساختن نمونه کدهای جاوا، از ابزار ساخت Gradle و نسخه 17 جاوا استفاده خواهید کرد. برای تنظیم پروژه خود با Gradle، در ترمینال Cloud Shell، یک دایرکتوری ایجاد کنید (اینجا، palm-workshop
)، دستور gradle init
را در آن دایرکتوری اجرا کنید:
$ mkdir palm-workshop $ cd palm-workshop $ gradle init Select type of project to generate: 1: basic 2: application 3: library 4: Gradle plugin Enter selection (default: basic) [1..4] 2 Select implementation language: 1: C++ 2: Groovy 3: Java 4: Kotlin 5: Scala 6: Swift Enter selection (default: Java) [1..6] 3 Split functionality across multiple subprojects?: 1: no - only one application project 2: yes - application and library projects Enter selection (default: no - only one application project) [1..2] 1 Select build script DSL: 1: Groovy 2: Kotlin Enter selection (default: Groovy) [1..2] 1 Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] Select test framework: 1: JUnit 4 2: TestNG 3: Spock 4: JUnit Jupiter Enter selection (default: JUnit Jupiter) [1..4] 4 Project name (default: palm-workshop): Source package (default: palm.workshop): > Task :init Get more help with your project: https://docs.gradle.org/7.4/samples/sample_building_java_applications.html BUILD SUCCESSFUL in 51s 2 actionable tasks: 2 executed
شما یک برنامه کاربردی (گزینه 2)، با استفاده از زبان جاوا (گزینه 3)، بدون استفاده از پروژه های فرعی (گزینه 1)، با استفاده از دستور Groovy برای فایل ساخت (گزینه 1)، از ویژگی های ساخت جدید استفاده نکنید (گزینه شماره) می سازید. ) با JUnit Jupiter (گزینه 4) تست ها را ایجاد کنید و برای نام پروژه می توانید از palm-workshop و به طور مشابه برای بسته منبع می توانید از palm.workshop استفاده کنید.
ساختار پروژه به صورت زیر خواهد بود:
├── gradle │ └── ... ├── gradlew ├── gradlew.bat ├── settings.gradle └── app ├── build.gradle └── src ├── main │ └── java │ └── palm │ └── workshop │ └── App.java └── test └── ...
بیایید فایل app/build.gradle
را به روز کنیم تا برخی وابستگی های مورد نیاز را اضافه کنیم. میتوانید وابستگی guava
را در صورت وجود حذف کنید و آن را با وابستگیهای پروژه LangChain4J و کتابخانه گزارشگیری جایگزین کنید تا از آزار دادن پیامهای از دست رفته لاگر جلوگیری کنید:
dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
// Logging library
implementation 'org.slf4j:slf4j-jdk14:2.0.9'
// This dependency is used by the application.
implementation 'dev.langchain4j:langchain4j-vertex-ai:0.24.0'
implementation 'dev.langchain4j:langchain4j:0.24.0'
}
2 وابستگی برای LangChain4J وجود دارد:
- یکی در پروژه اصلی،
- و یکی برای ماژول اختصاصی هوش مصنوعی Vertex.
به منظور استفاده از جاوا 17 برای کامپایل و اجرای برنامه های خود، بلوک زیر را در زیر بلوک plugins {}
اضافه کنید:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
یک تغییر دیگر برای ایجاد: بهروزرسانی بلوک application
app/build.gradle
، تا کاربران بتوانند کلاس اصلی را برای اجرا در خط فرمان هنگام فراخوانی ابزار ساخت، لغو کنند:
application {
mainClass = providers.systemProperty('javaMainClass')
.orElse('palm.workshop.App')
}
برای بررسی اینکه آیا فایل ساخت شما برای اجرای برنامه شما آماده است، می توانید کلاس اصلی پیش فرض را اجرا کنید که یک Hello World!
پیام:
$ ./gradlew run -DjavaMainClass=palm.workshop.App > Task :app:run Hello World! BUILD SUCCESSFUL in 3s 2 actionable tasks: 2 executed
اکنون با استفاده از پروژه LangChain4J آماده برنامه نویسی با مدل متنی زبان بزرگ PaLM هستید!
برای مرجع، در اینجا فایل ساخت کامل app/build.gradle
باید به شکلی باشد:
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
java {
toolchain {
// Ensure we compile and run on Java 17
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
// This dependency is used by the application.
implementation 'dev.langchain4j:langchain4j-vertex-ai:0.24.0'
implementation 'dev.langchain4j:langchain4j:0.24.0'
implementation 'org.slf4j:slf4j-jdk14:2.0.9'
}
application {
mainClass = providers.systemProperty('javaMainClass').orElse('palm.workshop.App')
}
tasks.named('test') {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
4. اولین تماس خود را با مدل چت PalM انجام دهید
اکنون که پروژه به درستی راه اندازی شده است، نوبت به فراخوانی PaLM API رسیده است.
یک کلاس جدید به نام ChatPrompts.java
در دایرکتوری app/src/main/java/palm/workshop
(در کنار کلاس 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
آماده کنید. این یک انتزاع سطح بالاتری است که توسط LangChain4J برای پیکربندی اجزای مختلف برای مدیریت یک مکالمه، مانند خود مدل زبان چت، اما به طور بالقوه سایر مؤلفهها برای مدیریت تاریخچه مکالمه چت، یا اتصال ابزارهای دیگر مانند retrievers برای واکشی اطلاعات از پایگاه های داده برداری اما نگران نباشید، ما بعداً در این کد لبه به آن باز خواهیم گشت.
سپس، میخواهید یک مکالمه چند نوبتی با مدل چت انجام دهید تا چندین سؤال مرتبط بپرسید. ابتدا در مورد LLM ها تعجب می کنید، سپس می پرسید که با آنها چه کاری می توانید انجام دهید، و چند نمونه از آنها چیست. توجه داشته باشید که چگونه مجبور نیستید خود را تکرار کنید، LLM می داند که "آنها" به معنای LLM ها در متن آن مکالمه است.
برای انجام آن مکالمه چند چرخشی، فقط متد execute()
را در زنجیره فراخوانی میکنید، آن را به متن گفتگو اضافه میکند، مدل چت یک پاسخ ایجاد میکند و آن را به تاریخچه چت نیز اضافه میکند.
برای اجرای این کلاس، دستور زیر را در ترمینال Cloud Shell اجرا کنید:
./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
پالم به 3 سوال مرتبط شما پاسخ داد!
سازنده VertexAIChatModel
به شما امکان می دهد پارامترهای اختیاری را تعریف کنید که از قبل دارای مقادیر پیش فرضی هستند که می توانید آنها را لغو کنید. در اینجا چند نمونه آورده شده است:
-
.temperature(0.2)
- برای تعریف اینکه می خواهید پاسخ چقدر خلاقانه باشد (0 خلاقیت پایین و اغلب واقعی تر است، در حالی که 1 برای خروجی های خلاقانه تر است) -
.maxOutputTokens(50)
-
.topK(20)
- برای انتخاب تصادفی یک کلمه از بین حداکثر تعداد کلمات احتمالاً برای تکمیل متن (از 1 تا 40) -
.topP(0.95)
- برای انتخاب کلمات ممکن که مجموع احتمال آنها به عدد ممیز شناور (بین 0 و 1) می رسد. -
.maxRetries(3)
- در صورتی که درخواست را در هر سهمیه زمانی پشت سر گذاشته اید، می توانید از مدل بخواهید برای مثال 3 بار تماس را دوباره امتحان کند.
5. یک چت بات مفید با شخصیت!
در بخش قبل، شما بلافاصله شروع به پرسیدن سوال از چت ربات LLM بدون ارائه هیچ زمینه خاصی کردید. اما شما می توانید چنین ربات چت را برای تبدیل شدن به یک متخصص در یک کار خاص یا در یک موضوع خاص متخصص کنید.
چگونه این کار را انجام می دهید؟ با تنظیم مرحله: با توضیح دادن LLM به کار در دست، زمینه، شاید ارائه چند مثال از آنچه باید انجام دهد، چه شخصیتی باید داشته باشد، در چه قالبی میخواهید پاسخها را دریافت کنید، و احتمالاً یک لحن ، اگر می خواهید ربات چت به روش خاصی رفتار کند.
این مقاله در مورد اعلانهای ساخت، این رویکرد را به خوبی با این گرافیک نشان میدهد:
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)، زیرا ما فقط می خواهیم حرکت بعدی را ایجاد کنیم، نه یک پایان نامه کامل در مورد شطرنج!
- در مرحله بعد، یک فروشگاه حافظه چت برای ذخیره مکالمات چت ایجاد می کنید.
- شما یک حافظه چت پنجرهدار واقعی ایجاد میکنید تا آخرین حرکتها را حفظ کنید.
- در حافظه چت، یک پیام "سیستم" اضافه می کنید، که به مدل چت در مورد اینکه قرار است چه کسی باشد (یعنی یک شطرنج باز خبره) راهنمایی می کند. پیام "سیستم" زمینه ای را اضافه می کند، در حالی که پیام های "کاربر" و "AI" بحث واقعی هستند.
- شما یک زنجیره مکالمه ایجاد می کنید که حافظه و مدل چت را ترکیب می کند.
- سپس، ما لیستی از حرکات سفید را داریم که شما در حال تکرار آن هستید. زنجیره با حرکت سفید بعدی هر بار اجرا می شود و مدل چت با بهترین حرکت بعدی پاسخ می دهد.
وقتی این کلاس را با این حرکات اجرا می کنید، باید خروجی زیر را ببینید:
$ ./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 (Portable Game Notation) بازی های گذشته را دیده باشد. اگرچه این ربات چت احتمالاً در برابر AlphaZero (هوش مصنوعی که بهترین بازیکنان Go، Shogi و Chess را شکست میدهد) پیروز نخواهد شد و ممکن است مکالمه در ادامه مسیر از مسیر خارج شود، زیرا مدل واقعاً وضعیت واقعی بازی را به خاطر نمیآورد.
مدلهای چت بسیار قدرتمند هستند و میتوانند تعاملات غنی با کاربران شما ایجاد کنند و کارهای متنی مختلف را انجام دهند. در بخش بعدی، یک کار مفید را بررسی خواهیم کرد: استخراج داده های ساختاریافته از متن .
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
به لطف کلاسAiServices
LangChain4J ایجاد می شود. - سپس، می توانید به سادگی با
Person person = extractor.extractPerson(...)
تماس بگیرید تا جزئیات شخص را از متن بدون ساختار استخراج کنید و یک نمونهPerson
با نام و سن را دریافت کنید.
حال این کلاس را با دستور زیر اجرا کنید:
$ ./gradlew run -DjavaMainClass=palm.workshop.ChatPrompts > Task :app:run Anna 23
بله! این آنا است، او 23 سال دارد!
آنچه در این رویکرد AiServices
مورد توجه است این است که شما با اشیاء تایپ شده قوی کار می کنید. شما مستقیماً با چت LLM در تعامل نیستید. در عوض، شما با کلاسهای مشخصی کار میکنید، مانند کلاس Person برای نمایش اطلاعات شخصی استخراجشده، و یک کلاس PersonExtractor
با متد extractPerson()
دارید که یک نمونه Person را برمیگرداند. مفهوم LLM انتزاع شده است، و به عنوان یک توسعه دهنده جاوا، شما فقط کلاس ها و اشیاء معمولی را دستکاری می کنید.
7. بازیابی نسل افزوده: چت با اسناد خود
بیایید به گفتگوها برگردیم. این بار می توانید در مورد مدارک خود سوال بپرسید. شما یک ربات چت خواهید ساخت که قادر است اطلاعات مربوطه را از پایگاه داده ای از عصاره اسناد شما بازیابی کند، و این اطلاعات توسط مدل برای "زمینه" کردن پاسخ هایش، به جای تلاش برای تولید پاسخ هایی که از آموزش خود می آید، استفاده می کند. این الگو RAG یا Retrieval Augmented Generation نامیده می شود.
در Retrieval Augmented Generation، به طور خلاصه، دو مرحله وجود دارد:
- مرحله جذب - اسناد بارگیری میشوند، به قطعات کوچکتر تقسیم میشوند و یک نمایش برداری از آنها ( "جاسازی برداری" ) در یک "پایگاه داده برداری" ذخیره میشود که قادر به انجام جستجوهای معنایی است.
- مرحله پرس و جو - کاربران اکنون می توانند از ربات چت شما در مورد اسناد سوال بپرسند. سوال نیز به یک بردار تبدیل می شود و با تمام بردارهای دیگر در پایگاه داده مقایسه می شود. مشابه ترین بردارها معمولاً از نظر معنایی مرتبط هستند و توسط پایگاه داده برداری برگردانده می شوند. سپس، به LLM زمینه گفتگو داده می شود، تکه هایی از متن که با بردارهای بازگردانده شده توسط پایگاه داده مطابقت دارند، و از آن خواسته می شود که با مشاهده آن تکه ها، پاسخ خود را پایه گذاری کند.
در حال آماده سازی مدارک شما
برای این نسخه ی نمایشی جدید، شما سوالاتی در مورد معماری شبکه عصبی "تبدیل کننده" ، که توسط گوگل پیشگام شده است، می پرسید، که چگونه همه مدل های مدرن زبان بزرگ امروزه پیاده سازی می شوند.
با استفاده از دستور wget
برای دانلود PDF از اینترنت، میتوانید مقاله تحقیقاتی را که این معماری را توصیف کرده است ("توجه تنها چیزی است که نیاز دارید") بازیابی کنید:
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();
در مرحله بعد، برای همکاری با هم به چند کلاس نیاز دارید:
- سند PDF را بارگیری و به تکه تکه کنید.
- برای همه این تکه ها جاسازی های برداری ایجاد کنید.
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
به تکههای تقسیم میشود. قرار است متن فایل PDF را به قطعاتی با 500 کاراکتر، با همپوشانی 100 کاراکتری (با تکه زیر، برای جلوگیری از برش کلمات یا جملات، به صورت تکه تکه) تقسیم کند.
فروشگاه "ingestor" تقسیم کننده سند، مدل جاسازی برای محاسبه بردارها و پایگاه داده برداری درون حافظه را پیوند می دهد. سپس، متد ingest()
مراقب انجام ingestion خواهد بود.
اکنون، مرحله اول به پایان رسیده است، سند به تکه های متنی با جاسازی های برداری مرتبط تبدیل شده و در پایگاه داده برداری ذخیره می شود.
سوال پرسیدن
وقت آن است که برای پرسیدن سؤال آماده شوید! برای شروع مکالمه می توان مدل چت معمولی ایجاد کرد:
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
) و مدل embedding را پیوند دهد. وظیفه آن این است که از پایگاه داده برداری با محاسبه یک جاسازی برداری برای پرس و جو کاربر، پرس و جو کند تا بردارهای مشابه را در پایگاه داده پیدا کند:
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();
این "زنجیره" به هم متصل می شود:
- مدل زبان چت که قبلاً پیکربندی کردید.
- Retriever یک پرس و جوی تعبیه بردار را با بردارهای پایگاه داده مقایسه می کند.
- یک الگوی سریع به صراحت می گوید که مدل چت باید با استناد به پاسخ خود بر اساس اطلاعات ارائه شده (یعنی گزیده های مربوطه از اسنادی که تعبیه برداری آن مشابه بردار سؤال کاربر است) پاسخ دهد.
و اکنون بالاخره آماده پرسیدن سوالات خود هستید!
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 و API PalM ایجاد کردید! در طول مسیر متوجه شدید که مدلهای بزرگ چت زبان بسیار قدرتمند هستند و میتوانند کارهای مختلفی مانند پرسش/پاسخ را انجام دهند، حتی در اسناد خود، استخراج دادهها، و تا حدودی حتی میتوانستند شطرنج بازی کنند!
بعدش چی؟
برای ادامه کار با PalM در جاوا، کدهای زیر را بررسی کنید:
در ادامه مطلب
- موارد استفاده متداول هوش مصنوعی
- منابع آموزشی در زمینه هوش مصنوعی مولد
- از طریق Generative AI Studio با Palm تعامل کنید
- هوش مصنوعی مسئول