iT邦幫忙

2026 iThome 鐵人賽

DAY 26
0
Build on Google AI

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

Day 26【極限測試】Gemini 真的能理解超長文字嗎?破萬字電子學教材的 Context 壓力測試

  • 分享至 

  • xImage
  •  

在 Day 14 時,我們替虛擬助教導入了 RAG(檢索增強生成),讓學生可以直接上傳 PDF 檔案,讓 AI 助教檢索內容後再回答。

但真實的學習場景往往充滿限制——如果今天學生使用的學校電子書、線上題庫或講義系統「根本沒有下載權限,只能純複製貼上」呢?

在不能下載檔案的情況下,學生最直覺的操作就是:Control/Cmd+A 全選、Control/Cmd+C 複製,然後把整整 11 個章節、破萬字的文字Control/Cmd+V「整包貼給助教」。

面對這種突如其來的海量文字沖刷,我們今天就來做一場直球對決的硬核極限測試:「不切片、不做向量庫,直接把破萬字的高職電子學(共11章節)完整講義塞進跟助教的對話筐,它還能穩穩當一個會引導學生的 AI 助教嗎?」

【今日開發目標】

打造自動化壓力測試腳本 (test_long_context.py):使用最新 Google GenAI SDK,針對大海撈針(Needle In A Haystack)、引導原則抗稀釋度、Token 消耗與延遲進行指標量測。

https://ithelp.ithome.com.tw/upload/images/20261005/20183764TK7tim62Tn.png

【Google AI 工具實作過程】

1. 打造三大維度壓測腳本 (test_long_context.py)

為了客觀評估,我們不只靠手動點擊,而是撰寫了一支自動化壓測工具,鎖定三個教育核心指標:

  • 大海撈針測試 (Needle In A Haystack):在 15,000 字的長教材正中間(典型的「Lost-in-the-middle」注意力真空區),埋入一個特定的先備知識——「量子糾纏態疊加原理」作為關鍵線索。當模擬學生提問時,測試 Gemini 是否能在茫茫字海中打撈出來並正確調用,而非產生幻覺。
  • 引導原則抗稀釋度 (Instruction Following under Long Context):預先注入多達 25 輪的模擬歷史對話。測試當注意力被大量對話洗刷時,AI 助教是否會破功直接把答案解出來,還是能死守 「蘇格拉底反問原則」。
  • 效能與自動重試監控:加入 API 自動重試機制(攔截 503 等暫時性伺服器過載),並於終端機輸出標準評測報告(包含 Latency、Input/Output Tokens 與 Pass/Fail 判定)。

2. 真實系統落地:前端全域導讀與後端結構化診斷

壓測腳本通過後,我們進一步將此能力整合至真實的 geminiService 與 Web 介面。

當學生將整本包含 11 個章節的電子學講義一口氣貼上,並要求「介紹每個章節在說什麼並整理重點」時,助教 Professor Spark 在前端展現了全域統整力:

  • 它沒有像傳統 RAG 那樣只吐出零星章節,而是將 11 個章節精準收斂成四大主軸(基礎波形與二極體、BJT、MOSFET、OPA 與振盪電路)。
  • 更關鍵的是,它沒有把話講死,文末主動拋出啟發性提問:「看完了這張電子學地圖,你目前想先從哪一個章節或元件開始深入探討呢?」,並在下方動態生成了 3 個鷹架選項按鈕(二極體、BJT 偏壓、OPA 虛短路)供學生點選!

https://ithelp.ithome.com.tw/upload/images/20261005/20183764A0j4ICoCS7.png

同時在後端終端機中,系統也印出了結構化決策:

https://ithelp.ithome.com.tw/upload/images/20261005/20183764bWrxxDto6H.png

(實測後端診斷 Log:面對萬字教材,AI 依然遵守引導原則,並準確分流不需要計算工具)

【核心 Code / Prompt 展示】

1. 解決 Express 長文本傳輸錯誤 (server.js)

這是我們在真實 Node.js 系統解決 PayloadTooLargeError 的關鍵修改。只要開發需要接收整份教材或長文本的 LLM 應用,這個調整非常重要:

JavaScript

// server.js 節錄
const express = require('express');
const app = express();

// 【關鍵修改】將預設的 100kb 限制大幅提高,以容納破萬字的長篇論文或 Context
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ limit: '50mb', extended: true }));

2. Google GenAI SDK 最新語法與 API 呼叫 (test_long_context.py)

