LINE Bot 整合 Gemini File Search API,讓你透過 LINE 上傳文件或圖片建立知識庫,並用自然語言或圖片搜尋其中的內容。
使用者資料隔離:每位 LINE 使用者只能存取自己上傳的資料,透過 LINE user ID 在 Gemini File Search Store 的
custom_metadata+metadata_filter實作。
| 操作 | 說明 |
|---|---|
| 傳送 PDF / 文件 | Bot 詢問:存入資料庫 or 作為搜尋 |
| 傳送 圖片 | Bot 詢問:存入資料庫 or 作為搜尋 |
| 點選 「📥 存入資料庫」 | 非同步建立索引(含 user_id metadata),完成後推播通知 |
| 點選 「🔍 作為搜尋」 | 以該圖片 / 文件作為查詢,僅從自己的資料中找相關內容 |
| 輸入 文字 | 直接對自己的資料庫做語意查詢(RAG) |
- 圖片:JPG、PNG、WebP 等
- 文件:PDF、TXT、CSV、Markdown 等
- 單檔上限:100 MB(Gemini File Search API 限制)
- 不支援:音訊(mp3、wav)、影片(mp4、mov)
- 文字查文字:輸入問題 → 找自己上傳的 PDF / 文件中的相關段落
- 圖片查資料庫:傳圖片 → Gemini 理解圖片內容 → 找自己資料庫中的相關資訊(包含 PDF 內的圖文說明)
- 跨語言:中文查詢英文文件也能運作(gemini-embedding-2 支援 100+ 語言)
- 多租戶隔離:每位使用者的資料完全分離,透過
metadata_filter: user_id="U..."在查詢時過濾
本專案的功能設計與 API 用法參考以下官方文件:
- Expanded Gemini API File Search: multimodal RAG — Google Blog 公告(多模態 RAG、metadata filter、page citations)
- Gemini Embedding 2 model card — Embedding 模型規格(5 種模態、8192 tokens、可變維度)
- Multimodal RAG with the Gemini API File Search tool: A Developer Guide — File Search API 完整程式碼範例
- File Search API documentation — 官方文件(含 metadata filter 語法)
LINE App
│
│ Webhook (HTTPS)
▼
FastAPI (Cloud Run)
├─ 文字訊息 ──────────────────► Gemini File Search → 回覆
├─ 圖片 / 檔案 ─► GCS 備份 ──► Quick Reply 按鈕
└─ Postback 按鈕
├─ 存入資料庫 ─► Background Task ─► Gemini 建索引 ─► Push 通知
└─ 作為搜尋 ──► GCS 讀取 ──────► Gemini File Search → 回覆
核心元件:
- Gemini File Search API — 托管式多模態 RAG(Google 處理 chunking、embedding、indexing)
- Embedding model:
gemini-embedding-2(文字 + 圖片同一向量空間) - Generation model:
gemini-3-flash-preview(可透過環境變數GEMINI_MODEL調整) - GCS:上傳檔案的持久化儲存 + File Search Store 名稱記錄
- FastAPI BackgroundTasks:避免建索引時佔住 LINE reply token(30 秒限制)
- Python 3.12+
- GCP 專案(需有 GCS bucket)
- LINE Bot channel(Messaging API)
- Gemini API Key(Google AI Studio)
git clone <your-repo-url>
cd linebot-multimodal-rag
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtcp .env.example .env編輯 .env:
LINE_CHANNEL_SECRET=你的_line_channel_secret
LINE_CHANNEL_ACCESS_TOKEN=你的_line_channel_access_token
GEMINI_API_KEY=你的_gemini_api_key
GCS_BUCKET=你的_gcs_bucket_名稱
GEMINI_MODEL=gemini-3-flash-preview| 變數 | 哪裡取得 |
|---|---|
LINE_CHANNEL_SECRET |
LINE Developers Console → Messaging API → Channel Secret |
LINE_CHANNEL_ACCESS_TOKEN |
LINE Developers Console → Messaging API → Channel access token |
GEMINI_API_KEY |
Google AI Studio |
GCS_BUCKET |
自行建立的 GCS bucket 名稱 |
gsutil mb -l asia-east1 gs://你的-bucket-名稱gcloud auth application-default loginuvicorn app.main:app --reload --port 8080啟動成功後會看到:
[Startup] File Search Store ready: fileSearchStores/xxxxxxxx
# 安裝 ngrok: https://ngrok.com
ngrok http 8080取得 https://xxxx.ngrok.io,填入 LINE Developers Console:
- Messaging API → Webhook URL →
https://xxxx.ngrok.io/webhook - 開啟「Use webhook」
# 健康檢查
curl http://localhost:8080/health
# 查看 File Search Store 狀態(已索引幾份文件)
curl http://localhost:8080/store/info# 確認已完成 spec/deployment.md 的 Step 1–5
gcloud builds submit \
--config=cloudbuild.yaml \
--substitutions=_GCS_BUCKET=你的-bucket-名稱gcloud run services describe linebot-multimodal-rag \
--region=asia-east1 \
--format='value(status.url)'將 {URL}/webhook 填入 LINE Developers Console。
詳細步驟見 spec/deployment.md。
- 開啟 LINE,找到你的 Bot
- 點選 + → 檔案 → 選擇 PDF 或文字檔
- Bot 回覆:「📄 收到檔案:xxx.pdf,請問要:」
- 點選 📥 存入資料庫
- Bot 回覆:「⏳ 正在建立索引,完成後會通知您...」
- 等待幾秒到幾分鐘(依檔案大小),Bot 推播:「✅ 已成功存入資料庫!」
- 直接在聊天框輸入問題,例如:
「第三季的營收是多少?」「退換貨政策是什麼?」「這個錯誤代碼代表什麼意思?」
- Bot 根據已建立的資料庫回答,並引用相關內容
- 點選 + → 相簿 → 選擇圖片(例如:截圖、白板照片、產品圖)
- Bot 回覆:「🖼️ 收到圖片!請問要:」
- 點選 🔍 作為搜尋
- Bot 分析圖片內容,從資料庫找出相關資訊並回覆
- 傳送圖片(如產品照、圖表、截圖)
- 點選 📥 存入資料庫
- 圖片完成索引後,可以透過文字搜尋這張圖片的相關內容
- 工作階段有效期 5 分鐘:傳送圖片 / 檔案後,需在 5 分鐘內選擇動作
- 若超時請重新上傳
- 所有使用者共用同一個資料庫(PoC 設計)
- 不支援音訊與影片格式
| 端點 | 方法 | 說明 |
|---|---|---|
/health |
GET | 服務健康檢查 |
/store/info |
GET | File Search Store 狀態(文件數、索引狀態) |
/webhook |
POST | LINE Bot Webhook 接收端點 |
{
"store_name": "fileSearchStores/abc123",
"display_name": "linebot-multimodal-rag",
"embedding_model": "models/gemini-embedding-2",
"document_count": 5,
"documents": [
{
"name": "fileSearchStores/abc123/documents/def456",
"display_name": "company_policy.pdf",
"state": "ACTIVE"
}
]
}linebot-multimodal-rag/
├── app/
│ ├── main.py # FastAPI + webhook routing + /store/info
│ ├── line_handler.py # LINE 事件處理
│ ├── gemini_service.py # Gemini File Search 封裝
│ └── session.py # 用戶工作階段(in-memory, 5min TTL)
├── spec/
│ ├── README.md # 功能說明(精簡版)
│ ├── architecture.md # 系統架構與資料流詳解
│ └── deployment.md # GCP 完整部署步驟
├── Dockerfile
├── cloudbuild.yaml # Cloud Build → Cloud Run 自動部署
├── requirements.txt
├── .env.example
└── README.md # 本文件
Bot 沒有回應
- 確認 Webhook URL 正確填入 LINE Developers Console
- 確認「Use webhook」已開啟
- 檢查
/health是否正常回應
「工作階段已過期」
- 傳送圖片 / 檔案後需在 5 分鐘內點選按鈕
- 重新傳送檔案即可
存入資料庫沒有收到完成通知
- 大型 PDF 可能需要幾分鐘
- 確認
LINE_CHANNEL_ACCESS_TOKEN有效(有效期限 30 天,需定期更新或設為長期) - 查看 Cloud Run logs 確認是否有錯誤
搜尋結果不相關
- 確認相關文件已成功存入(
/store/info確認 state 為 ACTIVE) - 嘗試更具體的問題描述
- 若為英文文件,中文查詢仍可運作(跨語言 embedding)