دليل شامل لبناء روبوت محادثة (Chatbot) باستخدام الذكاء الاصطناعي وPython
المقدمة
في هذا الدليل، سنتعلم كيفية بناء روبوت محادثة (Chatbot) باستخدام الذكاء الاصطناعي (AI) وتقنيات تعلم الآلة (Machine Learning). الروبوت سيستخدم مكتبة TensorFlow و Keras لإنشاء نموذج محادثة يعتمد على الشبكات العصبية المتكررة (Recurrent Neural Networks – RNNs) مع خوارزمية Sequence-to-Sequence (Seq2Seq)، وهي معمارية مشهورة لبناء تطبيقات المحادثة.
1. تجهيز بيئة العمل
أولاً، نحتاج إلى إعداد بيئة العمل. يجب أن يكون لدينا مكتبات TensorFlow و Keras مثبتة. كذلك سنحتاج إلى بعض المكتبات الأخرى مثل NLTK لمعالجة اللغة الطبيعية (Natural Language Processing – NLP).
pip install tensorflow keras nltk
2. تحضير البيانات (Data Preparation)
لإنشاء روبوت محادثة، نحتاج إلى بيانات محادثة لتدريب النموذج. يمكننا استخدام مجموعات بيانات جاهزة مثل Cornell Movie Dialogs أو أي بيانات محادثة أخرى. الهدف هو تدريب النموذج على مجموعة من الأسئلة والأجوبة.
مثال:
conversations = [
("Hello!", "Hi, how can I help you?"),
("What's your name?", "I'm an AI chatbot."),
("How are you?", "I'm just a program, but I'm functioning well!"),
("Tell me a joke.", "Why don't scientists trust atoms? Because they make up everything!"),
("Goodbye!", "Goodbye! Have a nice day!")
]
نقوم بتحميل البيانات ثم تجهيزها عن طريق تقسيم الأسئلة والأجوبة وتحويلها إلى توكنات (Tokens) باستخدام مكتبة NLTK لتحليل الجمل.
import nltk
import numpy as np
nltk.download('punkt')
# فصل الأسئلة عن الأجوبة
questions = [conversation[0] for conversation in conversations]
answers = [conversation[1] for conversation in conversations]
# تحويل الجمل إلى كلمات (Tokens)
questions_tokenized = [nltk.word_tokenize(question.lower()) for question in questions]
answers_tokenized = [nltk.word_tokenize(answer.lower()) for answer in answers]
3. تحويل البيانات إلى توكنات (Tokenization)
الخطوة التالية هي تحويل الكلمات إلى أرقام حتى يتمكن النموذج من معالجتها. يمكننا استخدام مكتبة Keras لإنشاء قاموس (Vocabulary) من الكلمات وتحويلها إلى أرقام باستخدام وظيفة Tokenizer
.
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
# إنشاء قاموس وتحويل الكلمات إلى أرقام
tokenizer = Tokenizer()
tokenizer.fit_on_texts(questions_tokenized + answers_tokenized)
# تحويل النصوص إلى تسلسل أرقام
questions_seq = tokenizer.texts_to_sequences(questions_tokenized)
answers_seq = tokenizer.texts_to_sequences(answers_tokenized)
# إضافة padding إلى التسلسل حتى تكون الأطوال موحدة
max_len = 10
questions_seq = pad_sequences(questions_seq, maxlen=max_len, padding='post')
answers_seq = pad_sequences(answers_seq, maxlen=max_len, padding='post')
# معرفة حجم المفردات
vocab_size = len(tokenizer.word_index) + 1
4. بناء نموذج المحادثة باستخدام Seq2Seq
نستخدم نموذج Seq2Seq الذي يعتمد على شبكات LSTM (Long Short-Term Memory). النموذج يتكون من جزئين رئيسيين:
- Encoder: يتعلم كيفية تمثيل السؤال في شكل متجهات (Vectors).
- Decoder: يتعلم كيفية توليد الإجابة بناءً على المتجهات التي تم الحصول عليها من الـ Encoder.
from keras.models import Model
from keras.layers import Input, LSTM, Dense, Embedding
# بناء الـ Encoder
encoder_inputs = Input(shape=(max_len,))
encoder_embedding = Embedding(vocab_size, 64)(encoder_inputs)
encoder_lstm = LSTM(64, return_state=True)
encoder_outputs, state_h, state_c = encoder_lstm(encoder_embedding)
encoder_states = [state_h, state_c]
# بناء الـ Decoder
decoder_inputs = Input(shape=(max_len,))
decoder_embedding = Embedding(vocab_size, 64)(decoder_inputs)
decoder_lstm = LSTM(64, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_embedding, initial_state=encoder_states)
decoder_dense = Dense(vocab_size, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)
# بناء النموذج
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
# تجميع النموذج (Compile)
model.compile(optimizer='adam', loss='categorical_crossentropy')
# عرض ملخص النموذج
model.summary()
5. تدريب النموذج (Training)
بعد بناء النموذج، نقوم بتدريبه باستخدام بيانات الأسئلة والأجوبة. نحتاج أيضًا إلى إضافة Shift إلى الأجوبة بحيث يمكن للنموذج تعلم تسلسل الكلمات في الجمل.
from keras.utils import to_categorical
# تجهيز بيانات الأجوبة (Shift)
decoder_output_data = np.zeros((len(answers_seq), max_len, vocab_size), dtype="float32")
for i, seq in enumerate(answers_seq):
for t, word_index in enumerate(seq):
if t > 0:
decoder_output_data[i, t - 1, word_index] = 1
# تدريب النموذج
model.fit([questions_seq, answers_seq], decoder_output_data, batch_size=32, epochs=500)
6. التنبؤ بإجابات جديدة (Inference)
بعد تدريب النموذج، نحتاج إلى إعداد نموذج التنبؤ (inference) الذي سيتيح للـ Encoder أخذ سؤال جديد، ومن ثم استخدام الـ Decoder لتوليد إجابة. في هذه الخطوة، سنبني نموذجًا للاستخدام بعد التدريب.
# بناء نموذج الـ Encoder للتنبؤ
encoder_model = Model(encoder_inputs, encoder_states)
# بناء نموذج الـ Decoder للتنبؤ
decoder_state_input_h = Input(shape=(64,))
decoder_state_input_c = Input(shape=(64,))
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
decoder_outputs, state_h, state_c = decoder_lstm(
decoder_embedding, initial_state=decoder_states_inputs)
decoder_states = [state_h, state_c]
decoder_outputs = decoder_dense(decoder_outputs)
decoder_model = Model(
[decoder_inputs] + decoder_states_inputs,
[decoder_outputs] + decoder_states)
يمكننا الآن استخدام النموذج للتنبؤ بإجابات بناءً على الأسئلة الجديدة.
def decode_sequence(input_seq):
# الحصول على الحالة من الـ Encoder
states_value = encoder_model.predict(input_seq)
# توليد بداية تسلسل الـ Decoder
target_seq = np.zeros((1, 1))
target_seq[0, 0] = tokenizer.word_index['startseq']
stop_condition = False
decoded_sentence = ''
while not stop_condition:
output_tokens, h, c = decoder_model.predict(
[target_seq] + states_value)
# اختيار الكلمة بتوقع أعلى
sampled_token_index = np.argmax(output_tokens[0, -1, :])
sampled_word = tokenizer.index_word[sampled_token_index]
decoded_sentence += ' ' + sampled_word
# التوقف إذا تم الوصول لنهاية الجملة
if sampled_word == 'endseq' or len(decoded_sentence) > max_len:
stop_condition = True
# تحديث الحالة للتنبؤ التالي
target_seq = np.zeros((1, 1))
target_seq[0, 0] = sampled_token_index
states_value = [h, c]
return decoded_sentence
الخاتمة
في هذا الدليل، تعلمنا كيفية بناء روبوت محادثة باستخدام الذكاء الاصطناعي وتقنيات تعلم الآلة. قمنا باستخدام نموذج Seq2Seq لإنشاء روبوت قادر على التعامل مع تسلسل الأسئلة والأجوبة. يمكنك تحسين النموذج بتدريبه على مجموعات بيانات أكبر وتحسين قدراته في فهم اللغة.
اترك تعليقاً