iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0

前言

目前探討相關的東西核心知識已經差不多了,今天 26 天,可以探討一些比較細節的部分
今天探討的部分是 『多語言支援』,相信我們的 ai 應用不只有『台灣用戶』,有可能需求
需要出海,那這時候就希望我們的 ai 回答可以因地事宜,在 ai 功能完成後,
這會是一個必須要考量的事情。讓我們開始學習吧

關於多語系的考量與常識

  • 市場擴展

支援多語言可以幫助你的應用觸及更廣泛的用戶群。根據統計,
只有約 25% 的網路用戶使用英語,這意味著單語應用會錯過 75% 的潛在用戶。

  • 用戶體驗

使用母語的應用能提供更好的用戶體驗。
研究顯示,用戶更傾向於使用和購買支援其母語的產品和服務。

  • 法規遵循

在某些地區,提供本地語言支援可能是法律要求,
特別是在歐盟等重視語言權利的地區。

由於以上多語系是一般工程師未必會直接考慮但相對重要的事情

AWS 的 AI 基礎設施,考慮多語系的項目

  1. Amazon Translate

可以參考

簡述 : AWS 的神經機器翻譯服務,支援超過 75 種語言之間的即時翻譯

  1. Amazon Comprehend

可以參考

簡述 : 以檢測文本的語言,這在處理多語言輸入時非常有用

  1. Amazon Bedrock 本身

簡述:多語言模型如 Claude 和其他基礎模型天生就支援多種語言,能夠理解和生成多種語言的內容。

架構考量

  • 用戶界面層:前端需要支援多語言文字顯示、RTL(從右到左)語言支援、日期時間格式化等。
  • 應用邏輯層:包括語言偵測、內容翻譯、多語言路由等功能。
  • 資料儲存層:需要設計支援多語言內容的資料庫結構,考慮使用 UTF-8 編碼。
  • AI 模型層:選擇支援多語言的模型,或針對特定語言訓練專用模型。

開始實作

我們來做一個多語言機器人,結合先前的知識

  1. 先把該裝的先裝起來
import boto3
import json
from datetime import datetime

# 初始化 AWS 服務客戶端
translate_client = boto3.client('translate', region_name='你的Region')
comprehend_client = boto3.client('comprehend', region_name='你的Region')
bedrock_runtime = boto3.client('bedrock-runtime', region_name='你的Region')

# 支援的語言列表
SUPPORTED_LANGUAGES = {
    'zh': '繁體中文',
    'zh-TW': '繁體中文(台灣)',
    'en': 'English',
    'ja': '日本語',
    'ko': '한국어',
    'es': 'Español',
    'fr': 'Français',
    'de': 'Deutsch'
}

  1. 語言偵測功能
def detect_language(text):
    """
    偵測文字的語言
    """
    try:
        response = comprehend_client.detect_dominant_language(
            Text=text
        )
        
        # 取得信心度最高的語言
        languages = response['Languages']
        if languages:
            dominant_language = max(languages, key=lambda x: x['Score'])
            return {
                'language_code': dominant_language['LanguageCode'],
                'confidence': dominant_language['Score']
            }
        return None
        
    except Exception as e:
        print(f"語言偵測錯誤: {str(e)}")
        return None

# 測試語言偵測
test_texts = [
    "Hello, how can I help you today?",
    "你好,我今天可以如何幫助你?",
    "こんにちは、今日はどのようにお手伝いできますか?"
]

for text in test_texts:
    result = detect_language(text)
    if result:
        print(f"文字: {text}")
        print(f"偵測語言: {result['language_code']}, 信心度: {result['confidence']:.2%}\n")

  1. 翻譯功能
def translate_text(text, source_lang, target_lang):
    """
    翻譯文字從來源語言到目標語言
    """
    try:
        # 如果來源語言和目標語言相同,直接返回原文
        if source_lang == target_lang:
            return text
            
        response = translate_client.translate_text(
            Text=text,
            SourceLanguageCode=source_lang,
            TargetLanguageCode=target_lang
        )
        
        return response['TranslatedText']
        
    except Exception as e:
        print(f"翻譯錯誤: {str(e)}")
        return text

# 測試翻譯功能
original_text = "I would like to know more about your products."
translated_to_chinese = translate_text(original_text, 'en', 'zh-TW')
print(f"英文: {original_text}")
print(f"中文: {translated_to_chinese}")

# 翻譯回英文驗證
back_to_english = translate_text(translated_to_chinese, 'zh-TW', 'en')
print(f"回譯: {back_to_english}")

  1. 多語言對話功能 - 使用 claude
