[Gemini] 讓 Gemini 根據你問題的關鍵字,透過 Google Custom Search 找到結果總結回覆

前情提要 一直以來我們都知道透過 LLM 上的 function call ,是可以讓 LLM 有了使用工具的能力。可以去做網頁搜尋,或是查詢資料庫,甚至是做一些特殊的工作。 而在處理網頁搜尋的時候,通常是會使用到一些外部服務 SerpAPI 相關的付費服務。 如果你原本的服務是建置在 Google Cloud Platform 上面,有沒有想過是否有可以使用的服務呢? 本篇文章就來介紹一下,如何透過 Google Custom Search API 搜尋 Google 並且將結果總結回覆。 如何快速取的 Google Search 的網頁 以往來說,如果你是在本地端直接來呼叫,可以透過 https://www.google.com/search?q=YOUR_KEYWORD 來直接呼叫網址顯示相關的搜尋結果。 這個時候,你也可以透過一些 Crawler 來搜尋以下的結果,但是…. 但是 如果你服務放在 GCP 不能直接爬 Google 網頁 如果你服務放在 GCP 不能直接爬 Google 網頁 如果你服務放在 GCP 不能直接爬 Google 網頁 這個時候,就應該要去思考有沒有其他的方式可以解決。 Google Custom Search JSON API (相關說明網址) Google Custom Search JSON API 提供了免費提供每天 100 個搜尋查詢。如果您需要更多,請在 API 控制台中申請billing功能。額外要求的費用為每 1 千筆查詢 $5 美元,每日最多 1 萬次查詢。 接下來給大家一個範例程式碼,看要如何呼叫 Google Custom Search JSON API def search_with_google_custom_search(keywords, search_api_key, cx, num_results=10): """ 使用 Google Custom Search API 根據關鍵字進行搜尋。 :param keywords: 關鍵字列表 :param search_api_key: Google Custom Search API 的 API 金鑰 :param cx: 搜尋引擎 ID :param num_results: 要返回的搜尋結果數量,預設為 10 :return: 搜尋結果列表,每個結果包含標題、連結和摘要 """ query = " ".join(keywords) # 將關鍵字組合成搜尋查詢 url = f"https://www.googleapis.com/customsearch/v1?key={search_api_key}&cx={cx}&q={query}&num={num_results}" try: logger.info(f"Searching for: {query}") response = requests.get(url) response.raise_for_status() # 如果請求失敗,拋出異常 result_data = response.json() # Check if there are search results if "items" not in result_data: logger.warning(f"No...
繼續閱讀

[Python] 在 LangChain 中將 Gemini 換成使用 Vertex AI

前情提要 前面提供相當多透過 LangChain 來打造一個 LINE Bot 的案例。但是如果希望使用更穩定的後台,並且希望使用更多 AI 相關的功能,那麼 Vertex AI 就是就是一個很好的選擇。接下來會開始逐步介紹整個移植過程並且介紹需要介紹的地方,還有可能會出現的問題。 範例程式碼: https://github.com/kkdai/linebot-gemini-python (透過這個程式碼,可以快速部署到 GCP Cloud Run) 透過 LangChain 與 Gemini 打造 LINE Bot 到 Vertex AI 首先先給各位一個簡單的 LangChain + Gemini 打造 LINE Bot 的範例程式碼: 處理 Webhook 相關程式碼: for event in events: if not isinstance(event, MessageEvent): continue if (event.message.type == "text"): # Process text message using LangChain msg = event.message.text response = generate_text_with_langchain(f'{msg}, reply in zh-TW:') reply_msg = TextSendMessage(text=response) await line_bot_api.reply_message( event.reply_token, reply_msg ) 接下來解釋一下 generate_text_with_langchain 的內容: # Initialize LangChain with Gemini os.environ["GOOGLE_API_KEY"] = gemini_key .... def generate_text_with_langchain(prompt): """ Generate a text completion using LangChain with Gemini model. """ # Create a chat prompt template with system instructions prompt_template = ChatPromptTemplate.from_messages([ SystemMessage( content="You are a helpful assistant that responds in Traditional Chinese (zh-TW)."), HumanMessage(content=prompt) ]) # Format the prompt and call the model formatted_prompt = prompt_template.format_messages() response = text_model.invoke(formatted_prompt) return response.content 這就是部分片段的透過 LangChain 加上 Gemini 來打造 LINE Bot 的程式碼,完成程式碼。...
繼續閱讀

