在亚马逊云科技上安全、合规、私密地调用生成式AI大模子 ...

  金牌会员 | 2024-8-14 10:32:26 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

项目简介:

小李哥将继承天天介绍一个基于亚马逊云科技AWS云盘算平台的全球前沿AI技术办理方案,资助大家快速相识国际上最热门的云盘算平台亚马逊云科技AWS AI最佳实践,并应用到本身的日常工作里。
本次介绍的是如何安全、合规、私密地调用亚马逊云科技大模子托管服务Amazon Bedrock,本架构将在私有网络情况VPC中创建VPC网络节点,将AI大模子的访问请求路由至私有网络节点,在通过亚马逊云科技底层私有连接PrivateLink将请求传输到Amazon Bedrock大模子的API生成内容回复,以提拔大模子交互过程中数据的隐私性和安全性。本架构筹划全部采用了云原生Serverless架构,提供可扩展和安全的AI办理方案。本方案的办理方案架构图如下:



方案所需底子知识 

什么是 Amazon Bedrock?

Amazon Bedrock 是亚马逊云科技提供的一项服务,旨在资助开发者轻松构建和扩展生成式 AI 应用。Bedrock 提供了访问多种强大的底子模子(Foundation Models)的本领,支持多种差别大模子厂商的模子,如AI21 Labs, Anthropic, Cohere, Meta, Mistral AI, Stability AI, 和Amazon,用户可以使用这些模子来创建、定制和摆设各种生成式 AI 应用步调,而无需从头开始训练模子。Bedrock 支持多个生成式 AI 模子,包罗文本生成、图像生成、代码生成等,简化了开发流程,加速了创新。
什么是亚马逊云科技 PrivateLink?

亚马逊云科技 PrivateLink 是一项网络服务,允许用户通过专用网络连接(而非公共互联网)私密访问亚马逊云科技的服务和第三方应用。它确保数据在传输过程中的安全性和隐私性。

通过 PrivateLink 私有访问 Amazon Bedrock 上的 AI 大模子的利益

增强安全性

通过 PrivateLink,您可以在无需公开互联网访问的情况下,安全地连接到 Amazon Bedrock 上的 AI 大模子,确保数据传输的安全性。
降低延长

PrivateLink 提供了更快的网络路径,淘汰了访问 AI 大模子时的网络延长,提拔了应用的相应速度。
简化网络架构

无需配置复杂的 VPN 或 NAT,PrivateLink 提供了更简单的网络架构,使得连接 Amazon Bedrock 更加直观和高效。


本方案包罗的内容

1. 配置亚马逊云科技PrivateLink私密链接访问Amazon Bedrock上的AI大模子

2. 摆设Amazon Lambda无服务器盘算服务调用Amazon Bedrock上的AI大模子

3. 在VPC私有网络情况中对Amazon Bedrock、Amazon Lambda和Amazon RDS举行访问测试


项目搭建具体步骤:

1. 起首我们登录亚马逊云科技控制台,确认Amazon Bedrock上的AI大模子“Titan Text G1 - Express”是开启状态。

2. 接下来我们创建一台EC2服务器,摆设一个数据库SQL服务器,复制其私有IP地点“10.0.4.23”。

3. 接下来我们创建一个无服务器盘算服务Lambda,命名为“invoke_bedrock”,用于API调用Amazon Bedrock上的AI大模子

4. 在Lambda函数中创建一个Python文件“bedrock.py”,复制以下代码
  1. import boto3
  2. import json
  3. from datetime import datetime
  4. import os
  5. model_id = os.environ.get('BEDROCK_MODEL_ID')
  6. def test_bedrock():
  7.     model_id = os.environ.get('BEDROCK_MODEL_ID')
  8.     prompt_data = "What is the envelope budget method?"
  9.     r = call_bedrock(model_id, prompt_data)
  10.    
  11.     return("""
  12.     \n\n\n
  13.     Model latency: %s\n
  14.     Response:\n
  15.     %s
  16.     \n\n\n
  17.     """ % (r['latency'],r['response'])
  18.     )
  19.    
  20. def call_bedrock(model_id, prompt_data):
  21.     bedrock_runtime = boto3.client('bedrock-runtime')
  22.     body = json.dumps({
  23.         "inputText": prompt_data,
  24.         "textGenerationConfig":
  25.         {
  26.             "maxTokenCount":1000,
  27.             "stopSequences":[],
  28.             "temperature":0.7,
  29.             "topP":0.9
  30.         }
  31.     })
  32.     accept = 'application/json'
  33.     content_type = 'application/json'
  34.     before = datetime.now()
  35.     response = bedrock_runtime.invoke_model(body=body, modelId=model_id, accept=accept, contentType=content_type)
  36.     latency = (datetime.now() - before).seconds
  37.     response_body = json.loads(response.get('body').read())
  38.     response = response_body.get('results')[0].get('outputText')
  39.     return {
  40.         'latency': str(latency),
  41.         'response': response
  42.     }
  43.    
  44. def json_to_pretty_table(json_data):
  45.     data = json.loads(json_data)
  46.     table = PrettyTable()
  47.    
  48.     # Assuming all rows have the same keys
  49.     headers = data['rows'][0].keys()
  50.     table.field_names = headers
  51.    
  52.     for row in data['rows']:
  53.         table.add_row(row.values())
  54.    
  55.     return table
  56.    
  57. def generate_budget_report(customer_data):
  58.    
  59.     prompt_data = f"""
  60.         Using the spending data in the table bellow, aggregate the spending by category and provide the total for each category.
  61.         Customer Spending Table:
  62.         
  63.         %s
  64.    
  65.     """ % (customer_data)
  66.    
  67.    
  68.     r = call_bedrock(model_id,prompt_data)
  69.     return r['response']
复制代码
 5. 再创建一个Python文件复制以下代码,命名为“db.py”,用于数据库访问
  1. import boto3
  2. import json
  3. from datetime import datetime
  4. import os
  5. model_id = os.environ.get('BEDROCK_MODEL_ID')
  6. def test_bedrock():
  7.     model_id = os.environ.get('BEDROCK_MODEL_ID')
  8.     prompt_data = "What is the envelope budget method?"
  9.     r = call_bedrock(model_id, prompt_data)
  10.    
  11.     return("""
  12.     \n\n\n
  13.     Model latency: %s\n
  14.     Response:\n
  15.     %s
  16.     \n\n\n
  17.     """ % (r['latency'],r['response'])
  18.     )
  19.    
  20. def call_bedrock(model_id, prompt_data):
  21.     bedrock_runtime = boto3.client('bedrock-runtime')
  22.     body = json.dumps({
  23.         "inputText": prompt_data,
  24.         "textGenerationConfig":
  25.         {
  26.             "maxTokenCount":1000,
  27.             "stopSequences":[],
  28.             "temperature":0.7,
  29.             "topP":0.9
  30.         }
  31.     })
  32.     accept = 'application/json'
  33.     content_type = 'application/json'
  34.     before = datetime.now()
  35.     response = bedrock_runtime.invoke_model(body=body, modelId=model_id, accept=accept, contentType=content_type)
  36.     latency = (datetime.now() - before).seconds
  37.     response_body = json.loads(response.get('body').read())
  38.     response = response_body.get('results')[0].get('outputText')
  39.     return {
  40.         'latency': str(latency),
  41.         'response': response
  42.     }
  43.    
  44. def json_to_pretty_table(json_data):
  45.     data = json.loads(json_data)
  46.     table = PrettyTable()
  47.    
  48.     # Assuming all rows have the same keys
  49.     headers = data['rows'][0].keys()
  50.     table.field_names = headers
  51.    
  52.     for row in data['rows']:
  53.         table.add_row(row.values())
  54.    
  55.     return table
  56.    
  57. def generate_budget_report(customer_data):
  58.    
  59.     prompt_data = f"""
  60.         Using the spending data in the table bellow, aggregate the spending by category and provide the total for each category.
  61.         Customer Spending Table:
  62.         
  63.         %s
  64.    
  65.     """ % (customer_data)
  66.    
  67.    
  68.     r = call_bedrock(model_id,prompt_data)
  69.     return r['response']
复制代码
6. 在Lambda服务的情况变量配置中配置如下键值对,用于Python代码运行读取情况变量。这里会用到刚刚复制的数据库服务器的私有IP地点,作为“DB_Host”的键值。

7. 接下来我们为Lambda函数配置网络,将其摆设到亚马逊云科技VPC网络情况里。进入到Lambda函数的VPC选项,点击配置。

8. 在配置中指定VPC网络、私有子网Subnet以及Security Group安全组防火墙


9.下面我们进入到VPC服务主页的Endpoints功能,点击Create创建一个VPC endpoint,用于私密访问Amazon Bedrock

10. 为网络节点起名“bedrock-vpce”,选择的节点类型为“AWS Services”,节点服务名为“com.amazonaws.us-east-1.bedrock-runtime”,该服务则为Amazon Bedrock的API节点名。

11. 将该节点放置在我们创建的VPC和对应私有Subnet子网中。

12. 为该配置Security Group防火墙限定访问IP、端口和协议。

 13. 为该节点添加如下JSON访问限定计谋,用于限定在亚马逊云科技平台上访问的API操作、发起请求主体和请求对象,复制后点击创建。
  1. {
  2.         "Version": "2012-10-17",
  3.         "Statement": [
  4.                 {
  5.                         "Action": [
  6.                                 "bedrock:InvokeModel"
  7.                         ],
  8.                         "Resource": [
  9.                                 "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1"
  10.                         ],
  11.                         "Effect": "Allow",
  12.                         "Principal": {
  13.                                 "AWS": "arn:aws:sts::<accountid>:assumed-role/lab_lambda_role/invoke_bedrock"
  14.                         }
  15.                 }
  16.         ]
  17. }
复制代码
14. 末了通过Lambda函数的代码测试功能,我们乐成得到私密调用Bedrock上的AI大模子和数据库的请求回复相应,阐明私有大模子调用通道创建乐成。该AI模子请求会自动被路由到我们刚刚创建的VPC节点中,通过PrivateLink访问大模子,得到回复。


以上就是在亚马逊云科技上通过PrivateLink,安全、合规、私密地调用Amazon Bedrock上的生成式AI大模子的全部步骤。接待大家将来与我一起,将来获取更多国际前沿的生成式AI开发方案。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表