# 使用 AI 建立聊天助理
還記得《星際迷航》當船員會隨意跟飛船的電腦聊天,問它複雜的問題並得到深思熟慮的回覆嗎?在 1960 年代看似純科幻的東西,如今你可以利用你已經認識的網頁技術建構出來。
在本課程中,我們將使用 HTML、CSS、JavaScript 和一些後端整合技術創建一個 AI 聊天助理。你會發現你一直在學習的技能如何連接到強大的 AI 服務,這些服務能夠理解上下文並生成有意義的回答。
想像 AI 就像擁有一座龐大的圖書館,不只可以找到資料,還能將它們綜合成符合你特定問題的連貫答案。你不用瀏覽成千上萬頁,只會獲得直接,有上下文關聯的回應。
這種整合是通過熟悉的網頁技術協同工作完成的。HTML 負責建立聊天界面,CSS 負責視覺設計,JavaScript 管理用戶互動,後端 API 將一切連接到 AI 服務。這就像管弦樂團不同部門合奏成一場交響樂。
我們本質上是在建立一座橋樑,連結自然的人類溝通與機器處理。你將學習 AI 服務整合的技術實作,以及讓互動感覺直觀的設計模式。
到本課程結束時,AI 整合將不再是神秘過程,而像是你能駕馭的另一個 API。你會理解驅動 ChatGPT、Claude 等應用背後的基本模式,同時使用你一直在學習的網頁開發原理。
## ⚡ 你接下來 5 分鐘能做到的事
**忙碌開發者的快速入門路徑**
```mermaid
flowchart LR
A[⚡ 5 分鐘] --> B[取得 GitHub 代幣]
B --> C[測試 AI 遊樂場]
C --> D[複製 Python 代碼]
D --> E[查看 AI 回應]
```
- **1 分鐘**:造訪 [GitHub Models Playground](https://github.com/marketplace/models/azure-openai/gpt-4o-mini/playground) 並創建個人訪問令牌
- **2 分鐘**:直接在 playground 介面測試 AI 互動
- **3 分鐘**:點擊「Code」頁籤並複製 Python 程式碼片段
- **4 分鐘**:使用你的令牌在本機執行程式碼:`GITHUB_TOKEN=your_token python test.py`
- **5 分鐘**:觀看你的第一個 AI 回應從你的程式碼中產生
**快速測試程式碼:**
```python
import os
from openai import OpenAI
client = OpenAI(
base_url="https://models.github.ai/inference",
api_key="your_token_here"
)
response = client.chat.completions.create(
messages=[{"role": "user", "content": "Hello AI!"}],
model="openai/gpt-4o-mini"
)
print(response.choices[0].message.content)
```
**為什麼這很重要**:在 5 分鐘內,你會體驗到程式化 AI 互動的魔力。這是驅動你所使用每個 AI 應用的基本建構塊。
以下是你完成的專案外觀:

## 🗺️ 你的 AI 應用開發學習之旅
```mermaid
journey
title 從網頁開發到 AI 整合
section 理解 AI 基礎
發掘生成式 AI 概念: 4: You
探索 GitHub 模型平台: 6: You
精通 AI 參數與提示詞: 8: You
section 後端整合
建立 Python API 伺服器: 5: You
實作 AI 函式呼叫: 7: You
處理非同步操作: 8: You
section 前端開發
創建現代聊天介面: 6: You
精通即時互動: 8: You
建立響應式使用者體驗: 9: You
section 專業應用
部署完整的 AI 系統: 7: You
優化效能模式: 8: You
創建生產準備應用程式: 9: You
```
**你的旅程終點**:到了課程結尾,你將用相同技術和模式打造出完整的 AI 應用,支撐現代 AI 助理如 ChatGPT、Claude 和 Google Bard。
## 了解 AI:從神秘到掌握
在深入程式碼前,讓我們了解我們正在處理什麼。如果你曾用過 API,就知道基本模式:發送請求,接收回應。
AI API 遵循類似結構,但它不是從資料庫檢索預存資料,而是根據大量文本學習的模式生成全新回應。想想看,這像圖書館目錄系統與知識淵博的圖書館員之間的差異,後者會綜合多個來源的信息。
### 什麼是真正的「生成式 AI」?
想像羅塞塔石碑讓學者透過已知與未知語言間的對應找出埃及象形文字的規律。AI 模型也像是這樣——他們在大量文字中尋找模式,理解語言運作,再用這些模式生成適合新問題的回應。
**我用個簡單比喻說明:**
- **傳統資料庫**:像是要你的出生證明——每次都給你完全相同的文件
- **搜尋引擎**:像是請圖書館員找關於貓的書——他們告訴你有哪些書可用
- **生成式 AI**:像是問一位懂貓的朋友——他會用自己的話告訴你有趣的事情,且依你的問題量身定制
```mermaid
graph LR
A[你的問題] --> B[人工智能模型]
B --> C[模式識別]
C --> D[內容生成]
D --> E[上下文回應]
F[訓練數據
書籍、文章、網絡] --> B
```
### AI 模型如何學習(簡單版)
AI 模型透過大量包含書籍、文章、對話的文本資料訓練。過程中學會辨識:
- 書寫溝通中思路如何組織
- 哪些詞經常一起出現
- 對話通常是如何進行
- 正式與非正式場合的語境差異
**這很像考古學家解讀古代語言**:他們分析數千個樣本理解語法、詞彙與文化背景,最後能用學到的模式解讀新文本。
### 為什麼用 GitHub Models?
選用 GitHub Models 是因為實用——它讓我們能接觸企業級 AI,無需自己架設 AI 基礎設施(相信我,你現在不想搞那個!)。把它想像成使用氣象 API,不用自己到處設置氣象站來預測天氣。
這基本上是「AI 即服務」,最棒的是開始免費,因此你可以無憂試驗。
```mermaid
graph LR
A[前端聊天介面] --> B[你的後端 API]
B --> C[GitHub 模型 API]
C --> D[人工智能模型處理]
D --> C
C --> B
B --> A
```
我們會用 GitHub Models 作為後端整合,提供專業級 AI 功能且開發者友善的介面。[GitHub Models Playground](https://github.com/marketplace/models/azure-openai/gpt-4o-mini/playground) 是測試環境,你可以在那裡試用不同 AI 模型,了解它們的能力,然後才將其應用到程式碼中。
## 🧠 AI 應用開發生態系統
```mermaid
mindmap
root((AI 開發))
Understanding AI
Generative Models
Pattern Recognition
Content Generation
Context Understanding
Response Synthesis
AI Parameters
Temperature Control
Token Limits
Top-p Filtering
System Prompts
Backend Architecture
API Integration
GitHub Models
Authentication
Request Handling
Error Management
Python Infrastructure
FastAPI Framework
Async Operations
Environment Security
CORS Configuration
Frontend Experience
Chat Interface
Real-time Updates
Message History
User Feedback
Loading States
Modern Web Tech
ES6 Classes
Async/Await
DOM Manipulation
Event Handling
Professional Patterns
Security Best Practices
Token Management
Input Validation
XSS Prevention
Error Boundaries
Production Readiness
Performance Optimization
Responsive Design
Accessibility
Testing Strategies
```
**核心原則**:AI 應用開發結合傳統網頁技能與 AI 服務整合,創建智能且自然、回應迅速的應用。

**playground 特別實用的原因:**
- **試用** 不同的 AI 模型,如 GPT-4o-mini、Claude 等(全部免費!)
- **測試** 你的想法與提示詞,才開始寫程式碼
- **取得** 你喜愛語言的即用程式碼片段
- **調整** 創意程度與回應長度等設定,觀察輸出差異
玩過一會兒後,點擊「Code」頁籤,選擇程式語言,即可取得你需要的實作程式碼。

## 設定 Python 後端整合
現在讓我們用 Python 實現 AI 整合。Python 簡單語法與強大函式庫非常適合 AI 應用。我們先拿 GitHub Models playground 上的程式碼開始,然後重構成可重用且生產等級的函式。
### 理解基本實作
當你從 playground 拿 Python 程式碼時,大致上會像下面這樣。別擔心,如果一開始看很多,我們逐段解析:
```python
"""Run this model in Python
> pip install openai
"""
import os
from openai import OpenAI
# 要進行模型身份驗證,您需要在 GitHub 設定中生成個人訪問令牌 (PAT)。
# 按照此處的指示創建您的 PAT 令牌:https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
client = OpenAI(
base_url="https://models.github.ai/inference",
api_key=os.environ["GITHUB_TOKEN"],
)
response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "",
},
{
"role": "user",
"content": "What is the capital of France?",
}
],
model="openai/gpt-4o-mini",
temperature=1,
max_tokens=4096,
top_p=1
)
print(response.choices[0].message.content)
```
**這段程式碼發生了什麼事:**
- **載入** 需要的工具:`os` 讀取環境變數、`OpenAI` 跟 AI 對話
- **設定** OpenAI 用戶端,指向 GitHub 的 AI 伺服器,不直接使用 OpenAI
- **用 GitHub 專用令牌進行認證**(待會詳細解釋)
- **規劃** 對話中不同「角色」——想像是在佈置戲劇場景
- **發送** 請求到 AI,並設定些微調參數
- **擷取** 回傳資料中的實際回答文字
### 理解訊息角色:AI 對話框架
AI 對話使用特定結構,有不同「角色」各司其職:
```python
messages=[
{
"role": "system",
"content": "You are a helpful assistant who explains things simply."
},
{
"role": "user",
"content": "What is machine learning?"
}
]
```
**想像像導演排戲:**
- **系統角色**:像演員的舞台指令——告訴 AI 怎麼表現,什麼個性和回應方式
- **用戶角色**:真正使用你應用的人發送的問題或訊息
- **助理角色**:AI 的回覆(你不會送這部分訊息,但它會留在對話紀錄中)
**真實世界比喻**:想像你在派對介紹朋友:
- **系統訊息**:「這是我朋友 Sarah,是一位擅長用簡單話解釋醫學的醫生」
- **用戶訊息**:「你能解釋疫苗怎麼工作嗎?」
- **助理回應**:Sarah 以友善醫生身份回答,不是律師或廚師
### 理解 AI 參數:微調回應行為
AI API 呼叫中的數值參數控制模型生成回應的方式。這些設定讓你調整 AI 行為以適應不同使用情境:
#### 溫度 (0.0 到 2.0):創意調節旋鈕
**作用**:控制 AI 回應的創意度或可預測性。
**想像像爵士樂手即興演奏程度:**
- **溫度 = 0.1**:每次都演奏一模一樣旋律(高度可預測)
- **溫度 = 0.7**:加點變化,但依舊還算合拍(平衡創意)
- **溫度 = 1.5**:完全實驗性的爵士樂,充滿意外轉折(非常不可預測)
```python
# 非常可預測的回應(適合事實性問題)
response = client.chat.completions.create(
messages=[{"role": "user", "content": "What is 2+2?"}],
temperature=0.1 # 幾乎總是會說「4」
)
# 有創意的回應(適合腦力激盪)
response = client.chat.completions.create(
messages=[{"role": "user", "content": "Write a creative story opening"}],
temperature=1.2 # 會生成獨特、意想不到的故事
)
```
#### 最多字數 (1 到 4096+): 回應長度控制器
**作用**:限制 AI 回應的最大長度。
**把 tokens 視為單詞大約數**(英文約 1 token = 0.75 個字):
- **max_tokens=50**:簡短訊息(像簡訊)
- **max_tokens=500**:挺全面的段落或兩段
- **max_tokens=2000**:詳細說明帶範例
```python
# 簡短、精煉的回答
response = client.chat.completions.create(
messages=[{"role": "user", "content": "Explain JavaScript"}],
max_tokens=100 # 強制簡要說明
)
# 詳盡、全面的回答
response = client.chat.completions.create(
messages=[{"role": "user", "content": "Explain JavaScript"}],
max_tokens=1500 # 允許詳細說明並附帶例子
)
```
#### Top_p (0.0 到 1.0):焦點參數
**作用**:控制 AI 專注於多可能回應選項中的焦點程度。
**想像 AI 字彙庫有很多詞,依可能性排序:**
- **top_p=0.1**:只考慮最可能的前 10% 詞語(非常專注)
- **top_p=0.9**:考慮前 90% 詞語(較富創意)
- **top_p=1.0**:全盤考慮(最大多樣性)
**例如**:你問「天空通常是……」
- **低 top_p**:幾乎肯定會說「藍色」
- **高 top_p**:可能會說「藍色」、「多雲」、「廣闊」、「變化多端」、「美麗」等
### 組合應用:參數配置與使用場景
```python
# 用於提供事實性、一致性的答案(例如文件機械人)
factual_params = {
"temperature": 0.2,
"max_tokens": 300,
"top_p": 0.3
}
# 用於創意寫作協助
creative_params = {
"temperature": 1.1,
"max_tokens": 1000,
"top_p": 0.9
}
# 用於對話式、樂於助人的回應(平衡)
conversational_params = {
"temperature": 0.7,
"max_tokens": 500,
"top_p": 0.8
}
```
```mermaid
quadrantChart
title AI 參數優化矩陣
x-axis 低創意 --> 高創意
y-axis 短回應 --> 長回應
quadrant-1 創意內容
quadrant-2 詳細分析
quadrant-3 快速資訊
quadrant-4 對話式 AI
Documentation Bot: [0.2, 0.3]
Customer Service: [0.4, 0.4]
General Assistant: [0.7, 0.5]
Creative Writer: [0.9, 0.9]
Brainstorming Tool: [0.8, 0.8]
```
**理解這些參數重要性**:不同應用需求不同答案型態。客服機器人應該一致且事實性強(低溫度),創意寫作助理則期待想像力豐富多變(高溫度)。懂得這些參數讓你掌控 AI 的個性與風格。
```
**Here's what's happening in this code:**
- **We import** the tools we need: `os` for reading environment variables and `OpenAI` for talking to the AI
- **We set up** the OpenAI client to point to GitHub's AI servers instead of OpenAI directly
- **We authenticate** using a special GitHub token (more on that in a minute!)
- **We structure** our conversation with different "roles" – think of it like setting the scene for a play
- **We send** our request to the AI with some fine-tuning parameters
- **We extract** the actual response text from all the data that comes back
> 🔐 **Security Note**: Never hardcode API keys in your source code! Always use environment variables to store sensitive credentials like your `GITHUB_TOKEN`.
### Creating a Reusable AI Function
Let's refactor this code into a clean, reusable function that we can easily integrate into our web application:
```python
import asyncio
from openai import AsyncOpenAI
# Use AsyncOpenAI for better performance
client = AsyncOpenAI(
base_url="https://models.github.ai/inference",
api_key=os.environ["GITHUB_TOKEN"],
)
async def call_llm_async(prompt: str, system_message: str = "You are a helpful assistant."):
"""
Sends a prompt to the AI model asynchronously and returns the response.
Args:
prompt: The user's question or message
system_message: Instructions that define the AI's behavior and personality
Returns:
str: The AI's response to the prompt
"""
try:
response = await client.chat.completions.create(
messages=[
{
"role": "system",
"content": system_message,
},
{
"role": "user",
"content": prompt,
}
],
model="openai/gpt-4o-mini",
temperature=1,
max_tokens=4096,
top_p=1
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"AI API error: {str(e)}")
return "I'm sorry, I'm having trouble processing your request right now."
# Backward compatibility function for synchronous calls
def call_llm(prompt: str, system_message: str = "You are a helpful assistant."):
"""Synchronous wrapper for async AI calls."""
return asyncio.run(call_llm_async(prompt, system_message))
```
**理解這個改良後函式:**
- **接受** 兩個參數:用戶提示與可選系統訊息
- **提供** 預設系統訊息,設定一般助理行為
- **使用** Python 型別提示,方便程式碼文檔
- **包含** 詳細函式說明字串解釋用途與參數
- **只回傳** 回應文字,方便用於 Web API
- **維持** 相同模型參數確保回應一致
### 系統提示的魔力:程式化 AI 個性
如果參數控制 AI 如何思考,系統提示決定 AI 是誰。這是 AI 操作中最酷的部分——你本質上在給 AI 一個完整的個性、專業程度與溝通風格。
**想像系統提示像是為不同角色選角**:不一定只有一種通用助理,你可以創造專家應對不同情境。需要耐心老師?創意腦力激盪夥伴?嚴謹商業顧問?改變系統提示就好!
#### 為什麼系統提示這麼強大
有趣的是:AI 模型被訓練於大量人們扮演不同角色與專業程度的對話。當你給 AI 指定角色,就像切換開關,啟動所有這些學習過的模式。
**這就像 AI 的方法演技**:告訴演員「你是位智慧的老教授」,看看他如何自動調整姿態、用詞與舉止。AI 用語言模式做類似事情。
#### 有效系統提示的構成藝術與科學
**優秀系統提示的要素:**
1. **角色/身分**:AI 是誰?
2. **專業**:它懂什麼?
3. **溝通風格**:怎麼說話?
4. **具體指示**:應該重點關注什麼?
```python
# ❌ 模糊嘅系統提示
"You are helpful."
# ✅ 詳盡、有用嘅系統提示
"You are Dr. Sarah Chen, a senior software engineer with 15 years of experience at major tech companies. You explain programming concepts using real-world analogies and always provide practical examples. You're patient with beginners and enthusiastic about helping them understand complex topics."
```
#### 系統提示範例與語境
看看不同系統提示如何創建完全不同的 AI 個性:
```python
# 範例 1:有耐性的老師
teacher_prompt = """
You are an experienced programming instructor who has taught thousands of students.
You break down complex concepts into simple steps, use analogies from everyday life,
and always check if the student understands before moving on. You're encouraging
and never make students feel bad for not knowing something.
"""
# 範例 2:有創意的合作者
creative_prompt = """
You are a creative writing partner who loves brainstorming wild ideas. You're
enthusiastic, imaginative, and always build on the user's ideas rather than
replacing them. You ask thought-provoking questions to spark creativity and
offer unexpected perspectives that make stories more interesting.
"""
# 範例 3:策略性的商業顧問
business_prompt = """
You are a strategic business consultant with an MBA and 20 years of experience
helping startups scale. You think in frameworks, provide structured advice,
and always consider both short-term tactics and long-term strategy. You ask
probing questions to understand the full business context before giving advice.
"""
```
#### 實際見識系統提示效果
用不同系統提示問同一題,看看截然不同的回答:
**問題**:「我該怎麼在網站應用中處理用戶身分驗證?」
```python
# 使用教師提示:
teacher_response = call_llm(
"How do I handle user authentication in my web app?",
teacher_prompt
)
# 典型回應:「好問題!讓我們將身份驗證拆解成簡單步驟。
# 想像它就像夜店保安檢查身份證……」
# 使用商業提示:
business_response = call_llm(
"How do I handle user authentication in my web app?",
business_prompt
)
# 典型回應:「從策略角度來看,身份驗證對用戶
# 信任與法規遵從至關重要。讓我從安全性、
# 用戶體驗和可擴展性來概述一個框架……」
```
#### 進階系統提示技巧
**1. 上下文設定**:給 AI 背景資訊
```python
system_prompt = """
You are helping a junior developer who just started their first job at a startup.
They know basic HTML/CSS/JavaScript but are new to backend development and databases.
Be encouraging and explain things step-by-step without being condescending.
"""
```
**2. 輸出格式設定**:告訴 AI 如何結構化回應
```python
system_prompt = """
You are a technical mentor. Always structure your responses as:
1. Quick Answer (1-2 sentences)
2. Detailed Explanation
3. Code Example
4. Common Pitfalls to Avoid
5. Next Steps for Learning
"""
```
**3. 限制條件設定**:定義 AI 不應該做的事
```python
system_prompt = """
You are a coding tutor focused on teaching best practices. Never write complete
solutions for the user - instead, guide them with hints and questions so they
learn by doing. Always explain the 'why' behind coding decisions.
"""
```
#### 為什麼這對你的聊天助理很重要
理解系統提示能讓你擁有強大能力,創造專門的 AI 助理:
- **客戶服務機器人**:有幫助、有耐心、熟悉政策
- **學習導師**:鼓勵式、一步步教學、檢查理解
- **創意夥伴**:富有想像力、在想法上發展、會問「如果怎樣呢?」
- **技術專家**:精確、詳細、注重安全
**關鍵洞察**:你不只是呼叫 AI API —— 你是在打造符合特定使用情境的客製化 AI 個性。這使得現代 AI 應用感覺更貼心、更實用,而非單調通用。
### 🎯 教學檢核:AI 個性設定編程
**暫停並反思**:你剛學會如何透過系統提示來設定 AI 個性。這是現代 AI 應用開發的基本能力。
**快速自我評估**:
- 你能說明系統提示如何不同於一般使用者訊息嗎?
- temperature 與 top_p 參數有什麼不同?
- 你會如何為特定使用情境(例如程式教學導師)建立系統提示?
**現實世界連結**:你學會的系統提示技巧被運用在每個主要 AI 應用中 —— 從 GitHub Copilot 的程式協助到 ChatGPT 的對話介面。你掌握了大型科技公司 AI 產品團隊使用的模式。
**挑戰問題**:你如何為不同使用者類型(初學者與專家)設計不同的 AI 個性?思考同一個 AI 模型如何透過提示工程來服務不同族群。
## 使用 FastAPI 打造 Web API:你的高效能 AI 交流中樞
現在來建立將前端與 AI 服務連接的後端。我們將使用 FastAPI,一個現代 Python 框架,非常適合建置 AI 應用的 API。
FastAPI 為這種專案提供多項優勢:內建非同步支援以處理多重請求、可自動生成 API 文件,並且性能優異。你的 FastAPI 伺服器擔任中介,接收前端請求、與 AI 服務溝通,並回傳格式化的回應。
### 為什麼選擇 FastAPI 用於 AI 應用?
你可能會想:「我不能直接從前端 JavaScript 呼叫 AI 嗎?」或「為什麼不用 Flask 或 Django?」好問題!
**FastAPI 適合我們的理由如下:**
- **預設非同步**:能同時處理多個 AI 請求,不卡死
- **自動文件**:訪問 `/docs`,免費獲得介面漂亮、可互動的 API 文件頁面
- **內建驗證**:及早捕捉錯誤,防患於未然
- **超快性能**:是 Python 框架中速度最快的之一
- **現代 Python**:使用最新、最棒的 Python 功能
**還有為什麼我們需要後端:**
**安全性**:你的 AI API 金鑰就像密碼 —— 如果放在前端 JavaScript,任何人查看網站原始碼都能偷用你的 AI 點數。後端能保護敏感憑證安全。
**流量限制與控管**:後端可以控制使用者請求頻率、實作身分驗證,並加上記錄追蹤使用狀況。
**資料處理**:你可能想要保存對話內容、過濾不當內容,或整合多個 AI 服務,這些邏輯都放在後端。
**架構類似客戶端-伺服器模式:**
- **前端**:使用者互動介面層
- **後端 API**:請求處理與路由層
- **AI 服務**:外部運算與回應產生
- **環境變數**:安全的設定與憑證儲存
### 理解請求-回應流程
讓我們追蹤使用者發訊息時發生的事:
```mermaid
sequenceDiagram
participant User as 👤 使用者
participant Frontend as 🌐 前端
participant API as 🔧 FastAPI 伺服器
participant AI as 🤖 AI 服務
User->>Frontend: 輸入 "Hello AI!"
Frontend->>API: POST /hello {"message": "Hello AI!"}
Note over API: 驗證請求
加入系統提示
API->>AI: 傳送格式化請求
AI->>API: 回傳 AI 回應
Note over API: 處理回應
記錄對話
API->>Frontend: {"response": "Hello! How can I help?"}
Frontend->>User: 顯示 AI 訊息
```
**理解每個步驟:**
1. **使用者互動**:使用者在聊天介面輸入文字
2. **前端處理**:JavaScript 擷取輸入並格式化成 JSON
3. **API 驗證**:FastAPI 使用 Pydantic 模型自動驗證請求內容
4. **AI 整合**:後端加入上下文(系統提示)並呼叫 AI 服務
5. **回應處理**:API 收到 AI 回覆後可視需要修改並回傳
6. **前端呈現**:JavaScript 在聊天介面顯示回覆
### 理解 API 架構
```mermaid
sequenceDiagram
participant Frontend
participant FastAPI
participant AI Function
participant GitHub Models
Frontend->>FastAPI: POST /hello {"message": "Hello AI!"}
FastAPI->>AI Function: call_llm(message, system_prompt)
AI Function->>GitHub Models: API 請求
GitHub Models->>AI Function: AI 回應
AI Function->>FastAPI: 回應文字
FastAPI->>Frontend: {"response": "你好!我可以點幫你?"}
```
```mermaid
flowchart TD
A[用戶輸入] --> B[前端驗證]
B --> C[HTTP POST 請求]
C --> D[FastAPI 路由]
D --> E[Pydantic 驗證]
E --> F[AI 函數調用]
F --> G[GitHub 模型 API]
G --> H[回應處理]
H --> I[JSON 回應]
I --> J[前端更新]
subgraph "安全層"
K[CORS 中介軟件]
L[環境變數]
M[錯誤處理]
end
D --> K
F --> L
H --> M
```
### 建立 FastAPI 應用
我們一步步打造 API。新建檔案 `api.py` 並加入以下 FastAPI 程式碼:
```python
# api.py
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from llm import call_llm
import logging
# 配置日誌記錄
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 創建 FastAPI 應用程式
app = FastAPI(
title="AI Chat API",
description="A high-performance API for AI-powered chat applications",
version="1.0.0"
)
# 配置 CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 為生產環境適當配置
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 用於請求/回應驗證的 Pydantic 模型
class ChatMessage(BaseModel):
message: str
class ChatResponse(BaseModel):
response: str
@app.get("/")
async def root():
"""Root endpoint providing API information."""
return {
"message": "Welcome to the AI Chat API",
"docs": "/docs",
"health": "/health"
}
@app.get("/health")
async def health_check():
"""Health check endpoint."""
return {"status": "healthy", "service": "ai-chat-api"}
@app.post("/hello", response_model=ChatResponse)
async def chat_endpoint(chat_message: ChatMessage):
"""Main chat endpoint that processes messages and returns AI responses."""
try:
# 擷取並驗證訊息
message = chat_message.message.strip()
if not message:
raise HTTPException(status_code=400, detail="Message cannot be empty")
logger.info(f"Processing message: {message[:50]}...")
# 呼叫 AI 服務(備註:call_llm 應該改成非同步以提升效能)
ai_response = await call_llm_async(message, "You are a helpful and friendly assistant.")
logger.info("AI response generated successfully")
return ChatResponse(response=ai_response)
except HTTPException:
raise
except Exception as e:
logger.error(f"Error processing chat message: {str(e)}")
raise HTTPException(status_code=500, detail="Internal server error")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=5000, reload=True)
```
**理解 FastAPI 實作細節:**
- **匯入** FastAPI 來使用現代網頁框架功能,Pydantic 用於資料驗證
- **建立** 自動 API 文件(伺服器運行後可透過 `/docs` 訪問)
- **啟用** CORS 中介軟體允許前端跨源請求
- **定義** Pydantic 模型,實作自動請求/回應驗證與文件生成
- **使用** 非同步端點來提升同時處理多請求的效能
- **實作** 適當的 HTTP 狀態碼與錯誤處理(HTTPException)
- **包含** 結構化日誌以利監控與除錯
- **提供** 健康檢查端點以監控服務狀態
**FastAPI 相較傳統框架的主要優點:**
- **自動驗證**:Pydantic 模型確保資料處理前的完整與正確
- **互動式文件**:訪問 `/docs` 獲得自動產生、可測試 API 文件
- **型別安全**:Python 型別提示減少執行時錯誤並提升程式碼品質
- **非同步支援**:同時處理多個 AI 請求不卡塞
- **效能優異**:顯著提升即時應用的請求處理速度
### 理解 CORS:網頁的守門員
CORS(跨來源資源共享)就像保全巡守大廈,檢查訪客是否被允許進入。讓我們了解為何重要,及其如何影響你的應用。
#### 什麼是 CORS 以及為何有它?
**問題所在**:想像任何網站都能不經允許替你向銀行網站發起請求,那會是安全大災難!瀏覽器透過「同源政策」防止這種狀況。
**同源政策**:瀏覽器只允許網頁向相同域名、埠號和協議的來源發出請求。
**現實比喻**:就像公寓大樓安全管理,預設只有住戶(同源)可進入。若要讓朋友(不同源)訪客,必須明確告訴保全允許。
#### 你開發環境中的 CORS
在開發時你的前端與後端跑在不同埠號:
- 前端:`http://localhost:3000`(或直接開啟本機 HTML,為 file://)
- 後端:`http://localhost:5000`
雖然同台電腦,但因埠號不同被視為「不同來源」!
```python
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI(__name__)
CORS(app) # 這告訴瀏覽器:「其他來源可以安全地向此 API 發送請求」
```
**CORS 設定實際作用:**
- **在 API 回應加上** 特殊 HTTP 標頭,告訴瀏覽器「這個跨來源請求是被允許的」
- **處理** 「預檢」請求(瀏覽器有時在正式發送請求前先確認權限)
- **避免** 瀏覽器主控台出現討厭的「被 CORS 政策阻擋」錯誤
#### CORS 安全:開發 vs 生產環境
```python
# 🚨 開發:允許所有來源(方便但不安全)
CORS(app)
# ✅ 生產:只允許你指定的前端網域
CORS(app, origins=["https://yourdomain.com", "https://www.yourdomain.com"])
# 🔒 進階:不同環境使用不同來源
if app.debug: # 開發模式
CORS(app, origins=["http://localhost:3000", "http://127.0.0.1:3000"])
else: # 生產模式
CORS(app, origins=["https://yourdomain.com"])
```
**重要點**:開發時使用 `CORS(app)` 像是把家門沒鎖 —— 方便但不安全。生產環境你要明確指定哪個網站能呼叫你的 API。
#### 常見的 CORS 情境與解決方案
| 情境 | 問題 | 解決方案 |
|----------|---------|----------|
| **本機開發** | 前端無法呼叫後端 | 在 FastAPI 加入 CORSMiddleware |
| **GitHub Pages + Heroku** | 部署後前端呼叫 API 失敗 | 把 GitHub Pages URL 加入 CORS 允許來源 |
| **自訂網域** | 生產環境產生 CORS 錯誤 | 更新 CORS 允許來源以符合網域 |
| **行動應用** | App 無法存取 Web API | 新增 App 網域或謹慎使用 `*` |
**專家小技巧**:你可以在瀏覽器開發者工具網路分頁檢查 CORS 標頭,找 `Access-Control-Allow-Origin` 回應標頭。
### 錯誤處理與驗證
注意我們的 API 還包含完整錯誤處理:
```python
# 驗證我們是否收到訊息
if not message:
return jsonify({"error": "Message field is required"}), 400
```
**重要驗證原則:**
- **先檢查** 請求是否帶有必要欄位
- **以 JSON 格式** 回傳有意義的錯誤訊息
- **使用** 合適的 HTTP 狀態碼(400 表示錯誤請求)
- **提供** 明確反饋幫助前端除錯
## 設定與啟動你的後端
現在我們完成 AI 整合與 FastAPI 伺服器,開始運行整套環境。設定流程包含安裝 Python 相依套件、配置環境變數,以及啟動開發伺服器。
### Python 環境設定
來建立你的 Python 開發環境。虛擬環境就像曼哈頓計畫的分工策略 —— 每個專案都有自己的隔離空間和套件,避免不同專案間衝突。
```bash
# 導航到你的後端目錄
cd backend
# 創建一個虛擬環境(就像為你的項目創建一個乾淨的空間)
python -m venv venv
# 啟動它(Linux/Mac)
source ./venv/bin/activate
# 在 Windows 上,使用:
# venv\Scripts\activate
# 安裝有用的東西
pip install openai fastapi uvicorn python-dotenv
```
**我們剛做了什麼:**
- **創建** 專屬的 Python 環境泡泡,可以放心安裝套件不影響其他系統
- **啟用** 這個環境,讓終端機知道接下來使用它
- **安裝** 重要套件:OpenAI(AI 魔法)、FastAPI(Web API)、Uvicorn(執行伺服器)、python-dotenv(安全載入祕密)
**重要套件解說:**
- **FastAPI**:現代且快速的網頁框架,自動產生 API 文件
- **Uvicorn**:超快的 ASGI 伺服器,跑 FastAPI 應用
- **OpenAI**:GitHub 模型及 OpenAI API 官方整合程式庫
- **python-dotenv**:從 .env 檔安全載入環境變數
### 環境變數設定:保護你的祕密
在啟動 API 前,談談網路開發最重要的觀念之一:如何真正保護你的祕密不外洩。環境變數就像保險庫,只有你的程式能查看。
#### 什麼是環境變數?
**把環境變數想成保險箱** —— 你把珍貴的東西放進去,只有你(和應用程式)有鑰匙能打開。不要把敏感資訊直接寫在程式碼裡(任何人都能看到),而是用環境妥善存放。
**差別在這裡:**
- **錯誤方式**:把密碼寫在便利貼貼在螢幕上
- **正確方式**:把密碼放進只有你能存取的密碼管理器
#### 為什麼環境變數重要
```python
# 🚨 千祈唔好咁做 - API 金鑰對所有人可見
client = OpenAI(
api_key="ghp_1234567890abcdef...", # 任何人都可以偷走佢!
base_url="https://models.github.ai/inference"
)
# ✅ 咁做啱 - API 金鑰安全咁儲存
client = OpenAI(
api_key=os.environ["GITHUB_TOKEN"], # 得你嘅應用程式先可以訪問到佢
base_url="https://models.github.ai/inference"
)
```
**硬編碼祕密的後果:**
1. **版本控制洩漏**:任何有權限看你的 Git 倉庫者也能看到你的 API 金鑰
2. **公開倉庫風險**:若推送到 GitHub,金鑰暴露於全球網路
3. **團隊共享風險**:其他開發人員會用到你的個人 API 金鑰
4. **安全漏洞**:金鑰被盜用,可能讓人濫用你的 AI 點數
#### 建立環境檔 .env
在後端專案目錄新增 `.env` 檔,本地存放你的秘密:
```bash
# .env 文件 - 絕對唔好提交到 Git
GITHUB_TOKEN=your_github_personal_access_token_here
FASTAPI_DEBUG=True
ENVIRONMENT=development
```
**認識 .env 檔:**
- 每行一條祕密,以 `KEY=value` 格式存放
- 等號兩側不能有空白
- 通常值不需要加引號
- 註解以 `#` 開頭
#### 建立 GitHub 個人存取令牌
你的 GitHub 令牌就像授權密碼,允許你的應用使用 GitHub 的 AI 服務:
**建立令牌步驟:**
1. 前往 GitHub 設定 → 開發者設定 → 個人存取令牌 → 傳統令牌
2. 點擊「產生新令牌(傳統)」
3. 設定有效期限(測試用 30 天,正式可更長)
4. 選擇完整權限範圍:勾選「repo」及其他需要的權限
5. 產生令牌並立即複製(之後無法再看!)
6. 貼到你的 `.env` 檔案裡
```bash
# 你嘅 token 長咩樣嘅範例(呢個係偽造嘅!)
GITHUB_TOKEN=ghp_1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R
```
#### 在 Python 中載入環境變數
```python
import os
from dotenv import load_dotenv
# 從 .env 檔案載入環境變數
load_dotenv()
# 現在你可以安全地存取它們
api_key = os.environ.get("GITHUB_TOKEN")
if not api_key:
raise ValueError("GITHUB_TOKEN not found in environment variables!")
client = OpenAI(
api_key=api_key,
base_url="https://models.github.ai/inference"
)
```
**這段程式做了什麼:**
- 載入你的 `.env` 檔,讓環境變數在 Python 裡可用
- 檢查是否有帶必要的令牌(錯誤處理良好!)
- 缺少時拋出明確錯誤
- 安全使用令牌且不會曝露在程式碼裡
#### Git 安全:.gitignore 檔
你的 `.gitignore` 檔告訴 Git 哪些檔案不該追蹤或上傳:
```bash
# .gitignore - 新增這些行
.env
*.env
.env.local
.env.production
__pycache__/
venv/
.vscode/
```
**這很關鍵**:加入 `.env` 到 `.gitignore` 後,Git 會忽略環境變數檔,避免你不小心把祕密上傳到 GitHub。
#### 不同環境,不同祕密
專業應用會針對不同環境使用不同 API 金鑰:
```bash
# .env.development
GITHUB_TOKEN=your_development_token
DEBUG=True
# .env.production
GITHUB_TOKEN=your_production_token
DEBUG=False
```
**原因說明**:你不想讓開發時的測試影響生產環境 AI 使用額度,也希望在不同環境有不同安全控管。
### 啟動開發伺服器:讓你的 FastAPI 活起來
現在到了令人興奮的時刻——啟動你的 FastAPI 開發伺服器,見證你的 AI 整合活起來!FastAPI 使用 Uvicorn,一個極速的 ASGI 伺服器,專為非同步 Python 應用程式設計。
#### 了解 FastAPI 伺服器啟動過程
```bash
# 方法 1:直接 Python 執行(包括自動重新載入)
python api.py
# 方法 2:直接使用 Uvicorn(更多控制)
uvicorn api:app --host 0.0.0.0 --port 5000 --reload
```
當你執行這個指令時,背後會發生以下事情:
**1. Python 載入你的 FastAPI 應用程式**:
- 匯入所有必需的函式庫(FastAPI、Pydantic、OpenAI 等)
- 從你的 `.env` 檔案載入環境變數
- 建立 FastAPI 應用程式實例,並附帶自動文件功能
**2. Uvicorn 設定 ASGI 伺服器**:
- 綁定在 5000 埠口,具備非同步請求處理能力
- 設置請求路由並自動驗證
- 啟用熱重載,方便開發時監看檔案變更後重啟
- 產生互動式 API 文件
**3. 伺服器開始監聽**:
- 你的終端機會顯示:`INFO: Uvicorn running on http://0.0.0.0:5000`
- 伺服器可以處理多個並發的 AI 請求
- 你的 API 可即時使用,且自動文件位於 `http://localhost:5000/docs`
#### 當一切正常時你應該看到的畫面
```bash
$ python api.py
INFO: Will watch for changes in these directories: ['/your/project/path']
INFO: Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit)
INFO: Started reloader process [12345] using WatchFiles
INFO: Started server process [12346]
INFO: Waiting for application startup.
INFO: Application startup complete.
```
**了解 FastAPI 輸出訊息:**
- **Will watch for changes**:開發模式下啟用自動重載
- **Uvicorn running**:高效能 ASGI 伺服器正在運行
- **Started reloader process**:檔案監視器啟動,用於自動重啟
- **Application startup complete**:FastAPI 應用程式成功初始化
- **Interactive docs available**:瀏覽 `/docs` 獲取自動產生的 API 文件
#### 測試你的 FastAPI:多種強大方法
FastAPI 提供多種方便測試 API 的方式,包括自動的互動文件:
**方法 1:互動式 API 文件(推薦)**
1. 開啟瀏覽器,前往 `http://localhost:5000/docs`
2. 你會看到用 Swagger UI 呈現的所有 API 端點文件
3. 點選 `/hello` → 按「Try it out」→ 輸入測試訊息 → 按「Execute」
4. 立即在瀏覽器中看到格式化良好的回應結果
**方法 2:基本瀏覽器測試**
1. 開啟 `http://localhost:5000` 測試根路由
2. 開啟 `http://localhost:5000/health` 檢查伺服器健康狀況
3. 可確認你的 FastAPI 伺服器正常運行
**方法 2:命令列測試(進階)**
```bash
# 用 curl 測試(如果有的話)
curl -X POST http://localhost:5000/hello \
-H "Content-Type: application/json" \
-d '{"message": "Hello AI!"}'
# 預期回應:
# {"response": "你好!我是你的 AI 助手。今天有什麼可以幫到你?"}
```
**方法 3:Python 測試腳本**
```python
# test_api.py - 建立此檔案以測試你的 API
import requests
import json
# 測試 API 端點
url = "http://localhost:5000/hello"
data = {"message": "Tell me a joke about programming"}
response = requests.post(url, json=data)
if response.status_code == 200:
result = response.json()
print("AI Response:", result['response'])
else:
print("Error:", response.status_code, response.text)
```
#### 常見啟動問題排錯
| 錯誤訊息 | 含意 | 解決方法 |
|---------------|---------------|------------|
| `ModuleNotFoundError: No module named 'fastapi'` | 未安裝 FastAPI | 在虛擬環境中執行 `pip install fastapi uvicorn` |
| `ModuleNotFoundError: No module named 'uvicorn'` | 未安裝 ASGI 伺服器 | 在虛擬環境中執行 `pip install uvicorn` |
| `KeyError: 'GITHUB_TOKEN'` | 找不到環境變數 | 檢查你的 `.env` 檔案及 `load_dotenv()` 呼叫 |
| `Address already in use` | 5000 埠口被佔用 | 終止其他佔用 5000 埠口的程序或更換埠口 |
| `ValidationError` | 請求資料與 Pydantic 模型不符 | 檢查請求格式是否符合預期結構 |
| `HTTPException 422` | 請求無法處理 | 驗證失敗,請查閱 `/docs` 確認格式正確 |
| `OpenAI API error` | AI 服務驗證失敗 | 確認你的 GitHub token 正確且擁有權限 |
#### 開發最佳實踐
**熱重載**:FastAPI 與 Uvicorn 支援在保存 Python 檔案後自動重載。這意味著你可以立刻修改與測試而無需手動重啟。
```python
# 明確啟用熱重載
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True) # debug=True 啟用熱重載
```
**開發紀錄**:加入 logging 以便了解系統運作狀況:
```python
import logging
# 設定日誌記錄
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@app.route("/hello", methods=["POST"])
def hello():
data = request.get_json()
message = data.get("message", "")
logger.info(f"Received message: {message}")
if not message:
logger.warning("Empty message received")
return jsonify({"error": "Message field is required"}), 400
try:
response = call_llm(message, "You are a helpful and friendly assistant.")
logger.info(f"AI response generated successfully")
return jsonify({"response": response})
except Exception as e:
logger.error(f"AI API error: {str(e)}")
return jsonify({"error": "AI service temporarily unavailable"}), 500
```
**logging 的好處**:開發期間可清晰看見收到的請求內容、AI 的回應,以及錯誤發生的位置,大幅加快除錯速度。
### GitHub Codespaces 配置:輕鬆雲端開發
GitHub Codespaces 就像一台強大開發電腦在雲端,可從任意瀏覽器存取。若你在 Codespaces 裡工作,還有一些額外設定要讓你的後端服務能讓前端訪問。
#### 了解 Codespaces 網路環境
本地開發環境中,一切在同一台電腦運行:
- 後端:`http://localhost:5000`
- 前端:`http://localhost:3000`(或 `file://`)
Codespaces 在 GitHub 伺服器上執行,因此「localhost」意義不同。GitHub 會自動建立服務的公開 URL,但你必須正確配置。
#### Codespaces 配置步驟
**1. 啟動你的後端伺服器**:
```bash
cd backend
python api.py
```
你會看到熟悉的 FastAPI/Uvicorn 啟動訊息,但注意它運行在 Codespace 環境中。
**2. 設定埠口可見性**:
- 在 VS Code 下方面板找到「Ports」分頁
- 找到列表中的 5000 埠口
- 右鍵點擊 5000 埠口
- 選擇「Port Visibility」→「Public」
**為何要設為公開?** 預設 Codespace 埠口為私有(只有你自己可以訪問)。設為公開後,前端(瀏覽器執行)才能跟後端溝通。
**3. 取得公開 URL**:
設為公開後,你會看到類似的 URL:
```
https://your-codespace-name-5000.app.github.dev
```
**4. 更新前端設定**:
```javascript
// 在你的前端 app.js 中,更新 BASE_URL:
this.BASE_URL = "https://your-codespace-name-5000.app.github.dev";
```
#### 了解 Codespace URL
Codespace URL 結構很有規律:
```
https://[codespace-name]-[port].app.github.dev
```
**細節說明:**
- `codespace-name`:你 Codespace 的唯一識別(通常會包含你的使用者名稱)
- `port`:你服務運行的埠口號(我們 FastAPI 是 5000)
- `app.github.dev`:GitHub Codespace 應用程式專用網域
#### 測試你的 Codespace 設定
**1. 直接測試後端**:
在新分頁開啟你的公開 URL,你應該看到:
```
Welcome to the AI Chat API. Send POST requests to /hello with JSON payload containing 'message' field.
```
**2. 使用瀏覽器開發工具測試**:
```javascript
// 打開瀏覽器控制台並測試您的 API
fetch('https://your-codespace-name-5000.app.github.dev/hello', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({message: 'Hello from Codespaces!'})
})
.then(response => response.json())
.then(data => console.log(data));
```
#### Codespaces 與本地開發比較
| 方面 | 本地開發 | GitHub Codespaces |
|--------|-------------------|-------------------|
| **設定時間** | 較長(需安裝 Python、依賴) | 即時(預先配置環境) |
| **URL 訪問** | `http://localhost:5000` | `https://xyz-5000.app.github.dev` |
| **埠口配置** | 自動 | 手動(需公開埠口) |
| **檔案持久性** | 存在本機 | 存在 GitHub 儲存庫 |
| **協作方式** | 難以共享環境 | 簡單共享 Codespace 連結 |
| **依賴網際網路** | 只對 AI API 需要 | 全程需要 |
#### Codespace 開發小貼士
**在 Codespaces 使用環境變數**:
你的 `.env` 檔案在 Codespaces 中同樣適用,但你也可以直接在 Codespace 中設定環境變數:
```bash
# 設定目前 session 的環境變數
export GITHUB_TOKEN="your_token_here"
# 或者加入你的 .bashrc 以持久保存
echo 'export GITHUB_TOKEN="your_token_here"' >> ~/.bashrc
```
**埠口管理**:
- Codespaces 會自動偵測應用程式監聽的埠口
- 可同時轉發多個埠口(對日後加入資料庫很方便)
- 埠口只要 Codespace 運行中就一直可用
**開發流程**:
1. 在 VS Code 編寫程式碼
2. FastAPI 自動重載(感謝 Uvicorn 重載模式)
3. 透過公開 URL 立即測試變動
4. 準備好就 commit 並推送
> 💡 **專業提示**:開發時將你的 Codespace 後端 URL 加入書籤。由於 Codespace 名稱穩定,只要使用同一個 Codespace,URL 不會改變。
## 建立前端聊天介面:人類與 AI 的互動空間
現在我們開始打造使用者介面——決定人們如何與你的 AI 助理互動的部分。如同原始 iPhone 的介面設計,我們聚焦讓複雜技術變得直觀且自然好用。
### 了解現代前端架構
我們的聊天介面會是所謂的「單頁應用程式」(SPA)。不再像舊式網站每次點擊載入新頁面,而是流暢且即時地更新:
**舊網站**:像在翻閱實體書本——翻到完全不同的頁面
**我們的聊天應用**:像在用手機——一切自然流暢地更新
```mermaid
graph TD
A[用戶輸入訊息] --> B[JavaScript 捕捉輸入]
B --> C[驗證及格式化資料]
C --> D[發送至後端 API]
D --> E[顯示載入狀態]
E --> F[接收 AI 回覆]
F --> G[更新聊天介面]
G --> H[準備下一則訊息]
```
```mermaid
classDiagram
class ChatApp {
+messages: HTMLElement
+form: HTMLElement
+input: HTMLElement
+sendButton: HTMLElement
+BASE_URL: string
+API_ENDPOINT: string
+constructor()
+initializeEventListeners()
+handleSubmit(event)
+callAPI(message)
+appendMessage(text, role)
+escapeHtml(text)
+scrollToBottom()
+setLoading(isLoading)
}
ChatApp --> DOM : 操作
ChatApp --> FastAPI : 發送請求
```
### 前端開發的三大支柱
所有前端應用——從簡單網站到像 Discord 或 Slack 般複雜的軟體——都是建立在三種核心技術之上。把它們當成網頁上你看見並互動的一切基礎:
**HTML(結構)**:你的基石
- 決定哪些元素存在(按鈕、文字輸入框、容器)
- 給內容賦予意義(這是標題,這是表單,等等)
- 建立其他一切的基本結構
**CSS(呈現)**:你的室內設計師
- 讓一切變美(顏色、字型、版面配置)
- 處理不同螢幕大小(手機、筆電、平板)
- 製造平滑動畫與視覺回饋
**JavaScript(行為)**:你的大腦
- 回應使用者行為(點擊、輸入、捲動)
- 跟後端對話並更新頁面
- 讓一切變得互動與動態
**把它想成建築設計:**
- **HTML**:結構藍圖(定義空間與關係)
- **CSS**:美學與環境設計(視覺風格與使用者體驗)
- **JavaScript**:機械系統(功能與互動)
### 為何現代 JavaScript 架構重要
我們的聊天應用會使用你在專業應用中會見到的現代 JavaScript 模式。理解這些概念能幫助你成長為優秀開發者:
**類別架構**:我們用類別組織程式碼,猶如為物件繪製藍圖
**Async/Await**:現代處理耗時操作(如 API 呼叫)的方法
**事件驅動程式設計**:應用回應使用者行為(點擊、按鍵),非持續輪詢
**DOM 操作**:根據使用者互動與 API 回應動態更新網頁內容
### 專案結構設定
創建一個前端資料夾及有組織的結構:
```text
frontend/
├── index.html # Main HTML structure
├── app.js # JavaScript functionality
└── styles.css # Visual styling
```
**理解架構:**
- **分離** 結構(HTML)、行為(JavaScript)與呈現(CSS)的關注點
- **維持** 一個簡單且易於瀏覽修改的檔案結構
- **遵循** 網頁開發組織性與可維護性最佳實踐
### 建立 HTML 基礎:語義化結構與無障礙設計
讓我們從 HTML 結構開始。現代網頁開發強調「語義化 HTML」——使用明確描述元素用途的 HTML 元素,而非僅外觀定義。這使你的應用對螢幕閱讀器、搜尋引擎等工具更友好。
**為何語義化 HTML 重要**:想像你要用電話描述你的聊天應用。你會說「有個標題在上方,主區域呈現對話,底部有個表單輸入訊息。」語義化 HTML 就是用符合這樣自然描述的元素。
建立 `index.html`,並使用這樣經心布局的標記:
```html
Ask me anything!