配置 Lambda 函数以发送 Amazon Bedrock 代理从用户那里获取的信息 - Amazon Bedrock

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 Lambda 函数以发送 Amazon Bedrock 代理从用户那里获取的信息

您可以定义一个 Lambda 函数,用于编写操作组的业务逻辑。在 Amazon Bedrock 代理确定需要在操作组中调用的 API 操作后,它会将来自 API 架构的信息以及相关的元数据作为输入事件发送到 Lambda 函数。要编写函数,您必须了解 Lambda 函数的以下组成部分:

  • 输入事件 – 包含 API 操作请求正文中的相关元数据和已填充字段,或者代理确定必须调用的操作的函数参数。

  • 响应 – 包含从 API 操作或函数返回的响应正文的相关元数据和已填充字段。

您可以编写 Lambda 函数来定义如何处理操作组,并自定义 API 响应的返回方式。您可以使用输入事件中的变量来定义函数,并向代理返回响应。

注意

一个操作组最多可以包含 11 个 API 操作,但您只能编写一个 Lambda 函数。由于 Lambda 函数一次只能接收一个输入事件并针对一个 API 操作返回响应,因此在编写函数时,您应该考虑到可能被调用的不同 API 操作。

要让代理使用 Lambda 函数,您必须将基于资源的策略附加到该函数,以便为代理提供权限。有关更多信息,请参阅 基于资源的策略,允许 Amazon Bedrock 调用操作组 Lambda 函数 中的步骤。有关 Lambda 中基于资源的策略的更多信息,请参阅《AWS Lambda 开发人员指南》中的在 Lambda 中使用基于资源的策略

要了解如何在创建操作组时定义函数,请参阅 在 Amazon Bedrock 中向代理添加操作组

来自 Amazon Bedrock 的 Lambda 输入事件

调用使用 Lambda 函数的操作组时,Amazon Bedrock 会发送以下一般格式的 Lambda 输入事件。您可以定义 Lambda 函数,使用任何输入事件字段来处理函数中的业务逻辑,以便成功执行操作。有关 Lambda 函数的更多信息,请参阅《AWS Lambda 开发人员指南》中的事件驱动调用

输入事件的格式取决于您是使用 API 架构还是使用函数详细信息定义操作组:

  • 如果您使用 API 架构定义操作组,则输入事件的格式如下:

    { "messageVersion": "1.0", "agent": { "name": "string", "id": "string", "alias": "string", "version": "string" }, "inputText": "string", "sessionId": "string", "actionGroup": "string", "apiPath": "string", "httpMethod": "string", "parameters": [ { "name": "string", "type": "string", "value": "string" }, ... ], "requestBody": { "content": { "<content_type>": { "properties": [ { "name": "string", "type": "string", "value": "string" }, ... ] } } }, "sessionAttributes": { "string": "string", }, "promptSessionAttributes": { "string": "string" } }
  • 如果您使用函数详细信息定义操作组,则输入事件的格式如下:

    { "messageVersion": "1.0", "agent": { "name": "string", "id": "string", "alias": "string", "version": "string" }, "inputText": "string", "sessionId": "string", "actionGroup": "string", "function": "string", "parameters": [ { "name": "string", "type": "string", "value": "string" }, ... ], "sessionAttributes": { "string": "string", }, "promptSessionAttributes": { "string": "string" } }

下面的列表介绍了输入事件字段:

  • messageVersion – 消息的版本,用于标识进入 Lambda 函数的事件数据格式以及 Lambda 函数的预期响应格式。Amazon Bedrock 仅支持版本 1.0。

  • agent – 包含操作组所属代理的名称、ID、别名和版本的相关信息。

  • inputText – 用户在对话回合中的输入。

  • sessionId – 代理会话的唯一标识符。

  • actionGroup – 操作组的名称。

  • parameters – 包含对象列表。每个对象都包含 API 操作中参数的名称、类型和值,如 OpenAPI 架构或函数中所定义。

  • 如果您使用 API 架构定义操作组,则输入事件包含以下字段:

    • apiPath – API 操作的路径,如 OpenAPI 架构中所定义。

    • httpMethod – API 操作的方法,如 OpenAPI 架构中所定义。

    • requestBody – 包含请求正文及其属性,如操作组的 OpenAPI 架构中所定义。

  • 如果您使用函数详细信息定义操作组,则输入事件包含以下字段:

    • function – 操作组的函数详细信息中定义的函数名称。

  • sessionAttributes – 包含会话属性及其值。这些属性在会话期间存储,并为代理提供上下文。

  • promptSessionAttributes – 包含提示会话属性及其值。这些属性在回合中存储,并为代理提供上下文。

对 Amazon Bedrock 的 Lambda 响应事件

Amazon Bedrock 希望从 Lambda 函数获得符合以下格式的响应。响应由从 API 操作返回的参数组成。代理可以使用 Lambda 函数的响应进行进一步编排或借助它向客户返回响应。

注意

最大 Lambda 有效载荷响应大小为 25 KB。

输入事件的格式取决于您是使用 API 架构还是使用函数详细信息定义操作组:

  • 如果您使用 API 架构定义操作组,则响应格式如下:

    { "messageVersion": "1.0", "response": { "actionGroup": "string", "apiPath": "string", "httpMethod": "string", "httpStatusCode": number, "responseBody": { "<contentType>": { "body": "JSON-formatted string" } } }, "sessionAttributes": { "string": "string", ... }, "promptSessionAttributes": { "string": "string", ... }, "knowledgeBasesConfiguration": [ { "knowledgeBaseId": "string", "retrievalConfiguration": { "vectorSearchConfiguration": { "numberOfResults": int, "overrideSearchType": "HYBRID | SEMANTIC", "filter": RetrievalFilter object } } }, ... ] }
  • 如果您使用函数详细信息定义操作组,则响应格式如下:

    { "messageVersion": "1.0", "response": { "actionGroup": "string", "function": "string", "functionResponse": { "responseState": "FAILURE | REPROMPT", "responseBody": { "<functionContentType>": { "body": "JSON-formatted string" } } } }, "sessionAttributes": { "string": "string", }, "promptSessionAttributes": { "string": "string" }, "knowledgeBasesConfiguration": [ { "knowledgeBaseId": "string", "retrievalConfiguration": { "vectorSearchConfiguration": { "numberOfResults": int, "filter": { RetrievalFilter object } } } }, ... ] }

下面的列表介绍了响应字段:

  • messageVersion – 消息的版本,用于标识进入 Lambda 函数的事件数据格式以及 Lambda 函数的预期响应格式。Amazon Bedrock 仅支持版本 1.0。

  • response – 包含有关 API 响应的以下信息。

    • actionGroup – 操作组的名称。

    • 如果您使用 API 架构定义操作组,则响应中可能包含以下字段:

      • apiPath – API 操作的路径,如 OpenAPI 架构中所定义。

      • httpMethod – API 操作的方法,如 OpenAPI 架构中所定义。

      • httpStatusCode – 从 API 操作返回的 HTTP 状态代码。

      • responseBody – 包含响应正文,如 OpenAPI 架构中所定义。

    • 如果您使用函数详细信息定义操作组,则响应中可能包含以下字段:

      • responseState(可选)– 设置为以下状态之一,以定义代理在处理操作后的行为:

        • FAILURE – 代理抛出当前会话的 DependencyFailedException。适用于由于依赖项故障而导致函数执行失败的情况。

        • REPROMPT – 代理向模型传递响应字符串,以重新提示模型。适用于由于输入无效而导致函数执行失败的情况。

      • responseBody – 包含一个对象,该对象定义了函数执行后的响应。键是内容类型(目前仅支持 TEXT),值是包含响应 body 的对象。

  • (可选)sessionAttributes – 包含会话属性及其值。有关更多信息,请参阅 会话和提示会话属性

  • (可选)promptSessionAttributes – 包含提示属性及其值。有关更多信息,请参阅 会话和提示会话属性

  • (可选)knowledgeBasesConfiguration – 包含附加到代理的知识库的查询配置列表。有关更多信息,请参阅 知识库检索配置

操作组 Lambda 函数示例

以下是如何在 Python 中定义 Lambda 函数的最简单示例。根据您是使用 OpenAPI 架构还是函数详细信息定义操作组来选择相应的选项卡:

OpenAPI schema
def lambda_handler(event, context): agent = event['agent'] actionGroup = event['actionGroup'] api_path = event['apiPath'] # get parameters get_parameters = event.get('parameters', []) # post parameters post_parameters = event['requestBody']['content']['application/json']['properties'] response_body = { 'application/json': { 'body': "sample response" } } action_response = { 'actionGroup': event['actionGroup'], 'apiPath': event['apiPath'], 'httpMethod': event['httpMethod'], 'httpStatusCode': 200, 'responseBody': response_body } session_attributes = event['sessionAttributes'] prompt_session_attributes = event['promptSessionAttributes'] api_response = { 'messageVersion': '1.0', 'response': action_response, 'sessionAttributes': session_attributes, 'promptSessionAttributes': prompt_session_attributes } return api_response
Function details
def lambda_handler(event, context): agent = event['agent'] actionGroup = event['actionGroup'] function = event['function'] parameters = event.get('parameters', []) response_body = { 'TEXT': { 'body': "sample response" } } function_response = { 'actionGroup': event['actionGroup'], 'function': event['function'], 'functionResponse': { 'responseBody': response_body } } session_attributes = event['sessionAttributes'] prompt_session_attributes = event['promptSessionAttributes'] action_response = { 'messageVersion': '1.0', 'response': function_response, 'sessionAttributes': session_attributes, 'promptSessionAttributes': prompt_session_attributes } return action_response