以 Prompt Engineering 建構新聞時事聊天機器人,整合 OpenAI web_search / file_search 能力,協助快速掌握事件脈絡、比對多方來源、標註不確定點,並提供可持續對話的互動體驗。系統採前後端分離架構:前端部署於 Firebase Hosting,後端容器化後部署至 Google Cloud Run;使用者與聊天紀錄以 Firestore 為主。
安全提醒:API Key、Service Account、Token Secret 等機密資訊一律放在
.env、Cloud Run 環境變數或 Secret Manager,禁止提交到 Git。
- 新聞時事對話:背景、關鍵人物/組織、時間線、可能走向
- 引用與查證:透過
web_search/file_search取得多來源參考 - 使用者登入:Firebase Authentication(Email / Google)
- 對話記憶:Firestore 儲存 chat session 與 message 紀錄
- 部署:後端 Cloud Run、前端 Firebase Hosting
backend/:FastAPI 後端(RAG / 工具呼叫 / Firestore)frontend/:Vite + Vue 前端(登入、聊天 UI、呼叫後端 API)backend/src/knowledge_base_operation/:新聞知識庫建置流程
python backend/src/knowledge_base_operation/news_pipeline.py-
Python 3.12.3
-
建議套件:
pip install fastapi uvicorn openai python-dotenv
- Node.js 18+
- Yarn(或 npm)
依實作可能增減,常見欄位如下:
OPENAI_API_KEYOPENAI_CHAT_MODEL(例:gpt-4o)OPENAI_ASSISTANT_ID(系統提示詞可維護於backend/src/app/prompts/system/bot.md)FIREBASE_SERVICE_ACCOUNT_BASE64(Firebase Admin SDK 服務帳戶 JSON 的 base64)- (若有)
MONGODB_URI、AUTH_SECRET、TOKEN_EXPIRE_MINUTES
Firebase Console → 專案設定(齒輪)→ 服務帳戶 → Firebase Admin SDK → 選 Python → 產生新的私密金鑰
建議:避免把整份 JSON 直接放進 repo;採 base64 後以 Cloud Run 環境變數注入,或改用 Secret Manager。
# 後端 API 位址(本機或 Cloud Run)
VITE_API_BASE=http://localhost:8000
# Firebase Web App(Vite 環境變數)
VITE_FIREBASE_API_KEY=
VITE_FIREBASE_AUTH_DOMAIN=
VITE_FIREBASE_PROJECT_ID=
VITE_FIREBASE_STORAGE_BUCKET=
VITE_FIREBASE_MESSAGING_SENDER_ID=
VITE_FIREBASE_APP_ID=
VITE_FIREBASE_MEASUREMENT_ID=
#(選用)Firebase Emulator
VITE_USE_AUTH_EMULATOR=false
# 使用方式:firebase emulators:start --only auth
# Hosting 登入的 URL
HOSTED_LOGIN_URL=<Hosting 預設網址>/login注意:鍵名需與程式碼
import.meta.env.VITE_FIREBASE_*完全一致(大小寫不可混用)。
uvicorn backend.src.app.main:app --reload --log-level debugcd frontend
yarn install
yarn devcd frontend
yarn add firebase
# 或 npm install firebaseFirebase Console →(專案)→「新增應用程式」→ 選 </>(Web)→ 註冊
取得的設定值請放入 frontend/.env.local(不要硬編碼在程式碼內)。
(檔案需自行新增)
import { initializeApp } from "firebase/app";
import { getAnalytics } from "firebase/analytics";
const firebaseConfig = {
apiKey: import.meta.env.VITE_FIREBASE_API_KEY,
authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN,
projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID,
storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET,
messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID,
appId: import.meta.env.VITE_FIREBASE_APP_ID,
measurementId: import.meta.env.VITE_FIREBASE_MEASUREMENT_ID,
};
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
export { app, analytics };修改
.env.local後需重跑yarn dev或yarn build,Vite 才會載入最新設定。
Firebase Console → Authentication → Sign-in method(登入方式):
- 啟用 Email/Password
- 啟用 Google
同時建議檢查:
-
Authentication → Settings(設定)→ Authorized domains
- 確認已包含 Firebase Hosting 網域(例如
*.web.app/*.firebaseapp.com) - 若使用自訂網域,也需加入
- 確認已包含 Firebase Hosting 網域(例如
npm install -g firebase-tools
firebase logincd frontend
firebase init建議選項:
- 勾選 Hosting
- 視需求可一併勾選 Firestore(若要用 CLI 管理 Rules/Indexes)
- 選擇已存在的 Firebase 專案
- Deploy to GitHub:選
n
補充:
firebase.json需與package.json同層(皆在frontend/),firebase deploy才能正確辨識前端專案。
frontend/firebase.json(重點是 public: "dist"):
{
"hosting": {
"public": "dist"
}
}cd frontend
yarn install
yarn run build
firebase deploy --only hosting部署完成後,點擊 Hosting URL:
- 若看到專案畫面即代表成功
- 若仍是 Firebase Welcome Page,通常是
dist/index.html沒更新或快取造成(見下方 Troubleshooting)
cd frontend
yarn install
yarn run build
firebase deploy --only hostingFirebase Console → Firestore Database → 建立資料庫即可。 Rules 文件(官方):https://firebase.google.com/docs/rules/get-started?hl=zh-TW
後端使用 Admin SDK 可進行伺服端存取;前端存取需搭配 Security Rules 設計。
gcloud init
gcloud config set run/region asia-east1
gcloud config get-value project- 後端需有
Dockerfile - 建議
.dockerignore排除frontend/、node_modules/、dist/等內容,縮小 image 體積
cd ~/dev/CurrentEvents-Chatbot
docker build -t ce-backend:dev -f Dockerfile .docker run --rm -p 8080:8080 --env-file .env ce-backend:dev驗證 Swagger:
PROJECT_ID=$(gcloud config get-value project)
REGION=asia-east1
REPO=currentevents-backend
IMAGE_NAME=backend-api
gcloud artifacts repositories create $REPO \
--repository-format=docker \
--location=$REGION \
--description="Container images for CurrentEvents-Chatbot backend"
gcloud auth configure-docker $REGION-docker.pkg.devcd ~/dev/CurrentEvents-Chatbot
PROJECT_ID=$(gcloud config get-value project)
REGION=asia-east1
REPO=currentevents-backend
IMAGE_NAME=backend-api
TAG=v1
docker build -t $REGION-docker.pkg.dev/$PROJECT_ID/$REPO/$IMAGE_NAME:$TAG -f Dockerfile .
docker push $REGION-docker.pkg.dev/$PROJECT_ID/$REPO/$IMAGE_NAME:$TAGgcloud run deploy currentevents-backend \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/$REPO/$IMAGE_NAME:$TAG \
--platform=managed \
--region=$REGION \
--allow-unauthenticated \
--port=8080 \
--cpu=1 \
--memory=512Mi \
--concurrency=80 \
--min-instances=0 \
--max-instances=5 \
--set-env-vars="ENV=prod"環境變數(如
OPENAI_API_KEY、FIREBASE_SERVICE_ACCOUNT_BASE64)建議於 Cloud Run Console: 服務 → 編輯及部署新修訂版本 → 容器 →「變數與密鑰」設定後再部署。
- 取得 Cloud Run 服務 URL
- 更新
frontend/.env.local:
VITE_API_BASE=https://<cloud-run-service-url>- 重新部署前端:
cd frontend
yarn install
yarn run build
firebase deploy --only hostingcd ~/dev/CurrentEvents-Chatbot
PROJECT_ID=$(gcloud config get-value project)
REGION=asia-east1
REPO=currentevents-backend
IMAGE_NAME=backend-api
TAG=v9
FULL_IMAGE="$REGION-docker.pkg.dev/$PROJECT_ID/$REPO/$IMAGE_NAME:$TAG"
docker build -t "$FULL_IMAGE" -f Dockerfile .
docker push "$FULL_IMAGE"
gcloud run deploy currentevents-backend \
--image="$FULL_IMAGE" \
--platform=managed \
--region=$REGION \
--allow-unauthenticatedCloud Run 會建立新 revision 並切換流量到新版;舊版保留可回滾。
##(選用)Firebase Emulator:離線整合測試
firebase init emulators
# 勾 Auth emulator、Firestore emulator 等前端可在開發模式連 emulator(示意):
import { getAuth, connectAuthEmulator } from "firebase/auth";
export const auth = getAuth(app);
if (import.meta.env.VITE_USE_AUTH_EMULATOR === "true") {
connectAuthEmulator(auth, "http://localhost:9099", { disableWarnings: true });
}.env.local:
VITE_USE_AUTH_EMULATOR=true-
確認
frontend/firebase.json的public為dist -
確認已執行
yarn run build且dist/index.html存在:cd frontend yarn run build ls dist -
用無痕視窗檢查,或清除快取
- 檢查
.env.local變數鍵名是否與import.meta.env.VITE_FIREBASE_*完全一致 - 修改
.env.local後需重跑yarn dev/yarn run build
- 優先檢查 Cloud Run 的環境變數是否已補齊
- 檢查容器是否監聽在 8080(Cloud Run 預設)