2026年10月21日 星期三

生成式 AI 技術入門:七種核心方法與架構圖(續)

這張圖說明大型語言模型(LLM)如何把一句話轉成模型可處理的數值,再依上下文逐步產生回答。

  1. 文字輸入:使用者輸入「今天天氣如何?」
  2. 分詞與向量表示:模型將文字切成 Token,例如「今天、天氣、如何」,再把每個 Token 轉成數值向量。
  3. Transformer 分析上下文:注意力機制計算不同 Token 之間的關聯;前饋神經網路進一步處理這些資訊。這些運算會經過多層堆疊,形成較完整的上下文表示。
  4. 預測下一個 Token:模型根據目前上下文,計算各候選 Token 的機率。圖中的「晴朗 0.62」是示意數值,不是固定答案或實際天氣資料。
  5. 逐步產生回答:模型選出一個 Token,加入上下文,再預測下一個 Token;重複這個過程,直到組成完整回答。

可以把它想成文字接龍:每一步都根據前面已知的內容,選出接下來最合適的詞語。生成得通順,不代表內容一定正確;例如天氣問題要得到即時資訊,仍需查詢天氣資料。


這張圖說明 Transformer 如何把輸入文字轉成模型能處理的數值表示,再透過「注意力」理解詞語之間的關係,最後逐步產生輸出文字。

一、輸入文字轉成向量

例如輸入「今天天氣很好」,模型先把句子切成 Token:

今天|天氣|很好

每個 Token 會轉成一組數值,稱為詞嵌入。接著加入位置編碼,讓模型知道詞語在句子中的順序。兩者相加後,形成 Transformer 的輸入表示。

二、編碼器理解上下文

圖左側是編碼器(Encoder)。它會經過多層相同類型的處理,每層主要包含:

  1. 多頭自注意力:讓每個 Token 參考其他 Token,計算它們對目前理解的重要程度。
    例如判斷「很好」是在描述「天氣」,而不是其他事物。
  2. 殘差連接與層正規化:保留原始資訊,並讓數值變化較穩定。
  3. 前饋神經網路:進一步轉換每個位置的特徵。

經過多層處理後,編碼器會產生包含上下文資訊的表示。

三、解碼器逐步產生文字

圖右側是解碼器(Decoder),負責產生下一個 Token。它也由多層處理構成:

  • 遮罩多頭自注意力只查看目前位置之前已生成的 Token,避免偷看後面的答案。
  • 編碼器-解碼器注意力參考編碼器的輸出,讓生成內容能依據輸入文字。
  • 前饋神經網路、殘差連接與層正規化再進一步處理資訊。

接著,線性層與 Softmax會計算詞彙表中各個 Token 成為下一個 Token 的機率。模型選出一個 Token,加入已生成內容,再重複預測,直到完成回答。

例如:

我 → 我覺得 → 我覺得今天 → 我覺得今天天氣 → …

四、注意力如何分配權重?

圖下方的注意力示意中,輸入會轉成三種向量:

  • Q(Query,查詢):目前要尋找什麼資訊?
  • K(Key,鍵):每個 Token 可以提供什麼資訊?
  • V(Value,值):每個 Token 實際提供的內容表示。

模型比較 Q 與各個 K,經 Softmax 得到注意力權重,再用權重加總 V。權重較高的詞,對目前的理解或生成影響較大。

「多頭」表示模型會用多組注意力,同時學習不同關係,例如詞義、句法或長距離關聯。

簡單比喻

Transformer 像一群一起閱讀的讀者:每個讀者負責注意句子中不同的線索,交換各自找到的關係,彙整後理解全文。生成回答時,解碼器再根據目前已寫出的內容,一個 Token 接一個 Token 地完成句子。

整體流程:

文字 → 分詞與向量化 → 編碼器理解上下文 → 解碼器預測下一個 Token → 組成文字回答



這張圖說明擴散模型如何學會生成圖片,可以分成「訓練」與「生成」兩個階段。

1. 訓練:逐步加入雜訊

上半部從一張清楚的橘貓圖片 \(x_0\) 開始,逐步加入高斯雜訊,變成 \(x_1\)、\(x_t\),最後接近純雜訊 \(x_T\)。

模型在這個過程中學習:在不同時間步,圖片裡加入了什麼雜訊。

2. 生成:逐步移除雜訊

下半部則反過來。模型從一張隨機雜訊 \(x_T\) 開始,每次估計目前雜訊中的成分,並移除一部分,逐步得到更清晰的圖片,最後形成 \(x_0\)。

去噪網路會參考兩項資訊:

  • 時間步 \(t\):告訴模型目前處於去噪流程的哪個階段。
  • 文字條件:例如「一隻橘貓坐在窗邊」,引導模型生成符合描述的內容。

圖中的 U-Net 或 Transformer 是可能採用的去噪網路架構;實際模型設計會依系統而不同。

簡單比喻

就像一張照片被雜訊蓋住,模型學會辨認雜訊並逐步清除。生成圖片時,它從一片雜訊開始,依提示詞反覆修整,最後形成新的影像。



這張圖是生成對抗網路(GAN)的架構。它由「生成器」和「判別器」組成,兩者交替訓練,像一場互相較勁的比賽。

1. 生成器:從雜訊產生資料

生成器接收隨機雜訊 \(z\),例如從標準常態分布取樣,再把它轉換成一筆看起來像真實資料的內容。圖中示範的是生成一個手寫數字「7」。

2. 判別器:判斷資料真偽

判別器會收到兩種資料:

  • 真實資料:訓練資料中的真實手寫數字。
  • 生成資料:生成器製作的樣本。

它輸出一個分數,估計輸入資料是真實資料的可能性。圖中的 0.8 是示意值,表示判別器認為該樣本有較高機率是真實的。

3. 兩者交替學習

  • 訓練判別器時:教它分辨真實資料與生成資料。
  • 訓練生成器時:利用判別器提供的學習訊號,調整參數,讓產生的資料更像真實資料、較容易騙過判別器。

這個循環反覆進行,生成器逐漸提升生成品質,判別器也持續改善辨識能力。

簡單比喻:生成器像仿畫者,判別器像鑑定師。仿畫者根據鑑定結果改進作品,鑑定師也從更多作品中練習辨真偽。



這張圖是變分自編碼器(VAE)的工作流程:先把資料壓縮成一個可取樣的潛在分布,再從中取樣並重建資料。以手寫數字「7」為例:

  1. 編碼器分析輸入
    輸入圖片 \(x\) 經過編碼器後,不會只變成一個固定的壓縮數值,而是轉成潛在分布的平均值 \(\mu\) 和標準差 \(\sigma\)。這表示模型學到「這張圖片可能對應到潛在空間中的哪些位置」。

  2. 從分布中取樣
    模型先取一個標準常態雜訊 \(\epsilon\),再用



    算出潛在向量 \(z\)。這個「重參數化」技巧讓取樣過程仍可配合神經網路訓練。

  3. 解碼器重建資料
    解碼器把 \(z\) 轉回圖片,產生重建結果 \(\hat{x}\)。訓練時希望它看起來盡量接近原始輸入 \(x\)。

  4. 同時調整兩種損失

    • 重建損失:衡量重建圖片 \(\hat{x}\) 和原圖 \(x\) 差多少。
    • KL 散度:讓每筆資料的潛在分布 \(q(z|x)\) 接近標準常態分布 \(p(z)\),避免潛在空間散亂或彼此斷裂。

    模型會一起降低兩種損失:



訓練完成後,可以直接從標準常態分布取樣一個 \(z\),交給解碼器生成新資料;也能在潛在空間中移動,產生外觀逐漸變化的圖片。

**簡單比喻:**編碼器先把圖片放到一張有規則的「特徵地圖」上,解碼器再依地圖上的位置畫回圖片。KL 散度則幫忙把這張地圖整理得平滑、連續,讓新取樣的位置也有機會解碼成合理資料。



這張圖說明自回歸生成:語言模型每次預測一個 Token,將它接回上下文,再預測下一個,直到產生結束符號。

以圖中的句子「今天天氣很好」為例:

  1. 從起始符號開始:模型收到 <開始>,計算下一個 Token 的機率。
  2. 選出下一個 Token:例如「今天」機率最高,模型選出它。
  3. 把新 Token 加入上下文:上下文變成「今天」,模型再預測下一個 Token,例如「天氣」。
  4. 重複預測:上下文累積為「今天、天氣」,接著產生「很好」。
  5. 產生結束符號:模型選出 <結束>,表示回答完成。

圖上的機率數字是示意。模型實際選詞時會受到取樣策略影響,因此不一定每次都選機率最高的 Token。文字模型的 Token 也不一定剛好等於一個完整的詞,可能是字、詞的一部分或標點。

簡單比喻:像接龍遊戲,每次根據前面已經說出的內容,接出下一段;整句話是許多次預測串接而成。



這張圖說明多模態生成模型如何處理文字、圖片、音訊與影片,並依需求產生一種或多種形式的內容。

工作流程

  1. 接收輸入
    模型可以收到文字、圖片、音訊或影片,也可以同時收到幾種。例如,一段文字提示加上一張參考圖片。

  2. 各模態分別編碼
    不同資料先由對應的編碼器轉成模型可處理的數值表示:文字由文字編碼器處理,圖片由圖像編碼器處理,音訊與影片也有各自的處理方式。

  3. 融合資訊並理解關係
    模型把不同輸入的特徵放在一起分析,理解它們如何互相補充。例如,文字提示描述「狗在海邊奔跑」,參考圖片則提供場景與色彩線索。

  4. 依任務生成輸出
    生成解碼器把模型的理解轉成指定形式的結果,例如文字說明、圖片、語音或影片片段。圖下方的例子是把文字提示與參考圖片結合,生成符合描述的新圖片。

簡單比喻

就像一位同時看圖、聽聲音、讀文字的創作者:先理解各種線索,再依照需求寫說明、畫圖或錄製語音。

各模型支援的輸入與輸出形式不同,因此不是每個多模態模型都能生成所有類型的內容。



這張圖說明 RAG(檢索增強生成)如何先從資料庫找相關資訊,再讓大型語言模型根據找到的資料回答。流程分成兩個階段:

一、資料建置:先整理好可搜尋的資料

這個階段通常事先完成,不必每次有人提問都重新處理文件。

  1. 收集資料:例如 PDF、Word、產品手冊、網頁或知識庫。
  2. 切分文字片段:把長文件拆成較小的段落,方便搜尋。
  3. 轉成向量:Embedding 模型把每個片段轉成數值向量,表示其語意。
  4. 建立索引:將向量和原始文字片段一起存入向量資料庫。

二、提問回答:依問題檢索並生成

使用者提問後,系統會:

  1. 將問題轉成向量。
  2. 到向量資料庫尋找語意相近的文字片段。
  3. 把問題和找到的片段組成提示,交給大型語言模型。
  4. 由模型依據這些資料撰寫回答,並可附上文件名稱或頁碼作為來源。

例如,詢問「公司今年的 ESG 目標是什麼?」系統會先找出 ESG 文件中相關段落,再請模型整理回答。

生活化比喻:像開卷考試。RAG 先幫模型從教材中找出相關頁面,再讓模型參考教材作答;這能減少只靠模型既有知識回答所造成的錯誤,但檢索到的資料若不完整或過時,回答仍可能不準確,因此仍要檢查來源。
















 

生成式 AI 技術入門:七種核心方法與架構圖

AI 技術入門|圖解系列

生成式 AI 技術入門:七種核心方法與架構圖

生成式 AI 不只是一種技術。不同模型各有擅長:有的依序寫出文字,有的從雜訊生成圖片,有的先搜尋資料再整理答案。本文用七張簡化架構圖,認識常見方法如何運作,以及它們彼此的關係。

先抓住一個核心:生成式 AI 從輸入與上下文中學習規律,接著預測或合成新的內容。文字、圖片、聲音與影片的生成方法不完全相同,也常會組合使用。

一、大型語言模型(LLM):讓機器理解並生成文字

大型語言模型(Large Language Model, LLM)透過大量文字資料學習語言模式、詞語關係與上下文。收到提示後,模型會根據目前內容計算後續文字的可能性,再逐步產生回答。現代 LLM 常以 Transformer 為基礎,並經過指令微調、偏好或安全性等後訓練,成為較能遵循指令的助理。

文字提示「解釋節水方法」分詞/嵌入轉成數值表示語言模型上下文理解與推理逐步預測下一個 Token生成回答文字/程式/摘要訓練階段學習模式;使用階段依提示逐步產生內容

LLM 的簡化流程:將輸入轉成模型可處理的表示,再依上下文生成內容。

生活比喻:像一位讀過大量文章、熟悉語言接龍規律的寫作者。它能寫得流暢,但流暢不代表每個事實都正確;重要資訊仍要查證。

二、Transformer:掌握上下文關係的模型架構

Transformer 是一種深度學習架構,核心特色是注意力機制(Attention):處理某個詞時,模型會衡量句中其他詞與它的關聯。這讓模型能在較長的文字範圍中建立上下文關係,也能有效平行處理訓練資料。

輸入文字詞嵌入+位置資訊編碼器 Encoder多頭自注意力殘差連接+正規化前饋神經網路解碼器 Decoder遮罩自注意力交叉注意力前饋網路+正規化輸出Token典型原始 Transformer 為編碼器-解碼器;許多模型只採用其中一側或改良變體

Transformer 的概念圖。不同產品會採用不同配置,並非每個模型都使用完整編碼器與解碼器。

注意力可想成閱讀時畫重點:理解「他把它放回原處」時,需要判斷「他」「它」「原處」分別對應什麼。常見元件還包括位置編碼、前饋神經網路、殘差連接與層正規化。

