通过 Lambda 函数调用时,Amazon Bedrock 类无法加载我的凭证

Mus*_*moh 7 amazon-ec2 aws-lambda aws-lambda-layers aws-iam-authenticator aws-iam-policy

因此,我为脚本创建了一个 lambda 函数,该函数本质上允许用户将查询传递给 Amazon bedrock 上的 amazon titan LLM。这是我的部署包中 main.py 文件的内容。

from langchain.llms.bedrock import Bedrock
import boto3
from langchain.retrievers import AmazonKendraRetriever
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import json
from botocore.exceptions import ClientError

def get_secret():
    secret_name = "kendraRagApp"

    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        raise e

    # Decrypts secret using the associated KMS key.
    secret = get_secret_value_response['SecretString']
    return secret   
def qa(query):
    secrets = json.loads(get_secret())
    kendra_index_id = secrets['kendra_index_id']

    llm = Bedrock(model_id="amazon.titan-tg1-large", region_name='us-east-1', credentials_profile_name='default')
    llm.model_kwargs = {"maxTokenCount": 4096}
    

    retriever = AmazonKendraRetriever(index_id=kendra_index_id)
    
    prompt_template = """
    {context}
    {question} If you are unable to find the relevant article, respond 'I can't generate the needed content based on the context provided.'
    """
    
    PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["context", "question"])
    
    chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    verbose=True,
    chain_type_kwargs={
    "prompt": PROMPT
    }
    )
    
    return chain(query)

def handler(event, context):
    query = event['query']
    response = qa(query)
    if response.get("result"):
        return {
            'statusCode': 200,
            'body': response["result"]
        }
    else:
        return {
            'statusCode': 400,
            'body': "Could not answer the query based on the context available"
        }

Run Code Online (Sandbox Code Playgroud)

lambda 函数已成功创建,但当我尝试调用它时,出现以下验证错误,显然,Bedrock 无法加载我的身份验证凭据。

{
  "errorMessage": "1 validation error for Bedrock\n__root__\n  Could not load credentials to authenticate with AWS client. Please check that credentials in the specified profile name are valid. (type=value_error)",
  "errorType": "ValidationError",
  "requestId": "b772f236-f582-4308-8af5-b5a418d4327f",
  "stackTrace": [
    "  File \"/var/task/main.py\", line 62, in handler\n    response = qa(query)\n",
    "  File \"/var/task/main.py\", line 32, in qa\n    llm = Bedrock(model_id=\"amazon.titan-tg1-large\", region_name='us-east-1',) #client=BEDROCK_CLIENT)\n",
    "  File \"/var/task/langchain/load/serializable.py\", line 74, in __init__\n    super().__init__(**kwargs)\n",
    "  File \"pydantic/main.py\", line 341, in pydantic.main.BaseModel.__init__\n    raise validation_error\n"
  ]

Run Code Online (Sandbox Code Playgroud)

我已经查看了此处定义的基岩类但找不到有关如何将我的凭据传递给基岩类的足够信息。请注意,我的代码在我的 Sagemaker 笔记本上运行没有问题(我猜是因为身份验证是自动处理的)。我将不胜感激任何有用的帮助。谢谢。

编辑:调用基岩类时不使用credentials_profile_name参数并不能解决问题,此外,从本地环境调用 lambda 函数并设置身份验证也不能解决问题。

Den*_*aub 2

可能的问题是您尚未在所使用的计算机上配置 AWS 凭证。当您传递credentials_profile_name='default'到 Bedrock 构造函数时,它会尝试从本地配置文件加载凭据default

SageMaker 笔记本会自动执行此操作,但在大多数其他计算机上,您必须自己执行此操作。

为了做到这一点,你需要做两件事:

话虽如此,您不必向 Bedrock 提供任何特定凭据,它会自动boto3.Session()在内部使用。

这意味着,如果您已使用正确的凭据配置了 boto3 会话,则无需传递credentials_profile_name='default'到构造函数中。

如果 boto3 会话具有所需的权限,则应足以替换:

llm = Bedrock(model_id="amazon.titan-tg1-large", region_name='us-east-1', credentials_profile_name='default')
Run Code Online (Sandbox Code Playgroud)

和:

llm = Bedrock(model_id="amazon.titan-tg1-large", region_name='us-east-1')
Run Code Online (Sandbox Code Playgroud)