标题:实验 3 - 使用返回控制(函数调用)创建代理 权重: 30
在这个实验中,我们提供了一个使用 Amazon Bedrock 新功能的 HR 代理示例,包括函数定义和返回控制 用于函数调用。
返回控制用于函数调用允许开发人员定义一个操作模式,并在代理调用该操作时获得控制权。这为开发人员提供了更多选择来实现业务逻辑,除了已有的 Lambda 方法。此外,通过返回控制,开发人员可以执行耗时的操作(异步执行),同时继续编排流程。例如,如果用户请求编码三个不同的视频文件,代理需要进行三个单独的 encode_video API 调用。开发人员现在可以构建使用返回控制的工作流,并行调用这三个 API,而无需等待第一个调用的结果。这个功能可以让我们作为开发人员实现更高的效率、更大的灵活性来执行操作,以及通过异步执行增强工作流管理。
本节的代理允许员工 get_available_vacations_days
和 book_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)
}
}
},
}]}
)
如果我们是通过 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
这里有一个笔记本,让我们可以尝试上述内容: 创建带有返回控制的代理 。