[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80855":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":10,"openIssues":12,"contributorsCount":12,"subscribersCount":12,"size":12,"stars1d":12,"stars7d":12,"stars30d":12,"stars90d":12,"forks30d":12,"starsTrendScore":12,"compositeScore":13,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":14,"fork":14,"defaultBranch":15,"hasWiki":16,"hasPages":14,"topics":17,"createdAt":8,"pushedAt":8,"updatedAt":18,"readmeContent":19,"aiSummary":20,"trendingCount":12,"starSnapshotCount":12,"syncStatus":21,"lastSyncTime":22,"discoverSource":23},80855,"linebot-multimodal-rag","kkdai\u002Flinebot-multimodal-rag","kkdai",null,"Python",35,5,0,2.33,false,"main",true,[],"2026-06-12 02:04:07","# LINE Bot Multimodal RAG\n\nLINE Bot 整合 **Gemini File Search API**，讓你透過 LINE 上傳文件或圖片建立知識庫，並用自然語言或圖片搜尋其中的內容。\n\n> **使用者資料隔離**：每位 LINE 使用者只能存取自己上傳的資料，透過 LINE user ID 在 Gemini File Search Store 的 `custom_metadata` + `metadata_filter` 實作。\n\n---\n\n## 功能\n\n| 操作 | 說明 |\n|------|------|\n| 傳送 **PDF \u002F 文件** | Bot 詢問：存入資料庫 or 作為搜尋 |\n| 傳送 **圖片** | Bot 詢問：存入資料庫 or 作為搜尋 |\n| 點選 **「📥 存入資料庫」** | 非同步建立索引（含 user_id metadata），完成後推播通知 |\n| 點選 **「🔍 作為搜尋」** | 以該圖片 \u002F 文件作為查詢，僅從自己的資料中找相關內容 |\n| 輸入 **文字** | 直接對自己的資料庫做語意查詢（RAG） |\n\n### 支援格式\n- 圖片：JPG、PNG、WebP 等\n- 文件：PDF、TXT、CSV、Markdown 等\n- 單檔上限：100 MB（Gemini File Search API 限制）\n- 不支援：音訊（mp3、wav）、影片（mp4、mov）\n\n### 搜尋能力\n- **文字查文字**：輸入問題 → 找自己上傳的 PDF \u002F 文件中的相關段落\n- **圖片查資料庫**：傳圖片 → Gemini 理解圖片內容 → 找自己資料庫中的相關資訊（包含 PDF 內的圖文說明）\n- 跨語言：中文查詢英文文件也能運作（gemini-embedding-2 支援 100+ 語言）\n- **多租戶隔離**：每位使用者的資料完全分離，透過 `metadata_filter: user_id=\"U...\"` 在查詢時過濾\n\n---\n\n## 參考資料\n\n本專案的功能設計與 API 用法參考以下官方文件：\n\n- [Expanded Gemini API File Search: multimodal RAG](https:\u002F\u002Fblog.google\u002Finnovation-and-ai\u002Ftechnology\u002Fdevelopers-tools\u002Fexpanded-gemini-api-file-search-multimodal-rag\u002F) — Google Blog 公告（多模態 RAG、metadata filter、page citations）\n- [Gemini Embedding 2 model card](https:\u002F\u002Fdeepmind.google\u002Fmodels\u002Fgemini\u002Fembedding\u002F) — Embedding 模型規格（5 種模態、8192 tokens、可變維度）\n- [Multimodal RAG with the Gemini API File Search tool: A Developer Guide](https:\u002F\u002Fdev.to\u002Fgoogleai\u002Fmultimodal-rag-with-the-gemini-api-file-search-tool-a-developer-guide-5878) — File Search API 完整程式碼範例\n- [File Search API documentation](https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Ffile-search?hl=zh-tw) — 官方文件（含 metadata filter 語法）\n\n---\n\n## 技術架構\n\n```\nLINE App\n  │\n  │  Webhook (HTTPS)\n  ▼\nFastAPI (Cloud Run)\n  ├─ 文字訊息 ──────────────────► Gemini File Search → 回覆\n  ├─ 圖片 \u002F 檔案 ─► GCS 備份 ──► Quick Reply 按鈕\n  └─ Postback 按鈕\n       ├─ 存入資料庫 ─► Background Task ─► Gemini 建索引 ─► Push 通知\n       └─ 作為搜尋 ──► GCS 讀取 ──────► Gemini File Search → 回覆\n```\n\n**核心元件：**\n- **Gemini File Search API** — 托管式多模態 RAG（Google 處理 chunking、embedding、indexing）\n- **Embedding model**：`gemini-embedding-2`（文字 + 圖片同一向量空間）\n- **Generation model**：`gemini-3-flash-preview`（可透過環境變數 `GEMINI_MODEL` 調整）\n- **GCS**：上傳檔案的持久化儲存 + File Search Store 名稱記錄\n- **FastAPI BackgroundTasks**：避免建索引時佔住 LINE reply token（30 秒限制）\n\n---\n\n## 安裝與本機開發\n\n### 環境需求\n- Python 3.12+\n- GCP 專案（需有 GCS bucket）\n- LINE Bot channel（Messaging API）\n- Gemini API Key（[Google AI Studio](https:\u002F\u002Faistudio.google.com)）\n\n### 1. Clone & 安裝依賴\n\n```bash\ngit clone \u003Cyour-repo-url>\ncd linebot-multimodal-rag\n\npython -m venv .venv\nsource .venv\u002Fbin\u002Factivate   # Windows: .venv\\Scripts\\activate\npip install -r requirements.txt\n```\n\n### 2. 設定環境變數\n\n```bash\ncp .env.example .env\n```\n\n編輯 `.env`：\n\n```env\nLINE_CHANNEL_SECRET=你的_line_channel_secret\nLINE_CHANNEL_ACCESS_TOKEN=你的_line_channel_access_token\nGEMINI_API_KEY=你的_gemini_api_key\nGCS_BUCKET=你的_gcs_bucket_名稱\nGEMINI_MODEL=gemini-3-flash-preview\n```\n\n| 變數 | 哪裡取得 |\n|------|---------|\n| `LINE_CHANNEL_SECRET` | LINE Developers Console → Messaging API → Channel Secret |\n| `LINE_CHANNEL_ACCESS_TOKEN` | LINE Developers Console → Messaging API → Channel access token |\n| `GEMINI_API_KEY` | [Google AI Studio](https:\u002F\u002Faistudio.google.com\u002Fapp\u002Fapikey) |\n| `GCS_BUCKET` | 自行建立的 GCS bucket 名稱 |\n\n### 3. GCS Bucket 建立（若尚未建立）\n\n```bash\ngsutil mb -l asia-east1 gs:\u002F\u002F你的-bucket-名稱\n```\n\n### 4. GCP 認證（本機開發）\n\n```bash\ngcloud auth application-default login\n```\n\n### 5. 啟動本機伺服器\n\n```bash\nuvicorn app.main:app --reload --port 8080\n```\n\n啟動成功後會看到：\n```\n[Startup] File Search Store ready: fileSearchStores\u002Fxxxxxxxx\n```\n\n### 6. 對外暴露 Webhook（ngrok）\n\n```bash\n# 安裝 ngrok: https:\u002F\u002Fngrok.com\nngrok http 8080\n```\n\n取得 `https:\u002F\u002Fxxxx.ngrok.io`，填入 LINE Developers Console：\n- Messaging API → Webhook URL → `https:\u002F\u002Fxxxx.ngrok.io\u002Fwebhook`\n- 開啟「Use webhook」\n\n### 7. 確認運作\n\n```bash\n# 健康檢查\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n\n# 查看 File Search Store 狀態（已索引幾份文件）\ncurl http:\u002F\u002Flocalhost:8080\u002Fstore\u002Finfo\n```\n\n---\n\n## 部署到 GCP Cloud Run\n\n### 快速部署\n\n```bash\n# 確認已完成 spec\u002Fdeployment.md 的 Step 1–5\ngcloud builds submit \\\n  --config=cloudbuild.yaml \\\n  --substitutions=_GCS_BUCKET=你的-bucket-名稱\n```\n\n### 取得 Webhook URL\n\n```bash\ngcloud run services describe linebot-multimodal-rag \\\n  --region=asia-east1 \\\n  --format='value(status.url)'\n```\n\n將 `{URL}\u002Fwebhook` 填入 LINE Developers Console。\n\n詳細步驟見 [spec\u002Fdeployment.md](spec\u002Fdeployment.md)。\n\n---\n\n## 如何使用 LINE Bot\n\n### 情境 1：上傳文件建立知識庫\n\n1. 開啟 LINE，找到你的 Bot\n2. 點選 **＋** → **檔案** → 選擇 PDF 或文字檔\n3. Bot 回覆：「📄 收到檔案：xxx.pdf，請問要：」\n4. 點選 **📥 存入資料庫**\n5. Bot 回覆：「⏳ 正在建立索引，完成後會通知您...」\n6. 等待幾秒到幾分鐘（依檔案大小），Bot 推播：「✅ 已成功存入資料庫！」\n\n### 情境 2：用文字查詢知識庫\n\n1. 直接在聊天框輸入問題，例如：\n   - `「第三季的營收是多少？」`\n   - `「退換貨政策是什麼？」`\n   - `「這個錯誤代碼代表什麼意思？」`\n2. Bot 根據已建立的資料庫回答，並引用相關內容\n\n### 情境 3：上傳圖片搜尋相關資料\n\n1. 點選 **＋** → **相簿** → 選擇圖片（例如：截圖、白板照片、產品圖）\n2. Bot 回覆：「🖼️ 收到圖片！請問要：」\n3. 點選 **🔍 作為搜尋**\n4. Bot 分析圖片內容，從資料庫找出相關資訊並回覆\n\n### 情境 4：將圖片也加入資料庫\n\n1. 傳送圖片（如產品照、圖表、截圖）\n2. 點選 **📥 存入資料庫**\n3. 圖片完成索引後，可以透過文字搜尋這張圖片的相關內容\n\n### 注意事項\n\n- 工作階段有效期 **5 分鐘**：傳送圖片 \u002F 檔案後，需在 5 分鐘內選擇動作\n- 若超時請重新上傳\n- 所有使用者共用同一個資料庫（PoC 設計）\n- 不支援音訊與影片格式\n\n---\n\n## API 端點\n\n| 端點 | 方法 | 說明 |\n|------|------|------|\n| `\u002Fhealth` | GET | 服務健康檢查 |\n| `\u002Fstore\u002Finfo` | GET | File Search Store 狀態（文件數、索引狀態） |\n| `\u002Fwebhook` | POST | LINE Bot Webhook 接收端點 |\n\n### `\u002Fstore\u002Finfo` 回傳範例\n\n```json\n{\n  \"store_name\": \"fileSearchStores\u002Fabc123\",\n  \"display_name\": \"linebot-multimodal-rag\",\n  \"embedding_model\": \"models\u002Fgemini-embedding-2\",\n  \"document_count\": 5,\n  \"documents\": [\n    {\n      \"name\": \"fileSearchStores\u002Fabc123\u002Fdocuments\u002Fdef456\",\n      \"display_name\": \"company_policy.pdf\",\n      \"state\": \"ACTIVE\"\n    }\n  ]\n}\n```\n\n---\n\n## 專案結構\n\n```\nlinebot-multimodal-rag\u002F\n├── app\u002F\n│   ├── main.py           # FastAPI + webhook routing + \u002Fstore\u002Finfo\n│   ├── line_handler.py   # LINE 事件處理\n│   ├── gemini_service.py # Gemini File Search 封裝\n│   └── session.py        # 用戶工作階段（in-memory, 5min TTL）\n├── spec\u002F\n│   ├── README.md         # 功能說明（精簡版）\n│   ├── architecture.md   # 系統架構與資料流詳解\n│   └── deployment.md     # GCP 完整部署步驟\n├── Dockerfile\n├── cloudbuild.yaml       # Cloud Build → Cloud Run 自動部署\n├── requirements.txt\n├── .env.example\n└── README.md             # 本文件\n```\n\n---\n\n## 疑難排解\n\n**Bot 沒有回應**\n- 確認 Webhook URL 正確填入 LINE Developers Console\n- 確認「Use webhook」已開啟\n- 檢查 `\u002Fhealth` 是否正常回應\n\n**「工作階段已過期」**\n- 傳送圖片 \u002F 檔案後需在 5 分鐘內點選按鈕\n- 重新傳送檔案即可\n\n**存入資料庫沒有收到完成通知**\n- 大型 PDF 可能需要幾分鐘\n- 確認 `LINE_CHANNEL_ACCESS_TOKEN` 有效（有效期限 30 天，需定期更新或設為長期）\n- 查看 Cloud Run logs 確認是否有錯誤\n\n**搜尋結果不相關**\n- 確認相關文件已成功存入（`\u002Fstore\u002Finfo` 確認 state 為 ACTIVE）\n- 嘗試更具體的問題描述\n- 若為英文文件，中文查詢仍可運作（跨語言 embedding）\n","该项目是一个基于LINE Bot的多模态检索增强生成（RAG）应用，利用Gemini File Search API实现文件和图片的知识库构建与查询。用户可以通过LINE上传文档或图片，并通过自然语言或图片进行内容搜索。核心功能包括支持多种格式文件的上传、异步索引创建及通知、以及基于文本或图片的内容检索，同时确保了用户数据的隔离性。适用于需要快速建立个人知识库并通过聊天机器人便捷访问相关信息的场景，特别适合研究者、学生或任何希望高效管理数字资料的个人使用。",2,"2026-06-11 04:02:35","CREATED_QUERY"]