class MultilingualChatbot:
    """
    多語言聊天機器人類別
    """
    
    def __init__(self, default_language='en', system_language='en'):
        self.default_language = default_language
        self.system_language = system_language
        self.conversation_history = []
        
    def process_message(self, user_message, user_language=None):
        """
        處理用戶訊息的完整流程
        """
        # 步驟 1: 偵測語言(如果未指定)
        if not user_language:
            detected = detect_language(user_message)
            user_language = detected['language_code'] if detected else self.default_language
            print(f"偵測到語言: {user_language}")
        
        # 步驟 2: 翻譯用戶訊息為系統語言(如果需要)
        translated_message = user_message
        if user_language != self.system_language:
            translated_message = translate_text(
                user_message, 
                user_language, 
                self.system_language
            )
            print(f"翻譯後訊息: {translated_message}")
        
        # 步驟 3: 使用 Bedrock 生成回應
        ai_response = self._generate_response(translated_message)
        
        # 步驟 4: 翻譯回應為用戶語言(如果需要)
        final_response = ai_response
        if user_language != self.system_language:
            final_response = translate_text(
                ai_response,
                self.system_language,
                user_language
            )
        
        # 儲存對話歷史
        self.conversation_history.append({
            'timestamp': datetime.now().isoformat(),
            'user_language': user_language,
            'user_message': user_message,
            'bot_response': final_response
        })
        
        return {
            'response': final_response,
            'detected_language': user_language,
            'original_response': ai_response if user_language != self.system_language else None
        }
    
    def _generate_response(self, message):
        """
        使用 Bedrock Claude 生成回應
        """
        try:
            # 準備對話上下文
            conversation_context = "\n".join([
                f"User: {item['user_message']}\nAssistant: {item['bot_response']}"
                for item in self.conversation_history[-3:]  # 只使用最近3輪對話
            ])
            
            # 建立提示詞
            prompt = f"""You are a helpful customer service assistant. 
            
Previous conversation:
{conversation_context}

Current user message: {message}

Please provide a helpful, friendly, and professional response."""

            # 呼叫 Bedrock
            request_body = {
                "anthropic_version": "bedrock-2023-05-31",
                "max_tokens": 1000,
                "messages": [
                    {
                        "role": "user",
                        "content": prompt
                    }
                ]
            }
            
            response = bedrock_runtime.invoke_model(
                modelId='anthropic.claude-3-sonnet-20240229-v1:0',
                body=json.dumps(request_body)
            )
            
            response_body = json.loads(response['body'].read())
            return response_body['content'][0]['text']
            
        except Exception as e:
            print(f"生成回應錯誤: {str(e)}")
            return "I apologize, but I'm having trouble processing your request right now."
    
    def get_conversation_history(self):
        """
        取得對話歷史
        """
        return self.conversation_history

# 使用範例
chatbot = MultilingualChatbot(system_language='en')

# 測試不同語言的對話
print("=== 測試 1: 英文對話 ===")
result1 = chatbot.process_message("What are your business hours?")
print(f"回應: {result1['response']}\n")

print("=== 測試 2: 中文對話 ===")
result2 = chatbot.process_message("你們的營業時間是什麼時候?")
print(f"回應: {result2['response']}")
print(f"偵測語言: {result2['detected_language']}\n")

print("=== 測試 3: 日文對話 ===")
result3 = chatbot.process_message("営業時間を教えてください。")
print(f"回應: {result3['response']}")
print(f"偵測語言: {result3['detected_language']}\n")

(進階)自訂翻譯術語

Amazon Translate 支援自訂術語,這對於保持品牌名稱、產品名稱或專業術語的一致性非常重要

def create_custom_terminology():
    """
    建立自訂翻譯術語
    """
    # 準備術語資料(CSV 格式)
    terminology_data = """en,zh-TW,ja
AWS,AWS,AWS
Amazon Bedrock,Amazon Bedrock,Amazon Bedrock
SageMaker,SageMaker,SageMaker
AI,AI,AI
Machine Learning,機器學習,機械学習"""
    
    try:
        response = translate_client.import_terminology(
            Name='TechTerminology',
            MergeStrategy='OVERWRITE',
            TerminologyData={
                'File': terminology_data.encode('utf-8'),
                'Format': 'CSV'
            }
        )
        print("自訂術語建立成功")
        return response
    except Exception as e:
        print(f"建立術語錯誤: {str(e)}")
        return None

def translate_with_terminology(text, source_lang, target_lang, terminology_names):
    """
    使用自訂術語進行翻譯
    """
    try:
        response = translate_client.translate_text(
            Text=text,
            TerminologyNames=terminology_names,
            SourceLanguageCode=source_lang,
            TargetLanguageCode=target_lang
        )
        return response['TranslatedText']
    except Exception as e:
        print(f"翻譯錯誤: {str(e)}")
        return text

# 測試自訂術語
create_custom_terminology()

text = "AWS provides Machine Learning services like Amazon Bedrock and SageMaker."
translated = translate_with_terminology(text, 'en', 'zh-TW', ['TechTerminology'])
print(f"原文: {text}")
print(f"譯文: {translated}")

關於多語言相關的,今天就說到這裡!


上一篇
CI/CD Pipeline整合
系列文
從零開始的AWS AI之路:用Bedrock與SageMaker打造智慧應用的30天實戰26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言