一個結合 LINE Bot 與 Google Gemini File Search 的智能文件問答機器人
想像一下:你可以把任何 PDF、Word 文件、圖片傳給 LINE Bot,然後直接問它「這份文件在講什麼?」、「幫我整理重點」、「這張圖片裡有什麼?」,Bot 就會用 AI 幫你分析並回答!
這個專案讓你輕鬆打造一個專屬的文件智能助手,只要:
- 📤 傳送文件或圖片給 Bot
- 💬 用自然語言提問
- 🤖 AI 立即分析並回答
- 📄 文件檔案:PDF、Word (DOCX)、純文字 (TXT) 等
- 自動上傳到 File Search Store
- 支援後續文字查詢
- 🖼️ 圖片檔案:JPG、PNG 等
- 使用 Gemini 視覺理解能力即時分析
- 無需上傳,直接回傳分析結果
- 使用 Google Gemini 2.5 Flash 模型
- 基於你上傳的文件內容回答問題
- 支援繁體中文、英文等多語言
- 1 對 1 聊天:每個人有自己的文件庫(隔離的)
- 群組聊天:群組成員共享文件庫(大家都能查詢)
- 自動識別對話類型,無需手動設定
- AI 口語化列表:使用 Google ADK Agent 以自然對話方式介紹檔案
- 智能識別:支援多種關鍵字(列出檔案、顯示檔案、list files 等)
- Quick Reply 快速操作:上傳成功後提供「生成摘要」、「重點整理」等快捷按鈕
- 明確檔案指定:Quick Reply 自動帶入檔案名稱,避免混淆
- 支援 Docker 容器化部署
- 可部署到 Google Cloud Run
- 或在本地開發測試
👤 你: [上傳一份會議記錄.pdf]
🤖 Bot: ✅ 檔案已成功上傳!
檔案名稱:會議記錄.pdf
現在您可以詢問我關於這個檔案的任何問題。
[Quick Reply 按鈕]
📝 生成檔案摘要 | 📌 重點整理 | 📋 列出檔案
👤 你: [點擊「📝 生成檔案摘要」]
→ 自動發送「請幫我生成「會議記錄.pdf」這個檔案的摘要」
🤖 Bot: 好的!這份會議記錄主要記錄了 2025 年第一季的營運會議...
主要決議包括:
1. 下季度預算增加 15%
2. 新產品預計 6 月上市
3. 人力資源部門將擴編 3 名員工
...
👤 你: 列出檔案
🤖 Bot: 我看到你上傳了 3 個檔案唷!
首先是「會議記錄.pdf」,這是在 1月8日下午2點半上傳的。
接著是「技術文件.docx」,是在下午3點20分傳的。
最後一個是「報告.txt」,這個是在下午4點10分上傳的。
需要我幫你查詢哪個檔案的內容呢?😊
💡 提示:使用 Google ADK Agent 讓 AI 用自然對話方式介紹檔案,比傳統的清單或卡片更親切!
👤 你: [傳送圖片]
🤖 Bot: 正在分析您的圖片,請稍候...
🤖 Bot: 📸 圖片分析結果:
這張圖片顯示了一個現代化的辦公室空間...
- Python 3.9+
- FastAPI - 高效能異步 Web 框架
- LINE Messaging API - LINE Bot 介面(含 Quick Reply)
- Google Gemini API - 文件搜尋與 AI 問答
- Google ADK (Agent Development Kit) - 口語化檔案管理 Agent
- Docker - 容器化部署
首先,你需要準備這些:
LINE Bot 設定
- 到 LINE Developers Console 建立一個 Messaging API channel
- 取得你的
Channel Secret和Channel Access Token
Google Gemini API
- 到 Google AI Studio 建立 API Key
- 複製你的
API Key
git clone <你的 repo URL>
cd linebot-file-search-adkpip install -r requirements.txt建立 .env 檔案或直接設定環境變數:
export ChannelSecret="你的 LINE Channel Secret"
export ChannelAccessToken="你的 LINE Channel Access Token"
export GOOGLE_API_KEY="你的 Google Gemini API Key"uvicorn main:app --reload服務會在 http://localhost:8000 啟動
如果在本地開發,使用 ngrok 來建立公開的網址:
ngrok http 8000然後到 LINE Developers Console,把 Webhook URL 設定為:
https://你的-ngrok-網址.ngrok.io/
文件檔案(PDF、DOCX、TXT 等):
- 直接在 LINE 聊天室傳送文件檔案
- Bot 會回覆「正在處理您的檔案,請稍候...」
- 上傳完成後會顯示「✅ 檔案已成功上傳!」
- 現在可以開始提問關於文件的內容
圖片檔案(JPG、PNG 等):
- 直接在 LINE 聊天室傳送圖片
- Bot 會回覆「正在分析您的圖片,請稍候...」
- 立即收到圖片分析結果
- 圖片不會儲存,每次都是即時分析
文件查詢(需先上傳文件):
- 「這份文件的重點是什麼?」
- 「幫我整理成條列式」
- 「第三章在講什麼?」
- 「根據這份報告,我們應該注意什麼?」
圖片分析(直接傳圖片):
- 傳送圖片後自動分析
- 會描述圖片的內容、場景、物品、文字等
- 無需額外提問
列出檔案(AI 口語化):
支援多種關鍵字來查看已上傳的文件:
- 「列出檔案」或「列出文件」
- 「顯示檔案」或「查看檔案」
- 「我的檔案」或「檔案列表」
- 英文:「list files」、「show files」、「my files」
Bot 會用 Google ADK Agent 以自然對話方式介紹檔案:
- 🤖 口語化描述(而非條列式清單)
- 📅 自動格式化上傳時間
- 💬 友善親切的語氣
- 🎯 智能總結(檔案多時會挑重點說明)
Quick Reply 快速操作:
上傳檔案成功後,Bot 會提供快捷按鈕:
- 📝 生成檔案摘要 - 自動帶入檔案名稱「請幫我生成『檔名』這個檔案的摘要」
- 📌 重點整理 - 自動帶入檔案名稱「請幫我整理『檔名』的重點」
- 📋 列出檔案 - 查看所有已上傳的文件
💡 提示:Quick Reply 會自動帶入剛上傳的檔案名稱,避免多檔案時的混淆!
文件檔案:
- 個人聊天:每個人有獨立的文件庫,只能查詢自己上傳的檔案
- 群組聊天:所有群組成員共享同一個文件庫,任何人上傳的檔案都能被查詢
- 文件會持續保存在 File Search Store 中
圖片檔案:
- 不會儲存到 File Search Store
- 每次傳送都是即時分析
- 分析完成後圖片會自動清除
docker build -t linebot-file-search .docker run -p 8000:8000 \
-e ChannelSecret=你的SECRET \
-e ChannelAccessToken=你的TOKEN \
-e GOOGLE_API_KEY=你的API_KEY \
linebot-file-search參考官方文件安裝
gcloud auth login
gcloud config set project 你的專案IDgcloud builds submit --tag gcr.io/你的專案ID/linebot-file-searchgcloud run deploy linebot-file-search \
--image gcr.io/你的專案ID/linebot-file-search \
--platform managed \
--region asia-east1 \
--allow-unauthenticated \
--set-env-vars ChannelSecret=你的SECRET,ChannelAccessToken=你的TOKEN,GOOGLE_API_KEY=你的API_KEYgcloud run services describe linebot-file-search \
--platform managed \
--region asia-east1 \
--format 'value(status.url)'把這個網址設定到 LINE Bot 的 Webhook URL 就完成了!
不要把敏感資訊寫進程式碼! 建議使用 Google Secret Manager:
# 建立 secrets
echo -n "你的SECRET" | gcloud secrets create line-channel-secret --data-file=-
echo -n "你的TOKEN" | gcloud secrets create line-channel-token --data-file=-
echo -n "你的API_KEY" | gcloud secrets create google-api-key --data-file=-部署時使用 secrets:
gcloud run deploy linebot-file-search \
--image gcr.io/你的專案ID/linebot-file-search \
--platform managed \
--region asia-east1 \
--allow-unauthenticated \
--update-secrets=ChannelSecret=line-channel-secret:latest,ChannelAccessToken=line-channel-token:latest,GOOGLE_API_KEY=google-api-key:latest部署後可以透過 Google Cloud Console 監控:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=linebot-file-search" --limit 50直接到 Cloud Run Console 查看服務狀態、錯誤率、回應時間等指標
- 上傳多份文件:可以連續上傳多份文件,Bot 會記住所有文件並在查詢時搜尋
- 圖片即時分析:圖片不需要「上傳」,直接傳送就會立即分析並回覆
- 文件持久化:上傳的文件會持續保存在 File Search Store,可隨時查詢
- Quick Reply 快捷操作:
- 上傳檔案後立即使用 Quick Reply 按鈕(生成摘要、重點整理)
- Quick Reply 會自動帶入檔案名稱,避免多檔案時混淆
- 點擊按鈕比手動輸入更快速方便
- AI 口語化檔案列表:
- 輸入「列出檔案」會得到自然對話式的回應
- AI 會用親切的語氣介紹每個檔案和上傳時間
- 比傳統清單更友善、更易讀
- 支援的檔案類型:
- 文件:取決於 Google Gemini File API 的支援
- 圖片:JPG、JPEG、PNG、GIF、WebP
Q: 為什麼我問問題時 Bot 說「您還沒有上傳任何檔案」? A: 這個訊息是針對文件查詢。請先上傳文件檔案(PDF、DOCX 等),Bot 才能根據文件內容回答。如果您想分析圖片,請直接傳送圖片,無需上傳。
Q: 圖片和文件的處理有什麼不同? A:
- 文件:會上傳到 File Search Store,可以後續查詢,適合需要反覆查詢的資料
- 圖片:即時分析後立即清除,適合快速了解圖片內容
Q: 群組聊天中,其他人上傳的檔案我也能查詢嗎? A: 可以!群組中所有成員共享同一個文件庫(僅限文件檔案)。
Q: 檔案會保存多久? A: 文件檔案會持續保存在 Google Gemini 的 File Search Store,圖片分析後會立即清除。
Q: 支援哪些語言? A: Google Gemini 支援多種語言,包括繁體中文、簡體中文、英文、日文等。
Q: 可以處理多大的檔案? A: 取決於 Google Gemini File API 的限制,一般文件都沒問題。圖片建議不超過 10MB。
Q: Quick Reply 按鈕是什麼? A: Quick Reply 是上傳檔案成功後出現的快捷按鈕(📝 生成檔案摘要、📌 重點整理、📋 列出檔案)。點擊按鈕會自動發送完整問題,比手動輸入更方便,且會自動帶入檔案名稱避免混淆。
Q: 為什麼列出檔案時不是顯示清單或卡片? A: 我們使用 Google ADK Agent 讓 AI 用自然對話方式介紹檔案,而非傳統的條列式清單或卡片。這樣的呈現更友善、更像真人對話,使用者體驗更好。AI 會根據檔案數量智能調整說明方式。
Q: 如何自訂 Quick Reply 按鈕的文字?
A: 在 main.py 的 handle_document_message() 函數中可以修改 Quick Reply 的設定。你可以調整按鈕的 label(顯示文字)和 text(發送內容)。
在 main.py 第 51 行可以修改使用的模型:
MODEL_NAME = "gemini-2.5-flash" # 可改成其他 Gemini 模型在 main.py 約第 220 行可以調整 AI 的創意程度:
temperature=0.7, # 0.0 = 保守精確, 1.0 = 創意發散在 main.py 約第 270 行可以修改圖片分析的提示:
contents=["請詳細描述這張圖片的內容,包括主要物品、場景、文字等資訊。", image],可以改成:
"請用英文描述這張圖片"- 英文回應"這張圖片中有哪些文字?"- 專注於 OCR"這張圖片的主題是什麼?"- 摘要式回應
在 main.py 的檔案上傳成功處理部分(約第 447-452 行):
quick_reply = QuickReply(items=[
QuickReplyButton(action=MessageAction(
label="📝 生成檔案摘要",
text=f"請幫我生成「{file_name}」這個檔案的摘要"
)),
QuickReplyButton(action=MessageAction(
label="📌 重點整理",
text=f"請幫我整理「{file_name}」的重點"
)),
QuickReplyButton(action=MessageAction(
label="📋 列出檔案",
text="列出檔案"
)),
])你可以:
- 修改
label來改變按鈕顯示文字 - 修改
text來改變點擊後發送的內容 - 新增或移除按鈕(LINE 限制最多 13 個)
- 使用
{file_name}變數來自動帶入檔案名稱
在 file_manager_agent/agent.py 中修改 agent instruction(約第 24-33 行):
instruction="""你是一個友善的檔案管理助手。
當使用者要求列出檔案時:
1. 使用 list_files tool 來取得檔案清單
2. 用口語化、友善的方式呈現結果
3. 不要使用條列式或表格,用自然的對話方式說明
4. 例如:「我看到你上傳了 3 個檔案唷!首先是『會議記錄.pdf』...」
5. 語氣要輕鬆、親切
回應時請用繁體中文。"""你可以調整:
- 語氣風格:從「親切」改為「專業」、「幽默」等
- 語言:改為英文或其他語言
- 呈現方式:要求 AI 用特定格式(如分類、排序等)
- 細節程度:決定要說明到多詳細
MIT License - 歡迎自由使用、修改、分享!
歡迎提交 Issue 或 Pull Request!
- Google Gemini File Search 官方文件
- Google ADK (Agent Development Kit) 文件
- LINE Messaging API 文件
- LINE Messaging API - Quick Reply
- FastAPI 文件
⭐ 如果這個專案對你有幫助,請給個 Star 支持一下!