使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何升级 AWS Lambda 中的 boto3 和 botocore 以访问更新的 AI 模型?

2 分钟阅读
0

我想在 AWS Lambda 中安装最新版本的 boto3 和 botocore,以便在 Amazon Bedrock 中访问更新的 AI 模型。

简短描述

如果您使用 Lambda 函数的 Python 版本来调用 Amazon Bedrock 模型,则可能会收到以下错误: Error: "errorMessage": "Unknown service: 'bedrock'。要解决此问题,您必须将 boto3 和 botocore 库升级到 Lambda 中的最新版本。

解决方法

先决条件

在开始之前,请确保您可以访问 Amazon Bedrock 基础模型

**注意:**当您使用 Amazon Bedrock 基础模型时,您需要遵守卖方的定价条款

创建 Lambda 层

以下 AWS 命令行界面 (AWS CLI) 命令适用于 Linux、Unix 和 macOS 操作系统。

**注意:**如果在运行 AWS CLI 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

  1. 创建临时文件夹:

    LIB_DIR=boto3-mylayer/python
    mkdir -p $LIB_DIR

    **注意:**将 boto3-mylayer 替换为您的临时文件夹名称。

  2. 将 boto3 库安装到 **LIB_DIR:
    **

    pip3 install boto3==1.34.44 -t $LIB_DIR
    pip3 install botocore==1.34.44 -t $LIB_DIR
  3. 将所有依赖项压缩到 /tmp/boto3-mylayer.zip

    cd boto3-mylayer
    zip -r /tmp/boto3-mylayer.zip .

    **注意:**将 boto3-mylayer 替换为您的临时文件夹名称。

  4. 要发布该层,请运行 publish-layer-version 命令:

    aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip

    **注意:**将 layer-name 替换为您的 Lambda 层名称,将 boto3-mylayer 替换为您的临时文件夹名称。

  5. 发布该层时,您将收到该层的 ARN。将 ARN 复制到文本文件中,以便稍后在此过程中使用。

创建 Lambda 函数

  1. 创建 Lambda 函数
  2. 将您创建的层附加到 Lambda 函数,请运行 update-function-configuration 命令:
    aws lambda update-function-configuration --function-name MY_FUNCTION --layer_ARN
    **注意:**将 layer_ARN 替换为您收到的层 ARN。
  3. 要测试您的更新,请运行以下代码来调用 Anthropic Claude 2.1:
    import boto3
    import json
    import os
    def lambda_handler(event, context):
      print("Boto3 version:", boto3.__version__)
    
      bedrock = boto3.client(service_name='bedrock', region_name='us-east-1', endpoint_url='https://bedrock.us-east-1.amazonaws.com')
    
      bedrock_runtime = boto3.client(service_name='bedrock-runtime', region_name='us-east-1', endpoint_url='https://bedrock-runtime.us-east-1.amazonaws.com')
      models=bedrock.list_foundation_models()
      modelIds = [model['modelId'] for model in models['modelSummaries']]
      print("Models: ", modelIds)
    
      for required_field in ["model"]:
        if required_field not in event:
          return {'statusCode': 400, 'body': f'ERROR: MISSING REQUEST PARAMETER {required_field}'}
      #event = {"model":"anthropic.claude-v2:1", "prompt": "Why is the sky blue?", "max_tokens_to_sample": 4000, "temperature": 0.5, "top_k": 250, "top_p": 1, "stop_sequences": ["Command:"]}
      print(f"EVENT: {event}")
      bedrock_model = event.pop("model")
      print(f"BEDROCK_MODEL: {bedrock_model}")
      if bedrock_model not in modelIds:
        return {'statusCode': 400, 'body': f'ERROR: INVALID MODEL {bedrock_model} REQUESTED. SUPPORTED MODELS: {modelIds}'}
    
      if "claude" in bedrock_model:
        event["prompt"] = f'Human: {event["prompt"]}\n\nAssistant:'
    
      bedrock_str = json.dumps(event)
      print(f"BEDROCK_STR: {bedrock_str}")
      modelId = 'anthropic.claude-v2:1'
    
      bodyprompt = {"prompt":"\n\nHuman:who is the prime minister of India\n\nAssistant:","max_tokens_to_sample":42,"temperature":0.5,"top_k":250,"top_p":1,"anthropic_version":"bedrock-2023-05-31"}
      response = bedrock_runtime.invoke_model(body=bedrock_str, modelId=modelId, accept='application/json', contentType='application/json')
      #response = bedrock.invoke_model(body= json.dumps(bodyprompt), modelId=bedrock_model, accept='application/json', contentType='application/json')
      response_body = json.loads(response.get('body').read())
      print(response_body)
    
      return {'statusCode': 200, 'body': json.dumps(response_body)}
    **注意:**将 region_nameendpoint_url 替换为您的 Amazon Bedrock 的 AWS 区域信息。
AWS 官方
AWS 官方已更新 7 个月前