高级教程:从互联网上获取相关信息#

网络检索器 WebRetriever 是一类特殊的检索器,这种检索器可以从互联网上获取信息。具体来说,可以是利用搜索引擎(如谷歌、必应等)来检索网页并读取相关信息,也可以是通过点击、跳转等操作自动浏览网页并获取相关信息。由于可以访问互联网,网络检索器在时效性和检索信息的广度上具有显著的优势,这使得网络检索器非常适合用于构建您的个人助手。

在本教程中,我们奖项您展示如何在您的项目中加载或构建网络检索器。

重要

由于使用计算机程序从互联网上获取信息有可能违反部分地区法律,或部分网站使用了反爬虫技术来阻止您的访问,请您确保您在使用网络检索器时的合法性。

使用 FlexRAG 内置的网络检索器#

使用网络检索器最简单的方式就是直接使用 FlexRAG 中内置的网络检索器。FlexRAG 中内置了以下两种网络检索器:

  • 简单网络检索器 SimpleWebRetriever :该检索器通过互联网搜索引擎来获取相关信息,并通过网页读取器 WebReader 来将 HTML 内容转化为对大模型友好的内容。

  • 维基百科检索器 WikipediaRetriever :该检索器直接通过维基百科检索相应的实体,该检索器是从 ReACT 项目中获取的灵感。

在这篇教程中,我们将会向您展示如何使用 SimpleWebRetriever 来从互联网上获取信息。

使用搜索引擎获取最相关片段#

大多数搜索引擎都会在搜索结果中提供一个文本片段,该片段通常是网页中的一小段和用户查询最相关的文本。在很多情况下,这个片段中包含了回答用户问题所需的信息。在 FlexRAG 中,您可以使用下面的代码来载入一个网络检索器,该检索器将会为您的查询搜索5个最相关的网页,同时返回相应的片段。

from flexrag.retriever import SimpleWebRetriever, SimpleWebRetrieverConfig

config = SimpleWebRetrieverConfig(
    top_k=5,  # Retrieve top 5 webpages
    search_engine_type="ddg",  # Use DuckDuckGo as the search engine
    web_reader_type="snippet",  # Return the snippet provided by the search engine
)
retriever = SimpleWebRetriever(config)
ctxs = retriever.search("Who is Bruce Wayne?")[0]

在上面的代码中,我们使用了 DuckDuckGo 搜索引擎,FlexRAG 中也提供了其它搜索引擎的接口,您可以查看 SearchEngineConfig 获取更多详细信息。

获取完整网页信息#

很多时候,仅使用搜索引擎提供的片段并不足以获取充足的信息。这种情况下,您也许会希望从完整的网页中获取信息。然而网页通常由 HTML 写成,其中包含了大量的样式标签和无关信息,直接将这样的网页送入大模型让其阅读可能会引入大量噪声,同时提高大模型推理成本。为了解决这一问题,FlexRAG 引入了网页读取器 WebReader 这一模块来将复杂的网页转换为大模型友好的内容。下面的例子向您展示了如何使用网页读取器来获取完整的网页信息:

from flexrag.retriever import SimpleWebRetriever, SimpleWebRetrieverConfig
from flexrag.retriever.web_retrievers import JinaReaderConfig

config = SimpleWebRetrieverConfig(
    top_k=5,  # Retrieve top 5 webpages
    search_engine_type="ddg",  # Use DuckDuckGo as the search engine
    web_reader_type="jina_reader",  # Extract all information from the HTML webpage
    jina_reader_config=JinaReaderConfig(
        api_key="<your-jina-api-key>",  # Jina API key
    )
)
retriever = SimpleWebRetriever(config)
ctxs = retriever.search("Who is Bruce Wayne?")[0]

在这段代码中,我们使用了 JinaReader 作为我们的网页读取器,这是一个由 Jina AI 公司提供的 API 服务,该服务可以帮助您将 HTML 页面转换为大模型友好的文本。您可以从 Jina AI 官网中获取您的 API 密钥。

FlexRAG 也提供了其它类型的网页读取器,比如获取网页截图的 ScreenshotWebReader 和使用本地模型的 JinaReaderLM。您可以访问 WebReaderConfig 文档以获取更多有关网页读取器的信息。

获取网页截图#

由于现在的视觉大模型(VLM)在处理图像信息方面取得了长足进步,即使是网页截图这样复杂的图片也可以被妥善处理。因此 FlexRAG 也提供给了一个独特的网页读取器用于将网页转换为截图。下面的代码将向您展示如何使用 ScreenshotWebReaderDuckDuckGo 检索到的网页转换为截图。

from flexrag.retriever import SimpleWebRetriever, SimpleWebRetrieverConfig
from flexrag.retriever.web_retrievers import JinaReaderConfig

config = SimpleWebRetrieverConfig(
    top_k=5,  # Retrieve top 5 webpages
    search_engine_type="ddg",  # Use DuckDuckGo as the search engine
    web_reader_type="screenshot",  # Capture the screenshot of the webpage
)
retriever = SimpleWebRetriever(config)
ctxs = retriever.search("Who is Bruce Wayne?")[0]

在运行了上述代码后,您将会获取到和您的查询最相关的五个网页的网页截图,该截图将以 PIL.Image.Image 的形式保存在 RetrievedContext 中。

备注

网页截图这一功能需要安装 playwright。请确保您在使用该功能前安装了 playwright

定义您自己的网络检索器#

如果您希望构建您自己的网络检索器,您可以继承 WebRetriever 这个类,并实现其中的 search 方法。当然,您也可以借助 FlexRAG 中提供的大量网络访问的工具来定义您的网络检索器。

FlexRAG 中的网络检索工具#

FlexRAG 提供了大量工具来帮助您构建您的网络检索器:

  • 互联网资源搜索器 WebSeeker:一个用于根据查询来寻找相关网络资源的模块。

  • 网页读取器 WebReader:一个用于从原始网页中提取有效信息的模块。

  • 网络下载器 WebDownloader:一个用于下载网络资源的模块。

检索器

您可以访问Web SeekerWeb Reader、以及 Web Downloader 的文档以获取更多相关信息。