LangChain實戰(十八):構建ReAct模式的網頁內容摘要與分析Agent

本文是《LangChain實戰課》系列的第十八篇,將深入講解如何構建一個基于ReAct模式的智能網頁內容摘要與分析Agent。這個Agent能夠自主瀏覽網頁、提取關鍵信息、生成智能摘要,并進行深入的內容分析,讓信息獲取和理解變得更加高效。

前言

在信息爆炸的時代,我們每天都需要處理大量的網頁內容。手動閱讀、理解和摘要這些內容既耗時又容易遺漏重要信息。通過結合LangChain的ReAct模式和網絡搜索工具,我們可以構建一個智能Agent,讓它自主地瀏覽網頁、提取信息、生成摘要并進行深度分析,極大地提高信息處理效率。

ReAct模式與網頁分析的核心概念

什么是ReAct模式?

ReAct(Reason + Act)是一種讓LLM能夠自主推理和行動的框架:

  • Reason(推理):LLM分析當前情況,決定需要采取什么行動

  • Act(行動):LLM選擇并執行適當的工具或操作

  • 觀察結果:根據行動結果決定下一步行動

網頁內容分析的挑戰

  1. 內容提取:從復雜的HTML中提取核心內容

  2. 信息過濾:識別和過濾廣告、導航等無關內容

  3. 摘要生成:保持原文關鍵信息的同時進行壓縮

  4. 多頁面處理:處理跨多個頁面的相關內容

  5. 實時性:處理動態更新的網頁內容

環境準備與安裝

首先安裝必要的依賴包:

# 安裝核心庫
pip install langchain openai python-dotenv# 安裝網絡請求和內容提取庫
pip install requests beautifulsoup4 newspaper3k# 安裝搜索引擎工具
pip install google-search-results# 安裝異步處理庫
pip install aiohttp asyncio# 安裝文本處理庫
pip install nltk sumy# 安裝可視化庫(可選)
pip install matplotlib seaborn

設置必要的環境變量:

export OPENAI_API_KEY="your-openai-api-key"
export SERPAPI_API_KEY="your-serpapi-key"  # 用于搜索引擎

構建網頁內容提取工具

1. 基礎網頁內容提取器

import requests
from bs4 import BeautifulSoup
from newspaper import Article
from urllib.parse import urlparse
from langchain.schema import Document
from typing import List, Dict, Any
import reclass WebContentExtractor:def __init__(self):self.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'}def extract_content(self, url: str) -> Dict[str, Any]:"""提取網頁主要內容"""try:# 使用newspaper3k提取文章內容article = Article(url)article.download()article.parse()article.nlp()  # 進行自然語言處理# 使用BeautifulSoup作為備選方案response = requests.get(url, headers=self.headers, timeout=10)soup = BeautifulSoup(response.content, 'html.parser')# 提取元數據metadata = self._extract_metadata(soup, url)# 提取主要內容content = self._extract_main_content(article, soup)return {"url": url,"title": article.title or metadata.get("title", ""),"content": content,"summary": article.summary,"publish_date": article.publish_date or metadata.get("publish_date", ""),"authors": article.authors or metadata.get("authors", []),"keywords": article.keywords,"metadata": metadata,"success": True}except Exception as e:print(f"提取網頁內容失敗: {e}")return {"url": url,"success": False,"error": str(e)}def _extract_metadata(self, soup: BeautifulSoup, url: str) -> Dict[str, Any]:"""提取網頁元數據"""metadata = {}# 提取標題if soup.title:metadata["title"] = soup.title.string# 提取meta描述meta_desc = soup.find("meta", property="og:description") or soup.find("meta", attrs={"name": "description"})if meta_desc and meta_desc.get("content"):metadata["description"] = meta_desc["content"]# 提取發布時間time_tag = soup.find("meta", property="article:published_time") or soup.find("time")if time_tag and time_tag.get("datetime"):metadata["publish_date"] = time_tag["datetime"]# 提取作者信息author_meta = soup.find("meta", property="article:author") or soup.find("meta", attrs={"name": "author"})if author_meta and author_meta.get("content"):metadata["authors"] = [author_meta["content"]]# 提取域名信息parsed_url = urlparse(url)metadata["domain"] = parsed_url.netlocreturn metadatadef _extract_main_content(self, article, soup: BeautifulSoup) -> str:"""提取網頁主要內容"""# 如果newspaper3k成功提取內容,優先使用if article.text and len(article.text.strip()) > 100:return article.text# 備選方案:使用啟發式規則提取主要內容# 移除無關元素for element in soup(["script", "style", "nav", "footer", "aside", "form"]):element.decompose()# 嘗試找到主要內容區域main_content = ""content_selectors = ["article","main","[role='main']",".content",".main-content",".post-content",".entry-content"]for selector in content_selectors:elements = soup.select(selector)if elements:main_content = "\n".join([elem.get_text(separator="\n", strip=True) for elem in elements])if len(main_content) > 200:  # 確保有足夠的內容break# 如果以上方法都失敗,返回整個頁面的文本if not main_content or len(main_content) < 200:main_content = soup.get_text(separator="\n", strip=True)# 清理文本main_content = re.sub(r'\n\s*\n', '\n\n', main_content)  # 移除多余空行return main_contentdef extract_multiple_urls(self, urls: List[str]) -> List[Dict[str, Any]]:"""批量提取多個網頁內容"""results = []for url in urls:result = self.extract_content(url)results.append(result)return results# 使用示例
extractor = WebContentExtractor()
content = extractor.extract_content("https://example.com")
print(f"標題: {content['title']}")
print(f"內容長度: {len(content['content'])} 字符")
print(f"摘要: {content['summary'][:200]}...")

2. 高級內容處理與清洗

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import sent_tokenize, word_tokenize
from collections import Counter
import re# 下載NLTK數據
nltk.download('punkt')
nltk.download('stopwords')class ContentProcessor:def __

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98545.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

debian11 ubuntu24 armbian24 apt install pure-ftpd被動模式的正確配置方法

debian11 ubuntu24 armbian24 apt install pure-ftpd被動模式的正確配置方法 安裝方法請看&#xff1a;https://www.itbulu.com/pure-ftpd.html 疑難問題解決 原本以為配置很簡單的&#xff0c;無非是修改 ForcePassiveIP MinUID PassivePortRange PureDB這幾個配置項就行了…

量化金融|基于算法和模型的預測研究綜述

一、研究背景與發展歷程??1.??量化投資理論演進???奠基階段&#xff08;1950s-1960s&#xff09;??&#xff1a;Markowitz均值方差理論&#xff08;1952&#xff09;、CAPM模型&#xff08;1964&#xff09;奠定現代量化投資基礎?衍生品定價&#xff08;1970s-1980s&…

從零開始的云計算生活——第六十天,志在千里,使用Jenkins部署K8S

一.安裝kubectl1、配置yum源cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/ enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes-new/core/sta…

無人機電壓模塊技術剖析

無人機電源模塊的基本運行方式無人機電壓模塊的核心任務是對動力電源&#xff08;通常是鋰電池&#xff09;進行轉換、調節和分配&#xff0c;為飛控、圖傳、攝像頭、舵機等各個子系統提供穩定可靠的電能。其運行方式可以概括為&#xff1a;電壓轉換與調控&#xff1a;無人機動…

MATLAB基于GM(灰色模型)與LSTM(長短期記憶網絡)的組合預測方法

一、GM與LSTM的基本原理及互補性 1. GM模型的核心特點基本原理&#xff1a;通過累加生成&#xff08;AGO&#xff09;將原始無序序列轉化為具有指數規律的光滑序列&#xff0c;建立一階微分方程&#xff08;如GM(1,1)&#xff09;進行預測。其數學形式為&#xff1a; dx(1)dtax…

【菜狗每日記錄】啟發式算法、傅里葉變換、AC-DTC、Xmeans—20250909

&#x1f431;1、啟發式算法 ① 定義 ② 特點 ③ 案例 &#x1f431;2、快速傅里葉變換FFT ① DFT離散傅里葉變換 ② FFT快速傅里葉變換 &#x1f431;3、AC-DTC聚類 &#x1f431;4、Xmeans &#x1f431;1、啟發式算法 啟發式算法是和最優化算法相對的。 一般而言&am…

Axure移動端選擇器案例:多類型選擇器設計與動態效果實現

在移動端交互設計中&#xff0c;選擇器是用戶輸入的核心組件。Axure移動端高保真元件庫提供了四種關鍵選擇器解決方案&#xff0c;通過動態效果提升操作真實感&#xff1a; 預覽地址&#xff1a;Axure 1. 基礎選擇器 采用底部彈窗設計&#xff0c;支持單選項快速選擇。點擊觸發…

Spring Boot圖片驗證碼功能實現詳解 - 從零開始到完美運行

Spring Boot圖片驗證碼功能實現詳解 - 從零開始到完美運行 &#x1f4d6; 前言 大家好&#xff01;今天我要和大家分享一個非常實用的功能&#xff1a;Spring Boot圖片驗證碼。這個功能可以防止惡意攻擊&#xff0c;比如暴力破解、刷票等。我們實現的是一個帶有加減法運算的圖片…

HarmonyOS實現快遞APP自動識別地址

