📢 转载信息
原文作者:Hasan Shojaei, Bommi Shin, Krishnan Gopalakrishnan, Anuja Narwadkar, and Sunita Koppar
旨在利用 AI 代理自动化流程或使用基于聊天的 AI 助手提高员工生产力的企业,需要对使用 大型语言模型 (LLMs) 的负责任的 AI 使用和敏感数据处理强制执行全面的安全措施和审计控制。许多企业已经开发了自定义的 生成式 AI 网关,或采用了现成的解决方案(如 LiteLLM 或 Kong AI Gateway),为 AI 从业者和开发人员提供访问来自不同提供商的 LLM 的权限。然而,在规模上,对不断增长的来自各种提供商的 LLM 列表强制执行和维护一致的提示安全和敏感数据保护策略是具有挑战性的。
在本文中,我们将演示如何通过使用 Amazon Bedrock 护栏 向自定义的多提供商生成式 AI 网关添加集中式安全措施来解决这些挑战。Amazon Bedrock 护栏提供了一套安全功能,可帮助组织大规模构建负责任的生成式 AI 应用程序。您将学习如何使用 Amazon Bedrock ApplyGuardrail API 来帮助对来自 Amazon Bedrock 和 Microsoft Azure OpenAI 等第三方提供商的 LLM 强制执行一致的提示安全和敏感数据保护策略。提出的解决方案还提供了集中式日志记录和监控、分析和分摊机制等额外的好处。
解决方案概述
要使用集中式护栏保护生成式 AI 应用程序,您需要满足几项要求。首先,组织需要为生成式 AI 网关及其护栏组件建立强大且可扩展的基础设施设置。该解决方案还需要一个全面的日志记录和监控系统来跟踪 AI 交互,以及分析功能来评估使用模式和合规性。对于敏感数据保护,组织需要建立明确的数据治理策略并实施适当的安全控制。此外,他们需要开发或集成一个分摊机制,以跨不同部门或项目跟踪和分配 AI 使用成本。了解特定于其行业的监管要求对于确保正确配置护栏以满足合规标准至关重要。
下图描绘了我们提出的解决方案的概念性说明。工作流程始于经过身份验证的用户向生成式 AI 网关发送 HTTPS 请求,该网关是一个在 Amazon Elastic Container Service (Amazon ECS) 上运行的集中式应用程序,作为 LLM 交互的主要接口。在生成式 AI 网关应用程序逻辑中,每个传入请求首先被转发到 Amazon Bedrock ApplyGuardrail API 进行内容筛选。然后,生成式 AI 网关根据预定义配置评估内容,做出关键决策,是完全阻止请求、屏蔽敏感信息,还是允许其不加修改地继续进行。
此评估过程是生成式 AI 网关功能的一个组成部分,有助于遵守既定的安全和合规准则。对于通过此筛选的请求,生成式 AI 网关逻辑会根据用户的规范确定适当的 LLM 提供商(Amazon Bedrock 或第三方服务)。然后将经过筛选的内容转发到选定的 LLM 进行处理。最后,生成式 AI 网关接收 LLM 的响应并将其返回给用户,从而完成交互周期。响应流程遵循两条不同的路径:被阻止的请求导致用户收到被阻止的内容消息,而批准的请求则提供模型响应,并在用户提示中应用了必要的内容屏蔽。在我们的实现中,护栏仅应用于输入或提示,而不应用于 LLM 响应。这种简化的流程为 Amazon Bedrock 和第三方提供商的 LLM 访问、安全和合规性提供了一种统一的方法。

生成式 AI 网关应用程序托管在 AWS Fargate 上,并使用 FastAPI 构建。该应用程序与 Amazon Web Services (AWS) 的其他服务进行交互,例如 Amazon Simple Storage Service (Amazon S3)、Amazon Bedrock、Amazon Kinesis 和 Amazon Data Firehose。该解决方案包括一个强大的数据持久性层,该层通过 Amazon Kinesis Data Streams 和 Amazon Data Firehose 捕获交互详细信息并将其存储在 Amazon S3 上。持久化数据包括清理后的请求和响应、事务信息、护栏元数据以及被阻止的内容和相关元数据。这种全面的日志记录有助于完全可审计性,并能持续改进护栏机制。
解决方案组件
该解决方案的可扩展性是通过使用以下工具和技术实现的:
- nginx,通过在每个容器内对请求进行负载均衡,为应用程序提供最大的性能和稳定性。
- Gunicorn,一个 Python Web 服务器网关接口 (WSGI) HTTP 服务器,常用于在生产环境中提供 Python Web 应用程序。它是一个高性能服务器,可以有效地处理多个工作进程和并发请求。Gunicorn 仅支持同步通信,但具有强大的进程管理功能。
- Uvicorn,用于提供轻量级和异步请求处理。虽然 Gunicorn 是同步的,但它支持使用异步工作进程类型(如 Uvicorn),通过它可以建立异步通信。这对于等待时间较长的应用程序是必需的。在从 LLM 获取响应的情况下,应预期等待时间较长。
- FastAPI,用于在生成式 AI 网关应用程序层处理实际请求。
- Amazon ECS Fargate 集群,用于在 AWS 上托管容器化应用程序,以及 AWS Auto Scaling 自动向上或向下扩展任务或容器。
- Amazon Elastic Container Registry (Amazon ECR),用于存储生成式 AI 网关应用程序的 Docker 镜像。
- Elastic Load Balancing (ELB) 和 Application Load Balancer,用于跨 ECS 容器对请求进行负载均衡。
- HashiCorp Terraform,用于资源预置。
下图说明了所提出架构的设计。消费者应用程序(如本地业务应用、推理应用、Streamlit 应用和 Amazon SageMaker Studio Lab)、仪表板和 Azure 云组件未包含在随附的 GitHub 仓库中。它们包含在架构图中,以演示与下游和上游系统的集成。

