-
چهارشنبه, ۸ شهریور ۱۴۰۲، ۱۰:۳۴ ق.ظ
-
۸۰۸
سلام دوستان :)
این روزا حتما همتون حداقل یکی از ابزار های معروف هوش مصنوعی مثل ChatGPT, Bing AI, Midjourney و... رو امتحان کردین.
توی پست امروز قراره که یک chatbot که از یک مدل هوش مصنوعی استفاده میکنه و مثل ChatGPT جوابمونو میده بسازیم!
ما توی این پست قرار نیست از API های مدل های آماده مثل GPT-3.5 یا... استفاده کنیم و قراره مدل خودمون رو داشته باشیم و از اول train کنیم پس با من همراه باشید!
اول از همه باید بگم که اینجا قرار نیست که یک شبکه عصبی از اول طراحی کنیم. برای اینکه طراحی همچین شبکه پیچیده ای کار یک پست نیست.
اما این به این معنی نیست که همه چی از قبل پیاده سازی شده بلکه ما میتونیم مدلمون رو کاملا شخصی سازی کنیم! یعنی اینکه این مدل از قبل train نشده و وقتی شما شروع به استفاده ازش کنید هیچ چیز معنی داری نداره که به شما بگه و شما باید از اول با دیتای خودتون، train رو انجام بدید.
چیزی که آخر این پست خواهیم داشت یک chatbot هست که یک جواب با معنی(تقریبا!) به ما میده و اگر بخواید که قابلیت های chatgpt مثل درست کردن کد یا عکس یا ... رو داشته باشه باید از یک مدل پیچیده تر و دیتای خیلی بیشتر استفاده کنید.
مزیتی که این chatbot داره اینه که شما بسته به استفاده ای که ازش خواهید کرد میتونید لحن، طرز صحبت، نوع پاسخ ها و... رو کاملا با دیتای ورودی تنظیم کنید. مثلا شاید یک چت بات برای یک سایت آموزشی یا یک چت بات برای مشاوره در مورد گیاهان!
کار هایی که قراره توی این پست انجام بدیم:
- پیاده سازی اولیه چت بات
- train کردن چت بات برای شخصی سازی کردن پاسخ هاش
- استفاده از دیتا برای train کردن چت بات(توی این مورد یک چت توی واتساپ)
- قابل استفاده کردن دیتا برای مدل با استفاده از regex
- train کردن نهایی چت بات و قابل استفاده کردنش
خب پس بریم شروع کنیم!
اینو بهتون گفتم که قراره از یک مدل شبکه عصبی آماده استفاده کنیم ولی اسمشو نگفتم! اسم مدلی که قراره ازش استفاده کنیم chatterbot هست که میتونید در قالب یک کتابخونه با استفاده از دستور pip نصبش کنید.
برای نصب کتابخونه توی ویندوز وارد cmd بشید و دستور زیر رو وارد کنید:
pip install -U chatterbot==1.0.4 pytz
برای نصب کتابخونه توی مک یا لینوکس هم وارد Terminal بشید و دستور زیر رو وارد کنید:
sudo pip3 install -U chatterbot==1.0.4 pytz
(پارامتر U- برای این هست که پیش نیاز های کتابخونه ها رو هم با خودشون نصب کنه)
مهمه که ورژن chatterbot دقیقا همونی باشه که اینجا گفتم چونکه با این ورژن کد ها رو تست کردم و اگر شما از ورژن دیگه ای استفاده کنید ممکنه برای شما کار نکنه(البته احتمالش خیلی کمه).
خب بعد از اینکه کتابخونه ها رو نصب کردیم بریم که ببینیم این کتابخونه چطور کار میکنه. البته توی این مرحله انتظار چیز خیلی جالبی نداشته باشید چونکه قرار نیست مدل رو train کنیم.
خب قبل از توضیحات بیشتر یک فایل درست کنید و کد های زیر رو توش قرار بدید:
from chatterbot import ChatBot chatbot = ChatBot("Chatbot") exit_conditions = (":q", "quit", "exit") while True: query = input("> ") if query in exit_conditions: break else: print(f"{chatbot.get_response(query)}")
توضیح: خب همونطور که میبینید کد خیلی پیچیده نیست. کلاس ChatBot رو از کتابخونه import ،chatterbot کردیم بعد کلاس چت بات خودمون رو با عنوان chatbot درست کردیم. بعدش پارامتر هایی که اگر واردشون کنیم از برنامه خارج بشه رو تعریف کردیم و داخل حلقه بینهایت هم گفتیم که از کاربر ورودی بگیره و اون رو پردازش کنه و بعد هم جوابشو بنویسه.
خب فایل رو run کنید:
python chatbot.py
(توی مک یا لینوکس به جای python بنویسید python3)
ممکنه که با اجرای فایل شما ببینید که برنامه داره چند تا پکیج برای مدل ها و... دانلود میکنه. اینکار فقط یکبار انجام میشه و دفعات دیگه که اجراش کنید دیگه چیزی دانلود نمیکنه.
خروجی:
> Hello Hello > are you a bot? Hello > can you speak? Hello >
خب به نظر میرسه که فقط داره یک کلمه رو تکرار میکنه.
به نظر فایده ای نداره اما بریم دوباره باهاش صحبت کنیم:
> Hello Hello > How are you? are you a bot? > No How are you? > Thanks I'm fine Hello >
خب الان نسبتا بهتره!
اما چرا؟
در حین اینکه ما با چت باتمون صحبت میکنیم اون از صحبت های ما یاد میگیره و توی یک دیتابیس توی همون مسیر برنامه چیز هایی که یادگرفته رو نگه میداره:
./ ├── chatbot.py ├── db.sqlite3
توی آخرین صحبتی که باهاش داشتیم به نظر میرسه جملاتی که توی اولین بار بهش گفتیم رو ذخیره کرده و اونارو با یک الگو تکرار میکنه اما ما اگر بخوایم واقعا یک چت بات قابل استفاده رو train کنیم این روش یادگیری مناسب نیست و بهتره یک گفتگو از پیش آماده شده رو برای train کردن استفاده کنیم.
قبل از اینکه ادامه بدیم یک فایل درست کنید و اسمش رو بذارید chatbot2 و کد های زیر رو توش وارد کنید:
from chatterbot import ChatBot from chatterbot.trainers import ListTrainer chatbot = ChatBot("Chatbot") trainer = ListTrainer(chatbot) trainer.train([ "Hi", "Welcome, friend", ]) trainer.train([ "Are you a plant?", "No, I'm the pot below the plant!", ]) exit_conditions = (":q", "quit", "exit") while True: query = input("> ") if query in exit_conditions: break else: print(f"{chatbot.get_response(query)}")
توضیح: خب تفاوت این کد با کد قبلی اینه که قبل از اینکه چت بات اجرا بشه با چهار تا مکالمه ساده train میشه و بر اساس اونا پاسخ میده.
خب بریم نتیجه رو ببینیم:
> hi Welcome, friend > are you a plant? No, I'm the pot below the plant! > how are you? hi > hi Welcome, friend > thanks
خب میبینید که بازم بهتر شده!
حالا فرض کنید که ما صد ها جمله رو از یک گفتگوی واقعی استخراج کنیم و مدلمون رو باهاش train کنیم. احتمالا حدس میزنید که این مدل بتونه پاسخ های نسبتا خوبی رو به ما بده.
خب برای استخراج گفتگو کجا بهتر از whatsapp؟!
خب مراحل اینکار رو توی عکس های زیر میبینید:
اول روی اسم مخاطب کلیک کنید:
دوم روی گزینه Export Chat کلیک کنید:
سوم روی گزینه without media کلیک کنید چون که عکس و فیلم بدردمون نمیخورن:
خب بعد از اینکه کارتون تموم شد فایل خروجی رو به کامپیوترتون منتقل کنید و بذارید کنار فایل برنامه.
اگر که گفتگوی بدرد بخوری توی واتساپ ندارید من یک فایل آماده از روی اینترنت پیدا کردم که دو نفر در مورد گیاهان صحبت میکنن. برای دانلود کلیک کنید.
اگر یکم توی زمینه تحلیل داده کار کرده باشید میدونید که داده ای که توی دستتونه خیلی احتمالش کمه که بدون هیچ تغییری بشه ازش استفاده کرد. برای همین یک کد پایتون با استفاده از regex مینویسیم که بتونیم دیتا رو آماده پردازش برای مدل کنیم.
پس قبل از اینکه ادامه بدیم یک فایل پایتون درست کنید و اسمشو بذارید cleaner.py و کد های زیر رو داخلش وارد کنید:
import re def remove_chat_metadata(chat_export_file): date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" dash_whitespace = r"\s-\s" username = r"([\w\s]+)" metadata_end = r":\s" pattern = date_time + dash_whitespace + username + metadata_end with open(chat_export_file, "r") as corpus_file: content = corpus_file.read() cleaned_corpus = re.sub(pattern, "", content) return tuple(cleaned_corpus.split("\n")) if __name__ == "__main__": print(remove_chat_metadata("PATH"))
توضیح: خب این یکی کد توضیح خاصی نداره و با استفاده از regex داده خروجی واتساپ رو آماده برای استفاده کرده. اگر فایل خروجی رو داخل یک text editor باز کنید میبینید که دقیقا این کد مناسب تمیز کردن فایل خروجی هست! فقط حواستون باشه که به جای PATH آدرس فایل خروجی واتساپ رو بذارید.
خب ما قرار نیست مستقیم از این کد استفاده کنیم و قراره که به عنوان یک کتابخونه توی فایل اصلی برنامه chatbot ازش استفاده کنیم برای همین بهتره این کد رو این شکلی بنویسید:
import re def clean_corpus(chat_export_file): message_corpus = remove_chat_metadata(chat_export_file) cleaned_corpus = remove_non_message_text(message_corpus) return cleaned_corpus def remove_chat_metadata(chat_export_file): date_time = r"(\d+\/\d+\/\d+,\s\d+:\d+)" dash_whitespace = r"\s-\s" username = r"([\w\s]+)" metadata_end = r":\s" pattern = date_time + dash_whitespace + username + metadata_end with open(chat_export_file, "r") as corpus_file: content = corpus_file.read() cleaned_corpus = re.sub(pattern, "", content) return tuple(cleaned_corpus.split("\n")) def remove_non_message_text(export_text_lines): messages = export_text_lines[1:-1] filter_out_msgs = ("<Media omitted>",) return tuple((msg for msg in messages if msg not in filter_out_msgs))
توضیح: این کد هم مثل همون کد قبلیه فقط برای استفاده به عنوان کتابخونه مناسب تره.
الان وقتشه که بریم سراغ کد نهایی و خروجی نهایی(همون چیزی که از اول پست منتظرشیم!).
قبل از اینکه ادامه بدیم یک فایل پایتون درست کنید و اسمشو بذارید bot.py و کد های زیر رو داخلش قرار بدید:
from chatterbot import ChatBot from chatterbot.trainers import ListTrainer from cleaner import clean_corpus CORPUS_FILE = "PATH" chatbot = ChatBot("Chatbot") trainer = ListTrainer(chatbot) cleaned_corpus = clean_corpus(CORPUS_FILE) trainer.train(cleaned_corpus) exit_conditions = (":q", "quit", "exit") while True: query = input("> ") if query in exit_conditions: break else: print(f"🪴 {chatbot.get_response(query)}")
توضیح: این کد دقیقا مشابه همون اولین کدی که برای train کردن نوشتیم هست. فرقی که داره اینه که با استفاده از کتابخونه ای که درست کردیم از روی فایل خروجی واتساپ tain میشه!
خب بریم نتیجه نهایی رو ببینیم:
> hi 🪴 Welcome, friend > thanks 🪴 Kudos go mostly to my dad > good 🪴 They are doing ok but not great > do you grow any crops? 🪴 I haven't graduated to plastic plants yet > oh 🪴 Motivational speeches > LOL 🪴 It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 > Yes It's pretty bad 🪴 Oh really? > really 🪴 What happened? > all the leaves destroyed 🪴 It‘s like she’s changing her summer jacket to a winter jacket > lol 🪴 It's depressing when lil monstera keeps making new leaves for them just to get infected 😢 > yes 🪴 I haven't even heard of Avodacos! > really, I like them 🪴 😂 >
ببینید چقدر خوبه! تازه شوخ طبع هم هست:)
خب رسیدیم به آخر کار. همونطور که دیدید الان ما یک چت بات داریم که میتونیم باهاش صحبت کنیم. من بر اساس دیتای خودم اون رو train کردم برای همین بیشتر توی فاز گیاهیه! اما شما بر اساس نیازتون میتونین رباتی داشته باشید که در مورد هر چیزی که میخواید حرف بزنه و هر کاربردی که میخواید داشته باشه.
امیدوارم این پست براتون مفید بوده باشه D: