1. 项目概述:当CDK遇上生成式AI

如果你正在AWS上构建生成式AI应用,并且厌倦了在控制台里反复点击、手动配置各种服务,或者觉得用CloudFormation模板管理复杂的AI基础设施链路既繁琐又容易出错,那么 awslabs/generative-ai-cdk-constructs 这个项目,很可能就是你一直在寻找的“脚手架”。

简单来说,这是一个由AWS实验室(awslabs)官方维护的 AWS CDK(Cloud Development Kit)高阶构造(Construct)库 。它的核心使命,是将构建生成式AI应用时那些高频、通用但又颇为复杂的云端基础设施部署模式,封装成一个个开箱即用、可组合的CDK构造块。你可以把它想象成一个专为生成式AI场景设计的“乐高套装”,里面提供了预先组装好的“墙面”、“门窗”和“楼梯”,让你能专注于搭建“房子”的功能和设计,而不是从烧制每一块砖开始。

我在实际项目中引入它,最直接的感受是 开发效率的质变 。以往,要部署一个包含Amazon Bedrock模型调用、向量数据库(如Amazon OpenSearch)、API网关和Lambda函数的完整RAG(检索增强生成)应用,即使对资深AWS架构师来说,编写、测试和维护一套完整的IaC(基础设施即代码)也需要数天时间。而使用这个构造库,通过几十行类型安全的代码(支持TypeScript、Python等),就能在几分钟内拉起一套生产就绪的、符合最佳实践的基础设施骨架。它特别适合 全栈工程师、ML工程师以及希望快速原型验证或标准化AI应用部署的团队 ,将你从繁琐的云资源配置中解放出来,更聚焦于提示词工程、业务逻辑和用户体验。

2. 核心构造解析:你的生成式AI工具箱里有什么?

这个库不是一个单体工具,而是一个不断丰富的“工具箱”。理解每个“工具”(Construct)的用途和能力,是高效使用它的关键。下面我们来拆解几个最核心、最常用的构造。

2.1 BedrockKnowledgeBase :一站式RAG核心引擎

这是库中的“明星”构造,它完整封装了基于Amazon Bedrock知识库的RAG解决方案。你不需要再手动串联S3、Bedrock Embedding模型、OpenSearch和Bedrock Knowledge Base API。

它的价值在于抽象和自动化

  • 数据源集成 :只需指定一个S3桶路径,它能自动处理文档的上传、分块(Chunking)和元数据提取。支持多种格式(PDF, TXT, DOCX, PPTX等)。
  • 向量化流水线 :内部自动调用你指定的Bedrock嵌入模型(如 amazon.titan-embed-text-v1 ),将文本块转化为向量。
  • 向量数据库部署 :可以一键部署并配置一个托管的OpenSearch Serverless向量集合(Collection),或者连接到已有的向量数据库。它帮你处理好了所有网络、安全(加密、IAM角色)和索引配置。
  • 知识库创建 :自动创建Bedrock知识库资源,并将其与数据源、向量库绑定。

一个典型的使用场景 :你有一个产品手册的PDF文件夹存放在S3。你想构建一个智能客服助手来回答产品相关问题。使用 BedrockKnowledgeBase ,你只需要在CDK代码中指定S3路径、选择嵌入模型和向量数据库类型,部署后,文档会自动被摄取、向量化并存入索引。之后,你的应用代码只需通过Bedrock Runtime API查询知识库,就能获得基于文档的精准答案。

2.2 ChatBot :快速构建对话式Web接口

这个构造解决了一个前端展示的痛点。当你构建了一个强大的后端RAG或对话系统后,如何快速提供一个界面供内部测试或给用户演示? ChatBot 构造可以快速部署一个完全无服务器的聊天机器人Web应用。

它基于以下AWS服务构建

  • 前端 :静态React应用托管在Amazon S3,通过CloudFront分发。
  • 后端API :由Amazon API Gateway和AWS Lambda函数提供RESTful API。
  • 对话管理 :可选集成Amazon DynamoDB来持久化聊天会话历史。
  • AI后端 :可以灵活配置后端Lambda函数去调用任何AI服务,无论是Bedrock、SageMaker端点,还是你自己的模型。

实操心得 :这个构造非常适合 概念验证(PoC)和内部工具 。它能让你在几个小时内就获得一个可交互的、界面美观的聊天应用。对于生产环境,你可能需要基于此定制UI和增强安全控制,但它提供了一个极佳的起点和架构参考。

2.3 LLMChain PromptChain :编排复杂AI工作流

生成式AI应用不仅仅是简单的问答。复杂的场景可能需要串联多个LLM调用、条件判断或外部API。 LLMChain PromptChain 这类构造提供了轻量级的工作流编排能力。

  • LLMChain :允许你定义一系列步骤(Step),每个步骤可以是一个LLM调用、一个Lambda函数或一个条件判断。它类似于一个简化的状态机,专门为顺序或带分支的AI任务设计。
  • PromptChain :更侧重于提示词(Prompt)的模板化和动态组装。你可以定义带有变量的提示词模板,并在运行时注入不同的上下文(如用户查询、检索到的文档片段)。

应用场景示例 :一个内容审核系统。 LLMChain 可以编排这样的流程:1. 用第一个LLM判断用户输入的情感倾向;2. 如果为负面,则调用第二个LLM分析具体风险点;3. 根据风险等级,调用不同的处理Lambda函数(如通知人工、直接过滤)。所有这些逻辑都可以用声明式代码定义。

2.4 其他实用构造与模式

除了上述核心构造,库中还包含许多其他实用组件:

  • SageMakerEndpoint :简化将SageMaker上训练好的模型部署为端点的过程,并自动生成调用该端点的Lambda函数样板代码。
  • VectorIndex :一个更底层的向量数据库抽象,如果你需要更精细地控制OpenSearch Serverless集合的配置,可以使用它。
  • 安全与监控 :大多数构造默认集成了良好的安全实践,如加密、最小权限IAM角色。也方便与CloudWatch日志、指标集成,为后续监控打下基础。

注意 :该库处于快速发展阶段(目前通常为开发者预览版)。这意味着新构造会不断加入,同时现有API也可能发生突破性变更。在生产中使用时,务必锁定特定的版本号,并在升级前仔细阅读变更日志。

3. 实战演练:从零部署一个企业知识库问答系统

理论说得再多,不如亲手搭一遍。让我们用一个完整的例子,展示如何用 generative-ai-cdk-constructs 在30分钟内搭建一个具备后台异步文档处理能力的企业知识库问答API。

3.1 环境准备与项目初始化

首先,确保你的本地环境已就绪:

  1. Node.js & AWS CDK :安装Node.js(建议LTS版本)和AWS CDK CLI ( npm install -g aws-cdk )。
  2. AWS凭证 :配置好AWS CLI,并拥有足够权限的IAM凭证(通常需要 AdministratorAccess 或包含相关服务权限的策略)。
  3. Bootstrap :在目标AWS区域(如 us-east-1 )运行 cdk bootstrap ,为CDK部署准备环境。

接下来,创建一个新的CDK项目(这里以TypeScript为例):

mkdir my-ai-knowledge-base && cd my-ai-knowledge-base
cdk init app --language typescript

安装所需的依赖库:

npm install @aws-cdk/aws-lambda-nodejs @aws-sdk/client-bedrock-agent @aws-sdk/client-s3
npm install @cdklabs/generative-ai-cdk-constructs

注意,构造库的包名是 @cdklabs/generative-ai-cdk-constructs ,这反映了它目前由CDK Labs(孵化器)维护的状态。

3.2 基础设施栈代码编写

打开 lib/my-ai-knowledge-base-stack.ts 文件,用以下代码替换原有内容。我们将构建一个包含知识库、处理Lambda和查询API的栈。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as path from 'path';
// 导入生成式AI构造库
import { BedrockKnowledgeBase, OpenSearchVectorIndex } from '@cdklabs/generative-ai-cdk-constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
import * as iam from 'aws-cdk-lib/aws-iam';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';

export class MyAiKnowledgeBaseStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // 1. 创建源文档存储桶
    const sourceBucket = new s3.Bucket(this, 'SourceDocumentsBucket', {
      removalPolicy: cdk.RemovalPolicy.DESTROY, // 演示用,自动删除
      autoDeleteObjects: true,
      encryption: s3.BucketEncryption.S3_MANAGED,
    });

    // 2. 创建向量索引(使用OpenSearch Serverless)
    const vectorIndex = new OpenSearchVectorIndex(this, 'VectorIndex', {
      vectorFieldName: 'embedding', // 向量字段名
      vectorDimensions: 1536, // 对应Titan Embedding G1 - Text模型的维度
    });

    // 3. 创建Bedrock知识库(核心构造)
    const knowledgeBase = new BedrockKnowledgeBase(this, 'EnterpriseKB', {
      knowledgeBaseName: 'EnterpriseProductKB',
      vectorIndex: vectorIndex, // 关联我们创建的向量索引
      dataSource: {
        bucket: sourceBucket,
        // 可以指定前缀,例如 'documents/'
      },
      embeddingModel: 'amazon.titan-embed-text-v1', // 指定嵌入模型
      chunkingStrategy: {
        // 使用默认的分块策略,也可自定义
        type: 'DEFAULT',
      },
    });

    // 4. 创建查询API的后端Lambda函数
    const queryHandler = new NodejsFunction(this, 'QueryHandler', {
      runtime: lambda.Runtime.NODEJS_18_X,
      entry: path.join(__dirname, '../lambda/query.ts'), // 处理函数路径
      handler: 'handler',
      environment: {
        KNOWLEDGE_BASE_ID: knowledgeBase.knowledgeBaseId,
        // 区域从Stack中获取
        AWS_REGION: this.region,
      },
      timeout: cdk.Duration.seconds(30),
      memorySize: 512,
    });

    // 5. 为Lambda函数授予调用Bedrock知识库的权限
    queryHandler.addToRolePolicy(new iam.PolicyStatement({
      actions: ['bedrock:Retrieve', 'bedrock:RetrieveAndGenerate'],
      resources: [
        `arn:aws:bedrock:${this.region}:${this.account}:knowledge-base/${knowledgeBase.knowledgeBaseId}`,
      ],
    }));

    // 6. 创建API Gateway
    const api = new apigateway.RestApi(this, 'KnowledgeBaseApi', {
      restApiName: 'Enterprise KB Service',
      description: 'API for querying the enterprise knowledge base.',
      defaultCorsPreflightOptions: {
        allowOrigins: apigateway.Cors.ALL_ORIGINS, // 生产环境应限制来源
        allowMethods: apigateway.Cors.ALL_METHODS,
      },
    });

    const queryIntegration = new apigateway.LambdaIntegration(queryHandler);
    api.root.addResource('query').addMethod('POST', queryIntegration);

    // 7. 输出有用的信息到CloudFormation输出
    new cdk.CfnOutput(this, 'SourceBucketName', {
      value: sourceBucket.bucketName,
      description: 'Name of the S3 bucket to upload documents',
    });
    new cdk.CfnOutput(this, 'ApiEndpointUrl', {
      value: api.url + 'query',
      description: 'Endpoint URL for querying the knowledge base',
    });
    new cdk.CfnOutput(this, 'KnowledgeBaseId', {
      value: knowledgeBase.knowledgeBaseId,
      description: 'ID of the created Bedrock Knowledge Base',
    });
  }
}

3.3 Lambda处理函数实现

在项目根目录创建 lambda 文件夹,并在其中创建 query.ts 文件:

import { BedrockAgentRuntimeClient, RetrieveAndGenerateCommand, RetrieveCommand } from '@aws-sdk/client-bedrock-agent-runtime';
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';

const client = new BedrockAgentRuntimeClient({ region: process.env.AWS_REGION });
const KNOWLEDGE_BASE_ID = process.env.KNOWLEDGE_BASE_ID!;