三、擴散模型(Diffusion):從雜訊逐步生成內容

擴散模型常用於圖片生成。訓練時,模型觀察圖片逐步被雜訊覆蓋的過程,學習估計雜訊;生成時,從隨機雜訊開始,反覆移除雜訊,最後形成新圖片。文字提示可透過條件機制引導去噪方向。

訓練:逐步加入雜訊清晰圖片 x₀原始資料加入一些雜訊x₁ … xₜ更多雜訊影像逐漸模糊純雜訊生成:模型反覆預測並移除雜訊隨機雜訊 xT去噪網路輸入時間步與條件較清晰影像生成圖片 x₀符合提示內容提示詞條件:例如「窗邊的橘貓」

正向過程讓資料逐漸變成雜訊;生成過程則由模型一步步還原結構。

簡單比喻:先把照片弄得越來越模糊,再教模型如何把模糊中的結構找回來。真正生成時,模型從雜訊開始「畫」出影像。

四、生成對抗網路(GAN):生成器與判別器互相較勁

GAN 由兩個神經網路組成:生成器把隨機向量轉成假資料;判別器比較真實資料與生成資料,判斷兩者差異。訓練時生成器努力做得更像,判別器努力抓出破綻,兩者在對抗中改善。

隨機雜訊 z隨機起點生成器 G產生仿真的資料生成資料假樣本判別器 D判斷真實或生成真實資料判別結果提供學習訊號,促使 G 改善G 想讓生成資料更像真的;D 想正確分辨真偽

GAN 的訓練核心是兩個網路輪流更新、互相競爭。

GAN 曾廣泛用於影像合成、修復與風格轉換。訓練可能較不穩定,例如生成結果缺少多樣性;因此不同任務也常採用擴散模型等其他方法。

五、變分自編碼器(VAE):學習可取樣的潛在空間

VAE 先由編碼器把輸入轉成潛在分布,再從分布中取樣,交給解碼器重建資料。它不只記住單一壓縮向量,而是學習一個平滑、可取樣的潛在空間,因此可用於生成與表示學習。

輸入 x例如手寫數字編碼器估計 μ 與 σ潛在分布 q(z|x)平均值 μ 標準差 σ加入 ε 後取樣 z解碼器從 z 重建重建x̂重建損失:x̂ 要接近 xKL 散度:潛在分布接近標準常態兩種目標共同訓練:重建得好,同時保留規整可取樣的潛在空間

VAE 用分布描述潛在表示,讓相近資料能落在相近區域並可由空間取樣生成。

訓練目標通常由兩部分組成:重建損失衡量輸出與輸入差異;KL 散度則鼓勵潛在分布接近預設的簡單分布(常見為標準常態分布)。

六、自回歸生成:一次預測一個 Token

自回歸(Autoregressive)生成會依序預測下一個單位。文字模型通常是預測下一個 Token;音訊或其他資料也能使用類似的逐步預測方式。每次選出下一個 Token 後,就把它加入上下文,再進行下一輪預測,直到產生結束符號。

目前上下文「今天天氣」語言模型計算下一個 Token選出 Token「很好」更新上下文再預測一次反覆進行,直到完成「今天天氣很好。」模型計算的是候選 Token 的機率;取樣策略會影響輸出的變化程度

自回歸生成像接龍:每一步都以已經出現的內容為條件。

溫度(temperature)、Top-k 或 Top-p 等解碼設定,會影響模型如何從候選 Token 中挑選下一個。較保守的設定通常輸出較穩定;較多樣的設定則可能帶來更多變化。

七、多模態生成:跨文字、圖像、音訊與影片

多模態模型能接收或產生不只一種形式的資料。模型會把文字、圖片、聲音或影片轉換成可共同處理的表示,再進行理解、融合與生成。不同模型支援的輸入與輸出組合不同,不能假設每個模型都能處理所有模態。

多種輸入文字提示圖片/文件音訊影片多模態模型模態編碼與融合理解/生成解碼可能的輸出文字回答生成圖片語音回答生成影片實際支援的模態依模型而異

多模態模型可跨形式理解與生成,並可能同時使用多種輸入。

例子:提供一張活動照片並詢問「孩子正在做什麼?」屬於文字加圖片輸入、文字回答輸出;要求「根據這段描述生成插畫」則是文字輸入、圖片輸出。

八、檢索增強生成(RAG):先找資料,再生成回答

RAG(Retrieval-Augmented Generation)會在生成答案前,先從指定文件或資料庫檢索相關內容,再把找到的片段提供給語言模型。這有助於回答內部知識、課程教材或較新的資料,也能讓答案附上來源線索。RAG 是結合檢索與生成的系統方法,不是單一模型架構。

資料建置(離線)文件/資料來源切分文字片段Embedding 向量化向量資料庫提問回答(即時)使用者提問問題文字問題向量化Embedding相似度檢索相關文件片段檢索結果LLM 組合上下文根據問題與片段生成輸出:有依據的回答(可附文件名稱或引用來源)

RAG 分成離線建立索引與即時檢索回答兩個階段。

典型流程是:① 整理文件、② 切分段落、③ 建立向量索引、④ 依問題檢索片段、⑤ 將問題與片段交給 LLM 生成答案。檢索品質和資料更新方式會直接影響回答品質;RAG 也不能保證完全沒有錯誤,仍應檢查引用來源。

九、七種技術快速比較

技術主要用途/特色容易記住的關鍵
LLM文字理解、對話、摘要、寫作與程式生成根據上下文產生文字
Transformer處理序列與上下文關係的模型架構注意力衡量關聯
擴散模型圖片生成、編輯,也可延伸至音訊或影片從雜訊逐步去噪
GAN合成資料、影像轉換與修復生成器和判別器對抗
VAE資料表示、壓縮與潛在空間生成編碼分布、取樣、解碼
自回歸生成逐步生成文字、語音或序列資料預測下一個單位
多模態生成跨文字、圖像、音訊與影片理解或生成不同資料模態共同處理
RAG接入文件或知識庫,讓回答引用外部資料先檢索,再生成

要寫文章或回答問題

使用 LLM;若需回答指定教材或校內資料,可搭配 RAG。

要生成圖片

常見做法是擴散模型;GAN 和 VAE 也有生成應用。

要理解圖片與文字

使用支援對應輸入與輸出的多模態模型。

要理解模型如何生成文字

從 Transformer 的注意力與自回歸逐 Token 預測開始。

結語:這些技術會互相搭配

生成式 AI 的各種技術不是互斥選項。LLM 常使用 Transformer 架構,並以自回歸方式生成文字;多模態模型可把不同資料形式整合;RAG 則在模型生成前加入外部檢索。圖片生成也可能採用擴散等專用模型,再由產品系統串接提示詞、安全檢查與編輯功能。

理解架構圖的價值,在於知道每種方法「從哪裡開始、經過哪些步驟、產生什麼結果」,進而依教學、研究或實務需求選擇合適工具。

圖解為教學用途的簡化示意。實際模型可能採用不同設計、訓練方法與模態組合;各家產品也不一定公開完整技術細節。

2026年10月20日 星期二

電子郵件怎麼旅行?用生活情境認識 SMTP、POP3、IMAP 與相關機制

網路與生活|電子郵件入門

電子郵件怎麼旅行?
用生活情境認識 SMTP、POP3、IMAP 與相關機制

寄一封電子郵件,看起來只要按下「傳送」,背後其實有好幾個角色接力合作。把電子郵件想成郵局寄信,就能理解 SMTP、POP3、IMAP 各自負責什麼,以及 DNS、MIME 和 SPF 等機制如何幫忙。

先記住三句話:
SMTP 負責把信寄出去;POP3 或 IMAP 負責讓收件人取信;DNS 幫忙找到收件者的郵件伺服器。

一、先把電子郵件想成寄信

你寫好一封信,投入郵筒後,郵局要知道信要送去哪裡、交給哪個郵局;收件人則要用自己的方式查看信件。電子郵件也類似:郵件軟體負責撰寫和顯示,郵件伺服器負責收送與保管,通訊協定則像郵局作業規則,規定各個系統怎麼交接。

寄件人
寫信並按下傳送
→
SMTP
把信交給寄件伺服器
→
DNS/MX
查到收件網域的郵件伺服器
→
收件伺服器
收下並保存信件
→
IMAP 或 POP3
收件人查看信件
簡化的郵件傳送與收取流程。實際服務可能包含多台伺服器與額外的安全檢查。

二、SMTP:像郵局的寄件櫃台

SMTP 是 Simple Mail Transfer Protocol 的縮寫,主要負責寄出郵件,以及讓郵件伺服器彼此轉送信件。你在手機或電腦按下「傳送」,郵件程式通常先透過 SMTP 把信交給你的郵件服務;接著寄件伺服器再把信送往收件方的郵件伺服器。

生活比喻:你把信交給郵局櫃台,櫃台負責把信送上寄送流程。SMTP 負責「寄」,不負責讓你在收件匣中閱讀郵件。

三、POP3:像把信領回家

POP3 是 Post Office Protocol 版本 3 的縮寫。它讓郵件程式從郵件伺服器取得信件,常見做法是把信下載到裝置上。是否在下載後保留伺服器副本,會依郵件服務和程式設定而不同。

生活比喻:你到郵局把信領回家,之後主要在家裡看這些信。如果還用另一台裝置,信件狀態或資料夾不一定會完全一致。

四、IMAP:像把信留在郵局信箱裡查看

IMAP 是 Internet Message Access Protocol 的縮寫。它讓郵件程式連線到伺服器查看和管理信件,通常由伺服器保留信件,因此手機、平板和電腦可以同步看到同一個信箱的內容與狀態。

生活比喻:信一直放在郵局的個人信箱,你用不同裝置查看同一個信箱;在手機上讀過的信,電腦通常也會顯示為已讀。

SMTP

寄信

把信交給寄件伺服器並轉送。

POP3

下載收信

把信取到裝置,保留伺服器副本與否看設定。

IMAP

同步收信

主要在伺服器管理信件,多台裝置同步查看。

五、除了三大協定,還有哪些幫手?

名稱生活化比喻作用
DNS/MX 紀錄查郵局地址DNS 查詢網域資訊;MX 紀錄指出該網域負責收信的郵件伺服器。
MIME信件內容與附件的包裝標示讓郵件能表示不同格式的文字、圖片和附件。嚴格來說,MIME 是一組媒體格式與郵件內容標準,不是和 SMTP、IMAP 同類的收信協定。
HTTPS安全連線到郵件網站用瀏覽器登入網頁信箱時,通常透過 HTTPS 與網站安全傳輸資料。
Exchange/ActiveSync公司信箱的整合式服務常用於企業郵件與行動裝置同步,也可能同步行事曆、聯絡人等資料;它不是 POP3 或 IMAP 的另一個簡單同義詞。

六、SPF、DKIM、DMARC:確認寄件來源的安全機制

這三者常和電子郵件一起談,但它們不是用來寄信或收信的協定,而是協助網域驗證寄件來源、降低偽冒郵件的機制。

  • SPF:像網域公布一份「哪些郵件伺服器可以代表我寄信」的名單。
  • DKIM:像替郵件加上可驗證的數位封印,讓收件方檢查內容是否被竄改,以及簽章是否來自相應網域。
  • DMARC:像網域提供給收件方的處理指引,說明 SPF、DKIM 檢查結果不符合時如何處理,並可接收驗證報告。

七、使用者需要全部設定嗎?

不一定。使用網頁版 Gmail、Outlook 等服務時,服務商通常已處理好伺服器之間的郵件傳送與收取。使用郵件 App 手動設定帳號時,通常需要設定寄信用的 SMTP,以及收信用的 IMAP 或 POP3;大多數日常使用情境選 IMAP,比較方便在多台裝置同步。

快速記憶:SMTP 把信寄出去;POP3 把信下載回來;IMAP 在伺服器上同步查看;DNS 找郵件伺服器;MIME 處理信件格式與附件。

結語

電子郵件不是由單一協定完成的。SMTP 負責寄送,POP3 或 IMAP 負責收取,DNS 協助找到收件伺服器,MIME 讓郵件能帶上各種內容,而 SPF、DKIM、DMARC 則協助收件系統判斷信件來源是否可信。把它們想成郵局裡不同的工作,就不容易混淆。

教學提醒:郵件服務商可能調整連接埠、加密方式與登入政策;實際設定時請以服務商公布的最新資料為準。

2026年10月17日 星期六

從活動照片到會動的繪本:AI 生圖與 Google Flow 影片實作

AI 創作實作|照片 × 插畫 × 影片

從活動照片到會動的繪本

把孩子操作機器人的真實活動照片,先轉成溫暖明亮的手繪插畫,再用 Google Flow 生成一段短影片,記錄科技教育活動的另一種方式。

一張活動照片記錄了當下;透過生成式 AI,我們還能把它轉化成具有繪本感的插畫,接著讓畫面中的人物和物件產生細微動作。本次以孩子們圍著 TaleMap 地圖、操作程式機器人的活動為例,實際完成「照片轉插畫」和「插畫轉影片」兩個步驟。

01|活動照片保留真實場景與互動
02|生成插畫轉換畫風,維持主要構圖
03|Flow 影片加入輕柔動作與鏡頭推近

一、從真實活動照片開始

原始照片中,孩子們圍在大型 TaleMap 地圖旁,觀察圖卡並操作白色程式機器人。照片還包含帶領活動的學生、桌面教材,以及右側的教具。生圖時最重要的是先說明哪些內容要保留:人物相對位置、姿勢、服裝、活動用品和現場情境。


