بناء روبوت محادثة Python باستخدام NLTK

اعتبارها أكبر شركة أبحاث واستشارات في العالم ، توقعت شركة Gartner أنه بحلول عام 2020 ، ستتعامل روبوتات المحادثة مع 85٪ من تفاعلات خدمة العملاء. تدير روبوتات الدردشة الآن حوالي 30٪ من هذه المعاملات. في هذه المقالة ، سوف نتعلم كيفية إنشاء روبوت محادثة Python بمساعدة حزمة NLTK.
ربما سمعت عن Duolingo الآن. يقدم هذا التطبيق الشهير طريقة لتعلم لغة من خلال ممارسة مرحة للغة جديدة. سبب شعبيتها هو أساليب تدريس اللغة الأجنبية المبتكرة. المفهوم بسيط: خمس إلى عشر دقائق من التدريب التفاعلي يوميًا تكفي لتعلم لغة.
ومع ذلك ، على الرغم من حقيقة أن Duolingo قد منح الناس الفرصة لتعلم لغة جديدة ؛ لكن مستخدميها لديهم قلق. يشعر الناس أنهم يفقدون فرصة تعلم مهارات المحادثة القيمة لأنهم تعلموا اللغة بشكل مستقل تمامًا. كما أن هؤلاء الأشخاص يخشون التحدث مع متعلمي تلك اللغة الآخرين ، لأنهم يعانون من عدم الثقة بالنفس. تم العثور على هذا ليكون عنق الزجاجة الرئيسية في خرائط Duolingo.
وبالتالي ، حل فريقهم هذه المشكلة عن طريق إنشاء روبوت محادثة محلي داخل التطبيق. يساعد روبوت المحادثة هذا المستخدمين على تعلم مهارات المحادثة وممارسة ما تعلموه.
نظرًا لأن الروبوتات مصممة لتكون محادثة وودودة ، يمكن لمتعلمي Duolingo الدردشة معهم في أي وقت من اليوم واستخدام شخصياتهم الخاصة حتى يصبحوا شجعانًا بما يكفي لممارسة لغتهم الجديدة مع المتحدثين الآخرين. بهذه الطريقة ، أصبح حل أحد الاهتمامات الرئيسية للعملاء والتعلم من خلال هذا التطبيق أكثر إثارة للاهتمام.
ما هو الشات بوت؟
"chatbot" هو في الواقع نوع من البرامج يستخدم الذكاء الاصطناعي على جهاز (مثل Siri أو Alexa أو مساعد Google وما إلى ذلك) أو تطبيق أو موقع ويب أو شبكات أخرى تحاول قياس احتياجات العملاء ثم الاستجابة لها في Assist في أداء مهام محددة مثل المعاملات التجارية ، وحجوزات الفنادق ، وتقديم النماذج ، وما إلى ذلك. اليوم ، تستخدم كل شركة تقريبًا chatbot لتقييم المستخدمين. فيما يلي بعض الطرق التي تستخدم بها الشركات روبوتات المحادثة:
- توفير معلومات الرحلة
- ربط العملاء والحسابات المالية
- دعم العملاء
- إمكانيات استخدام روبوتات المحادثة (تقريبًا) غير محدودة.
يعود تاريخ روبوتات المحادثة إلى عام 1966 عندما اخترع Weizenbaum برنامج كمبيوتر يسمى ELIZA. قام روبوت المحادثة هذا بمحاكاة لغة المعالج النفسي باستخدام 200 سطر فقط من التعليمات البرمجية. يمكنك التحدث إلى Eliza على هذا العنوان (+).
كيف يعمل الشات بوت؟
هناك نسختان رئيسيتان من روبوتات المحادثة ، أحدهما "مستند إلى القواعد" والآخر "التعلم الذاتي".
- في النهج القائم على القواعد ، يجيب الروبوت على الأسئلة بناءً على بعض القواعد التي تم تدريبه عليها. يمكن تعريف هذه القواعد ببساطة شديدة أو معقدة للغاية. يمكن لهذه الروبوتات إدارة الاستعلامات البسيطة ؛ لكنهم غير قادرين على إدارة الاستفسارات المعقدة.
- روبوتات "التعلم الذاتي" هي تلك التي تستخدم بعض الأساليب القائمة على التعلم الآلي وهي بالتأكيد أكثر كفاءة من الروبوتات القائمة على القواعد. يمكن أن تكون هذه الروبوتات من نوعين: "قائم على الاسترداد" أو "عام".
النماذج القائمة على الاسترجاع
في هذه النماذج ، يستخدم روبوت المحادثة نوعًا من الحدس لاختيار إجابة من مكتبة الإجابات المحددة مسبقًا. يستخدم chatbot الرسالة وسياق المحادثة لتحديد أفضل رد من قائمة محددة مسبقًا لرسائل الروبوت. يمكن أن يتضمن سياق المحادثة الموضع الحالي في شجرة المحادثة وجميع المحادثات السابقة في المحادثة والمتغيرات المحفوظة مسبقًا (مثل أسماء المستخدمين) والمزيد. يمكن تصميم الحدس لاختيار الاستجابات بعدة طرق ، بدءًا من المنطق الشرطي القائم على القواعد إذا كان آخرًا إلى طرق تصنيف التعلم الآلي.
نماذج الإنتاج
يمكن للروبوتات أيضًا إنشاء استجابات ولا يتعين عليها دائمًا الاختيار من بين مجموعة من الردود المحددة مسبقًا. هذا الموقف يجعلهم يصبحون كائنات ذكية ويقدمون إجابات عن طريق اختيار كلمة بكلمة من الاستعلام.
في هذه المقالة ، نقوم ببناء روبوت محادثة بسيط قائم على الاسترداد باستخدام مكتبة NLTK Python.
قم ببناء روبوت
في هذا القسم ، يتم شرح الخطوات المطلوبة لبناء الروبوت.
المتطلبات الأساسية
من المفترض أن لديك معرفة أساسية بمكتبة scikit و NLTK. ومع ذلك ، إذا كنت جديدًا في معالجة اللغات الطبيعية ، فلا يزال بإمكانك الاستفادة من هذه المقالة ثم الرجوع إلى الموارد.
البرمجة اللغوية العصبية
يركز هذا المجال من الدراسة على التفاعلات بين لغة الإنسان وأجهزة الكمبيوتر ويسمى باختصار "معالجة اللغة الطبيعية" أو NLP. يقع هذا المجال العلمي عند التقاطع بين علوم الكمبيوتر والذكاء الاصطناعي واللغويات الحاسوبية. البرمجة اللغوية العصبية هي طريقة تستخدمها أجهزة الكمبيوتر لتحليل وفهم وفهم اللغة البشرية بطريقة ذكية ومفيدة. باستخدام البرمجة اللغوية العصبية ، يمكن للمطورين اكتساب المعرفة لأداء مهام مثل التلخيص التلقائي والترجمة والتعرف على الكيانات المسماة واستخراج العلاقة وتحليل المشاعر والتعرف على الكلام وتصنيف الموضوع.
مقدمة موجزة عن NLTK
NLTK ، التي تعني Natural Language Toolkit ، هي منصة رائدة لبناء برامج Python مع بيانات اللغة البشرية. يوفر النظام الأساسي واجهات سهلة الاستخدام لأكثر من 50 مصدرًا نصيًا ومعجميًا مثل WordNet ، ويوفر مجموعة من مكتبات معالجة النصوص للتصنيف والترميز والاشتقاق والعلامات والتحليل والاستدلال العاطفي وأغلفة لمكتبات البرمجة اللغوية العصبية القوية ..
تم وصف NLTK بأنها "أداة رائعة للتعلم والعمل مع اللغويات الحاسوبية في Python" و "مكتبة رائعة للعمل مع اللغة الطبيعية".
توفر معالجة اللغة الطبيعية في Python (+) مقدمة عملية لبرمجة معالجة اللغة. نوصي بقراءة هذا الكتاب للأشخاص الذين يرغبون في بدء العمل مع البرمجة اللغوية العصبية في بايثون.
قم بتنزيل وتثبيت NLTK
قم بتشغيل الأمر التالي لتثبيت NLTK:
pip install nltk
يمكنك التأكد من صحة التثبيت عن طريق تشغيل الأوامر التالية:
python
import nltk
تثبيت حزم NLTK
قم باستيراد NLTK وقم بتشغيل الأمر التالي:
nltk.download()
يفتح الأمر أعلاه أداة تنزيل NLTK وفي هذا القسم يمكنك تحديد مجموعة النصوص والنماذج التي تريد تنزيلها. يمكنك أيضًا تحديد جميع الحزم مرة واحدة.
معالجة النص باستخدام NLTK
تكمن المشكلة الرئيسية في البيانات النصية في أنها بشكل عام بتنسيق نصي (سلسلة). ومع ذلك ، تتطلب خوارزميات التعلم الآلي نوعًا من متجه الميزات العددية لأداء مهامها. لذلك ، قبل بدء العمل في أي مشروع من مشاريع البرمجة اللغوية العصبية ، يجب أن نقوم بمعالجته مسبقًا لجعله مناسبًا للعمل. تشمل المراحل الأولية للمعالجة المسبقة ما يلي:
- تحويل النص بأكمله إلى أحرف كبيرة أو صغيرة. بهذه الطريقة ، لا تعامل الخوارزمية نفس الكلمة بشكل مختلف في أوضاع مختلفة.
- الترميز: Tokenization هو مصطلح يستخدم لوصف عملية تحويل السلاسل النصية العادية إلى قائمة من الرموز ، أي الكلمات التي نريدها في العمل. يمكن استخدام رمز الجملة للعثور على قائمة من الجمل ويمكن استخدام كلمة tokenizer للعثور على قائمة بالكلمات في سلسلة.
تتضمن حزم بيانات NLTK الرموز المميزة Punkt المدربة مسبقًا للغة الإنجليزية.
- إزالة الضوضاء: تتم إزالة أي شيء ليس حرفًا أو رقمًا قياسيًا من النص.
- إزالة كلمات التوقف: في بعض الحالات ، تتم إزالة الكلمات الشائعة جدًا التي يبدو أنها ذات قيمة قليلة جدًا في المساعدة على تحديد المستندات وتلبية احتياجات المستخدم تمامًا من القاموس. هذه الكلمات تسمى كلمات التوقف.
- Stemming: Stemming هو العملية التي يتم فيها تحويل الكلمات المشتقة أو اللاحقة إلى شكل جذري أو جذر ، وهو بشكل عام الشكل المكتوب للكلمة. لتقديم مثال على التجذير ، يجب أن نقول أنه إذا أردنا تجذير الكلمات Stems و Stemming و Stemmed و Stemtization ، فسنصل إلى كلمة "جذع".
- Lemmatization: هذه الطريقة هي نسخة مختلفة قليلاً من التجذير. الفرق الرئيسي بين الاثنين هو أن التجذير غالبًا ما ينتج عنه كلمات غير موجودة ، في حين أن غير الكلمات هي كلمات حقيقية. لذلك فإن الكلمة التي تم الحصول عليها في نهاية عملية التجذير قد لا تكون شيئًا يمكن العثور عليه في القاموس ؛ لكن المصطلح يمكن العثور عليه بالتأكيد في القواميس. أمثلة على الاشتقاق هي الكلمة run ، وهي أصل لكلمات مثل الجري أو الركض ، وكلمات مثل أفضل أو جيد موجودة في جذع مشترك ، وبالتالي فهي تعتبر ذات جذع مشترك.
حقيبة الكلمات
بعد المرحلة الأولى من المعالجة المسبقة للنص ، نحتاج إلى تحويله إلى متجه (أو مصفوفة) ذات معنى من الأرقام. حقيبة الكلمات هي تمثيل للنص الذي يصف حدوث الكلمات في المستند. هذه النمذجة لها نقطتان:
- معجم الكلمات المألوفة
- مقياس لوجود الكلمات المعروفة
قد تسأل نفسك لماذا نطلق عليها "كيس" من الكلمات؟ والسبب في ذلك هو أنه في هذه المرحلة ، تتم إزالة أي معلومات حول ترتيب الكلمات أو هيكلها في المستند ، ويقوم النموذج فقط بفحص ما إذا كانت الكلمة المعروفة المفترضة موجودة في المستند ولا يعد موقع حدوثها مهمًا.
الحدس وراء حقيبة الكلمات هو أن المستندات النصية تعتبر متشابهة إذا كانت تحتوي على محتوى مشابه. أيضًا ، يمكننا استخلاص استنتاجات حول معنى المستند من محتواه فقط.
على سبيل المثال ، إذا احتوى القاموس على الكلمات {Learning، is، the، not، great} وأردنا توجيه النص "التعلم رائع" ، فسنحصل على المتجه التالي:
(1, 1, 0, 0, 1)
نهج TF-IDF
هناك مشكلة في نهج حقيبة الكلمات وهي أن الكلمات ذات التردد العالي ستغطي المستند بأكمله (أي الحصول على درجة أعلى) ولكنها قد لا تحتوي على الكثير من المحتوى الإعلامي. كما أنه يزيد من وزن المستندات الأطول مقارنة بالمستندات الأقصر.
تتمثل إحدى طرق معالجة هذه المشكلة في إعادة قياس تواتر الكلمات وفقًا لمقدار ظهورها في جميع المستندات ، وبالتالي فإن درجات الكلمات ذات التردد العالي مثل التي ستكون عالية في جميع المستندات وبالتالي سيتم تحييد تأثيرها. يُطلق على هذا النهج لتسجيل النقاط مصطلح "تردد المستند المعكوس للتردد" (TF-IDF) حيث ينطبق ما يلي.
تردد المصطلح هو تصنيف لتكرار الكلمة المفترضة في المستند الحالي:
TF = (Number of times term t appears in a document)/(Number of terms in the document)
و Inverse Document Frequency هو تصنيف ندرة الكلمة في المستندات الأخرى:
IDF = 1+log(N/n), where, N is the number of documents and n is the number of documents a term t has appeared in.
وزن TF-IDF هو وزن يستخدم غالبًا في استرجاع المعلومات واستخراج النصوص. هذا الوزن هو مقياس إحصائي يستخدم لتقييم أهمية كلمة في مستند في مجموعة نصية:
مثال:
ضع في اعتبارك مستندًا يحتوي على 100 كلمة وتظهر كلمة هاتف 5 مرات. تردد المصطلح (أي TF) للهاتف يساوي 5.100 = 0.05. لنفترض الآن أن لدينا مستندًا يحتوي على 100 مليون كلمة تكررت فيه كلمة هاتف 1000 مرة. في هذه الحالة ، يتم حساب تردد المستند العكسي (IDF) على أنه 4 = 1000000/1000. وبالتالي ، فإن الوزن النهائي لـ TF-IDF سيكون 0.20 = 4 * 0.05.
يمكن استخدام TF-IDF في تعلم Scikit على النحو التالي:
from sklearn.feature_extraction.text import TfidfVectorizer
تشابه جيب التمام
TF-IDF هو تحويل مطبق على النصوص للحصول على متجهين حقيقيين في فضاء متجه. يمكننا بعد ذلك الحصول على تشابه جيب التمام لكل زوج من المتجهات باختيار حاصل الضرب النقطي والقسمة على حاصل الضرب السلس. بهذه الطريقة ، يتم الحصول على جيب التمام للزاوية بين المتجهات. تشابه جيب التمام هو مقياس للتشابه بين متجهين غير صفريين. باستخدام هذه الصيغة ، يمكننا إيجاد التشابه بين وثيقتين d1 و d2 على النحو التالي:
Cosine Similarity (d1, d2) = Dot product(d1, d2) / ||d1|| * ||d2||
حيث d1 و d2 هما متجهان غير صفريين.
الآن بعد أن أصبح لدينا فكرة شاملة إلى حد ما عن معالجة البرمجة اللغوية العصبية ، حان الوقت لبدء العمل الحقيقي لإنشاء روبوت محادثة. نحن نطلق على chatbot الخاص بنا ROBO.
استيراد المكتبات المطلوبة
يمكنك استخدام الأوامر التالية لاستيراد المكتبات المطلوبة:
import nltk
import numpy as np
import random
import string # to process standard python strings
مجموعة من النصوص
على سبيل المثال ، سوف نستخدم صفحة ويكيبيديا على روبوتات الدردشة (+). انسخ محتوى الصفحة والصقه في ملف نصي يسمى chatbot.txt. بالطبع ، يمكنك استخدام أي مجموعة نصية كما يحلو لك.
إقرأ البيانات
نقرأ الملف النصي chatbot.txt ونحول النص بأكمله إلى قائمة من الجمل وقائمة بالكلمات للمعالجة المسبقة.
f=open('chatbot.txt','r',errors = 'ignore')
raw=f.read()
raw=raw.lower()# converts to lowercase
nltk.download('punkt') # first-time use only
nltk.download('wordnet') # first-time use only
sent_tokens = nltk.sent_tokenize(raw)# converts to list of sentences
word_tokens = nltk.word_tokenize(raw)# converts to list of words
فيما يلي مثال على sent_tokens و word_tokens:
sent_tokens[:2]
['a chatbot (also known as a talkbot, chatterbot, bot, im bot, interactive agent, or artificial conversational entity) is a computer program or an artificial intelligence which conducts a conversation via auditory or textual methods.',
'such programs are often designed to convincingly simulate how a human would behave as a conversational partner, thereby passing the turing test.']
word_tokens[:2]
['a', 'chatbot', '(', 'also', 'known']
المعالجة المسبقة للنص الخام
نحتاج الآن إلى تحديد وظيفة تسمى LemTokens تأخذ الرموز المميزة كمدخلات وتعيد الرموز المميزة:
lemmer = nltk.stem.WordNetLemmatizer()
#WordNet is a semantically-oriented dictionary of English included in NLTK.
def LemTokens(tokens):
return [lemmer.lemmatize(token) for token in tokens]
remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
def LemNormalize(text):
return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))
مطابقة الكلمات الرئيسية
ثم سنحدد وظيفة مسؤولة عن التحية من الروبوت ، أي إذا قال المستخدم مرحبًا ، سيستجيب الروبوت بكلمة مرحبًا ومرحبًا. تستخدم ELIXA مطابقة كلمات رئيسية بسيطة للتحية. نحن أيضا نستخدم مفاهيم مماثلة هنا.
GREETING_INPUTS = ("hello", "hi", "greetings", "sup", "what's up","hey",)
GREETING_RESPONSES = ["hi", "hey", "*nods*", "hi there", "hello", "I am glad! You are talking to me"]
def greeting(sentence):
for word in sentence.split():
if word.lower() in GREETING_INPUTS:
return random.choice(GREETING_RESPONSES)
توليد الإجابات
يتم استخدام مفهوم تشابه المستندات لتوليد استجابة من الروبوت لأسئلة الإدخال. بهذه الطريقة نبدأ عملنا باستيراد الوحدات المطلوبة.
نقوم باستيراد وحدة TFidf vectorizer (+) من مكتبة scikit Learn لتحويل مجموعة من المستندات الأولية إلى مصفوفة من ميزات TF-IDF.
from sklearn.feature_extraction.text import TfidfVectorizer
نقوم أيضًا باستيراد وحدة تشابه جيب التمام (+) من مكتبة scikit Learn.
from sklearn.metrics.pairwise import cosine_similarity
تُستخدم هذه الوحدة للعثور على التشابه بين الكلمات التي أدخلها المستخدم والكلمات الموجودة في النص. هذا هو أبسط تنفيذ ممكن لبرنامج chatbot.
نحدد وظيفة تسمى الاستجابة التي تبحث عن نهج المستخدم لواحدة أو أكثر من الكلمات الرئيسية المعروفة وتعيد عدة ردود محتملة. إذا لم يتطابق مع إدخال أي كلمات رئيسية ، فسيتم عرض رد بـ "أنا آسف! لا أفهمك".
def response(user_response):
robo_response=''
sent_tokens.append(user_response)
TfidfVec = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english')
tfidf = TfidfVec.fit_transform(sent_tokens)
vals = cosine_similarity(tfidf[-1], tfidf)
idx=vals.argsort()[0][-2]
flat = vals.flatten()
flat.sort()
req_tfidf = flat[-2]
if(req_tfidf==0):
robo_response=robo_response+"I am sorry! I don't understand you"
return robo_response
else:
robo_response = robo_response+sent_tokens[idx]
return robo_response
أخيرًا ، نحدد الخطوط التي نريد أن يعبر عنها الروبوت في بداية ونهاية المحادثة اعتمادًا على مدخلات المستخدم.
flag=True
print("ROBO: My name is Robo. I will answer your queries about Chatbots. If you want to exit, type Bye!")
while(flag==True):
user_response = input()
user_response=user_response.lower()
if(user_response!='bye'):
if(user_response=='thanks' or user_response=='thank you' ):
flag=False
print("ROBO: You are welcome..")
else:
if(greeting(user_response)!=None):
print("ROBO: "+greeting(user_response))
else:
print("ROBO: ",end="")
print(response(user_response))
sent_tokens.remove(user_response)
else:
flag=False
print("ROBO: Bye! take care..")
وهكذا عملنا على وشك الانتهاء. لقد قمنا بترميز أول روبوت محادثة لنا في NLTK. يمكنك رؤية الكود بالكامل مع المجموعة النصية على عنوان GitHub (+).
الكود المصدري الكامل لبرنامج chatbot الخاص بنا هو كما يلي:
# coding: utf-8
# # Meet Robo: your friend
import nltk
import warnings
warnings.filterwarnings("ignore")
# nltk.download() # for downloading packages
import numpy as np
import random
import string # to process standard python strings
f=open('chatbot.txt','r',errors = 'ignore')
raw=f.read()
raw=raw.lower()# converts to lowercase
#nltk.download('punkt') # first-time use only
#nltk.download('wordnet') # first-time use only
sent_tokens = nltk.sent_tokenize(raw)# converts to list of sentences
word_tokens = nltk.word_tokenize(raw)# converts to list of words
sent_tokens[:2]
word_tokens[:5]
lemmer = nltk.stem.WordNetLemmatizer()
def LemTokens(tokens):
return [lemmer.lemmatize(token) for token in tokens]
remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
def LemNormalize(text):
return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))
GREETING_INPUTS = ("hello", "hi", "greetings", "sup", "what's up","hey",)
GREETING_RESPONSES = ["hi", "hey", "*nods*", "hi there", "hello", "I am glad! You are talking to me"]
# Checking for greetings
def greeting(sentence):
"""If user's input is a greeting, return a greeting response"""
for word in sentence.split():
if word.lower() in GREETING_INPUTS:
return random.choice(GREETING_RESPONSES)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# Generating response
def response(user_response):
robo_response=''
sent_tokens.append(user_response)
TfidfVec = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english')
tfidf = TfidfVec.fit_transform(sent_tokens)
vals = cosine_similarity(tfidf[-1], tfidf)
idx=vals.argsort()[0][-2]
flat = vals.flatten()
flat.sort()
req_tfidf = flat[-2]
if(req_tfidf==0):
robo_response=robo_response+"I am sorry! I don't understand you"
return robo_response
else:
robo_response = robo_response+sent_tokens[idx]
return robo_response
flag=True
print("ROBO: My name is Robo. I will answer your queries about Chatbots. If you want to exit, type Bye!")
while(flag==True):
user_response = input()
user_response=user_response.lower()
if(user_response!='bye'):
if(user_response=='thanks' or user_response=='thank you' ):
flag=False
print("ROBO: You are welcome..")
else:
if(greeting(user_response)!=None):
print("ROBO: "+greeting(user_response))
else:
print("ROBO: ",end="")
print(response(user_response))
sent_tokens.remove(user_response)
else:
flag=False
print("ROBO: Bye! take care..")
حان الوقت الآن لنرى كيف يتفاعل الروبوت لدينا مع البشر:
أداؤها ليس سيئا للغاية. على الرغم من حقيقة أن الشات بوت لا يمكنه تقديم إجابات مرضية لبعض الأسئلة ، إلا أنه يعمل بشكل جيد مع بعض الأسئلة الأخرى.
كلمة أخيرة
على الرغم من أن chatbot الخاص بنا يعتبر روبوتًا بسيطًا للغاية ومهاراته المعرفية محدودة للغاية ، إلا أنها طريقة جيدة للتعرف على البرمجة اللغوية العصبية وروبوتات الدردشة. على الرغم من أن ROBO تستجيب لمدخلات المستخدم ، إلا أنه لا يمكنك خداع أصدقائك بها ، وبالنسبة لنظام الإنتاج ، فأنت بحاجة إلى الرجوع إلى أحد الأنظمة الأساسية أو أطر العمل الحالية. سيساعدك هذا المثال على التفكير في تصميم وتحديات إنشاء روبوت محادثة. الإنترنت مليء بالموارد المختلفة وبعد قراءة هذا المقال نحن على يقين من أنك متحمس جدًا لإنشاء روبوت محادثة خاص بك.
ما هو رد فعلك؟






