用Browser-Use+LightRAG打造智能体:轻松抓取任何网站
2025年5月12日
这篇文章将带你快速上手如何使用 Browser-Use、LightRAG 以及本地大模型搭建一个功能强大的 AI 智能体,它可以访问并抓取任何你指定的网站数据,并基于这些数据回答你的问题!
⚠️免责声明:本文仅用于教学目的,我们不鼓励任何人抓取网站,尤其是违反相关条款的网站。
目前主流的 RAG(检索增强生成)系统存在很多局限,比如依赖平面化数据结构、缺乏上下文理解能力,导致回答片段化、无法处理复杂的知识关系。
为了解决这些问题,我们引入了 LightRAG 和 Browser-Use。
Browser-Use 是一个开源的网页自动化库,支持与任何大语言模型(LLM)交互。
通过一个简单的接口,你就能让 LLM 与网页互动,完成如网页抓取、信息查询等任务。
LightRAG 则将图结构引入文本索引与检索过程,通过双层检索系统,在低阶和高阶知识间实现更全面的信息获取。
例子
下面,我将用一个简单的 Demo 带你了解这个智能体的强大之处。
我先让这个 Agent 去抓取一个网站,并问了两个问题:
第一个问题是:“请访问亚马逊,找到一台配有 16GB 显存和 RTX 3080 或 RTX 4090 显卡的最便宜笔记本。”
结果令人惊艳!该智能体使用大模型识别网页结构并自动定位可交互元素。注意看,它还能在找不到元素或模型出错时自动纠正。此外,它还结合视觉模型,截屏并提取页面信息。
第二个问题是:“访问 google.com,搜索关于监督式大模型(Supervised LLM)的文章,并提取有关 Supervised Fine-Tuning 的所有内容。”如果你对微调感兴趣,可以看我上一支视频,讲得非常详细。
当数据加载完成后,我们用 LightRAG 让 LLM 同时处理多个要素 —— 实体、关系、描述等。虽然任务拆分可以减轻模型负担,但也可能增加 token 使用。
不过,模型源码中需预定义实体类型,这在新领域中可能通用性较差,类似于传统知识图谱中需要先定义 schema 的挑战。
在高层面上,系统会用关键词来召回相关信息,但最终召回效果仍依赖关键词选择。整体流程将显著提升最终回答质量。
什么是 LightRAG?
LightRAG 是一个快速高效的信息检索与生成系统,旨在解决传统 RAG 系统的痛点。RAG 系统的本质是将 LLM 与外部知识连接,以生成更准确的回答。
但传统 RAG 系统往往使用平面化的数据结构,缺乏上下文,LightRAG 通过引入图结构到数据索引与检索中,实现更高效、更具语境感的信息获取。
LightRAG 如何运作
LightRAG 在检索阶段预处理外部数据库中的实体及其关系,构建图状数据结构。
其流程主要包括:
- 实体与关系提取
- 构建检索键值对
- 重复信息去重
这些步骤不仅提取语义明确的实体,还加强了对抽象概念的理解,使系统面对复杂问题时能实现更准确的信息检索与生成。
比如下面这个例子:
图结构文本索引
LightRAG 会从文档中提取人物、地点、概念等实体,以及它们之间的关系,构建知识图谱。
比如从这句话中:“Andrew Yan 正在 Google Brain 团队研究人工智能”,我们能提取出:
-
实体:Andrew Yan(人物)、Google Brain 团队(组织)、人工智能(概念)
-
关系:
- Andrew Yan — 研究 — 人工智能
- Andrew Yan — 隶属 — Google Brain 团队
这就是图谱化过程,对应图中左侧部分。
双阶段检索范式
LightRAG 的检索过程包括两个阶段,对应图中中间部分:
- 低阶检索:定位具体实体或关系,比如“Andrew Yan”或“Google Brain 团队”
- 高阶检索:挖掘抽象主题,比如“Google 在 AI 研究中的前沿探索”
这种双层检索方式能同时把握细节与全局。
LightRAG vs GraphRAG
LightRAG 在效率、检索能力与复杂查询处理上远胜 GraphRAG。
它采用双层检索机制,一次 API 调用就能将 token 使用控制在 100 以内;而 GraphRAG 平均调用 61 万 token,且需多次请求。
LightRAG 更灵活、更高效、响应更丰富,适用于动态数据场景;而 GraphRAG 在复杂语境适应性和成本控制方面表现较差。
什么是 Browser-Use?
Browser-Use 是一个开源网页自动化工具,允许大语言模型完成如下任务:
- 查询航班
- 搜索信息
- 总结热门帖子……
它具备智能识别网页按钮、自动处理 Cookie 弹窗、支持多标签页切换等能力。还能填写表单、提取网页内容、截图、识别图像等。
这个工具具备“页面理解”能力:它能根据当前页面内容自动判断下一步操作(点击、输入、翻页等)。同时还具备“记忆”能力,可以记住浏览过的页面及提取的信息。
它支持与 LangChain 兼容的模型,如 GPT-4、Claude 3.5 和 LLama 等。
上代码
在正式构建应用之前,我们需要先搭建一个理想的开发环境,安装所有所需的 Python 库。首先,先通过如下命令安装支持模型运行所需的依赖项:
pip install -r requirements.txt
由于本示例使用的是 OpenAI 的大型模型,因此你需要先设置好 OpenAI API Key。
接着,我们导入核心模块:
from browser_use import Agent, Controller
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
import os
from lightrag.lightrag import LightRAG, QueryParam
from lightrag.llm import gpt_4o_mini_complete
然后,我们使用 Controller
来管理多个代理(Agent)之间的浏览器状态共享,使它们可以在同一个浏览会话中运行,共享 Cookie、Session 和标签页状态:
# 跨多个 Agent 保持浏览器状态一致
controller = Controller()
接下来,我们初始化一个代理(Agent),该代理的任务是在 Google 上搜索 “LoRA LLM”,并提取与 LoRA 相关的所有内容。我们使用 ChatOpenAI
模型处理网页内容,并与 controller
绑定以维护一致的浏览器状态:
# 初始化浏览器 Agent
agent1 = Agent(
task="Go to google.com and find the article about Lora llm and extract everything about Lora",
llm=ChatOpenAI(model="gpt-4o", timeout=25, stop=None),
controller=controller)
你也可以按需添加更多代理执行不同任务,例如:
agent2 = Agent(
task="Go to google.com and find the article Supervised llm and extract everything about Supervised Fine-Tuning",
llm=ChatOpenAI(model="gpt-4o", timeout=25, stop=None),
controller=controller)
接下来定义一个异步函数,用于以并发方式运行代理。我们设置最大步数为 20,你也可以根据需要自由修改。每一步,Agent 都会执行一次操作,并返回当前步骤的动作描述和结果内容。如果任务完成,程序会将提取的文本保存到本地文件 text.txt
中:
async def main():
max_steps = 20
# 逐步运行 Agent
for i in range(max_steps):
print(f'\n📍 第 {i+1} 步')
action, result = await agent1.step()
print('Action:', action)
print('Result:', result)
if result.done:
print('\n✅ 任务已成功完成!')
print('提取内容:', result.extracted_content)
# 将提取内容保存为文本文件
with open('text.txt', 'w') as file:
file.write(result.extracted_content)
print("内容已保存至 text.txt")
break
import asyncio
asyncio.run(main())
现在,我们定义一个工作目录 ./dickens
,如果该目录不存在,则创建一个新目录,用于后续存储处理结果:
WORKING_DIR = "./dickens"
if not os.path.exists(WORKING_DIR):
os.mkdir(WORKING_DIR)
接下来,我们配置 LightRAG
实例。这里指定了工作目录为 ./dickens
,并选用轻量级模型 gpt_4o_mini_complete
,适用于高效的检索增强任务。如果你需要更强的处理能力,也可以替换为更大的模型 gpt_4o_complete
:
rag = LightRAG(
working_dir=WORKING_DIR,
llm_model_func=gpt_4o_mini_complete # 可替换为 gpt_4o_complete
)
然后我们从指定路径读取 text.txt
文件中的内容,并将其插入到 LightRAG 系统中,作为知识库的一部分:
with open("C:/Users/mrtar/Desktop/lightrag/text.txt") as f:
rag.insert(f.read())
接下来,我们用不同的模式对「What is Supervised Fine-Tuning」这一问题进行查询,探索 LightRAG 支持的多种查询能力:
1. 朴素(Naive)检索
基于关键词的简单匹配,不考虑语义或上下文,用于直接查找文本中是否包含关键词:
print(rag.query("what is Supervised Fine-Tuning", param=QueryParam(mode="naive")))
2. 局部(Local)检索
会返回与查询直接相关的信息节点及其邻居,提供更多上下文信息,适用于理解相关关系:
print(rag.query("what is Supervised Fine-Tuning", param=QueryParam(mode="local")))
3. 全局(Global)检索
系统将在整个知识图谱中查找所有与查询有关的直接和间接关系,提供更全面的全景式信息:
print(rag.query("what is Supervised Fine-Tuning", param=QueryParam(mode="global")))
4. 混合(Hybrid)检索
结合 Local 和 Global 两种模式,既关注直接关系,也兼顾整体语义关联,是一种更平衡的查询方式:
print(rag.query("what is Supervised Fine-Tuning", param=QueryParam(mode="hybrid")))
总结
LightRAG 和 Browser-Use 不只是技术突破,更是未来人机交互方式的革新。它们让搜索更精准、回答更全面、结果始终紧贴最新信息。
如果它们的潜力得以发挥,将彻底改变教育、研究和商业领域的知识获取方式。LightRAG 与 Browser-Use 正是通往下一代信息检索与生成的大门。
我对它们的发展前景充满期待!