搜尋結果

×

使用 LangChain 和 Ollama 開發 Bing 網頁搜尋與摘要整理系統:使 LLM 可以整理新聞資訊

帶你一步步建立一個簡單的搜尋與摘要系統,結合 Bing API 與 Ollama LLM,實現從網路取得資訊並進行摘要的功能。

在這篇教學中,崴寶Weibert將帶你一步步建立一個簡單的搜尋與摘要系統,結合 Bing API 與 Ollama LLM,實現從網路取得資訊並進行摘要的功能。

需要文件下載

本文是使用到裡面的langchain_bing_news_api.py檔案。

成果展示

標題: 12強賽/台灣棒球世界冠軍!28位球員一路創造歷史 劇本太不真 …
連結: https://www.nownews.com/news/6591945
摘要: 2 天前 · 睽違32年,台灣棒球國家隊殺進一級國際賽事(奧運、經典賽、12強)冠軍賽,雖然最終0比4不敵日本,但也追平1992年巴塞隆納奧運銀牌的隊史最佳 ...

標題: 首座世界冠軍!中華隊寫台灣棒球新篇章 總獎金逾3.1億元
連結: https://tw.sports.yahoo.com/news/%E9%A6%96%E5%BA%A7%E4%B8%96%E7%95%8C%E5%86%A0%E8%BB%8D-%E4%B8%AD%E8%8F%AF%E9%9A%8A%E5%AF%AB%E5%8F%B0%E7%81%A3%E6%A3%92%E7%90%83%E6%96%B0%E7%AF%87%E7%AB%A0-%E7%B8%BD%E7%8D%8E%E9%87%91%E9%80%BE3-1%E5%84%84%E5%85%83-135943815.html
摘要: 2 天前 · 台灣奪冠!球迷激動落淚高喊:我們的驕傲 中華隊拿下世界12強棒球賽冠軍!台灣各地球迷踏出家門,與大家齊聚一堂,為遠赴東京巨蛋征戰的英雄們應援,口號從不間斷,看到奪冠當下更是激動流下淚水,中華隊4:0完封日本,讓台灣各地球迷嗨翻天。

標題: 台灣大賽 - 維基百科,自由的百科全書
連結: https://zh.wikipedia.org/zh-tw/%E5%8F%B0%E7%81%A3%E5%A4%A7%E8%B3%BD
摘要: 台灣大賽(Taiwan Series)即中華職棒的總冠軍賽,1990年開始舉行,當年稱為中華大賽,但隔年即不再使用,2003年中華職棒與台灣大聯盟合併,在年度總冠軍賽開打之前,中華職棒認為隨著台灣職棒在國際能見度漸高,有必要和其他國家一樣取一個響亮且能 []

標題: 台灣棒球史上首座世界冠軍!4:0完封日本斷27連勝神話 - Yahoo …
連結: https://tw.news.yahoo.com/%E5%8F%B0%E7%81%A3%E6%A3%92%E7%90%83%E5%8F%B2%E4%B8%8A%E9%A6%96%E5%BA%A7%E4%B8%96%E7%95%8C%E5%86%A0%E8%BB%8D-4-0%E5%AE%8C%E5%B0%81%E6%97%A5%E6%9C%AC%E6%96%B727%E9%80%A3%E5%8B%9D%E7%A5%9E%E8%A9%B1-130339161.html
摘要: 2 天前 · 世界12強棒球賽最終冠軍戰開戰,本屆賽會第3度上演「台日大戰」,台灣隊由林昱珉把關對抗戶鄉翔征,台灣隊長陳傑憲重返打線,前4局雙方形成 ...

標題: 「要看台灣拿世界冠軍」!彭政閔11年前願望成真了...球迷全看哭 …
連結: https://www.ettoday.net/news/20241125/2861406.htm
摘要: 1 天前 · 2024世界棒球12強冠軍戰昨(24日)晚完美落幕,中華隊以4:0的分數完封強敵日本,也是台灣首次在國際成棒3大賽的首座冠軍、最佳成績。賽前有 ...

正在進行摘要...
* 台灣棒球國家隊在2024年12強賽奪得冠軍,追平1992年巴塞隆納奧運銀牌的隊史最佳成績。
* 中華隊在世界12強棒球賽最終冠軍戰中,以4:0完封日本,拿下台灣棒球史上首座世界冠軍,也是國際成棒三大賽(奧運、經典賽、12強)的首次奪冠。
* 這場比賽讓台灣各地球迷嗨翻天,激動落淚高喊「我們的驕傲」,中華隊寫下台灣棒球新篇章。

環境準備

在開始之前,請確保你的環境已安裝以下模組:

  • requests:用來與 Bing API 互動。
  • langchain:處理 LLM 及嵌入式功能。
  • beautifulsoup4:我們將其替換為 Bing API,但可以保留作為 HTML 資料解析的參考。

安裝模組

如果尚未安裝,可以用以下指令安裝:

pip install requests beautifulsoup4 langchain

第一步:初始化 Ollama 模型與嵌入工具

我們需要導入 Ollama LLM 並初始化它的模型。

from langchain_community.llms import Ollama
from langchain_community.embeddings import OllamaEmbeddings
from langchain_core.prompts import PromptTemplate
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

# 初始化 Ollama LLM
llm = Ollama(
    model="kenneth85/llama-3-taiwan:8b-instruct", 
    callback_manager=CallbackManager([StreamingStdOutCallbackHandler()])
)

# 初始化 Ollama Embeddings
embeddings = OllamaEmbeddings(model="kenneth85/llama-3-taiwan:8b-instruct")

這段程式碼負責載入我們的 LLM 模型,後續會用來生成摘要。

第二步:用 Bing API 搜尋

我們用 Microsoft 的 Bing Search API

設定 Bing API

你需要申請一個 Bing API 金鑰,可參考 Bing Search API 文件

import requests

# 定義搜尋工具
def simple_search(query, api_key):
    """
    使用 Bing API 搜尋關鍵字並返回結果。
    """
    global search_results
    try:
        endpoint = "https://api.bing.microsoft.com/v7.0/search"
        headers = {"Ocp-Apim-Subscription-Key": api_key}
        params = {"q": query, "count": 5}
        
        response = requests.get(endpoint, headers=headers, params=params, timeout=10)
        response.raise_for_status()
        data = response.json()
        
        # 解析結果
        results = []
        for item in data.get("webPages", {}).get("value", []):
            result = {
                "title": item.get("name"),
                "link": item.get("url"),
                "snippet": item.get("snippet", "無摘要")
            }
            results.append(result)
        
        # 格式化結果
        search_results = "\n\n".join(
            f"標題: {res['title']}\n連結: {res['link']}\n摘要: {res['snippet']}"
            for res in results
        )
        return search_results
    except Exception as e:
        search_results = f"發生錯誤:{e}"
        return search_results

使用 API 搜尋

只需將 API 金鑰傳入 simple_search 函數,就能取得搜尋結果。

第三步:摘要搜尋結果

接下來,我們對搜尋結果進行摘要。利用 LangChainPromptTemplate,可以根據提示詞讓 LLM 自動提取重點。

def summarize_content():
    """
    對搜尋結果進行摘要。
    """
    global search_results
    if not search_results.strip():
        return "無內容可進行摘要。"

    # 使用提示模板來改進摘要指令
    prompt_template = PromptTemplate(
        input_variables=["content"],
        template="請對以下內容進行重點摘要,今年是2024年:\n\n{content}"
    )
    prompt = prompt_template.format(content=search_results)

    # 使用 LLM 進行摘要
    response = llm.invoke(prompt)
    return response.strip()

第四步:主程式

最後將所有功能整合成一個完整的流程,使用者可以直接輸入問題並獲取摘要。

if __name__ == "__main__":
    try:
        # 輸入 Bing API 金鑰
        BING_API_KEY = "你的 Bing API 金鑰"
        
        # 獲取使用者輸入
        user_query = input("請輸入您的問題(可用中文):")
        
        # 執行搜尋
        print("\n正在執行搜尋...")
        simple_search(user_query, BING_API_KEY)
        print("\n搜尋結果:")
        print(search_results)
        
        # 進行摘要
        print("\n正在進行摘要...")
        summary = summarize_content()
        print("\n摘要結果:")
        print(summary)
    except Exception as e:
        print(f"執行時發生錯誤:{e}")

崴寶結論

這篇文章帶你完成了一個整合 Bing Search APIOllama LLM 的搜尋與摘要工具。透過簡單的程式架構,我們學習到如何:

  1. 使用 Bing API 有效地取得網路搜尋結果
  2. 結合 LLM 模型處理資料,生成具有高效實用性的摘要。
  3. 將整個流程串接起來,建立一個直觀的使用者互動介面。

延伸應用

在此基礎上,你可以:

  • 加入文字分割工具來處理更大篇幅的資料。
  • 生成嵌入以進行相似性搜索

教學文章之後會貼在這裡!敬請期待! 🎉

    喜歡 好崴寶 Weibert Weiberson 的文章嗎?在這裡留下你的評論!本留言區支援 Markdown 語法