iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
Build on Google AI

用 Google AI 打造「因材施教」的個人化 AI 虛擬助教系列 第 22 篇

Day 22|【教育平權的語言考驗】同一個 AI Tutor,用英文和印尼文教學生,邏輯會崩壞嗎?

  • 分享至 

  • xImage
  •  

當系統準備推廣給更多不同語言背景的學生(例如外籍學生或雙語班學生)時,同一個 AI 助教,可以用不同語言教學生嗎?

多數人對 AI 翻譯能力很有信心,覺得「把英文題目丟給 Gemini 翻成中文」就叫多語系。但在教育場景(Educational Context)中,情況完全不同——如果只在原本的中文 Prompt 尾巴加上一句「請翻譯成印尼文」,AI 往往會發生「邏輯邊界崩塌 (Behavioral Boundary Collapse)」:它會將「翻譯」視為首要任務,從而遺忘了「絕對不能直接給答案」、「一次只能問一個引導性問題」等嚴格的教學原則。更嚴重的是,原本設定的溫柔引導口氣在單純的翻譯指令下,經常變得生硬且公式化。

今天我們就來實測:如何透過「後設提示 (Meta-Prompting) 與語言分離」,打造動態語系適配層,讓 AI 在切換多語系時,依然死守蘇格拉底教學的鐵律!

【今日開發目標】

  1. 解決多語系下的邏輯崩塌:防止 AI 在翻譯過程中丟失蘇格拉底引導的教學原則。
  2. 實作動態語系適配層:採用「英文邏輯核心 + 動態語系強制層」的雙層架構,確保中文、英文、印尼文等不同語言下,AI 助教的行為邊界完全一致。

【Google AI 工具與實作過程】

經過測試,目前主流的大語言模型在處理複雜的邏輯約束與行為邊界時,對英文 Prompt 的遵循能力是最強且最穩定的。因此我們放棄了單一語言寫到底的作法,改採語言分離的設計:

  1. 底層 (The Core):使用最高嚴謹度的英文寫死 AI 的 Persona 與所有教學禁忌。
  2. 表層 (The Presentation):透過後端 API 動態注入目標語言變數,利用最高權重的系統指令強制 AI 在「遵守底層規則」的前提下,替換最後輸出的語言。

【核心 Code / 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 });
  }
});

步驟三:前端 UI 與 Payload 串接 (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'
  })
});

【成果展示】

https://ithelp.ithome.com.tw/upload/images/20261001/20183764ITJ2Ue40Bs.png

【未來教育反思】:真正的教育平權,不只是把介面翻譯成外文

教育科技的平權,絕對不是丟給 Google 翻譯貼過去就好。如果 AI 在使用英文或印尼文教學時,因為語言習慣的差異而變得「比較好說話、比較容易給答案」,那就徹底違背了我們建立 AI Tutor 的初衷。透過「英文核心邏輯 + 動態語系強制層」的雙層架構,我們確保了無論學生切換成英文、日文還是印尼文,AI 永遠都能堅守系統指令。

【明日預告】

搞定多語系教學後,接下來我們將進入第 23 天:「分齡教學——同一道題,國中生和大學生不能用同一種方式教」,來探討如何根據學生年齡與程度動態切換教學難度與比喻


上一篇
Day21|【動態模型備援】提升 AI 系統可用性:實作解決 503 過載問題
系列文
用 Google AI 打造「因材施教」的個人化 AI 虛擬助教 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言