集中式护栏
生成式 AI 网关通过 Amazon Bedrock 护栏强制执行全面的安全控制,利用 ApplyGuardrail API 实现多层保护。这些护栏提供四个核心安全功能:内容筛选以筛选不当或有害内容、拒绝主题以帮助防止特定主题的讨论、词语过滤器以阻止特定术语或短语,以及敏感信息检测以帮助保护个人和机密数据。
组织可以使用三种可配置的强度级别——低、中、高——来实施这些控件。这样,业务部门就可以根据其特定的风险承受能力和合规性要求来调整其 AI 安全态势。例如,营销团队在生成创意内容时可能采用低强度护栏,而金融或医疗部门在处理敏感客户数据时可能需要高强度护栏。除了这些基本保护之外,Amazon Bedrock 护栏还包括上下文基础和自动化推理检查等高级功能,这些功能有助于检测和防止 AI 幻觉(模型生成错误或误导性信息的实例)。用户可以根据自己的用例扩展生成式 AI 网关的功能以支持这些高级功能。
多提供商集成
生成式 AI 网关与 LLM 提供商和模型无关,这使其能够与多个提供商和 LLM 无缝集成。用户可以在请求载荷中直接指定其首选的 LLM 模型,从而使网关能够将请求路由到适当的模型端点。AWS Secrets Manager 用于存储生成式 AI 网关 API 访问令牌以及来自 Azure OpenAI 等第三方 LLM 的访问令牌。生成式 AI 网关 API 令牌用于对调用方进行身份验证。LLM 访问令牌用于为第三方提供商建立客户端连接。
日志记录、监控和警报
实施生成式 AI 网关的一个关键优势在于其集中式日志记录和监控 LLM 交互的方法。每次交互,包括用户请求和提示、LLM 响应和用户上下文,都会以标准化的格式和位置捕获和存储。组织可以利用此收集策略来执行分析、排除故障并获得见解。日志记录、监控和警报是使用以下 AWS 服务启用的:
- Amazon CloudWatch 捕获容器和应用程序日志。我们可以针对特定的日志消息创建自定义指标,并创建可用于主动警报的警报(例如,当发生 500 内部服务器错误时)。
- Amazon Simple Notification Service (Amazon SNS),用于向分发列表发送通知(例如,当发生 500 内部服务器错误时)。
- Kinesis Data Streams 和 Data Firehose,用于将请求和响应数据及元数据流式传输到 Amazon S3(用于合规性和分析或分摊)。分摊 是一种将成本归因于所有者层次结构的过程。例如,在 AWS 上运行的应用程序会产生一些服务成本,但该应用程序可能正在为由业务部门管理的项目的员工提供服务。分摊是一个过程,可以将成本归因于单个用户的最低级别,并有可能向上汇总到多个中间级别,直到业务部门。
- Amazon S3,用于在事务级别(用于合规性)持久化请求和响应,此外还用于存储事务元数据和指标(例如,令牌计数)以进行分析和分摊。
- AWS Glue Crawler API 和 Amazon Athena,用于为事务元数据提供 SQL 表,以供分析和分摊使用。
仓库结构
该 GitHub 仓库 包含以下目录和文件:
genai-gateway/ ├── src/ -- 主应用程序代码
│ └── clients/ -- API 端点
│ ├── controllers/ --FastAPI 应用程序入口点
│ ├── generators/ --LLM 集成
│ ├── persistence/ -- 持久性逻辑
│ └── utils/
├── terraform/ -- IaC
├── tests/ -- 测试脚本
│ └── regressiontests/
├── .gitignore
├── .env.example
├── Dockerfile
├── ngnix.conf
├── asgi.py
├── docker-entrypoint.sh
├── requirements.txt
├── serve.py
└── README.md
先决条件
在部署此解决方案之前,您需要满足以下先决条件:
- 一个 AWS 账户
- 一个具有以下权限的 AWS 身份和访问管理 (IAM) 角色:
- Amazon S3 访问 (CreateBucket, PutObject, GetObject, DeleteObject)
- AWS Secrets Manager 访问
- Amazon CloudWatch 日志访问
- Amazon Bedrock 服务
- Amazon Bedrock 基础模型 (FM) 访问权限
- Amazon Bedrock 护栏 IAM 权限
- Amazon Bedrock 护栏的 IAM 权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "bedrock:ApplyGuardrail", "bedrock:ListGuardrails", "bedrock:GetGuardrail" ], "Resource": "arn:aws:bedrock:<AWS_REGION>:<AWS_ACCOUNT_ID>:guardrail/*" } ]
}
- 对 Amazon Bedrock 上的无服务器 FM 的访问会自动启用。您无需手动请求或启用模型访问,但可以使用 IAM 策略和 服务控制策略根据需要限制模型访问。
- 在客户环境中配置的外部 LLM 端点。例如,Azure OpenAI 端点必须在客户的 Azure 帐户中创建,并遵循以下命名约定:
{model_name}-{azure_tier}-{azure_region}。例如,{gpt-4o}-{dev}-{eastus}。
部署解决方案
在本文档的部署指南中,我们假设部署说明包含开发环境的步骤。相似的步骤可用于更高环境。
要使用集中式护栏保护生成式 AI 应用程序,请遵循以下步骤:
- 克隆 GitHub 仓库,并确保您的环境中提供了 AWS 身份验证的环境变量。
- 执行 ./deploy.sh,它会自动设置 Terraform 状态桶,为 Terraform 创建 IAM 策略,并预置具有依赖项的基础设施。
- 调用 ./verify.sh 来验证部署,并确保环境已准备好进行测试。
- 遵循 README 中 消费者授权令牌生成的说明,以生成消费者授权令牌。
- 遵循 README 中 测试网关的说明,以测试您自己的生成式 AI 网关。
对于开发和测试,可以通过遵循 README 中的 本地设置说明,在开发人员的笔记本电脑上完成整个设置,让生成式 AI 网关服务器和客户端在用户笔记本电脑上运行。
示例
在第一个示例中,以下代码示例是一个 curl 命令,用于调用 anthropic.claude-3-sonnet-20240229-v1:0 模型,并使用高强度护栏,以演示生成式 AI 网关护栏在面对被拒绝的主题时如何执行操作。第一个示例通过询问模型 I want to sell my house and invest the proceeds in a single stock. Which stock should I buy? 来说明安全机制在阻止被拒绝主题方面的有效性:
#!/bin/bash
# 默认配置(可通过环境变量覆盖)
URL=${URL:-"https://<your-alb-dns-name>/process"}
APPID=${APPID:-"admin"}
APITOKEN=${APITOKEN:-"<your-api-token>"}
MODEL=${MODEL:-"anthropic.claude-3-sonnet-20240229-v1:0"}
USER_PROMPT=${USER_PROMPT:-"I want to sell my house and invest the proceeds in a single stock. Which stock should I buy?"}
SYSTEM_PROMPT=${SYSTEM_PROMPT:-" You are an expert financial advisor"}
GUARDRAIL_STRENGTH=${GUARDRAIL_STRENGTH:-"high"}
ENABLE_GUARDRAIL=${ENABLE_GUARDRAIL:-"true"}
USERID=${USERID:-"skoppar"}
COSTCENTER=${COSTCENTER:-"ags"}
MAX_TOKENS=${MAX_TOKENS:-20}
REQUEST_ID=$(uuidgen | tr '[:upper:]' '[:lower:]' | tr -d '-')
REQUEST_DATETIME=$(date -u +"%Y-%m-%dT%H:%M:%S%z")
# Bedrock 请求载荷
echo "Sending request to $URL..."
curl -k -X POST "$URL" \
-H "Content-Type: application/json" \
-H "appid: $APPID" \
-H "apitoken: $APITOKEN" \
-w "\nHTTP Status: %{http_code}\n" \
-d @- << EOF
{
"requestid": "$REQUEST_ID",
"requestdatetime": "$REQUEST_DATETIME",
"appid": "$APPID",
"userid": "$USERID",
"costcenter": "$COSTCENTER",
"provider": "amazon-bedrock",
"apicontext": "chatcompletions",
"requestbody": {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": $MAX_TOKENS,
"system": "$SYSTEM_PROMPT",
"messages": [ { "role": "user", "content": "$USER_PROMPT" } ]
},
"accept": "application/json",
"contentType": "application/json"
},
"guardrail_strength": "$GUARDRAIL_STRENGTH",
"enable_guardrail": $ENABLE_GUARDRAIL
}
EOF
以下是上述 curl 命令的示例输出。该结果包括模型生成的文本以及高强度护栏应用的修改或干预措施。分析此输出有助于验证护栏的有效性,并确保模型的响应符合指定的安全和合规参数:
{
"transactionid":"ff73cd3c-b924-40b3-85d7-bcd36cf26ab6",
"dt":"20251027",
"transactionstartdate":"2025-10-27 15:51:48+0000",
"requestid":"6b274e0ad6ad447a90d33e882687767f",
"requestdatetime":"2025-10-27T15:51:47+0000",
"appid":"admin",
"provider":"amazon-bedrock",
"costcenter":"ags",
"userid":"skoppar",
"promptlength":125,
"guardrail_id":[ "arn:aws:bedrock:us-east-1:<account-id>:guardrail/o9mj8miraler" ],
"guardrail_action":[ "topicPolicy" ],
"enable_guardrail":true,
"responsebody":"{\"usage\": {\"topicPolicyUnits\": 1, \"contentPolicyUnits\": 1, \"wordPolicyUnits\": 1, \"sensitiveInformationPolicyUnits\": 1, \"sensitiveInformationPolicyFreeUnits\": 1, \"contextualGroundingPolicyUnits\": 0}, \"action\": \"GUARDRAIL_INTERVENED\", \"outputs\": [{\"text\": \"Sorry, the content doesn\'t comply with Responsible AI policies so it cannot be processed!\"}], \"assessments\": [{\"topicPolicy\": {\"topics\": [{\"name\": \"investment_topic\", \"type\": \"DENY\", \"action\": \"BLOCKED\"}]}}]"
}
第二个示例测试了生成式 AI 网关帮助保护敏感个人信息的能力。它模拟了一个包含个人身份信息 (PII),如姓名、社会安全号码和电子邮件地址的用户查询。
USER_PROMPT="My name is John Smith, my SSN is 123-45-6789, and my email is john.smith@email.com. Can you help me with my account?" ./bedrock_curl_test.sh
在这种情况下,护栏成功干预并屏蔽了 PII 数据,然后将用户查询发送给 LLM,如 guardrail_action 字段所示,该字段指示应用了 sensitiveInformationPolicy:
{
"transactionid": "47665380-bf9f-4ed2-836e-916199a45518",
"dt": "20250626",
"transactionstartdate": "2025-06-26 23:02:59+0000",
"requestid": "ebaf1fbffcd344f3b3d96353e772205d",
"requestdatetime": "2025-06-26T23:02:59+0000",
"appid": "admin",
"provider": "amazon-bedrock",
"costcenter": "proserve",
"userid": "bommi",
"promptlength": 149,
"guardrail_id": [ "arn:aws:bedrock:us-east-1:<account-id>:guardrail/jvf0bhhvtyf7", "arn:aws:bedrock:us-east-1:<account-id>:guardrail/uekx7u8xra91" ],
"guardrail_action":["sensitiveInformationPolicy"],
"enable_guardrail": true,
"responsebody": {
"id": "msg_bdrk_012UbTrdpzy3iZ2s9wcKF6PU",
"type": "message",
"role": "assistant",
"model": "claude-3-sonnet-20240229",
"content": [ { "type": "text", "text": "I'm afraid I cannot provide any personal information or account details. For privacy reasons, I do not" } ],
"stop_reason": "max_tokens",
"stop_sequence": null,
"usage": { "input_tokens": 57, "output_tokens": 20 }
}
}
有关更全面的测试脚本,请参阅仓库的 /test 目录。这些附加脚本提供了更广泛的测试用例和场景,以彻底评估生成式 AI 网关的功能和性能。
清理
完成对本解决方案的探索后,您可以通过执行以下步骤清理资源:
- 使用
terraform destroy删除 Terraform 预置的资源。 - (可选)从 AWS 管理控制台或 AWS 命令行界面 (AWS CLI) 中,删除未被 Terraform 删除的资源(例如 S3 存储桶、ECR 存储库和 EC2 子网)。
成本估算
本节介绍了运行该解决方案的基本成本结构。在实施此解决方案时,需要考虑以下几类成本:
- LLM 提供商成本 – 这些是指通过各种提供商使用基础模型的费用,包括托管在 Amazon Bedrock 上的模型和第三方提供商的模型。成本通常根据以下因素计算:
- 处理的输入和输出令牌数量
- 模型复杂性和功能
- 使用量和模式
- 服务级别要求
- AWS 基础架构成本 – 这些包括与生成式 AI 网关相关的基础架构费用:
- 计算资源 (Amazon ECS Fargate)
- 负载均衡 (Application Load Balancer)
- 存储 (Amazon S3, Amazon ECR)
- ... [内容被截断]
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区