إنشاء النصوص باستخدام الذكاء الاصطناعي التوليدي في Java باستخدام PaLM وLangChain4J
لمحة عن هذا الدرس التطبيقي حول الترميز
1. مقدمة
تاريخ آخر تعديل: 27/11/2023
ما هو الذكاء الاصطناعي التوليدي؟
يشير الذكاء الاصطناعي التوليدي أو الذكاء الاصطناعي التوليدي إلى استخدام الذكاء الاصطناعي في إنشاء محتوى جديد، مثل النصوص والصور والموسيقى والمحتوى الصوتي والفيديوهات.
يستند الذكاء الاصطناعي التوليدي إلى النماذج الأساسية (نماذج الذكاء الاصطناعي الكبيرة) التي يمكنها تنفيذ مهام متعددة وتنفيذ مهام غير تقليدية، بما في ذلك التلخيص والأسئلة والأجوبة والتصنيف وغير ذلك. بالإضافة إلى ذلك، يمكن تعديل نماذج الأساس لتناسب حالات الاستخدام المستهدَفة باستخدام الحدّ الأدنى من التدريب المطلوب، وذلك مع توفير أمثلة قليلة جدًا من البيانات.
ما هي آلية عمل الذكاء الاصطناعي التوليدي؟
يستخدم الذكاء الاصطناعي التوليدي نموذج تعلُّم الآلة للتعرّف على الأنماط والعلاقات في مجموعة بيانات تتضمّن محتوًى من إنشاء البشر. وتعتمد بعدها على الأنماط التي تعلّمتها لإنشاء محتوى جديد.
إنّ الطريقة الأكثر شيوعًا لتدريب نموذج الذكاء الاصطناعي التوليدي هي استخدام التعلّم الخاضع للإشراف، حيث يتم منح النموذج مجموعة من المحتوى من إنشاء البشر والتصنيفات المقابلة. ويتعلّم النظام بعد ذلك إنشاء محتوى مشابه للمحتوى الذي أنشأه المستخدمون ومصنَّف باستخدام التصنيفات نفسها.
ما هي التطبيقات الشائعة للذكاء الاصطناعي التوليدي؟
يعالج الذكاء الاصطناعي التوليدي المحتوى الهائل، وينشئ إحصاءات وإجابات عبر النصوص والصور والتنسيقات السهلة الاستخدام. يمكن استخدام الذكاء الاصطناعي التوليدي للأغراض التالية:
- تحسين تفاعلات العملاء من خلال تجارب بحث ومحادثات محسَّنة
- استكشِف كميات هائلة من البيانات غير المنظَّمة من خلال واجهات وملخصات للمحادثات.
- المساعدة في المهام المتكررة مثل الرد على طلبات تقديم العروض (RFP)، وأقلمة المحتوى التسويقي بخمس لغات، والتحقق من عقود العملاء للتأكد من الامتثال والمزيد
ما هي حلول الذكاء الاصطناعي التوليدي المتوفّرة في Google Cloud؟
باستخدام Vertex AI، يمكنك التفاعل مع النماذج الأساسية وتخصيصها وتضمينها في تطبيقاتك، مع العلم أنّ ذلك لا يتطلّب سوى خبرة قليلة في تكنولوجيا تعلُّم الآلة. يمكنك الوصول إلى نماذج الأساس في Model Garden، أو ضبط النماذج من خلال واجهة مستخدم بسيطة في أداة الذكاء الاصطناعي التوليدي، أو استخدام النماذج في دفتر ملاحظات لعلوم البيانات.
توفّر منصة Vertex AI Search and Conversation أسرع طريقة للمطوّرين لإنشاء محركات بحث وبرامج تتبُّع دردشة مستنِدة إلى الذكاء الاصطناعي التوليدي.
يمكنك أيضًا الاستعانة بخدمة Duet AI المستنِدة إلى الذكاء الاصطناعي (AI) والمتوفّرة في Google Cloud وبيئات IDE لمساعدتك في إنجاز المزيد من المهام بشكل أسرع.
ما الذي يركز عليه هذا الدرس التطبيقي حول الترميز؟
يركّز هذا الدرس التطبيقي حول الترميز على النموذج اللغوي الكبير PaLM 2 (LLM) المستضاف على Google Cloud Vertex AI والذي يشمل جميع منتجات وخدمات تعلُّم الآلة.
ستستخدم Java للتفاعل مع واجهة برمجة التطبيقات PaLM، بالإضافة إلى منسّق إطار العمل المستند إلى النموذج اللغوي الكبير LangChain4J. ستتمكّن من الاطّلاع على أمثلة ملموسة مختلفة للاستفادة من النموذج اللغوي الكبير في الإجابة عن الأسئلة وإنشاء الأفكار واستخراج الكيانات والمحتوى المنظَّم والتلخيص.
أريد معلومات أكثر عن إطار عمل LangChain4J
إنّ إطار العمل LangChain4J هو مكتبة مفتوحة المصدر لدمج النماذج اللغوية الكبيرة في تطبيقات Java، وذلك من خلال تنسيق مكونات مختلفة، مثل النموذج اللغوي الكبير نفسه، وكذلك أدوات أخرى مثل قواعد البيانات المتجهة (لعمليات البحث الدلالية)، وأدوات تحميل المستندات وأدوات تقسيمها (لتحليل المستندات والتعلّم منها)، وأدوات تحليل الإخراج، وغير ذلك.
المعلومات التي ستطّلع عليها
- كيفية إعداد مشروع Java لاستخدام PaLM وLangChain4J
- طريقة إجراء طلبك الأول لنموذج نص PaLM لإنشاء المحتوى والإجابة عن الأسئلة
- كيفية استخراج المعلومات المفيدة من المحتوى غير المنظَّم (استخراج الكيانات أو الكلمات الرئيسية بتنسيق JSON)
- كيفية تصنيف المحتوى أو تحليل الآراء باستخدام بضع لقطات تطلب
المتطلبات
- معرفة لغة البرمجة Java
- مشروع على Google Cloud
- متصفح، مثل Chrome أو Firefox
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
- يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (الذي يتم تحديده عادةً على أنّه
PROJECT_ID
). وإذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى طوال مدة المشروع. - لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع، الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. لن يؤدي إكمال هذا الدرس التطبيقي حول الترميز إلى فرض أي تكاليف، إن وُجدت. لإيقاف تشغيل الموارد لتجنب تحمُّل الفواتير إلى ما هو أبعد من هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
يمكنك إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، إلا أنّك ستستخدم في هذا الدرس التطبيقي Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.
إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة تصف ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.
يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير اللازمة. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح.
بعد الربط بخدمة Cloud Shell، من المفترض أن تتأكّد من أنّه تمّت مصادقتك وأنّ المشروع مضبوط على رقم تعريف مشروعك.
- شغِّل الأمر التالي في 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 وأداة تعديل الرموز لتطوير برامج Java.
تفعيل واجهات Vertex AI API
- في وحدة تحكُّم Google Cloud، تأكَّد من عرض اسم مشروعك في أعلى وحدة تحكُّم Google Cloud. وإذا لم يكن الأمر كذلك، انقر على اختيار مشروع لفتح أداة اختيار المشروع واختَر المشروع المطلوب.
- إذا لم تكن تستخدم قسم Vertex AI في وحدة تحكُّم Google Cloud، اتّبِع الخطوات التالية:
- في قسم البحث، أدخِل Vertex AI، ثم ارجِع
- في نتائج البحث، انقر على Vertex AI. ستظهر لوحة بيانات Vertex AI.
- انقر على تفعيل جميع واجهات برمجة التطبيقات المقترَحة في لوحة بيانات Vertex AI.
سيؤدّي ذلك إلى تفعيل العديد من واجهات برمجة التطبيقات، ولكن الأهم في الدرس التطبيقي حول الترميز هو aiplatform.googleapis.com
، الذي يمكنك أيضًا تفعيله في سطر الأوامر في الوحدة الطرفية Cloud Shell من خلال تنفيذ الأمر التالي:
$ gcloud services enable aiplatform.googleapis.com
إنشاء بنية المشروع باستخدام Gradle
لإنشاء أمثلة على رموز Java، ستستخدم أداة التصميم Gradle والإصدار 17 من Java. لإعداد مشروعك باستخدام Gradle، أنشِئ دليلاً (هنا، palm-workshop
) في الوحدة الطرفية في Cloud Shell، وشغِّل الأمر 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
سيكون عليك إنشاء تطبيق (الخيار الثاني)، باستخدام لغة Java (الخيار 3)، وبدون استخدام المشاريع الفرعية (الخيار 1)، باستخدام بنية Groovy لملف الإصدار (الخيار 1)، وعدم استخدام ميزات الإصدار الجديدة (الخيار "لا")، وإنشاء اختبارات باستخدام JUnit Jupiter (الخيار 4)، وبالنسبة إلى اسم المشروع، يمكنك استخدام palm-workshop كما لو كانت الميزة المصدر،
سيبدو هيكل المشروع على النحو التالي:
├── gradle │ └── ... ├── gradlew ├── gradlew.bat ├── settings.gradle └── app ├── build.gradle └── src ├── main │ └── java │ └── palm │ └── workshop │ └── App.java └── test └── ...
والآن، سنعدّل ملف app/build.gradle
لإضافة بعض الموارد المطلوبة. يمكنك إزالة تبعية guava
إذا كانت متوفّرة، واستبدالها بالعناصر التابعة لمشروع LangChain4J ومكتبة التسجيل لتجنُّب الإخلال برسائل المسجّل المفقودة:
dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
// Logging library
implementation 'org.slf4j:slf4j-jdk14:2.0.9'
// This dependency is used by the application.
implementation 'dev.langchain4j:langchain4j-vertex-ai:0.24.0'
implementation 'dev.langchain4j:langchain4j:0.24.0'
}
هناك تبعيتان للغة LangChain4J:
- واحد في المشروع الأساسي،
- وأخرى لوحدة Vertex AI
لاستخدام Java 17 لتجميع برامجنا وتشغيلها، أضِف المجموعة التالية أسفل مجموعة plugins {}
:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
هناك تغيير آخر يجب إجراؤه: تعديل مجموعة 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
أصبحت الآن جاهزًا للبرمجة باستخدام نموذج النص اللغوي الكبير PaLM باستخدام مشروع LangChain4J.
إليك الشكل الذي من المفترض أن يبدو عليه ملف إصدار 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.
أنشِئ فئة جديدة باسم TextPrompts.java
في الدليل app/src/main/java/palm/workshop
(بالإضافة إلى فئة App.java
التلقائية)، واكتب المحتوى التالي:
package palm.workshop;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiLanguageModel;
public class TextPrompts {
public static void main(String[] args) {
VertexAiLanguageModel model = VertexAiLanguageModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("text-bison@001")
.maxOutputTokens(500)
.build();
Response<String> response = model.generate("What are large language models?");
System.out.println(response.content());
}
}
في هذا المثال الأول، عليك استيراد الفئة Response
والنموذج اللغوي Vertex AI لنموذج PaLM.
بعد ذلك، وفي طريقة main
، ستتمكّن من ضبط النموذج اللغوي، باستخدام أداة الإنشاء لـ VertexAiLanguageModel
، لتحديد ما يلي:
- نقطة النهاية،
- المشروع،
- المنطقة،
- الناشر،
- واسم النموذج (
text-bison@001
).
والآن بعد أن أصبح النموذج اللغوي جاهزًا، يمكنك استدعاء طريقة generate()
وتمرير "الطلب". (أي السؤال أو التعليمات التي يجب إرسالها إلى النموذج اللغوي الكبير) يمكنك في هذا القسم طرح سؤال بسيط حول النماذج اللغوية الكبيرة. لكن لا تتردد في تغيير هذا الطلب لتجربة أسئلة أو مهام مختلفة.
لتشغيل هذه الفئة، شغِّل الأمر التالي في الوحدة الطرفية في Cloud Shell:
./gradlew run -DjavaMainClass=palm.workshop.TextPrompts
من المفترض أن تظهر لك نتيجة مشابهة لما يلي:
Large language models (LLMs) are artificial intelligence systems that can understand and generate human language. They are trained on massive datasets of text and code, and can learn to perform a wide variety of tasks, such as translating languages, writing different kinds of creative content, and answering your questions in an informative way. LLMs are still under development, but they have the potential to revolutionize many industries. For example, they could be used to create more accurate and personalized customer service experiences, to help doctors diagnose and treat diseases, and to develop new forms of creative expression. However, LLMs also raise a number of ethical concerns. For example, they could be used to create fake news and propaganda, to manipulate people's behavior, and to invade people's privacy. It is important to carefully consider the potential risks and benefits of LLMs before they are widely used. Here are some of the key features of LLMs: * They are trained on massive datasets of text and code. * They can learn to perform a wide variety of tasks, such as translating languages, writing different kinds of creative content, and answering your questions in an informative way. * They are still under development, but they have the potential to revolutionize many industries. * They raise a number of ethical concerns, such as the potential for fake news, propaganda, and invasion of privacy.
تتيح لك أداة إنشاء VertexAILanguageModel
تحديد المَعلمات الاختيارية التي تحتوي على بعض القيم التلقائية التي يمكنك تجاوزها. وإليك بعض الأمثلة:
.temperature(0.2)
: لتحديد مدى إبداع الردّ (0 مستوى إبداعي منخفض وغالبًا ما يكون أكثر واقعية، بينما 1 للمخرجات الإبداعية الإضافية).maxOutputTokens(50)
: في المثال، تم طلب 500 رمز مميّز (3 رموز مميّزة تساوي 4 كلمات تقريبًا)، بناءً على المدة التي تريد أن تكون الإجابة عنها.topK(20)
: لاختيار كلمة بشكل عشوائي من بين أقصى عدد ممكن من الكلمات لإكمال النص (من 1 إلى 40).topP(0.95)
: لاختيار الكلمات المحتمَلة التي يصل إجمالي احتمالية إجرائها إلى رقم النقطة العائمة (بين 0 و1).maxRetries(3)
: في حال تجاوز الحصة الزمنية للطلب، يمكنك أن تطلب من النموذج إعادة محاولة الاتصال 3 مرات، على سبيل المثال
النماذج اللغوية الكبيرة هي نماذج فعالة للغاية، ويمكنها تقديم إجابات عن الأسئلة المعقدة، كما يمكنها التعامل مع مجموعة كبيرة ومتنوعة من المهام المثيرة للاهتمام. في القسم التالي، سنلقي نظرة على مهمة مفيدة وهي: استخراج البيانات المنظَّمة من النص.
5. استخراج المعلومات من النص غير المنظَّم
في القسم السابق، قمت بإنشاء بعض الإخراج النصي. لا بأس إذا كنت تريد عرض هذه الإخراج للمستخدمين النهائيين مباشرةً. ولكن إذا كنت تريد استرداد البيانات المذكورة في هذا الإخراج، كيف يمكنك استخراج تلك المعلومات من النص غير المهيكل؟
لنفترض أنّك تريد استخراج اسم شخص وعمره مع توفّر سيرة ذاتية أو وصف له. يمكنك توجيه النموذج اللغوي الكبير لإنشاء بُنى بيانات JSON من خلال ضبط الطلب على النحو التالي (يُطلَق على ذلك عادةً "هندسة الطلبات"):
Extract the name and age of the person described below. Return a JSON document with a "name" and an "age" property, following this structure: {"name": "John Doe", "age": 34} Return only JSON, without any markdown markup surrounding it. Here is the document describing the person: --- Anna is a 23 year old artist based in Brooklyn, New York. She was born and raised in the suburbs of Chicago, where she developed a love for art at a young age. She attended the School of the Art Institute of Chicago, where she studied painting and drawing. After graduating, she moved to New York City to pursue her art career. Anna's work is inspired by her personal experiences and observations of the world around her. She often uses bright colors and bold lines to create vibrant and energetic paintings. Her work has been exhibited in galleries and museums in New York City and Chicago. --- JSON:
تعديل الاستدعاء model.generate()
في الفئة TextPrompts
لتمريره كامل الطلب أعلاه:
Response<String> response = model.generate("""
Extract the name and age of the person described below.
Return a JSON document with a "name" and an "age" property, \
following this structure: {"name": "John Doe", "age": 34}
Return only JSON, without any markdown markup surrounding it.
Here is the document describing the person:
---
Anna is a 23 year old artist based in Brooklyn, New York. She was born and
raised in the suburbs of Chicago, where she developed a love for art at a
young age. She attended the School of the Art Institute of Chicago, where
she studied painting and drawing. After graduating, she moved to New York
City to pursue her art career. Anna's work is inspired by her personal
experiences and observations of the world around her. She often uses bright
colors and bold lines to create vibrant and energetic paintings. Her work
has been exhibited in galleries and museums in New York City and Chicago.
---
JSON:
"""
);
إذا تم تشغيل هذا الطلب في فئة TextPrompts
، من المفترض أن يعرض سلسلة JSON التالية، والتي يمكنك تحليلها باستخدام محلل JSON اللغوي مثل مكتبة GSON:
$ ./gradlew run -DjavaMainClass=palm.workshop.TextPrompts > Task :app:run {"name": "Anna", "age": 23} BUILD SUCCESSFUL in 24s 2 actionable tasks: 1 executed, 1 up-to-date
نعم. عمر "آنا" 23 عامًا.
6. نماذج الطلبات والطلبات المنظَّمة
محتوى آخر غير الإجابة عن الأسئلة
تُعدّ النماذج اللغوية الكبيرة، مثل PaLM فعّالة في الإجابة عن الأسئلة، ولكن يمكنك استخدامها في العديد من المهام الأخرى. على سبيل المثال، جرِّب الطلبات التالية في استوديو الذكاء الاصطناعي التوليدي (أو من خلال تعديل فئة TextPrompts
). قم بتغيير الكلمات الكبيرة باستخدام أفكارك الخاصة، وافحص مخرجاتها:
- الترجمة — "ترجمة الجملة التالية إلى اللغة الفرنسية: YOUR_SENTENCE_HERE"
- Summarization — "تقديم ملخص للمستند التالي: PASTE_YOUR_DOC"
- إنشاء الإبداع — "كتابة قصيدة عن TOPIC_OF_THE_POEM"
- البرمجة — "كيف تكتب دالة فيبوناتشي باللغة PROGRAMMING_LANGUAGE؟"
نماذج الطلبات
إذا جرّبت الطلبات المذكورة أعلاه بشأن الترجمة أو التلخيص أو الإنشاء الإبداعي أو مهام البرمجة، فقد استبدلت قيم العنصر النائب بأفكارك الخاصة. ولكن بدلاً من إجراء بعض التلاعب في السلاسل، يمكنك أيضًا الاستفادة من "نماذج الطلبات" التي تتيح لك تحديد قيم العناصر النائبة هذه وملء الفراغ بعد ذلك ببياناتك.
لنلقِ نظرة على طلب لذيذ ومبتكر، وذلك من خلال استبدال المحتوى الكامل لطريقة main()
بالرمز التالي:
VertexAiLanguageModel model = VertexAiLanguageModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("text-bison@001")
.maxOutputTokens(300)
.build();
PromptTemplate promptTemplate = PromptTemplate.from("""
Create a recipe for a {{dish}} with the following ingredients: \
{{ingredients}}, and give it a name.
"""
);
Map<String, Object> variables = new HashMap<>();
variables.put("dish", "dessert");
variables.put("ingredients", "strawberries, chocolate, whipped cream");
Prompt prompt = promptTemplate.apply(variables);
Response<String> response = model.generate(prompt);
System.out.println(response.content());
وبإضافة عمليات الاستيراد التالية:
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
import java.util.HashMap;
import java.util.Map;
بعد ذلك، شغِّل التطبيق مرة أخرى. يجب أن تبدو النتيجة على النحو التالي:
$ ./gradlew run -DjavaMainClass=palm.workshop.TextPrompts > Task :app:run **Strawberry Shortcake** Ingredients: * 1 pint strawberries, hulled and sliced * 1/2 cup sugar * 1/4 cup cornstarch * 1/4 cup water * 1 tablespoon lemon juice * 1/2 cup heavy cream, whipped * 1/4 cup confectioners' sugar * 1/4 teaspoon vanilla extract * 6 graham cracker squares, crushed Instructions: 1. In a medium saucepan, combine the strawberries, sugar, cornstarch, water, and lemon juice. Bring to a boil over medium heat, stirring constantly. Reduce heat and simmer for 5 minutes, or until the sauce has thickened. 2. Remove from heat and let cool slightly. 3. In a large bowl, combine the whipped cream, confectioners' sugar, and vanilla extract. Beat until soft peaks form. 4. To assemble the shortcakes, place a graham cracker square on each of 6 dessert plates. Top with a scoop of whipped cream, then a spoonful of strawberry sauce. Repeat layers, ending with a graham cracker square. 5. Serve immediately. **Tips:** * For a more elegant presentation, you can use fresh strawberries instead of sliced strawberries. * If you don't have time to make your own whipped cream, you can use store-bought whipped cream.
لذيذ!
باستخدام نماذج الطلبات، يمكنك إدخال المَعلمات المطلوبة قبل طلب طريقة إنشاء النص. هذه طريقة رائعة لتمرير البيانات وتخصيص الطلبات للقيم المختلفة التي يقدّمها المستخدمون.
كما يشير اسم الفئة، تنشئ الفئة PromptTemplate
طلبًا بالنموذج، ويمكنك تحديد قيم للعناصر النائبة من خلال تطبيق خريطة لأسماء العناصر النائبة وقيمها.
الطلبات المنظَّمة (اختياري)
يمكنك أيضًا تنظيم الطلبات من خلال التعليق التوضيحي @StructuredPrompt
إذا كنت تريد استخدام أسلوب أكثر تقدّمًا استنادًا إلى العناصر. يمكنك إضافة تعليق توضيحي إلى فئة باستخدام هذا التعليق التوضيحي، وتتوافق حقولها مع العناصر النائبة المحددة في المطالبة. لنرى ذلك عمليًا.
أولاً، سنحتاج إلى بعض عمليات الاستيراد الجديدة:
import java.util.Arrays;
import java.util.List;
import dev.langchain4j.model.input.structured.StructuredPrompt;
import dev.langchain4j.model.input.structured.StructuredPromptProcessor;
يمكننا بعد ذلك إنشاء فئة ثابتة داخلية ضمن فئة TextPrompts
تجمع البيانات اللازمة لتمرير العناصر النائبة في الطلب الموضّح في تعليق @StructuredPrompt
التوضيحي:
@StructuredPrompt("Create a recipe of a {{dish}} that can be prepared using only {{ingredients}}")
static class RecipeCreationPrompt {
String dish;
List<String> ingredients;
}
بعد ذلك، أنشئ مثيلاً لهذه الفئة الجديدة وقدّم له أطباق الوصفة ومكوناتها، ثمّ اعمد إلى إنشاء الطلب وتمريره إلى طريقة generate()
كما في السابق:
RecipeCreationPrompt createRecipePrompt = new RecipeCreationPrompt();
createRecipePrompt.dish = "salad";
createRecipePrompt.ingredients = Arrays.asList("cucumber", "tomato", "feta", "onion", "olives");
Prompt prompt = StructuredPromptProcessor.toPrompt(createRecipePrompt);
Response<String> response = model.generate(prompt);
بدلاً من ملء الفجوات في الخريطة، يمكنك استخدام كائن Java بحقول يمكن إكمالها تلقائيًا بواسطة بيئة التطوير المتكاملة (IDE)، بطريقة أكثر أمانًا.
إليك الرمز الكامل إذا أردت لصق هذه التغييرات بسهولة أكبر في صف TextPrompts
:
package palm.workshop;
import java.util.Arrays;
import java.util.List;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiLanguageModel;
import dev.langchain4j.model.input.structured.StructuredPrompt;
import dev.langchain4j.model.input.structured.StructuredPromptProcessor;
public class TextPrompts {
@StructuredPrompt("Create a recipe of a {{dish}} that can be prepared using only {{ingredients}}")
static class RecipeCreationPrompt {
String dish;
List<String> ingredients;
}
public static void main(String[] args) {
VertexAiLanguageModel model = VertexAiLanguageModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("text-bison@001")
.maxOutputTokens(300)
.build();
RecipeCreationPrompt createRecipePrompt = new RecipeCreationPrompt();
createRecipePrompt.dish = "salad";
createRecipePrompt.ingredients = Arrays.asList("cucumber", "tomato", "feta", "onion", "olives");
Prompt prompt = StructuredPromptProcessor.toPrompt(createRecipePrompt);
Response<String> response = model.generate(prompt);
System.out.println(response.content());
}
}
7. تصنيف النص وتحليل الآراء
على غرار ما تعلّمته في القسم السابق، ستكتشف أسلوب "هندسة الطلبات" آخر لجعل نموذج PaLM يصنّف النص أو يحلِّل المشاعر. لنتحدث عن "الطلبات باستخدام بضع لقطات". إنّها طريقة لتحسين طلباتك من خلال بعض الأمثلة التي ستساعد في توجيه النموذج اللغوي إلى الاتجاه الذي تريده لفهم هدفك بشكل أفضل.
دعنا نعيد صياغة صف TextPrompts
للاستفادة من نماذج الطلبات:
package palm.workshop;
import java.util.Map;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiLanguageModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
public class TextPrompts {
public static void main(String[] args) {
VertexAiLanguageModel model = VertexAiLanguageModel.builder()
.endpoint("us-central1-aiplatform.googleapis.com:443")
.project("YOUR_PROJECT_ID")
.location("us-central1")
.publisher("google")
.modelName("text-bison@001")
.maxOutputTokens(10)
.build();
PromptTemplate promptTemplate = PromptTemplate.from("""
Analyze the sentiment of the text below. Respond only with one word to describe the sentiment.
INPUT: This is fantastic news!
OUTPUT: POSITIVE
INPUT: Pi is roughly equal to 3.14
OUTPUT: NEUTRAL
INPUT: I really disliked the pizza. Who would use pineapples as a pizza topping?
OUTPUT: NEGATIVE
INPUT: {{text}}
OUTPUT:
""");
Prompt prompt = promptTemplate.apply(
Map.of("text", "I love strawberries!"));
Response<String> response = model.generate(prompt);
System.out.println(response.content());
}
}
لاحظ نهج تقديم بعض الأمثلة على المدخلات والمخرجات في المطالبة. هذه هي "اللقطات القليلة" التي تساعد النموذج اللغوي الكبير على اتّباع البنية نفسها وعندما يحصل النموذج بعد ذلك على مدخل، سيرغب في عرض مخرجات تتطابق مع نمط الإدخال/الإخراج.
أثناء تشغيل البرنامج، يجب أن تظهر الكلمة POSITIVE
فقط، لأنّ الفراولة لذيذة أيضًا.
$ ./gradlew run -DjavaMainClass=palm.workshop.TextPrompts
> Task :app:run
POSITIVE
تحليل العاطفة هو أيضًا سيناريو من سيناريوهات تصنيف المحتوى. يمكنك تطبيق أسلوب "طلب بضع لقطات" نفسه لتصنيف المستندات المختلفة في مجموعات بيانات لفئات مختلفة.
8. تهانينا
تهانينا، لقد أنشأت بنجاح أول تطبيق للذكاء الاصطناعي التوليدي في Java باستخدام LangChain4J وPaLM API. لقد اكتشفت على طول الطريق أن النماذج اللغوية الكبيرة قوية جدًا وقادرة على التعامل مع مهام مختلفة مثل الأسئلة/الإجابة، واستخراج البيانات، والتلخيص، وتصنيف النص، وتحليل الآراء، والمزيد.
الخطوات التالية
يمكنك الاطّلاع على بعض الدروس التطبيقية التالية حول الترميز باستخدام نموذج PaLM في Java:
- إجراء محادثات مع المستخدمين والمستندات باستخدام الذكاء الاصطناعي التوليدي باستخدام PaLM وLangChain4J
قراءة إضافية
- حالات الاستخدام الشائعة للذكاء الاصطناعي التوليدي
- مراجع تدريبية حول الذكاء الاصطناعي التوليدي
- التفاعل مع نموذج PaLM من خلال Generative AI Studio
- الذكاء الاصطناعي المسؤول