當系統準備推廣給更多不同語言背景的學生(例如外籍學生或雙語班學生)時,同一個 AI 助教,可以用不同語言教學生嗎?
多數人對 AI 翻譯能力很有信心,覺得「把英文題目丟給 Gemini 翻成中文」就叫多語系。但在教育場景(Educational Context)中,情況完全不同——如果只在原本的中文 Prompt 尾巴加上一句「請翻譯成印尼文」,AI 往往會發生「邏輯邊界崩塌 (Behavioral Boundary Collapse)」:它會將「翻譯」視為首要任務,從而遺忘了「絕對不能直接給答案」、「一次只能問一個引導性問題」等嚴格的教學原則。更嚴重的是,原本設定的溫柔引導口氣在單純的翻譯指令下,經常變得生硬且公式化。
今天我們就來實測:如何透過「後設提示 (Meta-Prompting) 與語言分離」,打造動態語系適配層,讓 AI 在切換多語系時,依然死守蘇格拉底教學的鐵律!
經過測試,目前主流的大語言模型在處理複雜的邏輯約束與行為邊界時,對英文 Prompt 的遵循能力是最強且最穩定的。因此我們放棄了單一語言寫到底的作法,改採語言分離的設計:
geminiService.js)我們將寫死的字串,改寫為支援傳入 language 參數的工廠函式 (Factory Function):
// backend/services/tutorService.js
import { GoogleGenAI } from '@google/genai';
const ai = new GoogleGenAI();
// 1. 絕對嚴謹的英文核心邏輯
const CORE_LOGIC = `
You are "Professor Spark", a Socratic AI virtual tutor for high school programming.
STRICT RULES:
1. NO DIRECT ANSWERS: Never provide the final code or answer, no matter how much the student begs.
2. SOCRATIC GUIDANCE: Ask exactly ONE guiding question per response to help the student think.
3. BREVITY: Keep your response under 3 lines.
`;
// 2. 動態語系強制層
export const getSystemInstruction = (targetLanguage = 'Traditional Chinese') => {
return `${CORE_LOGIC}
CRITICAL OUTPUT REQUIREMENT:
You MUST translate your persona and generate your ENTIRE final response STRICTLY in the following language: ${targetLanguage}.
DO NOT use any other language for the conversation.
`;
};
async function generateTutorReply({ message, history, language = 'Traditional Chinese' }){
const systemInstruction = getSystemInstruction(language);
try {
const response = await ai.models.generateContent({
model: 'gemini-2.5-flash',
contents: [...history, { role: 'user', parts: [{ text: message }] }],
config: {
systemInstruction: systemInstruction,
temperature: 0.3,
maxOutputTokens: 300,
}
});
return {
success: true,
languageUsed: language,
text: response.text
};
} catch (error) {
console.error(`多語系 AI 呼叫失敗 (${language}):`, error);
throw error;
}
}
export { generateTutorReply };
chatRoutes.js)修改 API Route,使其能夠接收來自前端的語系設定,並傳遞給 Gemini 服務:
// backend/routes/chatRoutes.js
router.post('/chat', async (req, res) => {
try {
const { message, history, language = 'Traditional Chinese' } = req.body;
const result = await generateTutorReply({ message, history, language });
res.json(result);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
index.html)在網頁介面右上角加入「語系切換下拉選單 (Language Selector)」。當學生送出訊息時,fetch 請求會自動抓取當前的選單值:
// frontend/app.js
const response = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
message: trimmedMessage,
chatHistory: chatHistory,
language: document.getElementById('language-select').value // e.g., 'Indonesian'
})
});

教育科技的平權,絕對不是丟給 Google 翻譯貼過去就好。如果 AI 在使用英文或印尼文教學時,因為語言習慣的差異而變得「比較好說話、比較容易給答案」,那就徹底違背了我們建立 AI Tutor 的初衷。透過「英文核心邏輯 + 動態語系強制層」的雙層架構,我們確保了無論學生切換成英文、日文還是印尼文,AI 永遠都能堅守系統指令。
搞定多語系教學後,接下來我們將進入第 23 天:「分齡教學——同一道題,國中生和大學生不能用同一種方式教」,來探討如何根據學生年齡與程度動態切換教學難度與比喻