使用 ChatGPT 進行高效的國際化
本文分享了使用 ChatGPT API 高效支持產品國際化(i18n)的經驗,提供了整合 API、改善翻譯結果及優化指令的技巧,以達到更好的效果。
在當今全球市場中,對產品進行國際化(i18n)是必不可少的。支持多種語言的產品可以吸引並服務全球用戶群,提升用戶體驗,增加忠誠度以及獲得市場份額。然而,支持國際化通常伴隨著高昂成本和複雜的維護:
- 設置語言支持需要專業團隊和選擇合適的合作夥伴,這需要花費時間和精力。
- 傳統翻譯過程緩慢且需要人工干預,難以跟上產品的迭代速度。
在本文中,我們將分享 Logto 團隊使用 ChatGPT 及其 API 高效支持產品國際化的經驗,同時將成本降到最低。
我們如何進行國際化
在整合 ChatGPT API 之前,我們遵循傳統的翻譯流程來支持我們產品的國際化。流程如下:
- 對於每種語言,我們創建了一個翻譯文件夾,其中包含幾個 TypeScript 文件。每個文件由 TypeScript 對象組成,包含短語鍵值對及其翻譯。
- 要添加新短語,我們手動向每種語言的翻譯文件添加一個新的鍵值對。
- 在每種語言的根目錄中,我們創建了一個 index.ts 文件,導出該語言的所有翻譯文件。
以下是 zh-HK 語言的 index.ts 文件的一個例子:
要在 UI 中顯示一個短語,我們使用了一個根據當前環境檢索翻譯的函數。我們使用點符號訪問嵌套對象或鍵。
例如,如果用戶使用英文瀏覽器:
面臨的挑戰
我們在這一方法中遇到了兩大挑戰:
- 隨著語言和短語數量的增加,維護翻譯文件變得具有挑戰性。手動向每種語言添加新短語既耗時又容易出錯。
- 翻譯過程不可靠。由於沒有專門的翻譯團隊,我們主要依賴社區用戶進行翻譯。他們做得很好,但不可避免地翻譯會隨時間推移變得不完整和不一致。
引入 ChatGPT
當 ChatGPT 獲得普及時,我們發現了一個有趣的使用情境。偶然地,我們將一個 TypeScript 短語對象複製到 ChatGPT 中,發現它能夠用保留代碼結構的方法翻譯代碼片段。這一發現令我們激動不已。
例如:
回應如下:
這真是太棒了。在實際操作中,我們還有一些包含未翻譯短語的歷史文件,這些短語用 // UNTRANSLATED
標記:
ChatGPT 甚至能夠“部分” 翻譯這些代碼片段,消除了最後的障礙。然而,它仍然遠未完美。讓我們來看看我們遇到的問題。
提示工程
隨機性回應問題
關於 ChatGPT 的一個廣為人知的事實是它的不可預測性。有時候,結果是準確的,而其他時候,結果可能會很奇怪或不符合我們的預期。在聊天機器人情境中這可能是可以接受的,但在生成翻譯代碼片段時這會變得問題重重。
讓我們再次查看 zh-HK
的例子:
zh-HK
的 Nice to meet you.
預期翻譯是 很高興見到你。
。然而,有時代碼片段被翻譯成 zh-CN
:
很高兴见到你。
與 很高興見到你。
不同。
有時,“Please translate the...” 的提示也被翻譯了:
偶爾,結果包含不必要的內容:
第一行 “This is the translation:” 對我們的需求而言是不必要的。
基於上述結果,我們可以識別出 ChatGPT 和我們之間在對話中的幾個差距:
- 有時僅推斷出語言(zh),而未考慮地區差異(zh-HK)。
- 無法準確識別需要翻譯的內容。
- 回應格式不符合我們的期望。
撰寫清晰明確的提示
為了解決上述問題,我們改進了我們的提示:
這個新的提示被證明是有效的。我們指示 ChatGPT:
- 根據提供的語言代碼推斷地區語言。
- 翻譯由三個反引號分隔的代碼片段。
- 確保輸出保持原始格式,沒有任何附加內容。
給模型思考的時間
如前所述,對於現有短語,我們需要翻譯那些標有 // UNTRANSLATED 的短語。這給提示增加了另一層複雜性。例如:
我們得到的結果之一:
它還翻譯(或轉換)了短語 success
並添加了兩個 // TRANSLATED
評論,這都是意料之外的。
儘管前述提示是清晰且具體的,但它相當冗長且難以遵循,即使對人類而言也是如此。為了改善這一點,我們給模型更多的思考時間。我們提供了一個逐步的提示:
結果顯著改善。然而,有時 ChatGPT 會顯示 "思考過程",因為我們明確提供了步驟。
會話中的角色
儘管沒有直接的用戶界面,我們可以通過為每條信息分配不同的“角色”來向 ChatGPT 發送一個互動和動態的對話。角色可以是以下之一:
- "system":負責引導對話流程和行為,以確保連貫性和目標導向。
- "assistant":代表 ChatGPT 模型自身,提供答案和回應。
- "user":代表用戶提問並與模型互動。
通過使用角色,我們可以創造與 ChatGPT 更具吸引力的對話。每條信息在引導對話中扮演特定的角色。
在此,我們可以使用 "system" 角色來引導 ChatGPT 如何完成我們的任務:
用 "user" 角色來要求 ChatGPT 翻譯代碼片段:
用 "assistant" 角色來表示 "標準回答":
最後,將上述三條信息與我們要翻譯的代碼片段結合起來,並向 Chat Completion API 發送單個請求。以下是一個示例:
我們將 languageCode
替換為目標代碼,將 code
替換為要翻譯的代碼片段,並看到了我們期望的準確結果。非常好!
與我們的 CLI 整合
雖然結果是正確且穩定的,但使用 ChatGPT API 的過程仍不太方便。我們必須手動將代碼片段複製並粘貼到請求中,還需要替換 languageCode
和 code
變量。考慮到需要翻譯超過 10 種語言和 100 個代碼片段,這並不是理想的體驗。
為了解決這一問題,我們決定將 ChatGPT API 整合到我們的命令行介面(CLI)中。我們在 CLI 中添加了兩個命令:
logto translate sync
:此命令收集包含// UNTRANSLATED
註釋的所有語言的代碼片段,翻譯它們並用翻譯版本替換原始代碼片段。logto translate create [languageCode]
:此命令創建具有指定[languageCode]
的新語言,並將所有代碼片段從默認語言(英語)翻譯到新語言。
儘管翻譯可能不完美,但這仍是一項巨大的改進。我們現在可以專注於驗證和改善翻譯結果,而不是花時間在實際的翻譯過程上。
結論
將 ChatGPT API 整合到我們的產品國際化工作流程中可以成為強大的工具,但需要精心策劃和明確的指示才能獲得最佳結果。
如果你正在開發 AI 應用程序,用戶認證是必不可少的。Logto 提供一種簡單而安全的方法來認證你的用戶,並在所有應用程序中提供統一的用戶身份系統,還支持 ChatGPT 插件的即需使用。欲了解更多信息,請查看我們的博客文章: