在这篇故事中,我展示了一个快速教程,教你如何使用“浏览器使用” (Browser-use)、LightRAG 和一个本地大语言模型来创建一个功能强大的聊天机器人,使 AI 代理能够抓取你选择的任何网站。此外,你还能就你感兴趣的数据提出问题,该系统会为你提供相关回答。
现有的 RAG 系统存在显著的局限性,包括对平面数据表示的依赖和缺乏上下文感知,这导致答案支离破碎,无法捕捉复杂的相互依赖关系。
为了解决这些问题,我们提出了 **LightRAG 和 Browser-use **。
Browser-use 是一个开源的网页自动化库,支持与任何语言模型 (LLM) 进行交互。可以使 AI Agent 打开浏览器获取数据,而不是仅仅是通过接口,能够获取到渲染完的浏览器数据。
通过一个简单的接口,用户可以使 LLM 交互网站并执行数据抓取、信息查询等任务。
LightRAG 将图结构整合到文本索引和检索过程中。这种创新框架采用两级检索系统,以增强从低层和高层知识发现中的全面信息检索。
那么,让我通过一个在线聊天机器人的快速演示来展示我的意思。
我想抓取一个网站,所以我问了代理两个问题。我的第一个问题是:“去 Amazon 找到最便宜的、带有 16GB VRAM 和 RTX 3080 或 RTX 4090 的 GPU 笔记本电脑。”
结果非常惊人!浏览器利用了大型语言模型来提取数据,自动定位交互元素。如果你仔细观察,就会看到代理会在找不到元素或 LLM 出现错误时自我纠正。它还使用视觉模型截图并提取信息。
对于第二个问题,我询问代理:“去 google.com 找到关于 ‘监督大语言模型’ 的文章,然后提取所有关于 ‘监督微调’ 的信息。”如果你想了解更多关于微调的信息,我在上一段视频中详细解释了这一点,内容广泛且研究充分。
一旦数据加载完成,我们实现 LightRAG 以允许 LLM 同时处理多个元素,例如实体、关系和描述。它测试 LLM 的理解能力,并且任务拆分可以减少负担,但可能会增加 Token 使用。
模型的源代码提前指定了实体类型,这可能不适合新领域,就像在传统知识图中定义模式的难题一样。
在更高层次上,关键词引导关联信息的回忆,但回忆质量取决于这些关键词。最终,此过程提高了最终答案的质量。
声明:本文仅供教育目的。我们不鼓励任何人抓取网站,尤其是那些可能有条款和条件反对这种行为的网站。
什么是 LightRAG?
LightRAG 是一个快速而高效的信息检索和生成系统,旨在解决传统 RAG 系统的问题。典型的 RAG 系统旨在将 LLM 与外部知识链接,以生成对用户问题的更准确答案。
然而,传统系统受限于平面数据表示,缺乏更多上下文。LightRAG 通过将图结构引入数据索引和搜索,以克服这些局限性并提供高效的上下文信息。
LightRAG 如何工作
LightRAG 首先在信息检索过程中对外部数据库中的实体及其关系应用基于图的数据结构进行预处理。
整个过程包括多个步骤:
- 实体和关系的提取
- 检索键值对的生成
- 信息去重
通过这些步骤,LightRAG 不仅提取具有特定语义的实体,还深入理解抽象概念,使系统在面对复杂问题时能够更精准地进行信息检索和生成。
例如
基于图的文本索引
LightRAG 从文档中提取实体(如人物、地点、概念等)及其之间的关系,构建一个知识图谱。
例如,从句子“Andrew Yan 正在谷歌大脑团队研究人工智能”中,我们提取以下信息:
- 实体:Andrew Yan(人)、谷歌大脑团队(组织)、人工智能(概念)
- 关系:Andrew Yan - 研究 - 人工智能,Andrew Yan - 隶属 - 谷歌大脑团队
这样创建的知识图谱能够有效地表示复杂的信息关系。图 1 的左侧对应于这一过程。
两阶段搜索范式
LightRAG 的搜索分为低级和高级两阶段,位于图 1 中部分中心。
-
低级搜索:寻找具体的实体或关系, 如特定名称或概念,如“Andrew Yan”或“谷歌大脑团队”。
-
高级搜索:寻找更抽象的主题或主旨, 如“谷歌的人工智能前沿研究”的一个广泛主题。
这种两层次的方法允许全面的信息检索,它既能捕捉具体事实,又能获取全局视角。
LightRAG 对比 GraphRAG
LightRAG在效率、检索和处理复杂查询方面优于 GraphRAG。它使用双层检索系统,通过一次 API 调用将 Token 使用减少到 100 个以下,而 GraphRAG 则需要使用 610,000 个 Token 和多个调用。
LightRAG 提供更为多样化的回答,能够有效地捕捉具体和广泛的主题,并在复杂查询中表现出色,而 GraphRAG 灵活性较差,成本较高。LightRAG 更高效、灵活,适合动态数据环境。
什么是 Browser-use?
Browser-use 是一个开源的网页自动化库,允许大语言模型(LLMs)执行诸如查询航班、搜索信息、概括热门文章等任务。
它能够自动检测可点击的元素,处理 cookie 提示和弹出窗口,并允许在多个标签页之间切换。它还可以填写表单、提取网页信息、截屏并读取图像内容。
该工具通过分析当前页面内容来做出智能决策——是点击、输入文本还是翻页。此外,它具备记忆能力,能够回忆起以前访问过的页面和收集的信息。它支持与 LangChain 兼容的模型,包括 GPT-4、Claude 3.5 和 LLama。
开始编码吧
在深入探索我们的应用程序之前,我们需要为代码创建一个理想的环境。为此,我们需要安装必要的 Python 库。首先,我们将通过 pip 安装来支持模型的库。因为演示使用的是 OpenAI 的大模型,你首先需要设置 OpenAI API Key。
pip install -r requirements.txt
安装完后,我们导入 browser_use、langchain_openai 和 lightrag。
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 来管理和维持多个代理之间的浏览器状态。这样做能让代理共享同一个浏览会话,保持 Cookies、会话信息和标签页的一致性。
# 在代理之间维持浏览器状态
controller = Controller()
初始化代理以在谷歌中查找并提取关于“LoRA LLM”的信息。然后,我们使用 chatOpenai 模型来处理和分析内容,该模型与 controller
连接以保持浏览器状态。
# 初始化浏览器代理
agent = Agent(
task="前往 google.com 查找关于 Lora llm 的文章并提取所有关于 Lora 的信息",
llm=ChatOpenAI(model="gpt-4o", timeout=25, stop=None),
controller=controller)
我们还可以初始化另一个代理,但是是否需要这样做取决于你想在代码中包含多少代理。它们可以执行不同的任务,但你需要为每个代理管理不同的任务。
agent = Agent(
task="前往 google.com 查找关于 Supervised llm 的文章并提取所有关于监督微调的信息",
llm=ChatOpenAI(model="gpt-4o", timeout=25, stop=None),
controller=controller)
```现在,我们定义了一个异步函数,用于并行执行任务。这里把代理的最大步数限制设为20,不过你可以随意设定其他数值。在每一步,代理都会执行一个动作,这个动作代表代理接下来要做什么,而结果则包含了该步骤的输出信息,包括任务是否已完成以及是否有数据提取。如果任务完成,提取的内容会被保存到名为`text.txt`的文件中,然后进程终止。
```python
async def main():
max_steps = 20
# 逐步运行代理
for i in range(max_steps):
print(f'\n📍 第 {i+1} 步')
action, result = await agent1.step()
print('动作:', action)
print('结果:', 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
asyncio.run(main())
现在我们定义工作目录,并检查当前工作目录中是否存在名为dickens
的目录。如果不存在,程序会创建它。这保证了目录可用来存储文件或其他资源。
WORKING_DIR = "./dickens"
if not os.path.exists(WORKING_DIR):
os.mkdir(WORKING_DIR)
最基本的一步是配置 LightRAG 实例并设置必要的参数。我们初始化了一个工作目录(./dickens)并使用了轻量级的 GPT-4o 模型(gpt_4o_mini_complete)作为默认的大语言模型。这一设置对于增强检索的任务是高效的,如果需要,可以灵活使用更强大的模型(gpt_4o_complete)。
rag = LightRAG(
working_dir=WORKING_DIR,
llm_model_func=gpt_4o_mini_complete # 使用 gpt_4o_mini_complete 大语言模型
# llm_model_func=gpt_4o_complete # 可选择使用更强大的模型
)
我们从指定路径读取 text.txt
的内容,并使用 rag.insert()
插入到 RAG 系统中。
with open("C:/Users/mrtar/Desktop/lightrag/text.txt") as f:
rag.insert(f.read())
我们为查询 "What is Supervised Fine-Tuning" 在 RAG 系统中执行了简单搜索。在简单搜索模式中,系统会查找直接包含查询中关键词的文档或条目,而不会考虑这些术语周围的任何关系或背景。这对于不需要复杂推理的简单查询是很有用的。结果会纯粹基于关键词匹配返回。
# 执行简单搜索
print(rag.query("what is Supervised Fine-Tuning", param=QueryParam(mode="naive")))
我们还为查询 "What is Supervised Fine-Tuning?" 执行了本地搜索。在本地搜索模式中,系统检索有关查询及其直接邻居的信息。它会提供额外的背景,重点关注与 "Supervised Fine-Tuning" 直接相关的紧密关系。搜索比简单搜索更详细,当你需要更多关于直连或关系的上下文时,它很有价值。
# 执行本地搜索
print(rag.query("what is Supervised Fine-Tuning", param=QueryParam(mode="local")))
接下来,我们使用全局搜索查询 "What is Supervised Fine-Tuning"。在全局搜索模式下,系统会考虑整个知识图谱,在更广泛的范围内查看直接和间接的关系。它会检查与 "Supervised Fine-Tuning" 相关的所有可能连接,而不仅仅是最近的那些。它提供了全面的概述,非常适合需要广泛背景或全球关系视角的查询。
# 执行全局搜索
print(rag.query("what is Supervised Fine-Tuning", param=QueryParam(mode="global")))
最后,我们为查询 "What is Supervised Fine-Tuning" 进行了混合搜索。混合搜索模式结合了本地和全局搜索的优势。它在直接关系(如本地搜索)基础上检索信息,同时也考虑间接或全球的关系(如全局搜索)。它提供了一个平衡且全面的上下文,适用于大多数场景,尤其是当理解整体和特定背景非常重要时。
# 执行混合搜索
print(rag.query("what is Supervised Fine-Tuning", param=QueryParam(mode="hybrid")))
结论:
在技术进步之上,LightRAG 和 Browser-Use 有可能从根本上改变我们与信息互动的方式。它们提供更准确和全面的搜索能力,能够对复杂问题给出精确答案,响应永远反映最新知识。
如果这些目标得以实现,它们可能会颠覆如教育、研究和商业等领域。LightRAG 和 Browser-Use 代表着开创性的技术,将开启下一代信息搜索和生成的时代。我非常期待未来的发展!