以 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 預設)