二、用提示詞把照片轉成繪本插畫

提示詞可以分成四個部分:指定照片作為參考、列出要保留的內容、描述插畫風格,再補上不希望出現的改動。把構圖要求寫清楚,通常比只寫「變成可愛插畫」更容易得到符合活動紀錄用途的結果。

本次生圖提示詞

請以我上傳的照片為構圖與人物活動參考,將照片轉換成溫暖明亮的日系手繪插畫。保留照片中的主要人物、動作、互動關係、場景配置與重要物件,讓人仍能辨認原本的活動情境。

畫面採用兒童繪本插畫風格,結合水彩暈染與色鉛筆筆觸;人物比例自然可愛,表情生動親切,輪廓以細緻清楚的手繪線條呈現。使用明亮飽和的藍色、湖水綠、橘色與黃色,光線柔和,整體氣氛熱鬧、溫馨、有教育活動紀錄感。背景細節豐富但不凌亂,保留現場的展示物與活動用品。

請勿新增照片中沒有的人物或重要物件;不要改變人物的主要姿勢與相對位置。畫面呈現精緻、完整、適合活動成果展示的插畫,不要加入文字、標題、浮水印或邊框。


生成結果:保留孩子、地圖、機器人與活動互動,並轉為水彩與色鉛筆繪本風格。
觀察:插畫呈現了明亮色彩與手繪筆觸,也保留了地圖、機器人和孩子們操作教具的核心情境。生成式模型仍可能調整人物細節或重新詮釋背景,因此若要精準呈現活動紀錄,應以原照片為參考,並逐項寫明不可變動的元素。

三、把插畫放進 Google Flow 生成影片

完成插畫後,將圖片上傳到 Google Flow,選擇以圖片作為影片起始畫面的功能,再描述希望出現的動作與鏡頭運動。本次設計的是幅度較小的動作:孩子低頭看地圖、按下機器人按鍵,機器人在圖卡上緩慢前進;鏡頭則從全景稍微推近。

  1. 進入 Google Flow,建立新專案。
  2. 選擇可使用圖片作為起始畫面的影片功能(介面名稱與可用選項可能依帳號及模型而異)。
  3. 上傳生成的插畫,設定影片比例、長度與模型。
  4. 貼上動作提示詞,生成後檢查人物、地圖和機器人的連貫性。
  5. 若動作太大或場景變化過多,縮短描述並強調固定構圖,再重新生成。
本次 Flow 影片提示詞

以這張插畫作為影片起始畫面,保留孩子們圍著 TaleMap 操作機器人的構圖、服裝與人物位置。孩子自然地低頭看地圖、輕輕按下機器人按鍵,彼此微笑互動;機器人在地圖上緩慢前進。鏡頭平穩地由全景稍微推近,呈現溫暖明亮的兒童繪本氣氛,水彩與色鉛筆筆觸保持一致。動作自然、幅度小,不增加人物或物件,不改變場景,不出現文字或字幕。

Google Flow 生成的短影片:讓插畫中的孩子、地圖與機器人產生輕柔動態。

四、提示詞怎麼寫,影片會更穩定?

照片或插畫轉影片時,靜態畫面已經提供了人物和場景資訊,提示詞可以把重點放在「誰做什麼、動作多大、鏡頭怎麼移動」。動作越精簡、鏡頭越穩定,越容易維持原畫面。若一次要求多人做不同動作、快速移動鏡頭或大幅改變場景,生成結果就比較容易偏離原圖。

  • 人物動作:低頭看地圖、輕按按鍵、微笑互動。
  • 物件動作:機器人慢慢沿著地圖移動。
  • 鏡頭動作:平穩推近,避免快速旋轉或切換角度。
  • 一致性要求:保留人物位置、服裝、場景與插畫筆觸。
  • 排除事項:不增加人物、不改變場景、不生成字幕或文字。

五、從一張照片延伸出新的活動紀錄

這次實作把真實活動、繪本插畫與短影片連成一個簡單的創作流程。插畫可以用在成果報告、課程簡報或活動回顧;短影片則適合用於社群貼文或課程展示。對教育活動而言,AI 不只是把畫面變得更可愛,也提供了另一種說故事的方法:讓孩子的學習互動,以影像形式再次被看見。

使用提醒:若作品將公開發布,請確認照片中人物的肖像使用同意與活動素材授權。生成畫面可能改變臉部、文字或細節,重要資訊應以原始紀錄核對。Flow 的模型、功能、輸出長度和點數規則可能隨官方更新而調整,操作時請以平台當下顯示為準。

延伸參考:Google Flow 模型與支援功能說明|Google Flow 創作技巧

照片轉插畫與 Flow 影片生成實作|以兒童機器人地圖活動為例

2026年10月16日 星期五

泡泡牆為什麼能從另一台電腦開啟?IP、連接埠與區域網路入門

網際網路入門・Django 泡泡牆實作

泡泡牆為什麼能從另一台電腦開啟?
認識 IP、連接埠與區域網路

老師在一台電腦啟動 Django 泡泡牆,學生卻能用自己的手機或筆電投稿,投影幕也能即時出現新泡泡。這個過程不只是「打開一個網址」,而是裝置在區域網路中找到伺服器,並透過指定連接埠交換資料。

一、先看懂連線中的角色

角色在泡泡牆中的例子工作
用戶端學生手機、筆電、投影瀏覽器提出網頁請求、顯示畫面、送出資料
伺服器執行 Django 的教師電腦接收請求、驗證資料、查詢或更新資料庫、回應結果
區域網路教室 Wi‑Fi 或有線網路讓同一網路中的裝置彼此傳送資料

本例中,學生瀏覽器是用戶端,教師電腦是伺服器。Django 接到投稿後會儲存泡泡,再通知投影頁更新。

二、IP 位址:在網路中找到那台電腦

IP 位址像是裝置在網路上的地址。教室區域網路常見的私有 IPv4 位址會以 192.168.、10. 或 172.16 至 172.31 開頭。例如 Django 主機可能是 192.168.1.100。

在 Windows 主機開啟 CMD,輸入以下指令查詢網路設定:

ipconfig

找到正在使用的 Wi‑Fi 或乙太網路介面,查看「IPv4 位址」。遠端裝置要連線時,使用的就是這個主機 IP。主機若重新連接網路,IP 可能改變,需要重新查詢。

注意:127.0.0.1 是「本機迴路」位址,代表目前正在使用的這台電腦。遠端學生輸入 127.0.0.1 會連回自己的手機或電腦,因此要輸入 Django 主機的區域網路 IP。

三、連接埠:找到電腦裡正確的服務

一台電腦可能同時提供許多網路服務。連接埠(Port)用來區分資料應該交給哪個服務。泡泡牆開發時使用連接埠 8000,所以網址會寫成:

http://192.168.1.100:8000/