使用 gemini-3.8-flash 與最新版 SDK 的標準寫法,特別是 types.Part.from_text(text=...) 的強制具名參數:

Python

import os
from dotenv import load_dotenv
from google import genai
from google.genai import types

load_dotenv()
client = genai.Client() # 自動讀取環境變數中的 GEMINI_API_KEY

# 建立超嚴格的 System Instruction 測試抗稀釋度
system_instruction = """你是一位頂尖的 AI 虛擬助教。
請務必嚴格遵守以下教學原則:
1. 採用蘇格拉底式引導 (Socratic method)。
2. 嚴禁直接爆出最終答案。
3. 每次回覆只能問一個關鍵問題,引導學生思考。"""

# 將教材內容與提問封裝,注意 from_text 必須加上 text= 參數
user_content = types.Content(
    role="user",
    parts=[types.Part.from_text(text=f"【教材內容】\n{material}\n\n【我的問題】\n{question}")]
)

# 帶入設定檔並發送請求
response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=[user_content], # 如果有對話歷史,可以使用 history + [user_content]
    config=types.GenerateContentConfig(
        system_instruction=system_instruction,
        temperature=0.2,
    )
)
print(response.text)

3. 大海撈針 (Needle In A Haystack) 的測試邏輯

透過產生大量無意義文字,並在正中間(Lost-in-the-middle 易發區)插入特定觀念以驗證模型能力:

Python

def generate_mock_material(word_count: int, needle: str) -> str:
    """
    產生指定字數的模擬教材,並在中間段落插入隱藏觀念 (Needle)。
    """
    # 建立用來消耗 Token 的冗長背景知識
    base_paragraph = "這是一段模擬的學科教材內容,涵蓋了基礎科學、物理學、以及進階理論的探討..." * 15

    paragraphs = []
    current_words = 0
    while current_words < word_count:
        paragraphs.append(base_paragraph)
        current_words += len(base_paragraph)

    # 【關鍵】模擬 Lost-in-the-middle:精準在陣列正中間插入 Needle
    middle_index = len(paragraphs) // 2
    paragraphs.insert(middle_index, f"\n\n{needle}\n\n")

    return "\n".join(paragraphs)

【遇到的問題與 Debug】

1. SDK 具名參數限制引發 TypeError

  • 問題現象:撰寫 Python 腳本時,呼叫 types.Part.from_text("內容") 直接拋出 TypeError: from_text() takes 0 positional arguments but 1 was given。
  • 原因分析:最新版 Google GenAI SDK 對型別封裝採取強約束,禁止傳入位置參數(positional argument)。
  • 解法:強制使用具名參數改寫為 types.Part.from_text(text="內容"),順利通過編譯。

2. Express 伺服器 PayloadTooLargeError: request entity too large

  • 問題現象:當在前端對話框直接貼上整份萬字電子學講義送出時,Node.js 後端直接 Crash 並噴出 HTTP 413。
  • 原因分析:Express 的 express.json() 預設 body 大小限制僅有 100kb,對於純對話夠用,但只要學生貼入數萬字講義或論文,Request Body 就會輕易被撐爆。
  • 解法:修改 server.js,將 json 與 urlencoded 的 limit 顯式提升至 50mb,徹底打通超長 Context 在前端與後端間的傳輸通道。

【未來教育反思】

在壓力測試過後就得知它能把高職資電類 11 個章節的繁雜內容,提煉成清晰的四大主軸地圖,並根據全局先備知識,由淺入深地拋出測驗與引導。對學生而言,即使拿到的是無法下載的線上加密講義,只要「複製貼上」,AI Tutor也可以立即進入狀況,讓個人化學習的良好體驗又多了一項。

【明日預告】

完成了長文本壓測、Socratic Prompt、多模態 Vision、RAG、Function Calling 工具調用與學習紀錄儲存,我們的 AI 虛擬助教系統已經集齊了所有拼圖。

明天 Day 27【Full Demo】,我們將用一個真實學生的完整解題與診斷歷程,帶來最完整、最震撼的端到端全功能成果展示!


上一篇
Day 25|【接住情緒才配談教學】:實作 AI 助教的情緒閘門與諮商防禦邊界
下一篇
Day 27 |【Full Demo】30 天後,我的 AI 虛擬助教到底能做什麼?完整系統展示
系列文
用 Google AI 打造「因材施教」的個人化 AI 虛擬助教 共 27 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言