大同大學資訊工程學系智能問答機器人 - 使用 RAG (Retrieval-Augmented Generation) 架構建構
- 🤖 RAG 問答系統: 基於向量檢索的智能問答
- 📊 多來源整合: 整合系上新聞、課程資訊、成員資料等
- 🔄 重排序機制: 使用 BAAI/bge-reranker-base 提升檢索準確度
- 📅 時間感知: 自動加入當前日期(民國紀年)
- 🎯 新聞優先: 自動識別新聞相關查詢並優先檢索
- ✨ SSE 串流: 即時逐字顯示 AI 回應
- 📝 Markdown 渲染: 支援完整 Markdown 格式(標題、列表、程式碼、表格等)
- 🔐 XSS 防護: 使用 rehype-sanitize 保護使用者安全
- 📚 來源追溯: 可展開查看回答的資料來源(含相關度分數)
- 🎨 現代化 UI: Tailwind CSS 打造的美觀響應式介面
- 📱 響應式設計: 適配各種螢幕尺寸
ttu_cse_chatbot/
├── backend/ # FastAPI 後端
│ ├── main.py # 主應用程式(RAG 實現)
│ ├── requirements.txt # Python 依賴
│ ├── start_backend.ps1 # 後端啟動腳本(PowerShell)
│ └── start_backend.bat # 後端啟動腳本(CMD)
├── frontend/ # React + Vite 前端
│ ├── src/
│ │ ├── App.jsx # 主要聊天介面
│ │ └── index.css # Tailwind CSS
│ ├── package.json # Node.js 依賴
│ ├── tailwind.config.js # Tailwind 配置
│ ├── start_frontend.ps1 # 前端啟動腳本(PowerShell)
│ └── start_frontend.bat # 前端啟動腳本(CMD)
├── data/ # 原始資料檔案
│ ├── ttu_cse_news.sorted.json
│ ├── course_history_113.json
│ ├── department_members.json
│ └── ...
├── storage/ # ChromaDB 向量資料庫
│ └── chroma/
├── venv/ # Python 虛擬環境
├── start.ps1 # 主啟動腳本(PowerShell)
├── start.bat # 主啟動腳本(CMD)
├── README.md # 本文件
├── ENVIRONMENT.md # 環境配置說明
├── RAG_IMPLEMENTATION.md # RAG 實現細節
└── MARKDOWN_RENDERING.md # Markdown 功能說明
- FastAPI 0.115.0+: 現代化 Python Web 框架
- Uvicorn: ASGI 伺服器(含 websockets 和 httptools)
- LangChain 0.3.0+: RAG 框架
langchain-ollama 0.2.0+: Ollama LLM 整合langchain-chroma 0.1.0+: ChromaDB 整合langchain-huggingface: HuggingFace embeddings
- ChromaDB 0.5.0+: 向量資料庫
- Sentence Transformers 3.0.0+: 嵌入與重排序模型
- Embeddings:
BAAI/bge-m3 - Reranker:
BAAI/bge-reranker-base
- Embeddings:
- Ollama: 本地 LLM(qwen3:latest)
- React 18: UI 框架
- Vite 7.2.4: 建構工具與開發伺服器
- Tailwind CSS 3.4.18: CSS 框架
@tailwindcss/typography: 排版插件
- Markdown 渲染:
react-markdown: Markdown 組件remark-gfm: GitHub Flavored Markdownrehype-sanitize: XSS 防護
- EventSource API: SSE 客戶端
- Python 3.12+: 後端執行環境
- Node.js 18+: 前端執行環境
- CUDA: GPU 加速(可選,也支援 CPU)
- Python 3.12 或更高版本
- Node.js 18 或更高版本
- 8GB RAM(最低)
- 已安裝並運行 Ollama,且已下載
qwen3:latest模型
- 16GB+ RAM
- NVIDIA GPU(用於 CUDA 加速)
- SSD 硬碟
# 檢查 Ollama 是否運行
ollama list
# 如果沒有 qwen3 模型,請執行
ollama pull qwen3:latest
# 測試模型
ollama run qwen3:latestcd d:\畢業專題
git clone <repository-url> ttu_cse_chatbot
cd ttu_cse_chatbot# 創建虛擬環境(如果還沒有)
python -m venv venv
# 激活虛擬環境
.\venv\Scripts\Activate.ps1
# 安裝後端依賴
pip install -r backend\requirements.txtcd frontend
npm install
cd ..確保 storage/chroma/ 目錄存在且已包含向量資料。如果沒有,需要先執行 ingest.py 建立資料庫:
.\venv\Scripts\Activate.ps1
python ingest.pyPowerShell(推薦):
.\start.ps1CMD:
start.bat這會自動:
- 在新視窗啟動後端(自動激活 venv)
- 等待 3 秒
- 在新視窗啟動前端
後端:
# PowerShell
.\backend\start_backend.ps1
# 或 CMD
backend\start_backend.bat
# 或手動
.\venv\Scripts\Activate.ps1
cd backend
python main.py前端:
# PowerShell
.\frontend\start_frontend.ps1
# 或 CMD
frontend\start_frontend.bat
# 或手動
cd frontend
npm run dev- 前端 UI: http://localhost:5173
- 後端 API: http://localhost:8000
- API 文檔: http://localhost:8000/docs
| 檔案 | 用途 | Shell |
|---|---|---|
start.ps1 |
一鍵啟動前後端(新視窗) | PowerShell |
start.bat |
一鍵啟動前後端(新視窗) | CMD |
| 檔案 | 用途 | Shell |
|---|---|---|
backend/start_backend.ps1 |
啟動後端(自動激活 venv) | PowerShell |
backend/start_backend.bat |
啟動後端(自動激活 venv) | CMD |
特點:
- ✅ 自動激活 Python 虛擬環境 (venv)
- ✅ 自動切換到 backend 目錄
- ✅ 執行
python main.py
| 檔案 | 用途 | Shell |
|---|---|---|
frontend/start_frontend.ps1 |
啟動前端開發伺服器 | PowerShell |
frontend/start_frontend.bat |
啟動前端開發伺服器 | CMD |
特點:
- ✅ 自動切換到 frontend 目錄
- ✅ 執行
npm run dev
-
Windows PowerShell 使用者(推薦):
- 使用
.ps1腳本 - 如遇到執行策略錯誤,執行:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
- 使用
-
CMD 使用者:
- 使用
.bat腳本 - 雙擊或在 CMD 中執行
- 使用
健康檢查端點
回應:
{
"message": "TTU CSE Chatbot API is running"
}健康狀態檢查
回應:
{
"status": "healthy",
"rag_ready": true
}SSE 串流聊天端點(用於前端即時顯示)
參數:
message(query string): 使用者問題
回應: Server-Sent Events 串流
data: {"content": "你", "done": false}
data: {"content": "好", "done": false}
...
data: {"content": "", "done": true}
範例:
const response = await fetch(
`http://localhost:8000/api/chat/stream?message=${encodeURIComponent("資工系有哪些課程?")}`
);非串流聊天端點(用於獲取完整回應與來源)
請求 Body:
{
"message": "資工系有哪些課程?"
}回應:
{
"response": "## 資工系課程\n\n大同大學資工系提供以下課程:\n\n1. **程式設計**\n2. **資料結構**\n...",
"sources": [
{
"content": "課程內容摘要...",
"source": "course_history_113.json",
"relevance": 0.8523,
"rerank_score": 0.9234
}
]
}graph LR
A[使用者提問] --> B[加入時間戳]
B --> C[向量檢索 k=40]
C --> D{是否新聞查詢?}
D -->|是| E[優先檢索新聞]
D -->|否| F[一般檢索]
E --> G[去重]
F --> G
G --> H[重排序 top-10]
H --> I[LLM 生成]
I --> J[串流回應]
| 參數 | 值 | 說明 |
|---|---|---|
k_retrieve |
40 | 初始檢索數量(k × 4) |
k |
10 | 最終返回文件數 |
temperature |
0 | LLM 溫度(確定性輸出) |
embeddings |
BAAI/bge-m3 | 嵌入模型 |
reranker |
BAAI/bge-reranker-base | 重排序模型 |
llm |
qwen3:latest | 語言模型 |
當查詢包含以下關鍵字時,會優先檢索新聞類型資料:
["新聞", "消息", "news", "最新", "最近", "活動",
"說明會", "講座", "論壇", "營隊", "徵才"]每個檢索到的文件包含兩個分數:
- relevance: 向量相似度分數(0-1)
- rerank_score: 重排序分數(-∞ to +∞)
前端會顯示這兩個分數,幫助使用者了解來源可信度。
後端(Python)- 使用 venv ✅
# 為什麼需要 venv?
✅ 隔離套件:避免不同專案的套件版本衝突
✅ 保護全域環境:不會汙染系統 Python
✅ 版本管理:每個專案可以使用不同版本的套件
# 套件安裝位置
✅ venv 環境:d:\畢業專題\ttu_cse_chatbot\venv\Lib\site-packages\
❌ 全域環境:C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\前端(Node.js)- 不需要 venv ✅
# npm 本身就有專案隔離機制
✅ 所有套件都安裝在專案的 node_modules/ 目錄
✅ 不會影響其他 Node.js 專案- 確保在 venv 環境中:
.\venv\Scripts\Activate.ps1-
修改
backend/main.py -
重啟後端伺服器(Uvicorn 會自動重載)
-
修改
frontend/src/App.jsx或其他檔案 -
Vite 會自動熱重載(HMR)
後端:
.\venv\Scripts\Activate.ps1
pip install <package-name>
pip freeze > backend\requirements.txt前端:
cd frontend
npm install <package-name>如需修改允許的前端來源,編輯 backend/main.py:
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:5173", "http://localhost:3000"], # 添加新來源
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)原因: 未在 venv 環境中執行或依賴未安裝
解決:
.\venv\Scripts\Activate.ps1
pip install -r backend\requirements.txt原因: Node.js 依賴未安裝
解決:
cd frontend
npm install原因: 沒有 NVIDIA GPU 或 CUDA 未安裝
解決: 修改 backend/main.py,將所有 device="cuda" 改為 device="cpu"
原因: Ollama 服務未運行或模型未下載
解決:
# 確保 Ollama 運行
ollama list
# 下載模型
ollama pull qwen3:latest
# 測試模型
ollama run qwen3:latest原因: 向量資料庫未建立
解決:
.\venv\Scripts\Activate.ps1
python ingest.py錯誤訊息: "無法載入檔案 xxx.ps1,因為這個系統上已停用指令碼執行"
解決:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser原因: 後端未啟動或 CORS 配置錯誤
檢查:
- 確認後端運行在 http://localhost:8000
- 訪問 http://localhost:8000/health 檢查狀態
- 檢查瀏覽器控制台的錯誤訊息
原因: rehype-sanitize 過濾了某些標籤
解決: 查看 MARKDOWN_RENDERING.md 中的配置說明
後端除錯:
# 查看詳細日誌
cd backend
.\venv\Scripts\Activate.ps1
python main.py前端除錯:
# 開啟瀏覽器開發者工具(F12)
# 查看 Console 和 Network 標籤
cd frontend
npm run dev本 README.md 包含所有必要的專案資訊,包括:
- 完整的安裝與啟動指南
- 技術棧與架構說明
- RAG 實現細節
- API 文檔
- 故障排除指南
如需進一步了解 FastAPI 與 Vite 的詳細資訊,請參考官方文檔:
- 添加使用者認證系統
- 實作聊天歷史記錄(LocalStorage 或資料庫)
- 支援多輪對話上下文
- 添加檔案上傳功能(PDF、Word 等)
- 優化移動端 UI
- 實作搜尋歷史紀錄
- 添加主題切換(深色/淺色模式)
- 部署到生產環境
- 添加使用者回饋機制
- 整合更多資料來源
此專案為大同大學資訊工程學系畢業專題。
此專案為大同大學資訊工程學系畢業專題,僅供學術研究使用。
製作團隊: 大同大學資訊工程學系
最後更新: 2025年11月21日