其中 192.168.1.100 是主機 IP,8000 是 Django 服務使用的連接埠,最後的斜線代表網站路徑。完整網址可拆成:

網址部分例子說明
通訊協定http://瀏覽器與網站使用 HTTP 溝通
主機位置192.168.1.100要連線的 Django 電腦
連接埠:8000該電腦上的 Django 服務
路徑/projector/要開啟的網站功能

四、為什麼要用 0.0.0.0 啟動?

Django 的開發伺服器預設只接受本機連線。若要讓同一區域網路的其他裝置連線,要讓它監聽主機的網路介面。進入 Django 專案資料夾後,可在 Windows CMD 執行:

set DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,192.168.1.100
set BUBBLE_TOKENS=class-a-2026
set BUBBLE_ADMIN_TOKEN=teacher-admin-2026
python manage.py runserver 0.0.0.0:8000
  • 0.0.0.0:8000:Django 在所有可用網路介面的 8000 埠接收連線。
  • DJANGO_ALLOWED_HOSTS:列出 Django 接受的主機名稱或 IP,請換成自己的主機位址。
  • BUBBLE_TOKENS:學生投稿時使用的活動 token。
  • BUBBLE_ADMIN_TOKEN:管理頁清空泡泡時使用的管理 token,應與投稿 token 不同。

這些 set 指令設定的值只存在於目前 CMD 視窗。關閉視窗後,需重新設定並啟動伺服器。

五、遠端裝置如何連線

學生手機或筆電連上相同 Wi‑Fi 後,在瀏覽器輸入:

  • 投稿頁:http://192.168.1.100:8000/
  • 投影頁:http://192.168.1.100:8000/projector/
  • 管理頁:http://192.168.1.100:8000/manage/

網址中的 IP 請替換成 Django 主機的實際 IPv4 位址。學生在投稿頁填入活動 token;教師若要清空本場泡泡,則到管理頁輸入管理 token。

六、HTTP 請求如何抵達 Django?

當學生按下送出,瀏覽器會向伺服器傳送 HTTP POST 請求。網路設備依照目標 IP 將資料送到教師電腦,作業系統再依連接埠把請求交給 Django。Django 驗證 token 和欄位後回傳結果;投影頁則透過 SSE 接收新泡泡事件。

動作請求/通訊結果
打開投稿頁瀏覽器向 Django 要求 HTML、CSS、JavaScript顯示投稿表單
送出泡泡POST /api/bubbles,附上 JSON 與 tokenDjango 驗證並寫入資料庫
投影端載入舊資料GET /api/state回傳目前泡泡清單
出現新泡泡/api/events 的 SSE 推播投影頁即時更新,不必重新整理

七、Windows 防火牆與網路限制

即使 IP 和網址正確,防火牆仍可能阻擋其他裝置連入。首次執行 Python 時,若 Windows 顯示網路存取提示,應在可信任的教室私人網路中允許通訊。必要時請管理者設定允許 TCP 8000 埠的私人網路入站規則。

部分校園、訪客 Wi‑Fi 會啟用用戶端隔離,阻止同一 Wi‑Fi 的裝置互相連線。若兩台設備都連上網路但仍無法互通,可請網管確認此設定,或改用允許裝置互通的教學網路。

八、連線檢查清單

  1. 主機上 Django 是否正在執行,且啟動指令包含 0.0.0.0:8000?
  2. 遠端裝置是否使用主機 IPv4,而不是 127.0.0.1?
  3. 網址是否包含 :8000 連接埠?
  4. DJANGO_ALLOWED_HOSTS 是否包含該 IP?
  5. Windows 防火牆是否允許私人網路連線?
  6. 兩台設備所連的 Wi‑Fi 是否允許用戶端彼此通訊?

九、區域網路與公開網際網路

使用主機私有 IP 的方式,只適合可互相連線的同一區域網路。校外的電腦通常不能直接使用 192.168.x.x 連到教室主機。若需要公開服務,應部署到正式伺服器、設定網域與 HTTPS,並妥善管理密鑰。

安全提醒:python manage.py runserver 是開發伺服器,適合本機開發或受控教室網路示範。不要直接把它公開到網際網路,也不要將活動 token 或管理 token 放在公開文章或程式碼中。

十、課堂延伸問題

  • 為什麼同一台電腦上的 127.0.0.1 和 192.168.1.100 指向不同連線情境?
  • 一台電腦開啟多個網站服務時,如何利用連接埠區分它們?
  • 若主機 IP 改變,學生書籤中的網址會發生什麼事?
  • 若教室網路不允許裝置彼此連線,有哪些可行的部署或網路安排?

從泡泡牆的遠端操作開始,學生可以逐步理解 IP 如何定位主機、連接埠如何定位服務、HTTP 如何交換資料,也能認識防火牆和區域網路規則對網站連線的影響。把這些概念與親手操作連在一起,網際網路就不再只是抽象名詞。

從遠端電腦操作 Django 泡泡牆:區域網路設定教學

DJANGO 泡泡牆・網路實作

從遠端電腦操作 Django 泡泡牆
區域網路設定教學

泡泡牆網站只需在一台電腦啟動 Django,其他電腦便可透過瀏覽器連線投稿或投影。本文以 Windows 主機為例,說明如何在教室的同一個 Wi‑Fi/區域網路內設定與操作。

先了解架構:一台電腦擔任 Django 主機,負責執行網站與保存泡泡資料;其他電腦、平板或手機是用戶端,透過瀏覽器連線。遠端裝置不需要另外安裝 Django。

一、適用情境與準備項目

  • 一台已解壓縮 Django 泡泡牆專案、能執行 Python 的主機。
  • 主機和遠端電腦連接同一個 Wi‑Fi 或區域網路。
  • 主機的區域網路 IP 位址,以及活動投稿 token。

以下假設專案已依照泡泡牆安裝教學完成套件安裝和資料庫遷移。若尚未安裝,請先在專案目錄執行 pip install -r requirements.txt 和 python manage.py migrate。

二、在 Django 主機查詢 IP 位址

步驟 1:開啟命令提示字元

在執行 Django 的 Windows 電腦按下「開始」,搜尋並開啟「命令提示字元」(CMD),輸入:

ipconfig

找到目前正在使用的 Wi‑Fi 或乙太網路介面,查看「IPv4 位址」。以下用 192.168.1.100 作為示例,實際操作時請換成您電腦顯示的 IP。

三、允許區域網路連線並啟動 Django

步驟 2:切換到專案資料夾

在 CMD 用 cd 進入包含 manage.py 的資料夾。例如:

cd C:\Users\學生\Desktop\bubblewall-django

請依照您實際解壓縮的位置修改路徑。

步驟 3:啟用虛擬環境(若有建立)

.venv\Scripts\activate

若命令提示字元前面出現 (.venv),表示虛擬環境已啟用。

步驟 4:設定允許的主機 IP、活動 token 並啟動伺服器

在同一個 CMD 視窗依序執行下列指令。請把 IP 換成主機的 IPv4 位址,也可將 token 換成您要提供給學生的活動通行碼。

set DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost,192.168.1.100
set BUBBLE_TOKENS=class-a-2026
python manage.py runserver 0.0.0.0:8000

0.0.0.0:8000 表示 Django 開發伺服器接受主機其他網路介面的連線;若只執行 python manage.py runserver,通常只能由主機本身開啟。

請讓這個 CMD 視窗保持開啟,關閉視窗或停止伺服器後,遠端就無法連線。用 set 設定的環境變數只在目前 CMD 視窗有效。

四、從遠端電腦開啟泡泡牆

在遠端電腦確認已連上與主機相同的 Wi‑Fi,接著打開 Chrome、Edge 或其他瀏覽器,輸入主機 IP 和連接埠:

用途範例網址
學生投稿頁http://192.168.1.100:8000/
投影展示頁http://192.168.1.100:8000/projector/

請將範例網址中的 192.168.1.100 改成主機實際的 IPv4 位址。學生在投稿頁輸入活動 token、想法、隊伍名稱並選擇顏色,送出後投影頁會顯示新泡泡。

五、Windows 防火牆設定

若遠端電腦無法開啟網址,可能是 Windows 防火牆阻擋連線。首次啟動 Python 時若出現防火牆提示,允許 Python 在私人網路通訊。若沒有提示,可在 Windows「防火牆與網路保護」設定中,允許 Python 通過私人網路防火牆。

也可以由管理者建立入站規則,允許 TCP 連接埠 8000 在私人網路使用。請只開放教學場域需要的網路範圍。

六、常見問題排查

現象檢查方式
瀏覽器顯示無法連線確認 Django 主機的 CMD 視窗仍在執行;確認網址 IP 正確、連接埠是 8000,且兩台裝置在相同網路。
出現 DisallowedHost確認 DJANGO_ALLOWED_HOSTS 包含主機的 IPv4 位址;修改後重新啟動 Django。
網頁可開啟,但投稿失敗確認 token 與主機設定的 BUBBLE_TOKENS 相同;檢查文字、隊伍名稱與顏色欄位。
同一 Wi‑Fi 還是互相連不到查看防火牆是否允許私人網路;詢問網管 Wi‑Fi 是否啟用用戶端隔離。部分校園或訪客網路會禁止裝置彼此連線。
主機 IP 改變後網址失效重新執行 ipconfig 查詢 IPv4,並用新的 IP 開啟網址;也要更新允許的主機設定。

七、在外網或校外使用

上述方式適合教室內同一個區域網路使用。若要讓校外網路或不同網路的電腦連線,建議將網站部署到正式伺服器或雲端主機,設定網域名稱與 HTTPS,再妥善管理活動 token。

重要:python manage.py runserver 是 Django 開發用伺服器,不適合直接公開到網際網路。不要只為了遠端連線,就在路由器上將 8000 埠公開轉發到網路。

八、課堂操作流程建議

  1. 教師電腦啟動 Django,並將投影頁投放到教室螢幕。
  2. 教師確認主機 IP,將投稿網址和活動 token 提供給學生。
  3. 學生使用自己的電腦或手機開啟投稿頁,送出文字與顏色。
  4. 全班觀察投影頁即時出現泡泡,討論瀏覽器、HTTP 請求、伺服器、資料庫和 SSE 的分工。

透過這個流程,學生能把「網路上的資料如何傳送」與「多媒體內容如何呈現」連結起來,從實際操作理解網站與互動系統的基本架構。

用 Django 打造即時泡泡牆:從網際網路理論到多媒體實作

網際網路 × 多媒體應用 × Django 實作

用 Django 打造即時泡泡牆
從網際網路理論到多媒體實作

一個泡泡牆看起來像是把文字變成彩色圓泡泡,背後其實串起了瀏覽器、HTTP、JSON、伺服器、資料庫與即時推播。本文以 Django 製作一套可在教室展示的泡泡牆,帶大一新生透過完整作品認識網際網路與多媒體應用的基礎。






一、設計動機

大一新生初次接觸網際網路與多媒體應用時,常會分別學到網頁、伺服器、資料格式、資料庫和視覺設計等名詞,卻不容易看見它們如何合作。泡泡牆把這些概念放進一個能親手操作、能立即看見結果的情境:學生輸入一句想法,按下送出,教室投影畫面就多出一顆彩色泡泡。

因此,這個作品的動機是讓大一新生瞭解網際網路以及多媒體應用的理論基礎。學生可以沿著一則資料的旅程,觀察瀏覽器如何發出請求、Django 如何驗證與處理資料、資料如何存進資料庫,以及伺服器如何把新內容即時送到投影畫面。

二、教學目的

  • 認識用戶端與伺服器的分工,理解瀏覽器如何透過 HTTP 與網站溝通。
  • 分辨 GET 與 POST 的用途,讀懂 200、201、400、401 等狀態碼。
  • 理解 JSON 如何承載文字、顏色、隊伍等結構化資料。
  • 了解 Django URL 路由、View、Model 與 SQLite 資料庫的關係。
  • 體驗 Server-Sent Events(SSE)如何將新泡泡由伺服器推送到投影瀏覽器。
  • 連結多媒體的文字、色彩、動態效果與全螢幕展示,思考科技如何支持課堂互動。
學習成果:完成後,學生不只會看到泡泡牆的畫面,也能說明一顆泡泡如何從投稿表單出發,經過網路傳輸、伺服器處理與資料儲存,最後出現在投影幕上。

三、系統如何運作

學生瀏覽器HTTP POSTDjango API寫入SQLite
投影瀏覽器GET /api/state載入既有泡泡
Django SSE推送新事件投影瀏覽器新增泡泡

學生端將文字、顏色、隊伍名稱組成 JSON,並在 HTTP 標頭附上 Bearer token。伺服器檢查 token 和欄位後,建立資料記錄,回傳 201 Created。同時,SSE 連線會收到新泡泡事件,讓投影畫面無須重新整理就能更新。

介面方法與路徑用途成功/錯誤回應
載入泡泡GET /api/state取得既有泡泡200 OK + JSON
新增泡泡POST /api/bubbles驗證並儲存投稿201 Created;格式錯誤 400;token 無效 401
即時事件GET /api/events維持 SSE 連線、接收新泡泡text/event-stream

四、重要程式解析

1. Model:定義泡泡資料

Django Model 描述一筆泡泡要保存哪些欄位。執行資料庫遷移後,Django 會依此建立資料表。

from django.db import models

class Bubble(models.Model):
    text = models.CharField(max_length=160)
    color = models.CharField(max_length=7)
    team = models.CharField(max_length=40)
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)

    class Meta:
        ordering = ['-created_at']

    def as_event(self):
        return {
            'id': self.pk,
            'text': self.text,
            'color': self.color,
            'team': self.team,
            'created_at': self.created_at.isoformat(),
        }