[好書分享] 時勢 - 財經知識型YT「小Lin說」第一本商業金融科普書,讓你一口氣看懂世界經濟大局

時勢- 財經知識型YT「小Lin說」第一本商業金融科普書,讓你一口氣看懂世界經濟大局 作者: 小Lin 出版社:野人 買書推薦網址: Readmoo: 由此去購買。 前言: 這是 2025 年第 1 本讀完的書。其實一直有蠻多書籍在手上閱讀,但是 2024 年底後,開始比較多關於 AI Agent 的程式碼撰寫,反而就更少時間來讀書跟寫心得。 不過「小 LIN 」 一直都是我很關注的財經 YTer ,他用相當淺顯易懂的說明來講解很難懂的財經知識,真的很專業。 當然他出了書籍,就要來彭場一下。 內容摘要: 「小Lin說」是目前最受歡迎的YouTube財經知識頻道之一,   創立3年多,迅速衝破167萬訂閱數,   平均每部「總體經濟」系列影片,都突破100萬次觀看。   小Lin擅長梳理第一手經濟數據與報告,   從中歸納、提煉出令人著迷的故事,   並將龐雜的數字轉化成通俗的經濟史與時事,   把學習經濟學變成令人欲罷不能的知識享受!   在本書中,她將用最精煉的篇幅、最活靈活現的趣味譬喻,   解說日、韓、俄、英、歐盟、希臘、土耳其等大國或地區,錯綜複雜的經濟發展歷程;   以及美、中、德等重量經濟體如何影響上述國家與全球經濟。   帶領讀者一口氣深入世界動盪的核心,   看見金融市場的溫度與博弈! 心得: 這本書的主要內容有: 日本經濟泡沫的產生經過 日本後續的「失落三十年」 日幣匯率暴跌造成的股債雙殺 韓國經濟奇蹟的背後 印度的經濟奇蹟 希臘債務危機 歐盟重返榮耀 這本書透過從日本開始的貨幣經濟的說明,來解釋關於日本脈絡三十年的原因。但是也因為這些原因,才能去解釋了韓國經濟奇蹟與歐盟跟希臘產生的經濟問題。 整本書的節奏比起影片的說明來說比較緩慢,因為許多地方的說明在影片中都會使用圖片來說明。但是在書裡面就可以更清楚的詳細的說明整個前因後果,讓整個經濟推倒的過程更加的清楚。 我個人是相當推薦用書來整理過後梳理整個的經濟問題,反而更容易讓我們這種經濟小白更容易了解。但是反過來,如果喜歡影片節奏的人,可能對於書籍步調會覺得有點緩慢。 也建議大家可以先去看看「小LIN說」的頻道,如果真的有喜歡再來看整本書籍會更讓你喜歡的。
繼續閱讀

[Python/Golang] 解決 Imgur 圖片下載轉址問題

最近的變動造成的問題 近期,Imgur 對其圖片連結進行了技術更新,導致直接訪問 i.imgur.com/{image_id}.jpeg 類型的 URL 時會被重定向到 imgur.com/{image_id} 頁面。這種行為使得在應用程式或網頁中直接顯示或下載圖片變得困難。此外,這種轉址機制也會影響到使用者腳本和瀏覽器擴充套件的正常運作,使得原本能夠阻止轉址的工具可能失效。因此,開發者需要找到新的方法來繞過這個限制。 解決思路 要解決這個問題,我們可以採用以下幾種策略: 設置正確的 HTTP 標頭特別是設定 Referer 標頭,以模擬從 Imgur 頁面訪問圖片。使用合理的 User-Agent 標頭,以避免被視為爬蟲請求。 使用 Imgur 官方 API透過官方 API 可以穩定地取得圖片直連 URL,但需要註冊並取得 Client ID 和 Client Secret。這種方法通常更可靠,但需要額外的手續和速率限制考量。 瀏覽器擴充套件或腳本更新更新 NoImgurRedirect 等擴充套件以適應最新變動,或撰寫自訂腳本來處理轉址問題。 範例程式碼 以下是一段 Python 程式碼示範如何設定正確標頭來下載 Imgur 圖片: python import requests def download_img(image_id): # 構建 URL direct_url = f"https://i.imgur.com/{image_id}.jpeg" referer_url = f"https://imgur.com/{image_id}" # 設置請求頭 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Referer": referer_url } try: response = requests.get(direct_url, headers=headers) response.raise_for_status() if 'image' in response.headers.get('Content-Type', ''): filename = f"{image_id}.jpeg" with open(filename, 'wb') as f: f.write(response.content) print(f"圖片已成功下載:{filename}") else: print("下載失敗:返回內容不是圖片") except requests.RequestException as e: print(f"下載失敗:{e}") # 測試下載(假設 image_id 為「example123」) download_img("example123") 範例程式碼(Golang) 以下是一段 Golang 程式碼示範如何設定正確標頭來下載 Imgur 圖片: go package main import ( "fmt" "io/ioutil" "net/http" ) func downloadImg(imageID string) error { directURL := fmt.Sprintf("https://i.imgur.com/%s.jpeg", imageID) refererURL := fmt.Sprintf("https://imgur.com/%s", imageID) req, err := http.NewRequest("GET", directURL, nil) if err != nil { return err...
繼續閱讀

[生活] 日本旅遊零錢太多? 輕鬆存進 Suica 卡,手機也能用!

(✨ 影片示範看這裡 ✨ https://youtube.com/shorts/ffbuUVK_bsE?si=LopZUGuQ7mEpRDcd) 還在為日本零錢煩惱嗎? ( ̄▽ ̄;) 每次去日本玩,是不是都有一樣的困擾? 🤔 明明有 Suica 卡,卻還是收到一堆零錢! 😫 日本物價高,零錢好難花! (。ŏ_ŏ) 怕麻煩乾脆不拿出來… 結果口袋越來越重,回國前還是剩一堆! 😰 別擔心!有了 Pocket Exchange,輕鬆告別零錢困擾! 😎 Pocket Exchange 是什麼?哪裡找? 🤔 Pocket Exchange 就像個零錢 ATM,可以把你的硬幣通通存進 Suica 卡! 😮 超方便! 👍 我在成田機場第二航廈 61 登機口附近找到一台,就在咖啡廳旁邊! ☕ 其他地點可以參考官網: Pocket Exchange 官方網站 (所有機器地點) 常見問題 🙋‍♀️🙋‍♂️ Q:可以用手機 Suica 嗎? A:當然可以囉! (๑•̀ㅂ•́)و✧ Q:1 元硬幣可以存嗎? A:沒問題! ( • ̀ω•́ )✧ Q:其他硬幣呢? A:大部分都可以,但有些可能不吃喔!建議參考機器上的說明。 😉 找不到 Pocket Exchange 怎麼辦? 😱 別慌!7-11 也有自助結帳機可以讓你清掉零錢! 😉 不過要注意,需要 1000 日圓以上才能存進卡片喔! 😅 如果零錢不夠多,那就… 買個東西花掉吧! ( ´∀`) (小心又會產生新的零錢喔! 🤣) 最後 希望這篇文章對你有幫助! 🥰 下次去日本玩,別再讓零錢成為你的負擔啦! 😄
繼續閱讀

[Playstation Portal] 如何透過 WiFi 路由器設定來讓 Portal 與 PS5 連線更加順暢

前情提要 大家都知道,我大概一年前買入 PS Portal Remote 之後。大概也全破了不少款的遊戲。 但是原來的 TPLink 是 WiFi5 的 Router ,想要趁機換一台 WiFi6 的 Router 之後。但是卻發現讓連線狀況相當的不順,這一篇記錄一下,如何讓你的 PlayStation Portal Remote 可以更順暢的透過 WiFi 連線 Playstation 5 。 參考影片 自從把 TPLink 升級成 ASUS wifi6 router 後,一直無法讓 PS5 跟 Portal 連線順暢 用這招成功恢復速度 獨立 PS5 跟 Portal 用 5G ASUS router 對這兩個優化
繼續閱讀