ขจัดอุปสรรคด้านภาษา บอททีละตัว
การสร้าง Chatbot หลายภาษาด้วย C# และ MS Bot Framework v4
วิธีทำให้แอปพลิเคชันบอทของคุณเป็นสากล
ในบทความนี้ เราจะสร้างแชทบอทด้วย Microsoft Bot Framework และเรียนรู้วิธีปรับให้เข้ากับภาษาต่างๆ
บทที่ 1: การตั้งค่าโครงการ
เรากำลังจะสร้างโปรเจ็กต์แชทบอตธรรมดาที่จะเสนอตัวเลือกสองภาษาให้กับผู้ใช้ในตอนแรก มาเริ่มกันเลย!
ขั้นตอนที่ 1: เริ่มต้นโครงการ
ขั้นตอนแรกคือการสร้างโครงการ ASP.NET Core Empty ใหม่ใน Visual Studio และกำหนดเป้าหมายเป็น .NET 6.0 ตรวจสอบให้แน่ใจว่าได้เพิ่มแพ็คเกจ NuGet ต่อไปนี้ให้กับโปรเจ็กต์:
Microsoft.Bot.Builder.Integration.AspNet.Core --version 4.20.0
ขั้นตอนที่ 2: สร้างลอจิกบอท
สมองของบอทของเราจะอยู่ในไฟล์ MainBot.cs
:
using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; namespace MultilingualChatBot.Bots { public class MainBot : ActivityHandler { protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { foreach (var member in membersAdded) { if (member.Id == turnContext.Activity.Recipient.Id) continue; var reply = MessageFactory.Text("Please choose your language"); reply.SuggestedActions = new SuggestedActions { Actions = new List<CardAction> { new() { Title = "English", Type = ActionTypes.ImBack, Value = "English" }, new() { Title = "Українська", Type = ActionTypes.ImBack, Value = "Українська" } } }; await turnContext.SendActivityAsync(reply, cancellationToken); } } protected override Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { var replyText = $"Your language is **{turnContext.Activity.Text}**"; return turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken); } } }
บอทขอให้ผู้ใช้เลือกภาษา: อังกฤษหรือยูเครน หลังจากนั้นเมื่อใดก็ตามที่ผู้ใช้ส่งข้อความ บอทจะสะท้อนภาษาที่เลือก
ขั้นตอนที่ 3: สร้างอะแดปเตอร์
ในการปรับแต่งกลยุทธ์การจัดการข้อผิดพลาดสำหรับแชทบอท เราจะใช้คลาส AdapterWithErrorHandler.cs
:
using Microsoft.Bot.Builder.Integration.AspNet.Core; using Microsoft.Bot.Connector.Authentication; namespace MultilingualChatBot { public class AdapterWithErrorHandler : CloudAdapter { public AdapterWithErrorHandler(BotFrameworkAuthentication auth, ILogger<IBotFrameworkHttpAdapter> logger) : base(auth, logger) { OnTurnError = async (turnContext, exception) => { // Log any leaked exception from the application. logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); // Send a message to the user await turnContext.SendActivityAsync("The bot encountered an error or bug."); await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code."); }; } } }
ในโครงสร้างพื้นฐาน MS Bot Framework คลาสอะแดปเตอร์ทำหน้าที่เป็นสะพานเชื่อมระหว่างบอทและช่องทางการสื่อสาร (เช่น Telegram, Teams, Slack ฯลฯ) สำหรับคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับโครงสร้างบอทโดยรวม โปรดดูที่ "เอกสารประกอบ" อย่างเป็นทางการ
ขั้นตอนที่ 4: กำหนดค่าการพึ่งพา
เพื่อให้ทุกอย่างทำงานได้ เราจำเป็นต้องกำหนดค่าการขึ้นต่อกันทั้งหมดใน Program.cs
file:
using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Integration.AspNet.Core; using Microsoft.Bot.Connector.Authentication; using MultilingualChatBot; using MultilingualChatBot.Bots; var builder = WebApplication.CreateBuilder(args); // Create the Bot Framework Authentication to be used with the Bot Adapter builder.Services.AddSingleton<BotFrameworkAuthentication, ConfigurationBotFrameworkAuthentication>(); // Create the Bot Adapter with error handling enabled builder.Services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>(); // Add the main bot to the container builder.Services.AddTransient<IBot, MainBot>(); var app = builder.Build(); app.UseHttpsRedirection(); app.MapPost("api/messages", (IBotFrameworkHttpAdapter adapter, IBot bot, HttpContext context) => adapter.ProcessAsync(context.Request, context.Response, bot)); app.Run();
ขั้นตอนที่ 5: ทดสอบบอท
ตอนนี้เราได้เตรียมการตั้งค่าบอทเบื้องต้นแล้ว ถึงเวลาทดสอบแล้ว ต่อไปนี้คือลักษณะที่การสนทนาเริ่มแรกปรากฏใน Bot Framework Emulator:
หลังจากสรุปส่วนนี้แล้ว เราก็มีแชทบอตที่ใช้งานได้พร้อมที่จะปรับปรุงด้วยการสนับสนุนหลายภาษาในขั้นตอนถัดไป
บทที่ 2: การแปลเป็นภาษาท้องถิ่นและการสนับสนุนหลายภาษา
ในส่วนนี้ เราจะรวมการสนับสนุนหลายภาษาเข้ากับแชทบอทของเรา เราจะใช้ไฟล์ทรัพยากร (.resx) และอินเทอร์เฟซ IStringLocalizer เพื่อจัดเตรียมการแปลภาษาอังกฤษและภาษายูเครน
ขั้นตอนที่ 1: เพิ่มทรัพยากร (.resx)
เราจะสร้างคลาส BotMessages.cs
และไฟล์ทรัพยากรสองไฟล์ BotMessages.en-US.resx
สำหรับภาษาอังกฤษและ BotMessages.uk-UA.resx
สำหรับภาษายูเครน ไฟล์เหล่านี้จะจัดเก็บสตริงที่แปลแล้วซึ่งบอทของเราจะใช้ในการสื่อสาร ไฟล์มีลักษณะดังนี้ใน Visual Studio:
ขั้นตอนที่ 2: แก้ไขตรรกะของบอท
เราจะอัปเดต MainBot.cs
เพื่อใช้อินเทอร์เฟซ IStringLocalizer
สิ่งนี้จะช่วยให้บอทสามารถดึงข้อมูลและแสดงสตริงที่แปลเป็นภาษาท้องถิ่นที่ถูกต้องตามภาษาที่ผู้ใช้เลือก:
using System.Globalization; using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; using Microsoft.Extensions.Localization; using MultilingualChatBot.Resources; namespace MultilingualChatBot.Bots { public class MainBot : ActivityHandler { private readonly IStringLocalizer<BotMessages> _localizer; public MainBot(IStringLocalizer<BotMessages> localizer) => _localizer = localizer; protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { foreach (var member in membersAdded) { if (member.Id == turnContext.Activity.Recipient.Id) continue; var reply = MessageFactory.Text("Please choose your language"); reply.SuggestedActions = new SuggestedActions { Actions = new List<CardAction> { new() { Title = "English", Type = ActionTypes.ImBack, Value = "English" }, new() { Title = "Українська", Type = ActionTypes.ImBack, Value = "Українська" } } }; await turnContext.SendActivityAsync(reply, cancellationToken); } } protected override Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { var language = turnContext.Activity.Text; var culture = language switch { "English" => "en-US", "Українська" => "uk-UA", _ => "en-US" }; CultureInfo.CurrentCulture = new CultureInfo(culture); CultureInfo.CurrentUICulture = new CultureInfo(culture); var welcomeMsg = _localizer["WelcomeMessage", language]; return turnContext.SendActivityAsync(MessageFactory.Text(welcomeMsg, welcomeMsg), cancellationToken); } } }
เมธอด OnMessageActivityAsync
จัดการข้อความของผู้ใช้เป็นตัวเลือกภาษา แมปข้อความเหล่านั้นกับวัฒนธรรมที่เหมาะสม และส่งกลับข้อความต้อนรับที่แปลเป็นภาษาที่เลือกโดยใช้ IStringLocalizer
โปรดทราบว่า IStringLocalizer
ขึ้นอยู่กับวัฒนธรรมที่ตั้งไว้เพื่อค้นหาไฟล์ทรัพยากรที่ถูกต้อง ทำให้จำเป็นต้องกำหนดวัฒนธรรมด้วยตนเอง
ขั้นตอนที่ 3: เพิ่มการพึ่งพาการแปล
ในส่วนสุดท้าย เราจะปรับแต่ง Program.cs
เพื่อตั้งค่าการขึ้นต่อกันที่จำเป็น สิ่งนี้จะทำให้เราใช้ IStringLocalizer
สำหรับการแปลในบอทของเรา สิ่งที่เราต้องทำคือเพิ่มบรรทัดต่อไปนี้:
builder.Services.AddLocalization();
ในตอนท้ายของบทนี้ แชทบอทหลายภาษาของเราก็เปิดใช้งานและทำงานได้อย่างราบรื่น แต่อย่าหยุดอยู่แค่นี้ ในบทถัดไป เราจะสำรวจวิธีปรับปรุงให้ดียิ่งขึ้น
บทที่ 3: การเลือกภาษาที่ง่ายดาย
ในส่วนนี้ เราจะดำเนินการขั้นตอนการเลือกภาษาของแชทบอทโดยอัตโนมัติโดยใช้ "มิดเดิลแวร์" ซึ่งช่วยให้เราไม่ต้องยุ่งยากในการกำหนดวัฒนธรรมทุกครั้ง
ขั้นตอนที่ 1: ใช้มิดเดิลแวร์
ที่นี่ เราจะสร้างคลาส LocalizationMiddleware.cs
ซึ่งเป็นส่วนประกอบอัตโนมัติเพื่อกำหนดบริบทภาษาสำหรับการตอบสนองของบอทของเรา
using System.Globalization; using Microsoft.Bot.Builder; using IMiddleware = Microsoft.Bot.Builder.IMiddleware; namespace MultilingualChatBot { public class LocalizationMiddleware : IMiddleware { public Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = new()) { var culture = turnContext.Activity.Text switch { "English" => "en-US", "Українська" => "uk-UA", _ => "en-US" }; CultureInfo.CurrentCulture = new CultureInfo(culture); CultureInfo.CurrentUICulture = new CultureInfo(culture); return next(cancellationToken); } } }
มิดเดิลแวร์ของเราจะกำหนดภาษาสำหรับการโต้ตอบปัจจุบันกับบอทตามตัวเลือกของผู้ใช้ ซึ่งหมายความว่าบอทจะใช้ทรัพยากรภาษาที่ถูกต้องโดยอัตโนมัติเมื่อส่งข้อความ โดยไม่จำเป็นต้องตั้งค่าวัฒนธรรมด้วยตนเองทุกครั้งที่เราใช้ IStringLocalizer
interface
ในกรณีการใช้งานที่เป็นไปได้ ช่องทางต่างๆ เช่น Telegram, Facebook Messenger และอื่นๆ สามารถส่งภาษาของผู้ใช้ได้ ทำให้โค้ดด้านล่างเป็นโซลูชันที่ใช้งานได้สำหรับการตั้งค่าวัฒนธรรมอัตโนมัติต่อการโต้ตอบ:
using System.Globalization; using Microsoft.Bot.Builder; using IMiddleware = Microsoft.Bot.Builder.IMiddleware; namespace MultilingualChatBot { public class LocalizationMiddleware : IMiddleware { public Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = new()) { // Get the actual user's locale var culture = turnContext.Activity.Locale ?? "en-US"; CultureInfo.CurrentCulture = new CultureInfo(culture); CultureInfo.CurrentUICulture = new CultureInfo(culture); return next(cancellationToken); } } }
ขั้นตอนที่ 2: รวมมิดเดิลแวร์
เพื่อให้มิดเดิลแวร์ของเราทำงานได้อย่างสมบูรณ์ เราจะดำเนินการสองขั้นตอนสุดท้าย ก่อนอื่น เราจะรวมมันเข้ากับคลาส AdapterWithErrorHandler.cs
:
using Microsoft.Bot.Builder.Integration.AspNet.Core; using Microsoft.Bot.Connector.Authentication; namespace MultilingualChatBot { public class AdapterWithErrorHandler : CloudAdapter { public AdapterWithErrorHandler( LocalizationMiddleware localizationMiddleware, BotFrameworkAuthentication auth, ILogger<IBotFrameworkHttpAdapter> logger) : base(auth, logger) { // Add localization middleware Use(localizationMiddleware); OnTurnError = async (turnContext, exception) => { // Log any leaked exception from the application. logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); // Send a message to the user await turnContext.SendActivityAsync("The bot encountered an error or bug."); await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code."); }; } } }
ประการที่สอง เราจะตรวจสอบให้แน่ใจว่ามีการกำหนดค่าอย่างเหมาะสมภายในไฟล์ Program.cs
:
using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Integration.AspNet.Core; using Microsoft.Bot.Connector.Authentication; using MultilingualChatBot; using MultilingualChatBot.Bots; var builder = WebApplication.CreateBuilder(args); // Add localization builder.Services.AddLocalization(); builder.Services.AddSingleton<LocalizationMiddleware>(); // Create the Bot Framework Authentication to be used with the Bot Adapter builder.Services.AddSingleton<BotFrameworkAuthentication, ConfigurationBotFrameworkAuthentication>(); // Create the Bot Adapter with error handling enabled builder.Services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>(); // Add the main bot to the container builder.Services.AddTransient<IBot, MainBot>(); var app = builder.Build(); app.UseHttpsRedirection(); app.MapPost("api/messages", (IBotFrameworkHttpAdapter adapter, IBot bot, HttpContext context) => adapter.ProcessAsync(context.Request, context.Response, bot)); app.Run();
ด้วยมิดเดิลแวร์สำหรับการแปลในขณะนี้ แชทบอทของเราสามารถตั้งค่ากำหนดภาษาโดยอัตโนมัติตามการป้อนข้อมูลของผู้ใช้
ขั้นตอนที่ 4: Chatbot ในการใช้งานจริง
ในขั้นตอนสุดท้ายนี้ เราจะโต้ตอบกับแชทบอทของเรา ดูภาพด้านล่างเพื่อดูว่ามันจัดการกับหลายภาษาได้อย่างไร:
เพื่อสรุปบทนี้ เราได้ประสบความสำเร็จในการจัดการภาษาในแชทบอทของเราโดยอัตโนมัติ
บทที่ 4: สำรวจ Chatbot ในโลกแห่งความเป็นจริง
มาก้าวข้ามพื้นฐานกันเถอะ! ฉันได้สร้างแชทบอตเตือนความจำสองภาษาที่ใช้งานได้จริงและมีฟีเจอร์มากมาย
สำหรับผู้ใช้ มันเป็นเครื่องมือที่มีประโยชน์พร้อมความสามารถขั้นสูง อย่าลังเลที่จะทดสอบบน Telegram
ในขณะเดียวกัน นักพัฒนาสามารถรับข้อมูลเชิงลึกเกี่ยวกับการใช้งานบอทที่ซับซ้อนมากขึ้นใน GitHub ของฉัน เป็นข้อมูลอ้างอิงที่ดีในการดูวิธีการใช้บอทที่ซับซ้อนที่นำไปปฏิบัติจริง สนุก!
บทสรุป
ด้วยบทช่วยสอนนี้ เราได้สร้างแชทบอตที่สามารถรองรับได้หลายภาษา ปรับปรุงการโต้ตอบและการเข้าถึงของผู้ใช้ นอกจากนี้เรายังได้เห็นว่ามิดเดิลแวร์สามารถเลือกภาษาอัตโนมัติได้อย่างไร ทำให้บอทมีประสิทธิภาพมากขึ้น
เอาล่ะ แค่นั้นแหละ. ขอบคุณที่อ่าน! คุณสามารถค้นหาซอร์สโค้ดของโครงการที่ใช้ในบทความใน "GitHub" ของฉัน
ยกระดับการเข้ารหัส
ขอบคุณที่เป็นส่วนหนึ่งของชุมชนของเรา! ก่อนที่คุณจะไป:
- 👏 ปรบมือให้เรื่องและติดตามผู้เขียน 👉
- 📰 ดูเนื้อหาเพิ่มเติมใน "สิ่งพิมพ์ Level Up Coding"
- 💰 หลักสูตรสัมภาษณ์การเขียนโค้ดฟรี ⇒ ดูหลักสูตร
- 🧠 เครื่องมือ AI ⇒ ดูเลย
🔔 ติดตามเรา: Twitter | LinkedIn | จดหมายข่าว
🚀 👉 เข้าร่วมกลุ่มผู้มีความสามารถ Level Up และหางานที่น่าทึ่ง