وبلاگ فربد | Farbod Blog

توی این وبلاگ راجع به پروژه هام صحبت می کنم

ساخت ربات چت با هوش مصنوعی در پایتون

  • ۸۰۸

سلام دوستان :)

این روزا حتما همتون حداقل یکی از ابزار های معروف هوش مصنوعی مثل 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:


  • متشکرم از پاسخگوییتون
    من دوباره به مشکل خوردم و این دفعه بعد انجام تمامی مراحل موقع ران با این ارور ها مواجه میشم ممنون میشم راهنماییم بکنید
    File "bot.py", line 10, in
    cleaned_corpus = clean_corpus(CORPUS_FILE)
    File "C:\Users\my\cleaner.py", line 5, in clean_corpus
    message_corpus = remove_chat_metadata(chat_export_file)
    File "C:\Users\my\cleaner.py", line 18, in remove_chat_metadata
    content = corpus_file.read()
    File "C:\Users\my\AppData\Local\Programs\Python\Python36\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
    UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 8419: character maps to
    پاسخ:
    سلام دوست عزیز.
    البته که قاعدتا نباید همچین اروری می گرفتید ولی این ارور شما به علت اینه که encoding فایل شما با برنامه نمیخونه.
    توی فایل کتابخونه ای که خودمون تعریف کردیم بخش with open، داخل تابع open بعد از پارامتر اسم فایل پارامتر encoding رو به این صورت قرار بدید:
    encoding="utf8"
     اگر هر جای دیگه ای هم همچین تابعی بود این پارامتر رو اضافه کنید.(کاما فراموش نشه!) بعد از اون هم دوباره برنامه رو امتحان کنید و باید درست شده باشه.
    اگه نشد کلا کتابخونه و هر چی فایل داره رو پاک کنید و دوباره نصب کنید.
    .موفق باشید
  • سلام و عرض ادب من همه مراحلی که گفتید رو انجام دادم ولی هنگام run این خطا رو دارم
    ممنوم میشم راهنماییم کنید
    python: can't open file 'chatbot.py': [Errno 2] No such file or directory
    پاسخ:
    سلام دوست عزیز
    مطمعنید که اسم فایل پایتونتون chatbot.py هست؟
    اگر آره توی cmd یا ترمینالتون، working directory درستی رو انتخاب کردید؟
    اگر از این دو مورد مطمعن باشید ارور برطرف میشه چون ارور مربوط به پیدا نکردن فایلی برای اجرا هست و اصلا فایل برنامه پیدا نشده.
    موفق باشید.

  • سلام پستاتون واقعا عالین. فقط یک سوالی داشتم. اگر بخوام این چت بات قابلیت گشتن توی اینترنت رو داشته باشه و جواب سوال ها رو با توجه به نتیجه گیری خودش از چند وبسایت خاصی بده، چطور باید کدش رو بزنم؟ و برای پست بعدی میخواستم پیشنهاد بدم. الان هوش مصنوعی برای تقلید صدا با توجه به دیتای ورودی وجود داره که صدا رو میگیره و لحجه، استرس پترن . تن صدا رو تقلید میکنه و تبدیلش میکنه به یک فایل tts که هر چی بهش بدی رو با همون لحجه میگه. اگر بتونین یک پست هم راجع به اون هوش مصنوعی بسازید فکر میکنم خیلی جذاب بشه.
    به هر حال که پستاتون بسیار عالی و بروز هستن و واقعا خوندنشون لذت بخشه.
    پاسخ:
    سلام دوست عزیز.
    خیلی ممنون از نظر لطفتون.
    حتما همچین پستی در آینده خواهیم داشت.
    برای اینکه بخواید چت بات رو تحت وب کنید میتونید از فریم ورک های تحت پایتون مثل django یا flask استفاده کنید. توی همین وبلاگ هم یک سری پست در مورد django وجود داره. برای اینکه بتونه توی اینترنت بگرده باید از تکنیک های مختلف وب اسکرپینگ استفاده کنید. برای مثال کتابخونه beautifulsoup میتونه بهتون خیلی کمک کنه. اول باید جستجو رو در گوگل انجام بدید و بعد نتایج رو دسته بندی کنید و نمایش بدید. البته این کار خودش برای اینکه تمیز در بیاد احتمالا به یک مدل هوش مصنوعی دیگه نیاز داشته باشه ولی فعلا همینجوری هم میشه انجام داد.
    اگر راهنمایی بیشتر نیاز داشتید میتونید همینجا یا توی ایمیل سوالتون رو بپرسید.
    موفق باشید.
  • خیلی خوب بود خدا وکیلی
    توصیه می کنم به همه تا تهش برید و این کدها رو بزنید نتیجش شگفت زدتون می کنه


    پاسخ:
    سلام دوست عزیز.
    خوشحالم که این پست برای شما مفید واقع شده.
    موفق باشید.
  • درود بر شما
    واقعا سورپرایز شدم با دیدن این پست
    همیشه آموزش هاتون به روز و کاربردی هستند
    واقعا ممنونم ازتون
    بینظیرید
    پاسخ:
    سلام دوست عزیز.
    ممنون از نظرتون و خوشحالم که این پست برای شما مفید واقع شده.
    موفق باشید.
  • سلام و عرض ادب خدمت استاد بزرگ
    من این کدها رو امتحان کردم و نتیجش واقعا شگفت انگیز بود
    عاااااااااااااااااالی عااااااااااااااااالی عاااااااااااااالی
    پاسخ:
    سلام دوست عزیز.
    خوشحالم که این پست براتون مفید بوده و ممنون از نظرتون.
    موفق باشید.
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی