跳到正文
AWS Machine Learning Blog· Daxeshkumar Patel·· 4 小时前AI 评分34

用 Crawl4AI 为 Amazon Bedrock Knowledge Bases 准备网页内容

Prepare web content for Amazon Bedrock Knowledge Bases with Crawl4AI

AI 导读

Amazon Bedrock Knowledge Bases 可通过开源 Python 爬虫 Crawl4AI 做自定义网页内容预处理:将每页 Markdown 与元数据 sidecar 写入 Amazon S3,再由 S3 数据源完成摄取。

正文 · AI 翻译

在构建检索增强生成(RAG)应用时,回答质量取决于你摄取的数据。Amazon Bedrock Knowledge Bases 是 Amazon Bedrock 的全托管 RAG 能力。借助 Amazon Bedrock Managed Knowledge Base,你连接数据源,Amazon Bedrock 会为你管理摄取、存储、索引和检索。你无需预置或扩展向量存储,嵌入和重排序默认使用服务托管的模型。

对于网页内容,请从用于托管知识库的 Amazon Bedrock Web Crawler 数据源连接器开始。你向它提供已获授权抓取的种子 URL 或站点地图,它会在你设定的范围和速率限制内进行抓取。定时同步会在页面发生变化时保持知识库为最新状态,并且该连接器可以等待通过 JavaScript 加载的内容。你无需构建、托管或运维任何爬虫,因此对于大多数公共网站内容而言,该连接器是起点。

有些数据源需要对进入知识库的内容进行更多控制。你可能只想为每个页面的主要内容区域建立索引、移除导航和其他样板内容,或者为每个文档附加你自己的元数据属性。对于这类源材料,你可以使用基于开源 Python 爬虫 Crawl4AI 构建的预处理步骤来扩展知识库的覆盖范围。该步骤会将每个页面的 Markdown 和元数据附属文件写入 Amazon Simple Storage Service(Amazon S3),知识库则通过其 Amazon S3 数据源摄取这两者。

在本文中,我们将向你展示如何选择合适的网页摄取路径,并为需要额外处理的内容实现自定义预处理。随后,你开始向托管知识库进行摄取,并验证检索质量。配套的 aws-samples 仓库以示例实现的形式提供了完整工作流。

这是对已知网页资产的批量摄取,而非推理时的实时网页访问,例如使用 Amazon Nova 的 Web Grounding。

解决方案概览

当 Amazon Bedrock Web Crawler 能够访问并索引你所需的页面时,请从它开始。它遵循 robots.txt,并且在首次完整抓取之后,每次同步仅捕获新增、更新和删除的内容。

当公共源材料在摄取前需要满足以下一项或多项条件时,请使用 Crawl4AI 预处理路径:

  • 结构化 Markdown 预处理:使用 DefaultMarkdownGenerator 配合剪枝内容过滤器,在保留标题、列表和表格的同时减少导航和其他样板内容。由于剪枝是启发式的,请检查你站点具有代表性的输出。
  • 有界、定向提取:仅提取可选 CSS 选择器所匹配的页面区域。通过种子来源、页面/路径/主机范围、深度和页面上限以及 URL 模式来约束广度优先遍历。
  • 自定义元数据:为每个文档附加源 URL、抓取时间戳、内容类型和你自己的属性,以便据此过滤检索结果。

由于托管知识库和客户托管知识库都支持 Amazon S3 数据源,Crawl4AI 路径适用于这两种类型。本文使用托管知识库,并说明客户托管知识库的不同之处。

本文其余部分遵循配套示例。请将其架构和默认值视为起点,而非 Amazon Bedrock Knowledge Bases 的要求。

默认情况下,示例在公有子网中运行 AWS Fargate 任务,通过互联网网关访问您配置的网站。Crawl4AI 在准备好源文档和元数据附属文件后即完成其职责。从摄取开始,Amazon Bedrock Knowledge Bases 负责解析、分块、嵌入、索引和检索。下图展示了 Crawl4AI 从计划调度到检索的路径。

Architecture diagram showing an Amazon EventBridge schedule starting an AWS Fargate task that crawls public websites, writes prepared Markdown and metadata to Amazon S3, and triggers Amazon Bedrock Knowledge Bases ingestion into a vector store for retrieval by a generative AI application.

图 1:面向 Amazon Bedrock Knowledge Bases 的 Crawl4AI 到 Amazon S3 摄取路径

图中的编号步骤对应以下工作流:

  1. Amazon EventBridge 按配置的计划在 AWS Fargate 上启动 Amazon Elastic Container Service(Amazon ECS)任务。
  2. 该任务爬取您配置的公共网站,并为每个页面准备 Markdown 及元数据附属文件。
  3. 该任务将准备好的文件上传到为知识库数据源提供支持的 Amazon S3 存储桶。
  4. 该任务启动 Amazon Bedrock Knowledge Bases 摄取作业。
  5. Amazon Bedrock Knowledge Bases 读取新增和更改的对象,对其进行解析,并应用您选择的分块策略。
  6. 它创建嵌入并将其索引到知识库的向量存储中,对于托管知识库,该向量存储由 Amazon Bedrock 管理。
  7. 您的生成式 AI 应用程序查询知识库以获取相关分块,或获取带引用的生成响应。

该任务在启动时从 AWS Systems Manager Parameter Store 读取其非机密管道配置。

该工作流仅处理公共页面,不实现经过身份验证的会话。对于需要登录的站点,请先评估 Amazon Bedrock Web Crawler 身份验证选项,其中包括基本身份验证、基于表单的身份验证和 SAML 身份验证。通过身份验证扩展示例需要会话处理、AWS Secrets Manager 中的凭证以及安全审查。

工作流如何运作

AWS Cloud Development Kit(AWS CDK)应用在部署期间将实现打包为容器镜像。当计划触发时,容器运行 scripts/container_entrypoint.py 并依次执行爬取、上传和摄取。以下三个步骤解释了核心逻辑。

步骤 1:爬取并提取内容

爬取步骤执行有界爬取,并为每个成功准备的页面写入一个 Markdown 文件及元数据附属文件。以下摘录经过简化。模块 src/crawl4ai_bedrock_kb/crawl.py 包含完整的种子节奏控制、URL 过滤和范围限定、页面限制以及重定向检查:

async def crawl_and_prepare(config: PipelineConfig, output_dir: str) -> list[str]:
    written, seen = [], set()
    pages_crawled = 0
    browser_config = BrowserConfig(headless=True, java_script_enabled=True)

    async with AsyncWebCrawler(config=browser_config) as crawler:
        for seed in config.seed_urls:
            remaining = config.crawl.max_pages - pages_crawled
            if remaining <= 0:
                break

            strategy = BFSDeepCrawlStrategy(
                max_depth=config.crawl.max_depth,
                max_pages=remaining,
                filter_chain=FilterChain([
                    SeedScopeFilter(seed, config.crawl.scope),
                    # Optional include/exclude URLPatternFilter objects are added here.
                ]),
            )
            run_config = CrawlerRunConfig(
                deep_crawl_strategy=strategy,
                markdown_generator=DefaultMarkdownGenerator(
                    content_filter=PruningContentFilter()
                ),
                css_selector=config.crawl.css_selector,  # Optional page region.
                check_robots_txt=config.crawl.check_robots_txt,
                mean_delay=config.crawl.request_delay_seconds,
                max_range=0,
                semaphore_count=1,
            )

            results = await crawler.arun(url=seed, config=run_config)
            for result in results:
                if pages_crawled >= config.crawl.max_pages:
                    break
                pages_crawled += 1
                requested_url = result.url
                source_url = getattr(result, "redirected_url", None) or requested_url
                if not SeedScopeFilter(seed, config.crawl.scope).apply(source_url):
                    continue  # Recheck the effective destination after redirects.
                canonical = _canonical_url(source_url)
                if canonical in seen:
                    continue
                seen.add(canonical)
                if not result.success or not result.markdown:
                    continue

                md_result = result.markdown
                markdown = (
                    getattr(md_result, "fit_markdown", None)
                    or getattr(md_result, "raw_markdown", None)
                    or (md_result if isinstance(md_result, str) else "")
                )
                if not markdown:
                    continue

                # The complete implementation adds title, crawl timestamps, content
                # type, and configured custom attributes to this metadata.
                written.extend(
                    _write_document(
                        output_dir,
                        _base_name(source_url),
                        markdown,
                        {"source_url": source_url},
                    )
                )
    return written

Amazon Bedrock Knowledge Bases 支持 Amazon S3 数据源的多种文档格式,包括纯文本、HTML、Markdown、PDF 和 DOCX。该工作流写入 Markdown,因为它保留标题、列表和表格,而不会将所有原始 HTML 带入摄取过程。

步骤 2:上传到 Amazon S3

上传步骤将每个准备好的 Markdown 文档及其匹配的元数据附属文件发送到配置的 S3 存储桶,位于工作流的 s3Prefix 下。对于 page.md,附属文件必须命名为 page.md.metadata.json,即完整的源文件名后附加 .metadata.json。该工作流将每个附属文件存储在其文档所在的同一 S3 位置。Amazon Bedrock 将每个元数据附属文件限制为 10 KB。如果附属文件将超过该限制,运行会在写入任一文件之前因错误而停止。

附属文件中的每个属性都使用托管和客户管理知识库均接受的类型化格式,适用于 Amazon S3 数据源。以下为便于阅读而格式化的简化附属文件,展示了该工作流写入的三个属性:

{
  "metadataAttributes": {
    "source_url": {
      "value": {"type": "STRING", "stringValue": "https://www.example.com/services/permits"}
    },
    "crawled_at_epoch": {
      "value": {"type": "NUMBER", "numberValue": 1790640000}
    },
    "content_category": {
      "value": {"type": "STRING", "stringValue": "web"}
    }
  }
}

该流水线仅上传当前抓取产生的路径,因此不会发送过时的本地文件。

第 3 步:让 Amazon Bedrock Knowledge Bases 进行分块、嵌入和索引

内容进入 S3 后,摄取作业会将每个文档交给数据源的摄取流水线。默认情况下,托管知识库使用其托管解析器解析每个文件,该解析器会自动为你的内容选择解析方式。你在连接数据源时选择分块策略。之后无法更改,因此在创建生产数据源之前请评估各选项。托管知识库提供以下分块策略:

  • 默认分块使用 300 个 token 的固定大小分块,重叠率为 20%。
  • 固定大小分块按你设置的最大 token 数和重叠百分比拆分内容。
  • 不分块将每个文件视为单个分块,适用于你已自行拆分的内容。

分块边界和检索结果取决于内容和所选策略,因此请用有代表性的页面和评估问题比较各选项。若要在之后更改策略,请创建新的数据源。有关更多信息,请参阅为数据源自定义摄取。客户托管知识库还提供语义分块和分层分块以及额外的解析选项。有关详细信息,请参阅知识库的内容分块工作原理。

随后工作流会启动摄取作业,以便知识库处理新文档。以下摘自 src/crawl4ai_bedrock_kb/ingest.py 的简化片段展示了该调用:

def start_ingestion_job(config: PipelineConfig) -> str:
    # Start an Amazon Bedrock knowledge base ingestion job and return its ID.
    client = boto3.client("bedrock-agent", region_name=config.region)
    response = client.start_ingestion_job(
        knowledgeBaseId=config.knowledge_base_id,
        dataSourceId=config.data_source_id,
    )
    return response["ingestionJob"]["ingestionJobId"]

相同的 StartIngestionJob 和 GetIngestionJob 调用对两种知识库类型都适用,你也可以在控制台上监控进度。

部署解决方案

在本节中,你将使用 AWS CDK 将工作流部署到你的 AWS 账户。两种知识库类型之间只有知识库先决条件不同。完成后,请按照“清理”部分中的步骤移除资源。

先决条件

开始之前,请确保你具备:

  • 一个 AWS 账户。
  • One of the following knowledge bases:
    • 一个托管知识库(本文使用此类型),位于托管知识库可用的 AWS 区域。有关说明,请参阅创建托管知识库和Amazon S3 连接器。在数据源上,将元数据文件前缀留空,因为工作流会将每个元数据 sidecar 与其文档一起写入。
    • 一个现有的客户托管知识库。要添加 Amazon S3 数据源,请参阅为知识库连接到 Amazon S3。工作流会为每个文档写入一个元数据 sidecar,因此请确认你的向量存储能够存储和筛选这些属性,如元数据和筛选中所述。例如,Amazon OpenSearch Serverless 向量索引必须使用 faiss 引擎。Amazon Aurora 向量索引需要自定义元数据列,或为每个元数据属性各设一列。借助 Amazon S3 Vectors(Amazon S3 的一项功能),你可以为每个向量附加最多 1 KB 的自定义元数据,因此请保持添加的属性简短。
  • 该知识库中一个状态为 AVAILABLE 的 Amazon S3 数据源。它可以是新数据源,也可以是你已在使用的数据源。它必须使用你为此工作流配置的 S3 存储桶。如果数据源按前缀或文件模式筛选内容,则筛选条件必须允许工作流在其 s3Prefix(默认 web-content/)下写入的文件。
  • 知识库、S3 存储桶以及你部署的堆栈都位于同一个区域。
  • 授权爬取你配置的公共网站。
  • 一台部署工作站,需安装 Git、Python 3.10 或更高版本、Node.js、AWS 命令行界面(AWS CLI)版本 2、AWS CDK CLI v2,以及正在运行的兼容 Docker 的容器引擎。部署指南列出了 AWS CDK CLI 的最低版本要求。
  • 在部署工作站上配置 AWS 凭证,并具备引导目标环境和部署 CDK 堆栈的权限。
  • 在目标账户和区域中已引导的 CDK 环境。部署步骤中包含引导命令。

你只需要工作站来构建和部署。部署完成后,计划任务会在 AWS 中运行该任务。

部署计划工作流

克隆配套仓库并安装部署依赖项:

git clone https://github.com/aws-samples/sample-crawl4ai-bedrock-knowledge-base.git
cd sample-crawl4ai-bedrock-knowledge-base/deploy
python -m venv .venv
source .venv/bin/activate  # Windows PowerShell: .venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt

保持 Docker 运行。首先将 AWS_DEFAULT_REGION 设置为你的知识库所在区域,因为 cdk deploy 使用的是你的环境或 AWS 配置文件中的区域,而不是引导命令中的区域。如有需要,先对目标账户和区域执行一次引导。然后使用你的知识库、数据源、S3 存储桶和授权的种子 URL 部署堆栈:

export AWS_DEFAULT_REGION=REGION  # Windows PowerShell: $env:AWS_DEFAULT_REGION = "REGION"
cdk bootstrap aws://ACCOUNT_ID/REGION

cdk deploy \
  -c knowledgeBaseId=ABCDEFGHIJ \
  -c dataSourceId=KLMNOPQRST \
  -c s3Bucket=amzn-s3-demo-bucket \
  -c 'seedUrls=["https://www.example.com/services"]' \
  -c maxDepth=1 \
  -c maxPages=25

将每个示例值(包括 ACCOUNT_ID、REGION 以及四个必需的上下文键)替换为你自己的值。示例值在语法上是有效的,因此未经编辑的命令会部署一个指向你不拥有的存储桶的堆栈。你也可以在 cdk.json 中设置这些键。

maxDepth 和 maxPages 的值将首次爬取限制为一个链接层级和 25 个页面。在查看准备好的输出后,再提高这些值。要预览一次爬取会准备哪些页面,你还可以使用 --dry-run 在本地运行管道,具体如 README 中所述。堆栈名称是固定的,因此同一账户和区域中的另一个 cdk deploy 会更新此堆栈。

示例默认构建 ARM64 容器镜像。如果你 x86_64 工作站上的 Docker 无法构建 ARM64 镜像,请在 cdk deploy 命令中添加 -c cpuArchitecture=X86_64。

如果你的账户启用了 VPC 阻止公共访问,任务将无法从默认公共子网访问互联网。要检查模式,请运行 aws ec2 describe-vpc-block-public-access-options。在仅入站模式下,请使用 -c egressMode=nat 进行部署,这会添加一个按小时计费的 NAT 网关。双向模式还需要一个排除项,如部署指南所述。

该堆栈不会创建或更改你的知识库或数据源。

使用默认的 rate(24 hours) 计划,首次运行会在部署创建 Amazon EventBridge 规则时开始。要跟踪该次运行,请使用 TailLogsCommand 输出中的命令,cdk deploy 会在完成时打印该输出。成功运行会记录 job_status: COMPLETE。要在计划之外启动另一次运行,请在当前运行完成后使用 RunTaskCommand 输出中的命令。要稍后列出输出,请运行 aws cloudformation describe-stacks --stack-name Crawl4aiBedrockKbCrawler --region REGION --query "Stacks[0].Outputs"。

部署指南涵盖了其余配置,包括爬取边界、计划、网络、容器架构、监控和按需运行。

验证检索质量

摄取完成后,在添加生成功能之前,使用 Retrieve 测试具有代表性的问题。托管知识库使用混合搜索。当它使用默认的托管嵌入模型时,还会使用其托管重排序器对结果进行重排序。你可以使用附属文件中的元数据来缩小结果范围。示例的默认配置会向每个页面添加设置为 web 的 content_category。以下示例从过去七天内爬取的这些页面中最多返回五个数据块。它需要 AWS SDK for Python(Boto3)1.43.32 或更高版本,你可以使用 python -m pip install "boto3>=1.43.32" 安装。请将区域和知识库 ID 替换为你自己的值:

import time

import boto3

client = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
week_ago = int(time.time()) - 7 * 24 * 60 * 60

response = client.retrieve(
    knowledgeBaseId="ABCDEFGHIJ",
    retrievalQuery={"text": "How do I apply for a building permit?"},
    retrievalConfiguration={
        "managedSearchConfiguration": {
            "numberOfResults": 5,
            "filter": {
                "andAll": [
                    {"equals": {"key": "content_category", "value": "web"}},
                    {"greaterThan": {"key": "crawled_at_epoch", "value": week_ago}},
                ]
            },
        }
    },
)

for result in response["retrievalResults"]:
    print(result.get("metadata", {}).get("source_url"), result["content"]["text"][:200])

示例传入一个整数时间戳,两种知识库类型在数字过滤器中都接受该时间戳。托管知识库不支持 startsWith 和 stringContains 过滤器。对于客户托管知识库,请在 vectorSearchConfiguration 中传入相同的过滤器,而不是 managedSearchConfiguration。它支持的运算符取决于其向量存储。

元数据过滤可以提高检索精度,但它不是授权边界。如果不同用户应看到不同页面,托管知识库的 Amazon S3 连接器支持通过您提供的访问控制列表 (ACL) 文件实现文档级访问控制。示例不会创建 ACL 文件。

要从托管知识库生成响应,请使用代理式检索。AgenticRetrieveStream 操作会返回检索结果以及带有这些结果引用的生成响应。对于客户托管知识库,请使用 RetrieveAndGenerate。在两种情况下,每个被引用的结果都包含其 sidecar 中的 source_url 元数据,您的应用程序可以将其呈现为用户可见的来源。

每当您更改内容准备、分块或检索设置时,请评估检索相关性、来源页面覆盖率和引用质量。有关您可以调整的检索设置,请参阅为托管知识库配置和自定义查询。

重复运行

每个计划事件都会启动一个独立的 Fargate 任务。堆栈不会阻止重叠运行,因此请选择比预期抓取和摄取持续时间更长的间隔。运行失败不会被通知,因为示例没有添加重试策略、死信队列或告警。当某些文档摄取失败时,摄取作业也可能报告 COMPLETE,然后任务以代码 0 退出。任务会记录作业的失败原因。在依赖该计划之前,请添加您需要的监控,包括针对这些失败原因的告警。

每次运行都会按配置的任务大小产生 Fargate 费用,默认大小为 2 vCPU 和 4 GB。任务在轮询摄取作业期间会持续运行最多 30 分钟,因此摄取作业缓慢会延长可计费的任务时间。如果摄取耗时更长,任务会以非零代码退出,而摄取作业会继续运行。堆栈会为集群启用 Container Insights,并为其创建的 Amazon Virtual Private Cloud (Amazon VPC) 启用流日志。两者都会增加 Amazon CloudWatch 费用。堆栈的 AWS KMS 密钥有月度费用,并且任务运行期间其公有 IPv4 地址会产生费用。使用 egressMode=nat 或 privateEndpoints=true 时,即使没有任务运行,NAT 网关和接口端点也会按小时计费。知识库使用量单独计费。有关详细信息,请参阅Amazon VPC 定价和Amazon Bedrock 定价。

上传是累加的:在后续抓取中移除 URL 或遗漏页面不会删除其现有的 S3 对象。要移除过时内容,请删除配置前缀下的过时文档和匹配的 sidecar,然后再次启动摄取。如果您为托管知识库数据源开启文档删除保护(删除保护),请检查其阈值。如果同步会删除超过该百分比的文档,则会跳过其删除阶段,因此这些文档会保持索引状态。要在存储桶中的对象发生变化时自动启动摄取,请参阅为 Amazon Bedrock Knowledge Bases 构建和部署自动同步解决方案。

负责任 AI 注意事项

检索到的段落会成为基础模型用于生成响应的上下文。在生产环境中运行此工作流之前,请应用以下控制措施:

  • Amazon Bedrock Guardrails:为您的代理式检索或 RetrieveAndGenerate 请求附加护栏,以应用内容过滤器、拒绝主题、词语过滤器和敏感信息过滤器。代理式检索仅支持护栏的 BLOCK 操作,不支持 MASK。
  • 上下文接地检查:开启 Guardrails 的上下文接地检查,针对检索到的段落对每个响应进行接地评分,并评估其与查询的相关性。护栏会阻止评分低于您所设阈值的响应。对于代理式检索,您可以使用 ApplyGuardrail API 对生成的答案运行该检查。该检查支持问答和摘要,不支持对话式聊天机器人用例。
  • 将抓取的内容视为不可信输入:准备好的网页会成为模型上下文,因此公共页面上的文本可能通过检索尝试提示注入。不要仅依赖护栏来捕获它。将种子 URL 限制为您信任的站点,并在内容到达知识库之前应用下一节所述的摄取过滤模式。
  • 引用与人工审核:在每个生成的响应中返回引用,以便用户对照源页面验证声明。对于风险较高的用例,请保持人工审核员参与其中。

安全与合规注意事项

在针对生产内容运行此工作流之前,请审查以下注意事项:

  • 使用可信的公共抓取目标:种子 URL 和抓取设置属于部署配置,Fargate 任务允许出站访问,因此可以访问公共网站。在示例的默认网络模式下,任务在具有公有 IP 的公有子网中运行。仅配置经授权的公共站点。不要使用此示例抓取私有或内部端点。在针对其他信任模型调整工作流之前,请审查网络出口和目的地控制。
  • 遵守抓取指令:该工作流默认开启 Crawl4AI 的 robots.txt 检查,CDK 路径将其固定开启,没有可禁用的上下文键。请确认您已获得抓取目标站点的授权,并符合 AWS 可接受使用政策。
  • 速率限制:配置请求之间的延迟,以避免对源网站造成过大压力。
  • 静态加密:该堆栈会创建一个启用了自动密钥轮换的 AWS Key Management Service(AWS KMS)客户托管密钥,并用它加密其 CloudWatch 日志组。Amazon S3 默认使用 Amazon S3 托管密钥的服务器端加密(SSE-S3)加密新对象。如果您的数据分类要求为该存储桶使用客户托管密钥,请配置该存储桶以使用它。然后,在 AWS Identity and Access Management(IAM)和密钥策略中,为上传者和知识库服务角色授予所需的 AWS KMS 权限。该堆栈的任务角色不包含 AWS KMS 权限。托管知识库默认使用 AWS 拥有的密钥加密其数据,或使用您在创建时指定的客户托管密钥。对于客户托管的知识库,请审查其向量存储的加密设置。
  • 最小权限 IAM:CDK 堆栈在配置的存储桶前缀上为 Fargate 任务角色授予 s3:PutObject。它还在目标知识库上授予 bedrock:StartIngestionJob 和 bedrock:GetIngestionJob,并为其单个配置参数授予 ssm:GetParameter。单独的角色负责 Amazon EventBridge 任务启动以及标准容器镜像拉取和日志交付。该管道不读取或列出 S3,也不调用 InvokeModel 或 Retrieve。
  • 容器和模板检查:容器以非 root 用户运行,CDK 应用在每次合成时运行 cdk-nag AWS Solutions 检查,并带有资源范围的抑制。
  • 保护部署配置:CDK 应用将非机密管道设置存储在纯文本 Parameter Store String 参数中。任务定义中只放置参数名称。不要将密码、cookie、令牌或其他机密放入 CDK 上下文或此参数中。
  • 摄取管道安全:请参阅 保护 RAG 摄取管道:过滤机制,了解在内容到达知识库之前应用的过滤和验证模式。

清理

为避免持续产生费用,请删除本演练期间创建的资源:

  • 在仓库的 deploy/ 目录中,在同一区域运行 cdk destroy,并使用与传递给 cdk deploy 相同的四个必需 -c 值。应用会在每条命令上检查它们。这会移除堆栈的 Amazon EventBridge 规则、ECS 集群、任务定义、日志组、IAM 角色、Parameter Store 参数和安全组,以及堆栈创建的 VPC(如果由堆栈创建)。它还会将堆栈的 AWS KMS 密钥安排在 30 天等待期后删除。它不会删除导入的 VPC、您的知识库、您的 S3 存储桶或工作流上传的对象。CDK 还会将容器镜像和模板保留在其引导资源中。它还会保留集群的 Container Insights 日志组,其名称以 /aws/ecs/containerinsights/Crawl4aiBedrockKbCrawler- 开头。
  • 要移除已摄取的 Web 内容,请删除 s3://<bucket>/<prefix> 下准备好的对象,并再次同步数据源。如果托管知识库数据源启用了文档删除保护,则删除文档数量超过其阈值百分比的同步会跳过其删除阶段。
  • 仅当您专为本演练创建了托管知识库时,才删除该托管知识库。托管知识库没有单独的向量存储需要删除。
  • 对于客户管理的知识库,仅当您为本演练创建了 Amazon S3 数据源时,才删除该数据源。其数据删除策略决定 Amazon Bedrock 是否还会从您的向量存储中删除该数据源的向量嵌入。

结论

在本文中,您学习了如何将 Amazon Bedrock Knowledge Bases 扩展到需要摄取前准备的授权公共 Web 内容。计划运行的 Fargate 任务使用 Crawl4AI 进行有界爬取,使用 page.md.metadata.json sidecar 准备 Markdown,将其上传到 Amazon S3 数据源,并启动摄取。然后,知识库处理解析、分块、嵌入、索引、检索以及带引用的有依据响应。

对于大多数公共网站,请从托管知识库中的 Amazon Bedrock Web Crawler 开始。当您需要控制每个页面中索引的部分或随其传输的元数据时,请使用 Crawl4AI 路径。要开始使用,请从配套的 sample-crawl4ai-bedrock-knowledge-base 仓库部署计划运行的 Fargate 工作流,然后在扩展之前使用代表性内容验证检索质量和引用。

了解更多

有关本文中服务和模式的更多信息,请参阅以下资源:

致谢

本产品包含由 UncleCode 作为 Crawl4AI 项目的一部分开发的软件。


关于作者

Daxeshkumar Patel

Daxeshkumar Patel

Dax 是 Amazon Web Services(AWS)的解决方案架构师,与客户和合作伙伴在关键云项目中密切合作。他帮助组织在 AWS 上构建和迁移应用程序,重点关注数据处理和分布式计算解决方案。Dax 是 AI 倡导者,设计并交付基于 AWS 的生成式 AI 解决方案,帮助客户应用 AWS AI 服务来自动化工作流、提升运营效率并大规模加速决策。

Bhavesh Rathod

Bhavesh Rathod

Bhavesh 是 Amazon Web Services(AWS)的首席顾问,拥有 25 年以上深厚的数据库、现代化和技术领导经验。他专注于帮助企业客户采用 AWS 云并实现传统工作负载的现代化,成功在多个行业交付了大规模云转型项目。Bhavesh 是 AI 倡导者,领导开发 AI 驱动的解决方案和代理式加速器,利用 AWS AI 服务解决复杂的客户用例,推动大规模自动化、运营效率和智能决策。

Abhishek Shukla

Abhishek Shukla

Abhishek 是 AWS Professional Services 的高级交付顾问,负责领导企业云迁移和现代化项目的技术工作流。他专注于定义 DevOps 战略、设计可扩展的交付框架,并围绕技术成果协调跨职能工程团队。他的兴趣包括生成式 AI、代理式架构,以及构建可复用的模式,以提升客户和内部团队的交付标准,使组织能够在保持运营卓越的同时加快前进速度。

来源:AWS Machine Learning Blog · aws.amazon.com