用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 正是通往下一代信息检索与生成的大门。

我对它们的发展前景充满期待!