تولید و یکدست سازی چت بات اندرویدی با Dialogflow – راهنمای مقدماتی
Dialogflow از خدمتهای گوگل میباشد که پیش از اینً به اسم API.ai شناخته میشد و پلتفرمی بهتر برای توسعه و گسترش چتباتها برای پلتفرمهای متعدد میباشد. راهنماها و مستندات متعددی برای کسانی که جدیدا استارت به یادگیری و به کارگیری از این پلتفرم برای ایجاد کرد چتبات نمودهاند وجود دارا هستند. با این وجود، مدد از اندروید و iOS به خیر و خوبی مستندسازی نشده میباشد.
تا تا قبل از این که Dialogflow به اسم API.ai نامیده می شد، کتابخانه کلاینت اندروید و iOS برای مخلوط چتبات در نرم افزارهای گوشی ارائه گردیده بود؛ البته بعد از ترکیب آن در گوگل، کتابخانه جانور دیگر بهروزرسانی نشد و شاهد اضافه شدن Dialogflow به پلتفرم کلاود گوگل بودیم که API کلاینت جدیدی مطابق جاوا طراحی اپلیکیشن در مشهد در حالا بسط میباشد.
درین نوشته ی علمی، طرز یک دستسازی چتبات بسطیافته در Dialogflow با به کار گیری از کتابخانه API.ai دیرین و API کلاینت جاوای نو را توضیح میدهیم. براین اساس برای اکران این مسئله یک چتبات معمولی ساخت و ساز می کنیم که اطلاعاتی در ارتباط زمانهای متفاوت جشنواره پیشرفتدهندگان دهلیتازه که از سوی GDG برگزار میگردد ارائه مینماید.
کلیک نمائید
آغاز می بایست اسکریپتی بنویسیم که استفاده کننده بتواند با چتبات مکالمه نماید.
User: I want the list of sessions at Dev Fest in New Delhi.
Bot: Sure! There will be 4 tracks of sessions. For which track do you want the information?
User: third track.
Bot: 9:00–9:30 Registrations… Anything else?
User: No.
Bot: Thank you! Have a great day :)
آن گاه یک Agent برای Dialogflow میسازیم که Test_agent اسم دارااست.
اکانت خدمت برای ساخت داده ها احراز نامونشان برای API کلاینت جاوا به کار گیری می شود.
توکن دسترسی کلاینت برای یک پارچهسازی کتابخانه کلاینت اندروید
برای API کلاینت جاوا بایستی روی اکانت خدمت کلیک کرده و کلید JSON ساخت و ساز گردیده از سوی کنسول IAM را به دست آوریم.
اکنون اینتِنت (Intent) ها و نهادهایی را برای یادگرفتن دادن ایجنت ساخت میکنیم.
get_agenda مبادرت به رئیس درخواستها و واکشی عصرهایی که اطلاعاتشان ما یحتاج میباشد مینماید.
اضافه کردن مترادف و هم معنیها برای به چنگ آوردن مقادیر زمانها
پارامتری برای واکشی زمانها و فعال سازی ترکیب اینترنتهوک تاسیس شده است.
یک تابع کلاود برای رئیس درخواست اینترنتهوک ساخت و ساز میکنیم. مطابق شماره عصر تشخیص داده گردیده، جواب قابل قبولی به مخاطب ارسال میگردد.
فعلا ایجنت ما فراهم ترکیب با نرم افزار اندروید میباشد.
کلیک نمائید
در build.gradle (در سطح app) تعلقهایی برای کتابخانه کلاینت اندروید و API کلاینت جاوا اضافه می کنیم زیرا این چتبات را برای هر دو آیتم بسط میدهیم.
dependencies {
implementation fileTree(dir: \'libs\', include: [\'*.jar\'])
implementation \'com.android.support:appcompat-v7:28.0.0\'
testImplementation \'junit:junit:4.12\'
androidTestImplementation \'com.android.support.test:runner:1.0.2\'
androidTestImplementation \'com.android.support.test.espresso:espresso-core:3.0.2\'
// Dialogflow SDK dependencies
implementation \'ai.api:sdk:2.0.7@aar\'
implementation \'ai.api:libai:1.6.12\'
// Java V2
implementation \'com.google.cloud:google-cloud-dialogflow:0.67.0-alpha\'
// for Remote Procedure Call to avoid "No functional channel service provider found" error while creating SessionsClient
implementation \'io.grpc:grpc-okhttp:1.15.1\'
}
این چتبات در سیاق onCreate اکتیویتی اندروید شروع می گردد. آغاز به تنظیمات ایجنت Dialogflow با استعمال از توکن دسترسی کلاینت با یا این که به کار گیری از کلید JSON میکنیم. آنگاه یک گردهمایی (session) نو با به کار گیری از ID یکتا ساخت و ساز میکنیم و در غایت بات فراهم تعامل با استفاده کننده خواهد بود.
کتابخانه کلاینت اندروید
private void initChatbot() {
final AIConfiguration config = new AIConfiguration(BuildConfig.ClientAccessToken,
AIConfiguration.SupportedLanguages.English,
AIConfiguration.RecognitionEngine.System);
aiDataService = new AIDataService(this, config);
customAIServiceContext = AIServiceContextBuilder.buildFromSessionId(uuid);// helps to create new session whenever app restarts
aiRequest = new AIRequest();
}
API کلاینت جاوا
private void initV2Chatbot() {
try {
InputStream stream = getResources().openRawResource(R.raw.test_agent_credentials);
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
String projectId = ((ServiceAccountCredentials)credentials).getProjectId();
SessionsSettings.Builder settingsBuilder = SessionsSettings.newBuilder();
SessionsSettings sessionsSettings = settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();
sessionsClient = SessionsClient.create(sessionsSettings);
session = SessionName.of(projectId, uuid);
} catch (Exception e) {
e.printStackTrace();
}
}
ما رابطه چتبات با استفاده کننده را به طریق ناهمگام (Asynchronous) رئیس می کنیم. این شغل در مشی AsyncTask شکل میگیرد که در آن کوئری درخواستی از مخاطب به طور یک درخواست به چتبات ارسال گردیده و جواب اخذ می گردد.
مدیر AsyncTask در فراخوانیهای کتابخانه کلاینت اندروید
public class RequestTask extends AsyncTask {
Activity activity;
private AIDataService aiDataService;
private AIServiceContext customAIServiceContext;
RequestTask(Activity activity, AIDataService aiDataService, AIServiceContext customAIServiceContext){
this.activity = activity;
this.aiDataService = aiDataService;
this.customAIServiceContext = customAIServiceContext;
}
@Override
protected AIResponse doInBackground(AIRequest... aiRequests) {
final AIRequest request = aiRequests[0];
try {
return aiDataService.request(request, customAIServiceContext);
} catch (AIServiceException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(AIResponse aiResponse) {
((MainActivity)activity).callback(aiResponse);
}
}
رئیس AsyncTask برای فراخوانیهای API کلاینت جاوا
public class RequestJavaV2Task extends AsyncTask {
Activity activity;
private SessionName session;
private SessionsClient sessionsClient;
private QueryInput queryInput;
RequestJavaV2Task(Activity activity, SessionName session, SessionsClient sessionsClient, QueryInput queryInput) {
this.activity = activity;
this.session = session;
this.sessionsClient = sessionsClient;
this.queryInput = queryInput;
}
@Override
protected DetectIntentResponse doInBackground(Void... voids) {
try{
DetectIntentRequest detectIntentRequest =
DetectIntentRequest.newBuilder()
.setSession(session.toString())
.setQueryInput(queryInput)
.build();
return sessionsClient.detectIntent(detectIntentRequest);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(DetectIntentResponse response) {
((MainActivity) activity).callbackV2(response);
}
}
استفاده کننده قادر است کوئری را از نرم افزار اندروید با به کارگیری از EditText ارسال نماید و جواب در یک TextView اکران مییابد.
درخواست و جواب که در کتابخانه کلاینت اندروید رئیس می گردند
private void sendMessage(View view) {
String msg = queryEditText.getText().toString();
if (msg.trim().isEmpty()) {
Toast.makeText(MainActivity.this, "Please enter your query!", Toast.LENGTH_LONG).show();
} else {
showTextView(msg, USER);
queryEditText.setText("");
// Android client
aiRequest.setQuery(msg);
RequestTask requestTask = new RequestTask(MainActivity.this, aiDataService, customAIServiceContext);
requestTask.execute(aiRequest);
}
}
public void callback(AIResponse aiResponse) {
if (aiResponse != null) {
// process aiResponse here
String botReply = aiResponse.getResult().getFulfillment().getSpeech();
Log.d(TAG, "Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
رئیس درخواست و جواب در API کلاینت جاوا
private void sendMessage(View view) {
String msg = queryEditText.getText().toString();
if (msg.trim().isEmpty()) {
Toast.makeText(MainActivity.this, "Please enter your query!", Toast.LENGTH_LONG).show();
} else {
showTextView(msg, USER);
queryEditText.setText("");
// Android client
// aiRequest.setQuery(msg);
// RequestTask requestTask = new RequestTask(MainActivity.this, aiDataService, customAIServiceContext);
// requestTask.execute(aiRequest);
// Java V2
QueryInput queryInput = QueryInput.newBuilder().setText(TextInput.newBuilder().setText(msg).setLanguageCode("en-US")).build();
new RequestJavaV2Task(MainActivity.this, session, sessionsClient, queryInput).execute();
}
}
public void callback(AIResponse aiResponse) {
if (aiResponse != null) {
// process aiResponse here
String botReply = aiResponse.getResult().getFulfillment().getSpeech();
Log.d(TAG, "Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
public void callbackV2(DetectIntentResponse response) {
if (response != null) {
// process aiResponse here
String botReply = response.getQueryResult().getFulfillmentText();
Log.d(TAG, "V2 Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
ااینک مخلوط چتبات ما نقطه نهایی یافته میباشد. بعداز اضافه کردن تغییرات ما یحتاج در UI برای به دست آوردن کوئری مخاطب و اکران جواب بات، میتوانید مثال چتبات پایانی را در ویدئوی ذیل ملاحظه کنید.
تولید و یکدست سازی چت بات اندرویدی با Dialogflow – راهنمای مقدماتی
Dialogflow از خدمتهای گوگل میباشد که پیش از اینً به اسم API.ai شناخته میشد و پلتفرمی بهتر برای توسعه و گسترش چتباتها برای پلتفرمهای متعدد میباشد. راهنماها و مستندات متعددی برای کسانی که جدیدا استارت به یادگیری و به کارگیری از این پلتفرم برای ایجاد کرد چتبات نمودهاند وجود دارا هستند. با این وجود، مدد از اندروید و iOS به خیر و خوبی مستندسازی نشده میباشد.
تا تا قبل از این که Dialogflow به اسم API.ai نامیده می شد، کتابخانه کلاینت اندروید و iOS برای مخلوط چتبات در نرم افزارهای گوشی ارائه گردیده بود؛ البته بعد از ترکیب آن در گوگل، کتابخانه جانور دیگر بهروزرسانی نشد و شاهد اضافه شدن Dialogflow به پلتفرم کلاود گوگل بودیم که API کلاینت جدیدی مطابق جاوا طراحی اپلیکیشن در مشهد در حالا بسط میباشد.
درین نوشته ی علمی، طرز یک دستسازی چتبات بسطیافته در Dialogflow با به کار گیری از کتابخانه API.ai دیرین و API کلاینت جاوای نو را توضیح میدهیم. براین اساس برای اکران این مسئله یک چتبات معمولی ساخت و ساز می کنیم که اطلاعاتی در ارتباط زمانهای متفاوت جشنواره پیشرفتدهندگان دهلیتازه که از سوی GDG برگزار میگردد ارائه مینماید.
کلیک نمائید
آغاز می بایست اسکریپتی بنویسیم که استفاده کننده بتواند با چتبات مکالمه نماید.
User: I want the list of sessions at Dev Fest in New Delhi.
Bot: Sure! There will be 4 tracks of sessions. For which track do you want the information?
User: third track.
Bot: 9:00–9:30 Registrations… Anything else?
User: No.
Bot: Thank you! Have a great day :)
آن گاه یک Agent برای Dialogflow میسازیم که Test_agent اسم دارااست.
اکانت خدمت برای ساخت داده ها احراز نامونشان برای API کلاینت جاوا به کار گیری می شود.
توکن دسترسی کلاینت برای یک پارچهسازی کتابخانه کلاینت اندروید
برای API کلاینت جاوا بایستی روی اکانت خدمت کلیک کرده و کلید JSON ساخت و ساز گردیده از سوی کنسول IAM را به دست آوریم.
اکنون اینتِنت (Intent) ها و نهادهایی را برای یادگرفتن دادن ایجنت ساخت میکنیم.
get_agenda مبادرت به رئیس درخواستها و واکشی عصرهایی که اطلاعاتشان ما یحتاج میباشد مینماید.
اضافه کردن مترادف و هم معنیها برای به چنگ آوردن مقادیر زمانها
پارامتری برای واکشی زمانها و فعال سازی ترکیب اینترنتهوک تاسیس شده است.
یک تابع کلاود برای رئیس درخواست اینترنتهوک ساخت و ساز میکنیم. مطابق شماره عصر تشخیص داده گردیده، جواب قابل قبولی به مخاطب ارسال میگردد.
فعلا ایجنت ما فراهم ترکیب با نرم افزار اندروید میباشد.
کلیک نمائید
در build.gradle (در سطح app) تعلقهایی برای کتابخانه کلاینت اندروید و API کلاینت جاوا اضافه می کنیم زیرا این چتبات را برای هر دو آیتم بسط میدهیم.
dependencies {
implementation fileTree(dir: \'libs\', include: [\'*.jar\'])
implementation \'com.android.support:appcompat-v7:28.0.0\'
testImplementation \'junit:junit:4.12\'
androidTestImplementation \'com.android.support.test:runner:1.0.2\'
androidTestImplementation \'com.android.support.test.espresso:espresso-core:3.0.2\'
// Dialogflow SDK dependencies
implementation \'ai.api:sdk:2.0.7@aar\'
implementation \'ai.api:libai:1.6.12\'
// Java V2
implementation \'com.google.cloud:google-cloud-dialogflow:0.67.0-alpha\'
// for Remote Procedure Call to avoid "No functional channel service provider found" error while creating SessionsClient
implementation \'io.grpc:grpc-okhttp:1.15.1\'
}
این چتبات در سیاق onCreate اکتیویتی اندروید شروع می گردد. آغاز به تنظیمات ایجنت Dialogflow با استعمال از توکن دسترسی کلاینت با یا این که به کار گیری از کلید JSON میکنیم. آنگاه یک گردهمایی (session) نو با به کار گیری از ID یکتا ساخت و ساز میکنیم و در غایت بات فراهم تعامل با استفاده کننده خواهد بود.
کتابخانه کلاینت اندروید
private void initChatbot() {
final AIConfiguration config = new AIConfiguration(BuildConfig.ClientAccessToken,
AIConfiguration.SupportedLanguages.English,
AIConfiguration.RecognitionEngine.System);
aiDataService = new AIDataService(this, config);
customAIServiceContext = AIServiceContextBuilder.buildFromSessionId(uuid);// helps to create new session whenever app restarts
aiRequest = new AIRequest();
}
API کلاینت جاوا
private void initV2Chatbot() {
try {
InputStream stream = getResources().openRawResource(R.raw.test_agent_credentials);
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
String projectId = ((ServiceAccountCredentials)credentials).getProjectId();
SessionsSettings.Builder settingsBuilder = SessionsSettings.newBuilder();
SessionsSettings sessionsSettings = settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();
sessionsClient = SessionsClient.create(sessionsSettings);
session = SessionName.of(projectId, uuid);
} catch (Exception e) {
e.printStackTrace();
}
}
ما رابطه چتبات با استفاده کننده را به طریق ناهمگام (Asynchronous) رئیس می کنیم. این شغل در مشی AsyncTask شکل میگیرد که در آن کوئری درخواستی از مخاطب به طور یک درخواست به چتبات ارسال گردیده و جواب اخذ می گردد.
مدیر AsyncTask در فراخوانیهای کتابخانه کلاینت اندروید
public class RequestTask extends AsyncTask {
Activity activity;
private AIDataService aiDataService;
private AIServiceContext customAIServiceContext;
RequestTask(Activity activity, AIDataService aiDataService, AIServiceContext customAIServiceContext){
this.activity = activity;
this.aiDataService = aiDataService;
this.customAIServiceContext = customAIServiceContext;
}
@Override
protected AIResponse doInBackground(AIRequest... aiRequests) {
final AIRequest request = aiRequests[0];
try {
return aiDataService.request(request, customAIServiceContext);
} catch (AIServiceException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(AIResponse aiResponse) {
((MainActivity)activity).callback(aiResponse);
}
}
رئیس AsyncTask برای فراخوانیهای API کلاینت جاوا
public class RequestJavaV2Task extends AsyncTask {
Activity activity;
private SessionName session;
private SessionsClient sessionsClient;
private QueryInput queryInput;
RequestJavaV2Task(Activity activity, SessionName session, SessionsClient sessionsClient, QueryInput queryInput) {
this.activity = activity;
this.session = session;
this.sessionsClient = sessionsClient;
this.queryInput = queryInput;
}
@Override
protected DetectIntentResponse doInBackground(Void... voids) {
try{
DetectIntentRequest detectIntentRequest =
DetectIntentRequest.newBuilder()
.setSession(session.toString())
.setQueryInput(queryInput)
.build();
return sessionsClient.detectIntent(detectIntentRequest);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(DetectIntentResponse response) {
((MainActivity) activity).callbackV2(response);
}
}
استفاده کننده قادر است کوئری را از نرم افزار اندروید با به کارگیری از EditText ارسال نماید و جواب در یک TextView اکران مییابد.
درخواست و جواب که در کتابخانه کلاینت اندروید رئیس می گردند
private void sendMessage(View view) {
String msg = queryEditText.getText().toString();
if (msg.trim().isEmpty()) {
Toast.makeText(MainActivity.this, "Please enter your query!", Toast.LENGTH_LONG).show();
} else {
showTextView(msg, USER);
queryEditText.setText("");
// Android client
aiRequest.setQuery(msg);
RequestTask requestTask = new RequestTask(MainActivity.this, aiDataService, customAIServiceContext);
requestTask.execute(aiRequest);
}
}
public void callback(AIResponse aiResponse) {
if (aiResponse != null) {
// process aiResponse here
String botReply = aiResponse.getResult().getFulfillment().getSpeech();
Log.d(TAG, "Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
رئیس درخواست و جواب در API کلاینت جاوا
private void sendMessage(View view) {
String msg = queryEditText.getText().toString();
if (msg.trim().isEmpty()) {
Toast.makeText(MainActivity.this, "Please enter your query!", Toast.LENGTH_LONG).show();
} else {
showTextView(msg, USER);
queryEditText.setText("");
// Android client
// aiRequest.setQuery(msg);
// RequestTask requestTask = new RequestTask(MainActivity.this, aiDataService, customAIServiceContext);
// requestTask.execute(aiRequest);
// Java V2
QueryInput queryInput = QueryInput.newBuilder().setText(TextInput.newBuilder().setText(msg).setLanguageCode("en-US")).build();
new RequestJavaV2Task(MainActivity.this, session, sessionsClient, queryInput).execute();
}
}
public void callback(AIResponse aiResponse) {
if (aiResponse != null) {
// process aiResponse here
String botReply = aiResponse.getResult().getFulfillment().getSpeech();
Log.d(TAG, "Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
public void callbackV2(DetectIntentResponse response) {
if (response != null) {
// process aiResponse here
String botReply = response.getQueryResult().getFulfillmentText();
Log.d(TAG, "V2 Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
ااینک مخلوط چتبات ما نقطه نهایی یافته میباشد. بعداز اضافه کردن تغییرات ما یحتاج در UI برای به دست آوردن کوئری مخاطب و اکران جواب بات، میتوانید مثال چتبات پایانی را در ویدئوی ذیل ملاحظه کنید.

معایب سبک ایده پردازی و فروش آن و درآمد از اندروید