? 大家好&#xff0c;我是潘Sir&#xff0c;持續分享IT技術&#xff0c;幫你少走彎路。《鴻蒙應用開發從入門到項目實戰》系列文章持續更新中&#xff0c;歡迎關注&#xff01; 隨著鴻蒙&#xff08;HarmonyOS&#xff09;生態發展&#xff0c;越來越多的APP需要進行鴻蒙適…

CUDA編程13 - 測量每個Block的執行時間

一:概述 GPU 程序性能不是靠 CPU 那樣的“順序執行”來衡量的,而是靠線程塊(block)和多處理器(SM)利用率。每個 block 在 GPU 的不同多處理器上執行,順序不確定。傳統的 kernel 總體計時(比如 cudaEvent 計時整個 kernel)只能知道總時間,無法分析哪個 block 慢,為什…

敏捷開發-Scrum(下)

Scrum 核心構成&#xff1a;團隊、事件與工件的協同價值體系 在 Scrum 框架中&#xff0c;“團隊、事件、工件” 并非孤立的模塊&#xff0c;而是相互咬合的有機整體&#xff1a;Scrum 團隊是價值交付的執行核心&#xff0c;Scrum 事件是節奏把控與反饋調整的機制載體&#xff…

LeetCode 單調棧 739. 每日溫度

739. 每日溫度給定一個整數數組 temperatures &#xff0c;表示每天的溫度&#xff0c;返回一個數組 answer &#xff0c;其中 answer[i] 是指對于第 i 天&#xff0c;下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高&#xff0c;請在該位置用 0 來代替。 示例 1: 輸入…

Java-面試八股文-JVM篇

JVM篇 一.在JVM中&#xff0c;什么是程序計數器? 在 JVM&#xff08;Java Virtual Machine&#xff09; 中&#xff0c;程序計數器&#xff08;Program Counter Register&#xff0c;簡稱 PC 寄存器&#xff09; 是一塊較小的內存空間&#xff0c;用于記錄 當前線程所執行的字…

微算法科技(NASDAQ: MLGO)采用量子相位估計(QPE)方法,增強量子神經網絡訓練

隨著量子計算技術的迅猛發展&#xff0c;傳統計算機在處理復雜問題時所遇到的算力瓶頸日益凸顯。量子計算以其獨特的并行計算能力和指數級增長的計算潛力&#xff0c;為解決這些問題提供了新的途徑。微算法科技&#xff08;NASDAQ: MLGO&#xff09;探索量子技術在各種應用場景…

MySQL 備份的方法和最佳實踐

MySQL 是一種流行的開源關系數據庫管理系統&#xff0c;用于在線應用程序和數據倉庫。它以可靠性、有效性和簡單性而聞名。然而&#xff0c;與任何計算機系統一樣&#xff0c;由于硬件故障、軟件缺陷或其他不可預見的情況&#xff0c;存在數據丟失的可能性。因此&#xff0c;保…

應用層自定義協議、序列化和反序列化

1.自定義協議開發者根據特定應用場景的需要&#xff0c;自行設計和制定的通信規則和數據格式 1.1 核心組成部分一個典型的自定義協議通常包含以下幾個關鍵部分&#xff1a;?幀/報文格式 (Frame/Packet Format)??&#xff1a;定義了數據是如何打包的。這通常包括&#xff1a…

Excel VBA 中可用的工作表函數

Visual Basic for Applications (VBA) 中可用的工作表函數。可以在 VBA 中通過 Application.WorksheetFunction 對象調用。 下面我將按照字母分組&#xff0c;對每個函數進行簡要解釋&#xff0c;并給出在 VBA 中使用的示例。A 組Acos: 返回數字的反余弦值。 result Applicati…

OpenWrt + Docker 完整部署方案:CFnat + Cloudflared 一體化集成

AI生成&#xff08;可能是AI幻覺&#xff09; 項目架構概述 基于您現有的網絡配置&#xff08;IP: 192.168.1.1&#xff09;&#xff0c;本方案將CFnat服務作為網絡優化層整合到現有的Cloudflare隧道架構中&#xff0c;實現完整的網絡加速解決方案。 優化后的流量路徑 用戶訪問…

蒼穹外賣項目實戰(day7-1)-緩存菜品和緩存套餐功能-記錄實戰教程、問題的解決方法以及完整代碼

完整資料下載 通過網盤分享的文件&#xff1a;蒼穹外賣 鏈接: https://pan.baidu.com/s/1JJaFOodXOF_lNJSUiZ6qtw?pwdps2t 提取碼: ps2t 目錄 1、緩存菜品 &#xff08;1&#xff09;問題說明 &#xff08;2&#xff09;使用redis緩存部分數據 1-2、代碼完善 &#xff…

計算機畢業設計 基于Python+Django的醫療數據分析系統

精彩專欄推薦訂閱&#xff1a;在 下方專欄&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二…