export const handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
  console.log('Received event:', JSON.stringify(event, null, 2));

  try {
    const body = JSON.parse(event.body || '{}');
    const { query, retrievalMode = 'RETRIEVE_AND_GENERATE' } = body;

    if (!query) {
      return {
        statusCode: 400,
        body: JSON.stringify({ error: 'Missing required field: query' }),
      };
    }

    let response;
    if (retrievalMode === 'RETRIEVE') {
      // 仅检索相关文档片段
      const retrieveCommand = new RetrieveCommand({
        knowledgeBaseId: KNOWLEDGE_BASE_ID,
        retrievalQuery: {
          text: query,
        },
        retrievalConfiguration: {
          vectorSearchConfiguration: {
            numberOfResults: 5, // 返回最相关的5个片段
          },
        },
      });
      const retrieveResponse = await client.send(retrieveCommand);
      response = {
        retrievedResults: retrieveResponse.retrievalResults,
      };
    } else {
      // 检索并生成答案(默认)
      const ragCommand = new RetrieveAndGenerateCommand({
        input: {
          text: query,
        },
        retrieveAndGenerateConfiguration: {
          type: 'KNOWLEDGE_BASE',
          knowledgeBaseConfiguration: {
            knowledgeBaseId: KNOWLEDGE_BASE_ID,
            modelArn: 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0', // 指定用于生成的模型
          },
        },
      });
      const ragResponse = await client.send(ragCommand);
      response = {
        generatedAnswer: ragResponse.output?.text,
        citations: ragResponse.citations,
      };
    }

    return {
      statusCode: 200,
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(response),
    };
  } catch (error) {
    console.error('Error processing query:', error);
    return {
      statusCode: 500,
      body: JSON.stringify({ error: 'Internal server error', details: (error as Error).message }),
    };
  }
};

3.4 部署与验证

  1. 合成与部署

    cdk synth
    cdk deploy
    

    首次部署可能需要10-15分钟,因为需要创建OpenSearch Serverless集合等资源。

  2. 上传文档 :部署成功后,控制台会输出 SourceBucketName 。将你的企业文档(如PDF、TXT)上传至该S3桶的根目录或指定前缀下。Bedrock知识库会自动开始同步和向量化处理。你可以在AWS控制台的Bedrock“知识库”页面查看同步状态。

  3. 测试API :获取输出的 ApiEndpointUrl 。使用curl或Postman发送POST请求:

    curl -X POST https://your-api-id.execute-api.region.amazonaws.com/prod/query \
      -H "Content-Type: application/json" \
      -d '{"query": "我司产品A的核心优势是什么?"}'
    

    你将收到一个由Claude模型生成的、基于你上传文档的答案。

这个实战案例的价值 :我们用了不到100行的基础设施代码和50行的业务逻辑,就构建了一个具备企业级可扩展性、安全性和维护性的RAG后端系统。所有底层细节——向量数据库配置、网络隔离、IAM策略、数据同步流水线——都被构造库优雅地抽象了。

4. 深入原理:构造库如何封装最佳实践

使用这个库不仅仅是调用API,更是在采纳一套经过设计的AWS生成式AI最佳实践。理解其背后的设计哲学,能帮助你在更复杂的场景下灵活运用或进行定制。

4.1 安全性与权限的最小化原则

构造库在创建资源时,默认遵循AWS安全最佳实践。例如:

  • 加密 :创建的S3桶、OpenSearch集合默认启用加密(KMS或服务托管密钥)。
  • 网络隔离 OpenSearchVectorIndex 默认部署在VPC内(如果使用Serverless VPC端点)或配置了安全的访问策略,避免公开暴露。
  • 最小权限IAM :为Lambda函数或知识库执行角色生成的IAM策略,通常只包含完成其任务所必需的最低权限。例如,查询Lambda只有 bedrock:RetrieveAndGenerate 权限,而不是宽泛的 bedrock:*

实操心得 :尽管默认设置已很安全,但在生产环境中仍需根据合规要求进行审查。例如,你可能需要改用自定义的KMS密钥来满足加密要求,或者调整VPC和子网配置以匹配公司的网络规划。构造库通常通过属性(props)暴露这些高级配置选项。

4.2 无服务器与弹性架构

库中绝大多数构造都基于无服务器服务(Lambda, API Gateway, S3, OpenSearch Serverless, Bedrock)。这带来了几个核心优势:

  • 自动扩展 :无需预置或管理服务器,流量高峰时自动扩容,空闲时成本降至零。
  • 高可用性 :这些服务本身跨多个可用区部署,提供了内置的高可用性。
  • 按需付费 :你只为实际使用的资源(如向量搜索的计算单元、Lambda执行时间、Bedrock模型调用)付费。

这种架构选择使得基于此库构建的应用天生具备处理不确定、爆发式AI工作负载的能力。

4.3 可观测性设计

好的基础设施必须可观测。构造库在创建资源时,通常会配置好基本的CloudWatch日志和指标。

  • Lambda函数 :自动启用日志,并配置合理的日志组和保留期。
  • Bedrock知识库 :同步作业的状态、成功/失败事件会发送到CloudWatch。
  • OpenSearch :Serverless集合提供搜索延迟、请求计数等指标。

给你的建议 :在项目初期,就应考虑增强可观测性。你可以在CDK栈中额外添加:

  • 自定义指标 :在查询Lambda中,使用 putMetricData 记录每次查询的响应时间、检索到的文档数量等业务指标。
  • 结构化日志 :以JSON格式输出日志,便于后续用CloudWatch Logs Insights进行分析,例如记录用户查询、生成的答案长度、模型使用情况等。
  • 告警 :基于错误率或延迟指标创建CloudWatch告警。

5. 进阶应用与定制化策略

当你熟悉了基础构造后,就可以开始探索更高级的用法,解决更复杂的业务场景。

5.1 混合检索策略的实现

单纯的向量相似性搜索(语义搜索)有时会遗漏关键词完全匹配的重要文档。一个健壮的RAG系统往往需要结合 向量搜索 关键词搜索 (如OpenSearch的lexical search)。

generative-ai-cdk-constructs BedrockKnowledgeBase 目前主要对接向量搜索。但你可以通过“逃逸舱口”进行定制。

策略 :不直接使用 BedrockKnowledgeBase 的数据源同步功能,而是:

  1. 使用 OpenSearchVectorIndex 构造创建向量索引。
  2. 自己实现一个文档处理流水线(可以用AWS Step Functions或一个Lambda函数编排):
    • 从S3读取文档。
    • 使用Amazon Textract或Lambda进行文本提取和分块。
    • 同时,将文本块存入OpenSearch, 既存入向量字段(通过Bedrock Titan Embedding),也存入用于关键词搜索的文本字段
    • 在OpenSearch中配置一个混合搜索(Hybrid Search)的索引映射和搜索查询。
  3. 在查询时,你的Lambda函数直接调用OpenSearch的搜索API(而非Bedrock Knowledge Base的Retrieve API),执行混合搜索,将结果作为上下文传递给Bedrock模型生成答案。

这种方式增加了复杂度,但给予了你最大的灵活性和对检索过程的控制力。

5.2 多模型路由与A/B测试

生产环境可能同时使用多个模型(如Claude-3 Haiku用于简单问答,Sonnet用于复杂分析,或不同供应商的模型)。你需要一个智能的路由层。

实现方案

  1. 使用 LLMChain 构造,在链中定义一个“路由”步骤。这个步骤可以是一个Lambda函数,其逻辑基于:
    • 查询复杂度分析 :通过一个轻量级模型或规则(如查询长度、关键词)判断。
    • 成本控制 :优先使用低成本模型,仅在必要时路由到高能力模型。
    • 负载均衡 :在不同模型端点间轮询。
  2. 路由Lambda函数根据逻辑,将请求转发到不同的下游资源。这些资源可以是:
    • 不同的Bedrock模型ID。
    • 通过 SageMakerEndpoint 构造部署的自有模型。
    • 甚至是通过API Gateway集成的外部模型API。
  3. 为了进行A/B测试,你可以在路由逻辑中引入随机分流,并将每次请求的模型选择、输入输出记录到DynamoDB或S3,用于后续的效果分析和模型评估。

5.3 与现有CI/CD流水线集成

将基于此CDK构造库的项目纳入你现有的软件开发流程至关重要。

典型CI/CD流程(以GitHub Actions为例)

  1. 代码提交触发 :推送代码到特性分支触发测试流水线。
  2. 安全与质量扫描 :使用 cdk synth 生成CloudFormation模板,并用 cfn-nag 等工具进行安全策略检查。同时运行单元测试(针对Lambda函数逻辑)。
  3. 部署到开发环境 :通过 cdk deploy --require-approval never 自动部署到开发AWS账户和环境。
  4. 集成测试 :部署后,自动化脚本调用部署好的API进行冒烟测试,验证知识库同步和查询功能是否正常。
  5. 人工评审与生产部署 :创建Pull Request,合并后触发生产流水线。生产部署前可设置手动批准关卡。生产部署使用明确的版本标签和回滚策略。

关键配置 :在 cdk.json 中为不同环境(dev, staging, prod)配置不同的上下文变量,如知识库名称、实例类型、是否启用删除保护等。

{
  "context": {
    "environments": {
      "dev": {
        "knowledgeBaseName": "mykb-dev",
        "removalPolicy": "destroy"
      },
      "prod": {
        "knowledgeBaseName": "mykb-prod",
        "removalPolicy": "retain"
      }
    }
  }
}

6. 常见陷阱、问题排查与优化指南

即使有了强大的工具,在实际操作中依然会遇到各种问题。以下是我在多个项目中总结的常见“坑点”和解决方案。

6.1 部署与初始化问题

问题现象 可能原因 排查步骤与解决方案
cdk deploy 失败,提示 OPEN_SEARCH_ACCESS_DENIED 执行部署的IAM角色缺少操作OpenSearch Serverless的权限。 1. 检查部署角色的IAM策略,确保包含 aoss: 相关权限(如 CreateCollection , BulkGet )。
2. 最简单的方式是临时为角色附加托管策略 AmazonOpenSearchServiceFullAccess (仅限开发),生产环境需细化权限。
知识库同步状态一直为 IN_PROGRESS 或失败 1. S3桶策略阻止Bedrock访问。
2. 文档格式不受支持或已损坏。
3. 向量索引未就绪。
1. 检查Bedrock知识库执行角色的S3读取权限,以及S3桶策略是否允许该角色访问。
2. 在Bedrock控制台查看同步作业的详细错误信息。
3. 确认OpenSearch Serverless集合状态为 ACTIVE
Lambda函数超时 1. 文档分块过多或过大,处理耗时。
2. Bedrock模型响应慢。
3. 冷启动。
1. 增加Lambda超时时间(如至5分钟)和内存(如1024MB)。
2. 优化提示词,减少不必要的上下文。
3. 为Lambda配置预置并发以消除冷启动影响(会增加成本)。

6.2 运行时性能与成本优化

性能优化

  • 向量索引调优 :对于 OpenSearchVectorIndex ,关注 vectorDimensions 必须与所选嵌入模型严格匹配(如Titan Embed Text v1是1536)。错误维度会导致搜索失败或结果不准。
  • 分块策略 :默认分块策略可能不适合所有文档。对于技术文档或代码,可能需要更小的块大小和重叠。你可以通过 chunkingStrategy 属性自定义 maxTokens overlapTokens
  • 检索优化 :调整 numberOfResults (检索片段数量)和 similaritySearchK 参数。并非越多越好,过多的无关片段会干扰模型并增加延迟和成本。通常5-10个高质量片段足够。

成本控制

  • OpenSearch Serverless OCU :这是主要的潜在成本项。监控OCU(OpenSearch Compute Units)使用情况。在开发环境,可以设置较低的容量下限;对于有明显波峰波谷的应用,可以考虑使用定时任务(如通过EventBridge触发Lambda)在非高峰时段自动缩放容量。
  • Bedrock模型调用 :区分 InvokeModel (按输入输出token计费)和 InvokeModelWithResponseStream (流式,类似计费)。对于长文本生成,流式响应可以改善用户体验,但计费方式相同。选择性价比合适的模型,例如Haiku通常比Sonnet便宜一个数量级,且对许多任务足够胜任。
  • Lambda与API Gateway :这部分成本通常较低。确保Lambda函数逻辑高效,避免不必要的循环或外部调用。使用API Gateway缓存(如果查询可缓存)可以显著减少后端调用。

6.3 内容安全与合规性考量

生成式AI应用必须考虑内容安全。

  • 输入输出过滤 :在调用Bedrock模型前后,添加内容审查层。可以使用Bedrock内置的Guardrail功能(如果模型支持),或者在Lambda函数中集成一个轻量级的内容安全分类器。
  • 数据隐私 :确保上传到S3的源文档不包含敏感个人信息(PII)。可以考虑在文档处理流水线中增加一个使用Amazon Comprehend进行PII检测和脱敏的步骤。
  • 审计与溯源 :确保所有用户查询和AI生成的答案都连同时间戳、用户ID(如有)和使用的上下文来源(引用),被安全地日志记录到诸如Amazon CloudWatch Logs或S3中,并配置合适的保留策略,以满足合规审计要求。

一个重要的提醒 generative-ai-cdk-constructs 是一个加速开发的利器,但它不替代你对所构建系统架构和安全性的深入理解。它封装了“通用模式”,但你的“具体业务需求”和“合规边界”需要你自己来定义和实现。把它当作一个生产力强大的伙伴,而不是一个全自动的黑盒。

更多推荐