🌏 Read this article in English
⚡ 3 秒重點
- LLM 訓練資料來自各地中文,輸出用語自然混合
- 台灣讀者看到「用戶」「調用」「軟體」會出戲
zhtw fix一個指令自動轉換成台灣習慣用語- 支援 CLI、Python 整合、LangChain、批次處理
你的 README 讓同事「出戲」了
你用 AI 生成了一份專案 README。
內容很完整——安裝步驟、API 說明、範例程式碼都有。你很滿意,準備 commit。
然後台灣同事 Slack 你:「欸,『用戶需要先調用這個介面』是什麼意思?可以改成台灣的說法嗎?」
你打開檔案一看:
## 安裝說明
使用者需要先安裝相依性:
npm install
然後呼叫 API 取得資料...
不只這個檔案。你用 AI 生成的 400 個檔案,全都是這種混合用語。
手動改?會改到天荒地老。
為什麼 LLM 會輸出混合用語?
這不是 AI 的 bug,是訓練資料的特性。
Key Insight: LLM 的中文訓練資料來自各地——大陸、台灣、香港、新加坡。模型學會了「中文」,但沒有學會「哪裡的中文」。
即使你在 prompt 寫「請用繁體中文回答」,模型理解的是字形(繁體字),不是用語習慣(台灣說法)。
所以你會得到:
- 繁體字 ✅
- 但用語是「用戶」「調用」「軟體」❌
| 你寫的 prompt | AI 理解的 | 你期待的 |
|---|---|---|
| 請用繁體中文 | 用繁體字形 | 用台灣用語 |
| 請用台灣繁體 | 可能有幫助,但不穩定 | 用台灣用語 |
不同 LLM 的狀況也不同。根據我的觀察:
| LLM | 混合用語程度 | 備註 |
|---|---|---|
| ChatGPT | 中等 | 有時會自動調整 |
| Claude | 較輕 | 但仍會出現 |
| Gemini | 較重 | 大陸用語較多 |
Key Insight: 與其期待 AI 完美輸出台灣用語,不如接受「後處理」是必要步驟。就像程式碼要 lint,AI 輸出也要在地化。
解法:一個指令完成在地化
zhtw 是我開發的命令列工具,專門處理這個問題。
pip install zhtw
# 轉換單一檔案
zhtw fix README.md
# 轉換整個目錄
zhtw fix docs/
# 從 stdin 讀取(適合 pipe)
echo "使用者需要呼叫介面" | zhtw fix -
# 輸出:使用者需要呼叫介面
轉換範例:
| 原本 | 轉換後 |
|---|---|
| 使用者 | 使用者 |
| 呼叫 | 呼叫 |
| 軟體 | 軟體 |
| 伺服器 | 伺服器 |
| 資料庫 | 資料庫 |
| 程式碼 | 程式碼 |
| 影片 | 影片 |
| 資訊 | 資訊 |
不只是簡繁轉換,是用語習慣的轉換。
整合到你的工作流程
方式 1:CLI 單次處理
最簡單的用法,適合一次性處理:
# 處理單一檔案
zhtw fix ai-generated-doc.md
# 處理整個資料夾
zhtw fix ./docs/
# 預覽變更(不修改檔案)
zhtw check ./docs/
方式 2:Python 整合
在你的 Python 程式中,對 LLM 輸出做後處理:
import subprocess
def localize_to_taiwan(text: str) -> str:
"""將文字轉換成台灣用語"""
result = subprocess.run(
['zhtw', 'fix', '-'],
input=text,
capture_output=True,
text=True
)
return result.stdout if result.returncode == 0 else text
搭配 OpenAI
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "解釋什麼是 API Gateway"}
]
)
# LLM 輸出 → 台灣在地化
content = response.choices[0].message.content
localized = localize_to_taiwan(content)
print(localized)
搭配 Anthropic
from anthropic import Anthropic
client = Anthropic()
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{"role": "user", "content": "解釋什麼是 API Gateway"}
]
)
# LLM 輸出 → 台灣在地化
content = message.content[0].text
localized = localize_to_taiwan(content)
print(localized)
方式 3:LangChain OutputParser
如果你用 LangChain,可以包裝成 OutputParser:
from langchain.schema import BaseOutputParser
import subprocess
class TaiwanLocalizer(BaseOutputParser):
"""將 LLM 輸出轉換成台灣用語"""
def parse(self, text: str) -> str:
result = subprocess.run(
['zhtw', 'fix', '-'],
input=text,
capture_output=True,
text=True
)
return result.stdout.strip() if result.returncode == 0 else text
@property
def _type(self) -> str:
return "taiwan_localizer"
# 使用方式
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
llm = ChatAnthropic(model="claude-sonnet-4-20250514")
localizer = TaiwanLocalizer()
prompt = ChatPromptTemplate.from_template("解釋 {topic}")
chain = prompt | llm | localizer
result = chain.invoke({"topic": "微服務架構"})
print(result)
方式 4:批次處理腳本
處理大量 AI 生成的檔案:
# 處理所有 Markdown 檔案
find ./generated-docs -name "*.md" -exec zhtw fix {} \;
# 處理所有 Python docstring(先提取再處理)
zhtw fix ./src/**/*.py
# 搭配 git,只處理變更的檔案
git diff --name-only | grep '\.md$' | xargs zhtw fix
實際效果對比
範例 1:README.md
轉換前:
## 安裝說明
使用者需要先安裝相依性,然後呼叫初始化函式。
### 設定資料庫
在 `config.js` 中設定資料庫連線資訊:
轉換後:
## 安裝說明
使用者需要先安裝依賴,然後呼叫初始化函數。
### 設定資料庫
在 `config.js` 中設定資料庫連線資訊:
範例 2:API 文件
轉換前:
該介面回傳使用者資訊。呼叫時需要傳遞 token 參數。
如果請求失敗,伺服器會回傳錯誤程式碼。
轉換後:
該介面回傳使用者資訊。呼叫時需要傳遞 token 參數。
如果請求失敗,伺服器會回傳錯誤代碼。
範例 3:程式碼註解
轉換前:
def get_user_data(user_id):
"""取得使用者資料
呼叫此函式前,請確保資料庫連線正常。
"""
pass
轉換後:
def get_user_data(user_id):
"""取得使用者資料
呼叫此函數前,請確保資料庫連線正常。
"""
pass
進階設定
檢查模式(不修改檔案)
想先看看哪些地方會被轉換?
zhtw check ./docs/
輸出會顯示:
- 哪些檔案有需要轉換的用語
- 具體是哪些詞彙
- 不會修改任何檔案
保守模式
擔心誤轉換?用保守模式只處理高信心的詞彙:
zhtw fix --conservative ./docs/
什麼時候該用這個工具?
| 場景 | 建議 |
|---|---|
| AI 生成的 README、文件 | ✅ 建議使用 |
| AI 生成的程式碼註解 | ✅ 建議使用 |
| AI 對話內容要分享給台灣讀者 | ✅ 建議使用 |
| 翻譯大陸技術文章 | ✅ 建議使用 |
| 原本就是台灣人寫的內容 | ❌ 不需要 |
| 目標讀者是大陸用戶 | ❌ 不需要 |
Key Insight: 這不是「簡體 vs 繁體」的問題,是「內容要符合目標讀者習慣」的在地化需求。就像英文內容要考慮 US English 還是 UK English。
結論
LLM 訓練資料來自各地中文,輸出混合用語是常態,不是 bug。
與其每次手動修改,不如把在地化變成工作流程的一部分:
# 安裝
pip install zhtw
# 使用
zhtw fix your-ai-generated-file.md
三秒鐘,讓你的 AI 輸出說台灣話。
Sources
zhtw 工具
- zhtw GitHub Repository | Archive
命令列工具,將簡體中文用語轉換為台灣繁體用語。支援 CLI、Python API、批次處理。
LLM 中文輸出研究
- Anthropic Claude Documentation | Archive
Claude 的多語言支援說明,包含中文輸出的特性。