在 Amazon Bedrock 的知识库中部署网络爬虫

发布时间:2024 年 7 月 30 日
Olawale Olaleye
亚马逊云科技使用经验
300 - 高级
完成所需时间
30 分钟
上次更新时间
2024 年 7 月 30 日
相关产品

Amazon Bedrock 是一项全托管服务,只需一个 API ,即可调用 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 和 Amazon 等业界领先的人工智能 (AI) 公司推出的高性能基础模型 (FM),并构建兼具安全性和隐私性的负责任的生成式 AI 应用程序所需的各种能力。

简介

借助 Amazon Bedrock,可针对不同的用例尝试和评估顶级基础模型,也可通过检索增强生成 (RAG) 等技术利用您的企业数据自定义私有化基础模型,并基于您的企业系统和数据资源构建任务代理。借助 Knowledge Bases for Amazon Bedrock,您可以将数据源聚合到单个信息库中,从而轻松构建采用 RAG 技术的应用程序。

对于大部分 AI 应用程序而言,想要得到准确且相关的数据,就必须从各个网站获取最新的详尽信息。因此,不少客户希望借助 Knowledge Bases for Amazon Bedrock 扩展爬取和索引公共网站的功能。想要实现这一点,我们可以将网络爬虫集成到知识库中,以高效获取并利用这些网站上的数据。在本文中,我们将向您介绍如何无缝实现该功能。

用于知识库的网络爬虫

借助知识库中的网络爬虫数据源,您可以利用 AWS Management Console 或 API 基于爬取的网站数据为终端用户创建生成式 AI 网络应用程序。网络连接器提供以下默认爬取操作:获取所提供的种子 URL,遍历同一顶级域名 (TDP) 下与具有相同或更深 URL 路径的子链接。

目前需要考虑以下问题:网络爬虫只能爬取无需身份验证的 URL,URL 的主机字段不可以是 IP 地址,必须以 http:// 或 https:// 开头。此外,网络连接器会获取爬取页面中引用的非 HTML 文件,比如 PDF、文本文件、markdown 和 CSV 文件(除非这些文件明确排除在外),而不会考虑这些网页的 URL。在提供多个种子 URL 的情况下,网络连接器会爬取所有符合种子 URL 的 TPD 和路径的 URL。但最多只能提供 10 个源 URL,以供知识库作为爬取的起点。

默认情况下,网络连接器不会遍历不同域名下的网页,但由于其默认行为可以获取受支持的非 HTML 文件,因此爬取过程始终会在指定的范围内进行,并且爬取的信息会始终有所侧重且与目标数据源相关。

了解同步范围

在构建提供网页爬取功能的知识库时,可选择不同的同步类型来控制需要爬取的网页。下表展示了在不同同步范围内,根据给定源 URL 所爬取的路径示例(以 https://example.com 为例)。

Sync Scope Type Source URL Example Domain Paths Crawled Description
Default https://example.com/products https://example.com/products Same host and the same initial path as the source URL
https://example.com/products/product1
https://example.com/products/product
https://example.com/products/discounts
Host only https://example.com/sellers https://example.com/ Same host as the source URL
https://example.com/products
https://example.com/sellers
https://example.com/delivery
Subdomains https://example.com https://blog.example.com Subdomain of the primary domain of the source URLs
https://blog.example.com/posts/post1
https://discovery.example.com
https://transport.example.com

您可以设置爬取速度的最大限速来控制最大爬取速度。该值越大,同步时间越短。但如果域名下存在 robots.txt 文件,爬取任务便会始终遵循该文件中的标准 robots.txt 指令,例如“允许”、“不允许”和爬取速度。

此外,还可使用包含和排除过滤器来进一步明确要爬取的 URL 范围。过滤器是应用于各个 URL 的正则表达式 (regex) 模式。如果某个 URL 与任一排除过滤器匹配,爬虫便会忽略该 URL。相反,如果设置了包含过滤器,爬虫便只会处理至少与任一过滤器匹配且未超出范围的 URL。例如,如需排除以 .pdf 结尾的 URL,可使用正则表达式 ^.*\.pdf$;如需爬取只包含 “products”一词的 URL,可使用正则表达式 .*products.*。

解决方案概述

接下来,我们将逐步演示如何利用网络爬虫构建知识库并对其进行测试,以及如何使用特定嵌入模型和 Amazon OpenSearch Service 向量集合(作为向量数据库)来构建知识库。此外,我们还将讨论如何对网络爬虫进行监控。

先决条件

请确保您有权爬取即将使用的 URL,并遵循 Amazon 可接受使用政策。同时,请确保这些 URL 的机器人检测功能均已关闭。知识库中的网络爬虫会通过用户代理 bedrockbot 来爬取网页。

利用网络爬虫构建知识库

在知识库中实现网络爬虫的具体步骤如下:

1. 在 Amazon Bedrock 控制台中,选择导航窗格中的“Knowledge bases”。

2. 点击 Create knowledge base

3. 在 Provide knowledge base details 页面,设置以下配置:

a) 为知识库命名。

b) 对于 IAM permissions 项,选择 Create and use a new service role

c) 对于 Choose data source项,选择 Web Crawler 作为数据源。

d) 点击 Next

4. 在 Configure data source 页面,设置以下配置:

a) Source URLs 项输入 https://www.aboutamazon.com/news/amazon-offices。

b) Sync scope 项选择 Host only

c) Include patterns 项输入 ^https?://www.aboutamazon.com/news/amazon-offices/.*$。

d) 对于排除模式,输入 *plants.*(我们不需要 URL 中包含“plants”一词的帖子)。

e) Content chunking and parsing 项选择 Default

f) 点击 Next

5. 在 Select embeddings model and configure vector store 页面,设置以下配置:

a) Embeddings model 项选择 Titan Text Embeddings v2

b) Vector dimensions 项输入 1024。

c) Vector database 项选择 Quick create a new vector store

d) 点击 Next

6. 仔细检查后,选择 Create knowledge base

在上述步骤中,我们使用同步范围 Include patternsHost only 演示了如何使用网络爬虫中的包含模式。但如前所述,使用默认的同步范围也可实现同样的效果。

在创建知识库时,可选择 Quick create vector store 选项来创建 Amazon OpenSearch Serverless 向量搜索集合。启用该选项后,系统会自动为您设置公共向量搜索集合和向量索引,并对其设置必填字段和必要的配置。此外,Knowledge Bases for Amazon Bedrock 还能管理端到端摄取和查询工作流。

测试知识库

接下来,我们来了解一下如何测试使用网络爬虫作为数据源的知识库:

1. 在 Amazon Bedrock 控制台上,导航至先前创建的知识库。

2. 在 Data source 下,选择数据源名称并点击 Sync。同步过程可能需要几分钟到几小时,具体取决于数据大小。

3. 同步任务完成后,在右侧面板的 Test knowledge base 下,选择 Select model 并点击想要选择的模型。

4. 输入以下任一提示词并查看模型响应:

a) 如何参观亚马逊西雅图办公区?

b) 提供有关亚马逊北美区第二总部的信息。

c) 亚马逊纽约办公区是什么样的?

截图如下所示,会在响应参考网页中返回引用的内容。其中 x-amz-bedrock-kb-source-uri 是网页链接,可帮助您验证响应的准确性。

使用 AWS SDK 创建知识库

以下代码展示了如何使用 AWS SDK for Python (Boto3) 在 Amazon Bedrock 中创建使用特定嵌入模型和 Amazon OpenSearch Service 向量集合(向量数据库)的知识库。

import boto3

client = boto3.client('bedrock-agent')

response = client.create_knowledge_base(
    name='workshop-aoss-knowledge-base',
    roleArn='your-role-arn',
    knowledgeBaseConfiguration={
        'type': 'VECTOR',
        'vectorKnowledgeBaseConfiguration': {
            'embeddingModelArn': 'arn:aws:bedrock:your-region::foundation-model/amazon.titan-embed-text-v2:0'
        }
    },
    storageConfiguration={
        'type': 'OPENSEARCH_SERVERLESS',
        'opensearchServerlessConfiguration': {
            'collectionArn': 'your-opensearch-collection-arn',
            'vectorIndexName': 'blog_index',
            'fieldMapping': {
                'vectorField': 'documentid',
                'textField': 'data',
                'metadataField': 'metadata'
            }
        }
    }
)

以下 Python 代码展示了如何使用 Boto3 为 Amazon Bedrock 知识库创建网络爬虫数据源,并明确列出了 URL 种子、爬取限制以及包含和排除过滤器:

import boto3

client = boto3.client('bedrock-agent', region_name='us-east-1')

knowledge_base_id = 'knowledge-base-id'

response = client.create_data_source(
    knowledgeBaseId=knowledge_base_id,
    name='example',
    description='test description',
    dataSourceConfiguration={
        'type': 'WEB',
        'webConfiguration': {
            'sourceConfiguration': {
                'urlConfiguration': {
                    'seedUrls': [
                        {'url': 'https://example.com/'}
                    ]
                }
            },
            'crawlerConfiguration': {
                'crawlerLimits': {
                    'rateLimit': 300
                },
                'inclusionFilters': [
                    '.*products.*'
                ],
                'exclusionFilters': [
                    '.*\.pdf$'
                ],
                'scope': 'HOST_ONLY'
            }
        }
    }
)

监控

可在 Amazon CloudWatch 日志中跟踪正在运行的网络爬虫的状态,该日志会报告网络爬虫访问的 URL,以及是否成功检索或跳过了这些 URL。下方截图展示了 Amazon CloudWatch 日志中爬取任务的具体情况。

清理

清理资源的具体步骤如下:

1. 删除知识库:

a) 在 Amazon Bedrock 控制台上,在导航栏中选择 Orchestration 下的 Knowledge bases

b) 选择先前创建的知识库。

c) 记录知识库概述中 AWS Identity and Access Management (IAM) 服务角色的名称。

d) 记录 Vector database 中 Amazon OpenSearch Serverless 集合的 ARN。

e) 点击 Delete,再输入 delete 进行确认。

2. 删除向量数据库:

a) 在 Amazon Bedrock 控制台上,选择导航栏中 Serverless 下的 Orchestration

b) 在搜索栏中输入先前保存的集合的 ARN。

c) 选择该集合并点击 Delete

d) 在确认提示中输入 confirm,接着选择 Delete

3. 删除 IAM 服务角色:

a) 在 IAM 控制台上,选择导航栏中的 Roles

b) 搜索先前记录的角色名称。

c) 选中该角色并点击 Delete

d) 在确认提示中输入角色名称,再删除该角色。

总结

在本文中,我们展示了如何利用 Knowledge Bases for Amazon Bedrock 来使用网络数据源,以实现公共网页的索引。借助该功能,可实现对网站的高效爬取和索引,利用网络上丰富的相关信息来填充知识库。此外,借助 Amazon Bedrock 的基础设施,还可利用最新的详尽数据来提高生成式 AI 应用程序的准确性和有效性。