配置 Lambda 函数以发送 Amazon Bedrock 代理从用户那里获得的信息,以便在 Amazon Bedrock 中执行操作组 - Amazon Bedrock

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

配置 Lambda 函数以发送 Amazon Bedrock 代理从用户那里获得的信息,以便在 Amazon Bedrock 中执行操作组

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

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

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

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

注意

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

要让您的代理使用 Lambda 函数,您必须将基于资源的策略附加到该函数,以便为代理提供权限。要了解更多信息,请按照中的步骤操作基于资源的策略,允许 Amazon Bedrock 调用操作组 Lambda 函数。有关 Lambda 中基于资源的策略的更多信息,请参阅开发人员指南中的对 Lambda 使用基于资源的策略。 AWS 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(可选)-设置为以下状态之一以定义代理在处理操作后的行为:

        • 失败 — 代理DependencyFailedException为当前会话抛出。当由于依赖关系失败而导致函数执行失败时适用。

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

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

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

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

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

操作组 Lambda 函数示例

以下是如何在中定义 Lambda 函数的最小示例。Python选择与您是使用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