Lab 3 - Create Agents with Return of Control (Function Calling)

标题:实验 3 - 使用返回控制(函数调用)创建代理 权重: 30

在这个实验中,我们提供了一个使用 Amazon Bedrock 新功能的 HR 代理示例,包括函数定义和返回控制 用于函数调用。

返回控制用于函数调用允许开发人员定义一个操作模式,并在代理调用该操作时获得控制权。这为开发人员提供了更多选择来实现业务逻辑,除了已有的 Lambda 方法。此外,通过返回控制,开发人员可以执行耗时的操作(异步执行),同时继续编排流程。例如,如果用户请求编码三个不同的视频文件,代理需要进行三个单独的 encode_video API 调用。开发人员现在可以构建使用返回控制的工作流,并行调用这三个 API,而无需等待第一个调用的结果。这个功能可以让我们作为开发人员实现更高的效率、更大的灵活性来执行操作,以及通过异步执行增强工作流管理。

本节的代理允许员工 get_available_vacations_daysbook_vacations 根据员工的请求。

这两个功能都在笔记本中内存中实现,并将在现有的生产应用程序中使用。代理用例类似于实验 1,但函数执行发生在代理范围之外,如下图所示的体系结构:

笔记本逻辑连接到一个生成的内存 SQLite 数据库,该数据库包含有关员工可用假期天数和计划假期的信息。

创建的数据库结构如下:

这些函数是使用函数定义定义的,格式为 JSON 对象列表:

    agent_functions = [
        {
            'name': 'get_available_vacations_days'
            'description': '获取某个员工的可用假期天数'
            'parameters': {
                "employee_id": {
                    "description": "获取可用假期的员工 ID"
                    "required": True
                    "type": "integer"
                }
            }
        }
        {
            'name': 'book_vacations'
            'description': '为员工预订假期'
            'parameters': {
                "employee_id": {
                    "description": "获取可用假期的员工 ID"
                    "required": True
                    "type": "integer"
                }
                "start_date": {
                    "description": "假期开始日期"
                    "required": True
                    "type": "string"
                }
                "end_date": {
                    "description": "假期结束日期"
                    "required": True
                    "type": "string"
                }
            }
        }
    ]

在创建代理操作组时,将 actionGroupExecutor 参数设置为 'customControl': 'RETURN_CONTROL',以指示不提供 Lambda 函数,并且代理应该返回要调用的函数及其参数。

    agent_action_group_response = bedrock_agent_client.create_agent_action_group(
        agentId=agent_id
        agentVersion='DRAFT'
        actionGroupExecutor={
            'customControl': 'RETURN_CONTROL'
        }
        actionGroupName=agent_action_group_name
        functionSchema={
            'functions': agent_functions
        }
        description=agent_action_group_description
    )

使用返回控制执行的代理将输出一个包含 functionInvocationInput 的对象,如果使用了函数定义(本示例中展示的),或 apiInvocationInput,如果使用了 API 模式。

函数定义的示例 JSON:

{
    "returnControl": {
        "invocationId": "<INVOCATION_ID>" 
        "invocationInputs": [{
            "functionInvocationInput": {
                "actionGroup": "<ACTION_GROUP>" 
                "function": "get_available_vacations_days" 
                "parameters": [{
                    "name": "employee_id" 
                    "type": "integer" 
                    "value": 1
                }]
            }
        }]
    }
}

API 模式的示例 JSON:

{
    "returnControl": {
        "invocationId": "<INVOCATION_ID>"
        "invocationInputs": [{
            "apiInvocationInput": {
                "actionGroup": "<ACTION_GROUP>"
                "apiPath": "get_available_vacations_days"
                "httpMethod": "get"
                "parameters": [{
                    "name": "employee_id"
                    "type": "integer"
                    "value": "1"
                }]
            }
        }]
    }
}

一旦函数被执行,函数的输出就会传递给 invoke_agent 调用中的 returnControlInvocationResults 参数。

这是使用函数定义的代理的语法:

raw_response_with_roc = bedrock_agent_runtime_client.invoke_agent(
    agentId=agent_id
    agentAliasId=agent_alias_id 
    sessionId=session_id
    enableTrace=enable_trace 
    sessionState={
        'invocationId': "<INVOCATION_ID>"
        'returnControlInvocationResults': [{
                'functionResult': {
                    'actionGroup': agent_action_group_name
                    'function': "get_available_vacations_days"
                    'responseBody': {
                        "TEXT": {
                            'body': "available_vacation_days: "+str(available_vacation_days)
                        }
                    }
                }
        }]}
)

使用 API 模式的相同示例:

raw_response_with_roc = bedrock_agent_runtime_client.invoke_agent(
    agentId=agent_id
    agentAliasId=agent_alias_id 
    sessionId=session_id
    enableTrace=enable_trace 
    sessionState={
        'invocationId': "<INVOCATION_ID>"
        'returnControlInvocationResults': [{
            "apiResult": {
                "actionGroup": agent_action_group_name
                "httpStatusCode": 200
                "httpMethod": "get"
                "apiPath": "get_available_vacations_days"
                "responseBody": {
                    "text": {
                        "body": "available_vacation_days: "+str(available_vacation_days)
                    }
                }
            }
        }]}
)

试一试

在 AWS 活动中

如果我们是通过 workshop studio 参加研讨会,现在请转到 SageMaker Studio 中的 JupyterLab。

在 JupyterLab UI 中导航到 bedrock-agents-workshop/03-create-agent-with-return-of-control/03-create-agent-with-return-of-control.ipynb

自主学习

这里有一个笔记本,让我们可以尝试上述内容: 创建带有返回控制的代理