مهندسی سریع: آینده توسعه مبتنی بر هوش مصنوعی

ChatGPT و سایر خدمات مولد هوش مصنوعی کمتر از یک سال است که وجود دارند و در حال حاضر طوفان جهان را فرا گرفته است. هر روز موارد استفاده بیشتری را می بینیم که در رسانه های اجتماعی ظاهر می شوند که نشان می دهد چگونه این سرویس ها یک مشکل جدید جالب را حل می کنند. دیدن موج نوآوری که ظاهراً یک شبه ظاهر می شود، هیجان انگیز است.
چند هفته پیش مقالهای نوشتم که چگونه ChatGPT نحوه نوشتن نرمافزار را تغییر داد. در این مقاله چند مورد استفاده جدید در دسترس ما مورد بحث قرار گرفت و چند مثال عملی برای چرخاندن دندههای شما به اشتراک گذاشت.
امروز می خواهیم آن را یک قدم جلوتر ببریم. قراره بحث کنیم چگونه می توانید نرم افزار بنویسید تا از خدماتی مانند ChatGPT بهره ببرید. برای انجام این کار، بیایید گام به گام یک مثال را طی کنیم: یک ربات چت سوال بی پاسخ.
چیزی که ما می سازیم
هر زمان که وارد یک پخش زنده شلوغ یا چت روم محبوب میشوید، هر دقیقه صدها پیام را میبینید که در سراسر صفحه پخش میشوند. ادامه مکالمه غیرممکن است، چه رسد به اینکه پاسخ یک سوال را دریافت کنید. گردانندگان در کنار سؤالات، کار شایسته ای انجام می دهند، اما این یک کار دستی است که بر قضاوت و توانایی آنها در تجزیه ده ها پیام در ثانیه تکیه دارد. سوالات از قلم می افتند و پاسخ های اشتباه داده می شوند… زیاد.
من میخواهم آن را با یک ربات مجهز به هوش مصنوعی که به این سؤالات پاسخ میدهد، برطرف کنم. ما آن را ربات “هیچ سوالی باقی نگذاشته” می نامیم. در اینجا الزامات وجود دارد:
- به هر سوالی که پرسیده شده ولی جوابی دریافت نکرده اید پاسخ دهید
- به هر سوالی که پرسیده شده اما پاسخ نادرست دریافت کرده اید پاسخ دهید
- فردی که سوال بدون پاسخ یا اشتباه پرسیده را در پاسخ تگ کنید
- به سوالاتی که توسط یک انسان یا ربات به درستی پاسخ داده شده پاسخ ندهید
- به طور خودکار با فاصله 1 دقیقه اجرا شود
قبل از معرفی هوش مصنوعی مولد، ساخت این پروژه تقریبا غیرممکن بود. اما با مهندسی سریع و مناسب، میتوانیم آن را تنها در چند ساعت بسازیم.
سلب مسئولیت – من کد منبع کامل را برای این پروژه در دسترس ندارم. هدف از این مقاله این است که به شما نشان دهد چگونه میتوانید اعلانهای خدمات هوش مصنوعی تولیدی را ساختار دهید.
تنظیم چشم انداز
آیا تا به حال به کسی گفته اید که قبل از اینکه از او سوالی بپرسید، “کلاه مهندس” یا “کلاه محصول” خود را روی سر بگذارد؟ این به آنها کمک می کند تا در چارچوب ذهنی مناسب قرار گیرند، یا چشم انداز، برای پاسخ به سوال شما
هنگام ساختن یک خانه، وقتی میپرسید «آشپزخانه را توصیف کنید»، پاسخهای بسیار متفاوتی از خریدار، معمار و گروه ساختوساز دریافت خواهید کرد. برای دریافت پاسخی که به دنبال آن هستید، باید از فرد مناسب بپرسید.
در مورد ChatGPT نیز بسیار مشابه است. هنگام درخواست سرویس، می توانید به صورت اختیاری به آن یک علامت بدهید نقش سیستم که چشم انداز مدل را تعیین می کند و مستقیماً بر نوع پاسخی که دریافت می کنید تأثیر می گذارد.
اما قبل از اینکه جلوتر برویم، اجازه دهید یک قدم به عقب برگردیم و ورودیهای a را بررسی کنیم chatCompletion
با استفاده از OpenAI Node.js SDK.
const result = await openai.createChatCompletion({
model: 'gpt-4',
temperature: .7,
messages: messages
});
این تماسی است که ما برای برقراری ارتباط با OpenAI، مخصوصا gpt-4
مدلی که همه ما در این مرحله با آن آشنا هستیم. را temperature
فیلد «خلاقیت» پاسخهایی را که مدل ارائه میکند نشان میدهد. هرچه این عدد کمتر باشد، پاسخها خلاقانهتر/وحشیتر هستند. این مقدار از 0 تا 1 متغیر است، و من به طور کلی دریافتم که مقدار 0.7 به طور مداوم نتایج با کیفیت را ارائه می دهد.
را messages
میدان جایی است که قدرت وارد بازی می شود. میتوانید کل مکالمات را به این آرایه منتقل کنید و به مدل زمینه معنادار بدهید (در ادامه در این مورد بیشتر توضیح خواهیم داد).
برای تنظیم چشم انداز تماس خود، باید پیامی با ویژگی های زیر ارسال کنیم:
{
"role": "system",
"content": "You are a master trivia player. You provide quick, to-the-point answers to any and all questions you see. You aren't afraid to correct others when they are wrong"
}
با نشان دادن نقشی از سیستم، ما چشم انداز مدل هوش مصنوعی را تنظیم کردیم. برای “ربات هیچ سوالی باقی نگذاشته” ما می خواهیم دیدگاه شخصی را داشته باشیم که واقعاً در مطالب بی اهمیت و ارائه پاسخ های مختصر مهارت داشته باشد. بنابراین ما دقیقاً به آن می گوییم.
تنظیمات زمینه
اکنون که به مدل هوش مصنوعی گفتهایم که میخواهیم چگونه به درخواست ما نزدیک شود، باید به آن دادههایی برای پردازش بدهیم. ما در حال ساخت یک ربات چت هستیم، بنابراین بیایید آرایه ای از اشیاء json را که تاریخچه چت را نشان می دهد به آن تغذیه کنیم. داده های خام ما چیزی شبیه به این خواهد بود:
[
{
"username": "allenheltondev",
"message": "Does anyone know what color you get when you mix purple and green?"
},
{
"username": "andmoredev",
"message": "definitely pink"
},
{
"username": "astuyve",
"message": "How many pounds are in a stone?"
},
{
"username": "allenheltondev",
"message": "Thanks. And how would you center a div in css?"
},
{
"username": "astuyve",
"message": "display: flex; align-items: center; justify-content: center;"
}
]
چیزهای زیادی در آن گفتگو می گذرد. ما یک پاسخ کاملاً نادرست داریم، سؤالی که اصلاً به آن پاسخ داده نشده است و سؤالی که پاسخ صحیح داده شده است. ربات چت ما باید به درستی به سوال رنگی پاسخ دهد، به سوال وزن پاسخ دهد و از روی یکی از css بگذرد. اما قبل از انجام این کار، باید داده ها را در اختیار ChatGPT قرار دهیم. برای این کار باید پیام دیگری به آرایه پیام اضافه کنیم.
const chatHistory = await getChatHistory(chatId);
const historyMessage = {
"role": "user",
"content": `Here is a chat history for the past minute. It's an array of json objects indicating the user that sent the message and what message they sent. ${JSON.stringify(chatHistory)}`
};
messages.push(historyMessage);
این به ChatGPT اطلاعات لازم را می دهد تا بتواند کاری را که ما می خواهیم انجام دهد. ما هنوز از آن درخواست نکردهایم که کاری انجام دهد، اما به آن گفتهایم که چگونه میخواهیم به اعلان دریافتی نزدیک شود و تمام دادههایی را که برای انجام کاری معنادار نیاز دارد به آن دادهایم.
فرمت خروجی
ما در حال نوشتن یک برنامه هستیم. برنامه ها نیاز به رفتار ثابت دارند. همانطور که قبلاً اشاره کردم، ChatGPT هر از گاهی سرگردان است و هر از گاهی پاسخ های جالبی را ارائه می دهد.
برای دور زدن این موضوع، باید یک طرحواره برای ساختار خروجی آن ارائه کنیم. ما طرحی کاملاً تعریف شده میخواهیم که بتوانیم آن را تأیید کنیم تا تضمین کنیم پاسخهایی که دریافت میکنیم تمام اطلاعات مورد انتظار ما را دارند. پس بیایید خروجی مورد نظر خود را به صورت طرحواره json تعریف کنیم.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "MessageFormat",
"type": "array",
"items": {
"type": "object",
"properties": {
"username": {
"type": "string",
"description": "Username of the person sending a message"
},
"message": {
"type": "string",
"description": "Message sent to all users in the chat room"
}
},
"required": [ "username", "message" ]
}
}
ما می توانیم این طرح را به عنوان پیام دیگری در ChatGPT ارائه کنیم messages
آرایه تا بداند که چگونه پاسخ تولید شده را قالب بندی کند. علاوه بر این، میتوانیم از طرحواره برای اعتبارسنجی خروجی بعد از آن استفاده کنیم. به این ترتیب ما می توانیم تضمین کنیم که سرویس های پایین دستی داده هایی را که انتظار دارند دریافت می کنند.
const messageSchema = require('./messages.json');
// existing code
const outputMessage = {
"role": "user",
"content": `Here is a MessageFormat json schema. Please provide an answer in this format when asked to respond with "MessageFormat" schema. ${messageSchema}`
}
messages.push(outputMessage);
پرسیدن سوال
اکنون که چشم انداز را تنظیم کرده ایم، داده های متنی را ارائه کرده ایم و فرمت خروجی مورد نظر را ارائه کرده ایم، اکنون می توانیم سؤال خود را بپرسیم. باور کنید یا نه، این بخش آسان است! ما فقط باید سایر داده هایی را که در آن ارائه کرده ایم به خاطر بسپاریم messages
آرایه تا بتوانیم به آنها ارجاع مناسب دهیم. این سوال در قالبی مشابه پیام های دیگر ما ساخته شده است، اما این بار از آن می خواهیم آنچه را که می خواهیم انجام دهد.
{
"role": "user",
"content": `Answer any unanswered or incorrect questions from that chat history. Be sure to tag the user who asked the question in your answers (use @{username} to tag the user). The answers you come up with should come from a bot with the username "NoQuestionsLeftBehindBot". Structure your answer in the MessageFormat schema.`
}
در اینجا مشاهده می کنید که ما به داده های متنی به عنوان “آن تاریخچه چت” اشاره می کنیم. مدل از کل آرایه داده های ارائه شده می داند که تاریخچه چت چیست، بنابراین می توانیم به سادگی به آن اشاره کنیم. همین مورد برای فرمت خروجی – ما قبلاً به آن گفتهایم که چگونه پاسخ را وقتی گفته شد از طرح MessageFormat استفاده کند، ساختار دهد.
اعتبارسنجی پاسخ
همانطور که قبلاً اشاره کردم، باید فرمت پاسخ را تأیید کنید تا اطمینان حاصل شود که دادهها به شکل صحیح دریافت شدهاند. برای انجام این کار در Node.js، ما از ajv به عنوان اعتبار سنجی خود استفاده می کنیم.
const Ajv = require('ajv');
const addFormats = require('ajv-formats');
const messageSchema = require('./messages.json');
const ajv = new Ajv();
addFormats(ajv);
// code to create message array
const result = await openai.createChatCompletion({
model: 'gpt-4',
temperature: .7,
messages: messages
});
try {
const answerArray = JSON.parse(result.data.choices[0].message.content);
const validate = ajv.compile(messageSchema);
const valid = validate(answerArray);
if (!valid) {
throw new Error ('Invalid data format');
}
return answerArray;
} catch(err) {
console.error(err);
throw new Error ('Invalid data format');
}
اگر دادهها را با فرمت صحیح دریافت نکنیم، میتوانیم قبل از اجرا نشدن و اطلاع دادن به یک انسان، حداکثر تا چند بار دوباره تلاش کنیم. اما در صورت احتمالی که ما انجام دادن دادهها را با فرمتی که انتظار داشتیم دریافت کنید، میتوانیم آنها را به سرویسهای پایین دستی منتقل کنیم. در مورد ربات ما، این پیامها را از طریق اتصال WebSocket ارسال میکند تا پاسخها را مستقیماً به مرورگرهای افرادی که به اتاق چت متصل هستند ارسال کند.
برگزاری مکالمات
همه چیزهایی که ما از آن عبور کردیم برای یک فرمان بود. ترکیبی از چشم انداز، داده ها، فرمت خروجی و سؤال به عنوان یک درخواست در نظر گرفته می شود. اما موارد استفاده زیادی وجود دارد که در آنها باید مکالمه را ادامه دهید و بر روی پاسخ های ارائه شده از ChatGPT بسازید.
هنگامی که ChatGPT به شما پاسخ می دهد، پیامی را با همان قالبی که خودمان ساخته ایم برمی گرداند. تنها تفاوت این است role
دارایی تنظیم خواهد شد دستیار برای نشان دادن پاسخ از خود ChatGPT.
من یک تابع لامبدا مکالمه را در جعبه ابزار بدون سرور خود ایجاد کردم که رفت و آمد بین شما و ChatGPT را حفظ می کند. همه پیامهای دریافتشده از ChatGPT و تمام سؤالاتی که از آن پرسیدهاید را به ترتیب زمانی ضبط میکند. هر بار که با آن تماس می گیرید، به مکالمه موجود می افزاید و به شما امکان می دهد مکالمه کامل را به صورت دستی به مدل ارائه دهید. میتوانید از مهارتهایی که در بالا یاد گرفتیم در رابطه با این تابع Lambda برای ایجاد مکالمات قدرتمند با هوش مصنوعی استفاده کنید.
خلاصه
ایجاد دستورات بسیار دشوارتر از آنچه شما انتظار دارید است. رابط کاربری آسان وب سایت OpenAI تصور نادرستی از آسانی برقراری ارتباط و دریافت پاسخ از یک سرویس هوش مصنوعی مولد ایجاد کرده است.
اعلان به چندین قطعه، بررسی و تعادل، و کمی دانش برای دریافت پاسخ در دیدگاه و شکل درستی که انتظار دارید نیاز دارد. درست مانند برنامه نویسی، ما قرار نیست در روز اول متخصص باشیم. برای اینکه بدانید دقیقاً چگونه می توانید نوع داده ای را که می خواهید از این خدمات بدست آورید، به تمرین و آزمایش نیاز دارد. به عنوان مثال، تکرارهای زیادی طول کشید تا من به نتیجه ای از ربات چت خود در بالا برسم که نتیجه آن خروجی زیر است:
[
{
"username": "NoQuestionsLeftBehindBot",
"message": "@allenheltondev, you get dark gray when mixing purple and green."
},
{
"username": "NoQuestionsLeftBehindBot",
"message": "There are 14 pounds in a stone, @astuyve."
}
]
همانند بسیاری از ارائههای SaaS، ChatGPT و سایر سرویسهای هوش مصنوعی مولد به مرور زمان بهتر خواهند شد. چیزهای بیشتری برای ما رسیدگی خواهد شد، استدلال بهتر خواهد شد، و حتی ممکن است به شما بگوید که چگونه آن را بهتر بیان کنید!
اما یک چیز مطمئن است – هوش مصنوعی از بین نمی رود. محبوبیت و در دسترس بودن آن همچنان به رشد خود ادامه خواهد داد. بنابراین در حالی که ما هنوز در حال پیشگامی هستیم، وارد شوید. وارد شوید، چند برنامه بسازید و از قابلیت های جدیدی که اخیرا قفل آن را باز کرده ایم شگفت زده شوید.
کد نویسی مبارک!