CharField 用來保存文字欄位,auto_now_add=True 會在建立記錄時自動記下時間。as_event() 將 Model 物件轉成適合 JSON 傳輸的 Python 字典。

2. URL 路由:把網址交給對應功能

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('projector/', views.projector, name='projector'),
    path('api/state', views.state, name='state'),
    path('api/bubbles', views.create_bubble, name='create_bubble'),
    path('api/events', views.events, name='events'),
]

路由可以想成網站的分機表:收到不同路徑,Django 就呼叫不同的 View。一般頁面負責回傳 HTML;以 /api/ 開頭的路徑主要交換資料。

3. View:驗證資料、存入資料庫並回傳狀態碼

以下節錄新增泡泡的關鍵邏輯。實際專案也會檢查 JSON 格式、欄位長度與色碼格式。

@require_POST
def create_bubble(request):
    token = request.headers.get('Authorization', '')
    token = token.removeprefix('Bearer ').strip()

    if not token or token not in settings.BUBBLE_TOKENS:
        return JsonResponse(
            {'error': 'unauthorized'}, status=401
        )

    data = json.loads(request.body)
    text = data.get('text', '').strip()
    color = data.get('color', '')
    team = data.get('team', '').strip()

    # 正式程式在此檢查欄位內容與格式
    bubble = Bubble.objects.create(
        text=text, color=color.upper(), team=team
    )
    return JsonResponse(bubble.as_event(), status=201)

Authorization: Bearer ... 是 HTTP 標頭中的通行憑證。驗證失敗回傳 401;資料欄位無效回傳 400;建立成功回傳 201。這些狀態碼是瀏覽器或其他用戶端判斷結果的依據。

安全提醒:教學原型使用環境變數設定 token;正式活動應將預設示範 token 換掉,避免把 token 寫在公開程式碼中。登入表單送出的 token 會由瀏覽器傳送到網站,因此公開部署須使用 HTTPS。

4. SSE:讓投影畫面收到新泡泡

SSE 是由伺服器單向推送資料到瀏覽器的機制。它適合「學生送出、投影端即時顯示」這種更新方向單純的情境。

def events(request):
    q = Queue()
    with _subscribers_lock:
        _subscribers.add(q)

    def stream():
        try:
            yield 'retry: 3000\n\n'
            while True:
                try:
                    payload = q.get(timeout=15)
                    yield f'event: bubble\ndata: {payload}\n\n'
                except Empty:
                    yield ': keep-alive\n\n'
        finally:
            with _subscribers_lock:
                _subscribers.discard(q)

    response = StreamingHttpResponse(
        stream(), content_type='text/event-stream'
    )
    response['Cache-Control'] = 'no-cache'
    response['X-Accel-Buffering'] = 'no'
    return response

投影瀏覽器先呼叫 /api/state 載入舊泡泡,再使用 EventSource 訂閱新事件:

fetch('/api/state')
  .then(response => response.json())
  .then(data => data.bubbles.forEach(addBubble));

const stream = new EventSource('/api/events');
stream.addEventListener('bubble', event => {
  const bubble = JSON.parse(event.data);
  addBubble(bubble);
});

收到資料後,JavaScript 建立泡泡元素、套用顏色,並將文字放入頁面。CSS 負責圓形外觀、陰影、浮動動畫和手機版排版,構成多媒體呈現的一部分。

五、執行步驟

步驟 1:準備環境

先安裝 Python 3.10 以上版本,將 bubblewall-django.zip 解壓縮到一個工作資料夾。開啟 Windows 命令提示字元(CMD),使用 cd 切換到含有 manage.py 的專案目錄。

cd C:\\Users\\學生\\Desktop\\bubblewall-django

步驟 2:建立虛擬環境並安裝 Django

python -m venv .venv
.venv\\Scripts\\activate
pip install -r requirements.txt

看到命令提示字元前面出現 (.venv),表示虛擬環境已啟用。

步驟 3:設定活動 token

原型預設 token 是 demo-token,直接啟動也能測試。若要指定活動用 token,可在同一個 CMD 視窗執行:

set BUBBLE_TOKENS=class-a-2026

此 token 會用來驗證學生的投稿請求。CMD 視窗關閉後,這項設定會消失;正式部署需改用適當的環境變數管理方式。

步驟 4:建立資料表並啟動伺服器

python manage.py migrate
python manage.py runserver

看到 Django 的開發伺服器已啟動後,在同一個 Wi-Fi 網路中,可先用本機網址測試 http://127.0.0.1:8000/。開發伺服器預設只供本機使用;若要讓教室其他設備連線,需設定主機位址、防火牆及允許的網域。

步驟 5:開啟投稿頁與投影頁

  • 學生投稿頁:http://127.0.0.1:8000/
  • 投影展示頁:http://127.0.0.1:8000/projector/

用兩個瀏覽器視窗開啟這兩個頁面。在投稿頁輸入想法、隊伍、選擇顏色和 token,送出後觀察投影頁是否即時出現泡泡。

步驟 6:用 curl 測試 API

開啟另一個 CMD 視窗,以 curl 直接送出 JSON。若將 token 設定為示範值,命令如下:

curl.exe -X POST http://127.0.0.1:8000/api/bubbles ^
  -H "Authorization: Bearer demo-token" ^
  -H "Content-Type: application/json" ^
  -d "{\"text\":\"讓想法一起發光\",\"color\":\"#61D7C5\",\"team\":\"海洋隊\"}"

成功時會回傳泡泡資料及 HTTP 201。把 token 改錯可觀察 401;把色碼改成不符合格式的內容,則可觀察 400。

六、課堂討論與延伸

  1. 如果投稿資料只有文字、沒有顏色,JSON 欄位與表單要如何調整?
  2. 為什麼投影端要先載入既有泡泡,再訂閱 SSE?如果順序相反,可能發生什麼情況?
  3. GET 和 POST 在這個系統中各自負責什麼?為什麼新增資料不使用 GET?
  4. 除了隊伍名稱與文字,還可以加入圖片、表情符號或音效嗎?前端需要做哪些變更?
  5. 目前資料庫記錄會保留。若每次活動要建立獨立泡泡牆,可加入活動代碼或活動模型來分流資料。

七、原型限制與下一步

目前版本使用 SQLite,適合課堂示範和小型單機活動。SSE 訂閱者清單保存在單一 Django 程序的記憶體中,因此多程序、多台主機部署時,事件不會自動跨程序同步;正式擴充時可改用 Redis Pub/Sub 或 Django Channels。正式上線也應使用 HTTPS、妥善管理 token,並搭配正式的 Django 部署伺服器。

這個作品的價值,在於把抽象網路概念變成可觀察的資料流程。學生每送出一顆泡泡,就能看見用戶端、伺服器、資料庫與多媒體畫面如何協同工作,逐步建立對網際網路與互動應用的整體理解。